【问题标题】:Visual Studio 2010 extension that does code expansion进行代码扩展的 Visual Studio 2010 扩展
【发布时间】:2011-09-26 13:58:14
【问题描述】:

我想构建一个 Visual Studio 2010 VSIX 扩展,它基于对方法的调用(使用 Zen Coding selector-based syntax)扩展一些文本。理想情况下,用户键入一串文本,按下热键,文本串就会展开。

我查看了很多示例,但它们都专注于成熟的语言服务或简单的装饰。理想情况下,我希望找到一个完整的工作示例,但我会对接口/类和一些代码感到满意。

我看过的一些参考资料:

更新:我知道 Resharper 和 CodeRush 会做这种事情。如果可能的话,我想把它作为一个独立的插件来做。

【问题讨论】:

  • 听起来像“code sn-ps”的类固醇。我想知道您是否可以从该功能中利用一些东西。
  • 如果扩展不依赖于代码库的上下文细节,也许 AutoHotKey 脚本就足够了。
  • 实际上我刚刚发布了一个这样的扩展。在这里查看:yngvenilsen.wordpress.com/2011/11/19/…

标签: visual-studio-2010 visual-studio-extensions


【解决方案1】:

听起来您正在寻找一个很好的示例/参考,了解如何进行键盘处理以将文本插入到 Visual Studio 缓冲区中。

很遗憾,这不是一个有直接答案的问题。 Visual Studio 中的键盘处理充其量是复杂的,有时令人沮丧。我试图让这个答案尽可能简单,但不幸的是这个主题并不适合简单

首先,Visual Studio 至少有 5 种不同的机制将键盘输入路由到命令中。

您需要加入哪些取决于几个因素

  • 您希望插件在哪些版本的 Visual Studio 中运行?
  • 您将构建什么类型的插件:实际插件、Vs 包或 VSIX
  • 您对赢得键盘输入战的关心程度有多大

您需要挂钩其中的哪些在很大程度上取决于您希望插件如何运行以及您希望它在什么版本的 Visual Studio 中工作。虽然您可以选择 2 条基本路线

首先是开发一个 Visual Studio 包并为扩展中的每个热键注册一个DTE.Command。然后,您需要将 IOleCommandTarget 添加到 IVsTextViews 过滤器链中以处理您的命令。这种方法将允许您在大多数情况下处理您的热键。

第二个是开发一个 VSIX,挂钩到 IVsTextViewIOleCommandTarget 链并拦截映射到您的热键的真实 Visual Studio 命令。

这两种方法都有其起伏,但我的回答已经有点太长了。如果您可以给我更多详细信息,我可以尝试为您提供更简洁和有用的答案。

举个例子。 VsVim 为 Visual Studio 进行了相当广泛的键盘处理,并为我提到的上述任何方法提供了一个示例。

让我知道您对哪一个感兴趣,我可以为您指出源代码中的正确位置。

此外,在我努力弄清楚键盘输入的复杂性时,我试图记录我所学到的一切。它不是最新的,但本文档描述了输入如何路由的更基本方面

编辑

Jon 在 cmets 中表示 VSIX + IOleCommandTarget 路由

恕我直言,这是最简单的方法。不过要注意的一件事是命令绑定如何影响通过IOleCommandTarget 链传递的数据。 Visual Studio 命令绑定发生在数据传递到IOleCommandTarget 链之前。因此,如果给定的键输入绑定到命令,它将作为命令而不是键盘输入传递 IOleCommandTarget

例如,CTRL-Z 通常映射到 Visual Studio Undo 命令。如果用户点击CTRL-Z,那么IOleCommandTarget 将看到撤消命令而不是键盘输入CTRL-Z

这里有一些您可能有兴趣查看的示例

  • VsCommandTargetIOleCommandTarget 的示例实现
  • OleCommandUtil:用于将传入IOleCommandTarget的数据转换成实际的命令和键盘输入
  • HostFactory:详细说明如何将 IOleCommandTarget 从 VSIX 扩展实际连接到 IVsTextView

【讨论】:

  • 谢谢!我想将 Zen Coding 支持添加到 Visual Studio,最好是 VSIX。这是一个概述:coding.smashingmagazine.com/2009/11/21/… - 似乎带有 IVsTextView 的 IOleCommandTarget 可能会起作用? Zen Coding 是用 JavaScript 编写的,我想我可以使用 IronJs / Jurassic 之类的 .NET JavaScript impl 调用它。
  • @Jon 我更新了我的答案,以便更详细地了解该场景。如果您需要任何其他信息,请告诉我
  • @JaredPar 很抱歉挖掘了一个旧帖子,但我希望你能帮助我解决我目前的问题。我正在做类似于 Jon 正在做的事情。我遵循 VSIX + IOleCommandTarget 方法。我想听Ctrl+K,Ctrl+C键。但是,当按下此组合键时,VS 在状态栏中显示“组合键(Ctrl+K、Ctrl+C)绑定到当前不可用的命令(注释选择)”,而我的 Exec() 函数是没有被调用。知道如何解决这个问题吗?
【解决方案2】:

也许这会有所帮助:http://resharperpowertoys.codeplex.com/wikipage?title=ZenCoding

不过,它使用 ReSharper 作为插件宿主。

【讨论】:

    【解决方案3】:

    我会考虑在 ReSharper 的 LiveTemplates 上进行构建。你可以用宏做很多事情,使扩展比简单的填空更智能。我不是这方面的专家,但我见过一些用这种方法构建的相当复杂的模板。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多