执行代码扩展的Visual Studio 2010扩展
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了执行代码扩展的Visual Studio 2010扩展相关的知识,希望对你有一定的参考价值。
我想构建一个Visual Studio 2010 VSIX扩展,它基于对方法的调用(使用Zen Coding selector-based syntax)扩展一些文本。理想情况下,用户可以键入文本字符串,点击热键,然后展开文本字符串。
我看了很多样本,但他们都把重点放在全面的语言服务或简单的装饰上。理想情况下,我想找到一个完整的工作示例,但我对接口/类和一些代码感到满意。
我看过一些参考文献:
- http://msdn.microsoft.com/en-us/library/bb165336.aspx
- http://msdn.microsoft.com/en-US/vstudio/ff718165.aspx
- http://msdn.microsoft.com/en-us/library/ee372314.aspx
更新:我知道Resharper和CodeRush会做这种事情。如果可能的话,我想把它作为一个独立的插件。
听起来您正在寻找关于如何进行键盘处理以将文本插入到Visual Studio缓冲区中的良好示例/参考。
不幸的是,这不是一个直截了当的答案的问题。 Visual Studio中的键盘处理充其量是复杂的,有时令人沮丧。我试图尽可能简单地保持这个答案,但不幸的是,这个主题并不简单
首先,Visual Studio将键盘输入路由到命令中至少有5种不同的机制。
- 绑定到已知的Visual Studio命令
- 通过KeyProcessor(仅限2010年及以上)
- 通过IVsFilterKeys.TranslateAccelerator(2005年及以上IIRC)
- 通过IOleCommandTarget
- Alt键映射(我实际上根本不理解的东西)
您需要涉及哪些内容取决于几个因素
- 您希望addin运行的Visual Studio版本是什么?
- 您将构建什么类型的加载项:实际的Addin,Vs Package或VSIX
- 你对赢得键盘输入的战斗有多深切
您需要了解哪些内容取决于您希望您的插件如何运行以及您希望它在哪种版本的Visual Studio中运行。虽然有2条基本路线可供选择
第一个是开发Visual Studio包并为扩展中的每个热键注册DTE.Command
。然后,您需要将IOleCommandTarget
添加到IVsTextView
s过滤器链中以处理您的命令。此方法允许您在大多数情况下处理热键。
第二个是开发一个VSIX,挂钩到IOleCommandTarget
的IVsTextView
链,并拦截映射到热键的真实Visual Studio命令。
这两种方法都有起伏不定,但我的答案已经有点太长了。如果你能给我一些更多的细节,我可以尝试给你一个更简洁和有用的答案。
至于例子。 VsVim为Visual Studio进行了相当广泛的键盘处理,并为我提到的任何上述方法提供了示例。
让我知道哪一个让您感兴趣,我可以将您指向源代码中的正确位置。
此外,在努力弄清楚键盘输入的纠结时,我试着记录下我学到的东西。它并不完全是最新的,但本文档描述了输入如何路由的更基本方面
编辑
乔恩在评论中表示VSIX + IOleCommandTarget
路线
这是恕我直言最简单的方法。但要注意的一件事是命令绑定如何影响传递到IOleCommandTarget
链的数据。 Visual Studio命令绑定在数据传递到IOleCommandTarget
链之前发生。因此,如果给定的键输入绑定到命令,它将作为命令向下传递IOleCommandTarget
而不是键盘输入。
例如,CTRL-Z
通常映射到Visual Studio Undo
命令。如果用户点击CTRL-Z
,那么IOleCommandTarget
将看到撤消命令,而不是键盘输入CTRL-Z
。
以下是您可能感兴趣的一些示例
- VsCommandTarget:
IOleCommandTarget
的示例实现 - OleCommandUtil:用于将传递到
IOleCommandTarget
的数据转换为实际命令和键盘输入 - HostFactory:详细说明如何将
IOleCommandTarget
从VSIX扩展中连接到IVsTextView
。
也许这可以帮助:http://resharperpowertoys.codeplex.com/wikipage?title=ZenCoding
它使用ReSharper作为插件主机。
我会看看在ReSharper的LiveTemplates上构建。您可以使用宏做很多事情,使扩展比简单的填空更智能。我不是那个领域的专家,但我已经看到了一些相当复杂的模板。
以上是关于执行代码扩展的Visual Studio 2010扩展的主要内容,如果未能解决你的问题,请参考以下文章
为啥这段代码不能在 Visual Studio 2010 中编译和运行?
为 Visual Studio 2010 编写代码生成插件的教程
如何忽略 '$' 未定义 JsHint 错误。 (Visual Studio 2010 JsHint 扩展)