8

我想构建一个 Visual Studio 2010 VSIX 扩展,它基于对方法的调用(使用Zen Coding 基于选择器的语法)扩展一些文本。理想情况下,用户键入一串文本,点击热键,文本串就会被展开。

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

我看过的一些参考资料:

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

4

3 回答 3

9

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

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

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

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

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

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

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

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

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

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

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

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

编辑

乔恩在评论中指出 VSIX +IOleCommandTarget路线

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

例如CTRL-Z通常映射到 Visual StudioUndo命令。如果用户点击CTRL-Z然后IOleCommandTarget将看到 Undo 命令而不是键盘输入CTRL-Z

以下是您可能有兴趣查看的一些示例

  • VsCommandTarget:示例实现IOleCommandTarget
  • OleCommandUtil:用于将传入的数据转换IOleCommandTarget为实际的命令和键盘输入
  • HostFactory :详细说明如何将一个从 VSIX 扩展 实际连接IOleCommandTarget到一个。IVsTextView
于 2011-07-01T17:27:53.503 回答
1

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

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

于 2011-07-01T09:59:02.670 回答
1

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

于 2011-07-01T11:40:34.680 回答