我想构建一个Visual Studio 2010 VSIX扩展,它根据对方法的调用(使用Zen Coding selector-based syntax)扩展一些文本。理想情况下,用户可以键入文本字符串,点击热键,然后展开文本字符串。
我看了很多样本,但他们都把重点放在全面的语言服务或简单的装饰上。理想情况下,我想找到一个完整的工作示例,但我对接口/类和一些代码感到满意。
我看过一些参考文献:
更新:我知道Resharper和CodeRush会做这种事情。如果可能的话,我想把它作为一个独立的插件。
答案 0 :(得分:9)
听起来您正在寻找关于如何进行键盘处理以将文本插入到Visual Studio缓冲区中的良好示例/参考。
不幸的是,这不是一个有直接答案的问题。 Visual Studio中的键盘处理充其量是复杂的,有时令人沮丧。我试图让这个答案尽可能简单,但不幸的是,这个主题并不简单
首先,Visual Studio将键盘输入路由到命令中至少有5种不同的机制。
您需要涉及哪些内容取决于几个因素
您需要了解哪些内容取决于您希望您的插件如何运行以及您希望它在哪种版本的Visual Studio中运行。虽然有两条基本路线你可以参加
第一个是开发Visual Studio包并为扩展中的每个热键注册DTE.Command
。然后,您需要将IOleCommandTarget
添加到IVsTextView
的过滤器链中以处理您的命令。此方法允许您在大多数情况下处理热键。
第二个是开发一个VSIX,挂钩到IOleCommandTarget
的{{1}}链,并拦截映射到热键的真实Visual Studio命令。
这两种方法都有起伏,但我的答案已经有点太长了。如果你能给我一些更多的细节,我可以尝试给你一个更简洁和有用的答案。
至于例子。 VsVim为Visual Studio进行了相当广泛的键盘处理,并为我提到的任何上述方法提供了示例。
让我知道哪一个让您感兴趣,我可以将您指向源代码中的正确位置。
此外,在努力弄清楚键盘输入的纠结时,我试着记录下我学到的东西。它不完全是最新的,但本文档描述了输入如何路由的更基本方面
修改强>
Jon在评论中指出VSIX + IVsTextView
路线
这是恕我直言最简单的方法。但要注意的一件事是命令绑定如何影响传递到IOleCommandTarget
链的数据。 Visual Studio命令绑定在数据传递到IOleCommandTarget
链之前发生。因此,如果给定的键输入绑定到命令,它将作为命令向下传递IOleCommandTarget
而不是键盘输入。
例如,IOleCommandTarget
通常映射到Visual Studio CTRL-Z
命令。如果用户点击Undo
,则CTRL-Z
将看到撤消命令,而不是键盘输入IOleCommandTarget
。
以下是您可能有兴趣查看的一些示例
CTRL-Z
IOleCommandTarget
的数据转换为实际命令和键盘输入IOleCommandTarget
实际连接到VSIX扩展程序中IOleCommandTarget
。 答案 1 :(得分:1)
也许这可以提供帮助:http://resharperpowertoys.codeplex.com/wikipage?title=ZenCoding
它使用ReSharper作为插件主机。
答案 2 :(得分:1)
我会看看ReSharper的LiveTemplates。您可以使用宏做很多事情,使扩展比简单的填空更智能。我不是那个领域的专家,但我已经看到了一些相当复杂的模板。