执行代码扩展的Visual Studio 2010扩展

Jon*_*way 8 visual-studio-2010 visual-studio-extensions

我想构建一个Visual Studio 2010 VSIX扩展,它扩展了一些基于对方法调用的文本(使用基于Zen Coding选择器的语法).理想情况下,用户可以键入文本字符串,点击热键,然后展开文本字符串.

我看了很多样本​​,但他们都把重点放在全面的语言服务或简单的装饰上.理想情况下,我想找到一个完整的工作示例,但我对接口/类和一些代码感到满意.

我看过一些参考文献:

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

Jar*_*Par 9

听起来您正在寻找关于如何进行键盘处理以将文本插入到Visual Studio缓冲区中的良好示例/参考.

不幸的是,这不是一个直截了当的答案的问题.Visual Studio中的键盘处理充其量是复杂的,有时令人沮丧.我试图尽可能简单地保持这个答案,但不幸的是,这个主题并不简单

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

您需要涉及哪些内容取决于几个因素

  • 您希望addin运行的Visual Studio版本是什么?
  • 您将构建什么类型的加载项:实际的Addin,Vs Package或VSIX
  • 你对赢得键盘输入的战斗有多深切

您需要了解哪些内容取决于您希望您的插件如何运行以及您希望它在哪种版本的Visual Studio中运行.虽然有2条基本路线可供选择

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

第二个是开发一个VSIX,挂钩到IOleCommandTarget链中IVsTextView并拦截映射到热键的真实Visual Studio命令.

这两种方法都有起伏不定,但我的答案已经有点太长了.如果你能给我一些更多的细节,我可以尝试给你一个更简洁和有用的答案.

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

让我知道哪一个让您感兴趣,我可以将您指向源代码中的正确位置.

此外,在努力弄清楚键盘输入的纠结时,我试着记录下我学到的东西.它并不完全是最新的,但本文档描述了输入如何路由的更基本方面

编辑

Jon在评论中指出VSIX + IOleCommandTarget路线

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

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

以下是您可能感兴趣的一些示例

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