创建一个简单的文本操作Visual Studio 2010扩展

时间:2010-11-03 08:16:00

标签: c# visual-studio-2010 mef vsx

我一直想为Visual Studio创建一个简单的文本操作扩展,现在我终于找到了一些时间来研究如何编写扩展。我想到的可以通过VBA宏来实现,但我宁愿将其作为“真正的”扩展来实现;作为一个学习过程,因为老实说我不能忍受VBA。

经过大量的谷歌搜索,博客阅读,深入研究MSDN和浏览StackOverflow帖子后,我想我已经收集了足够的信息,我可以实现它 - 但我想要一些关于我是否正确处理事情的反馈在我开始乱砍之前:)

我想要的是:

  1. 注册用户可以通过工具绑定热键的命令 - >选项 - >键盘。
  2. 在调用命令时修改活动窗口的文本缓冲区。
  3. 我真的不关心菜单或工具栏,但知道如何通过.vsct文件添加它(有更好的选择吗?)
  4. 对于#1,似乎我必须完成一个完整的VSPackage,.vsct文件等等 - 我没有可以处理的简单易用的MEF扩展点吗? (也许导出IWpfTextViewCreationListener并摆弄手动键盘快捷键处理 - 但这是一个主要的黑客攻击。)

    对于#2,我不确定如何为活动文档获取ITextBuffer。我可以通过DTE.ActiveDocument,但我不确定如何从中获得ITextBuffer。或者,我可以按照......的方式做点什么。

    var txtMgr = (IVsTextManager)ServiceProvider.GetService(typeof(SVsTextManager));
    IVsTextView textViewCurrent;
    txtMgr.GetActiveView(true, null, out textView);
    IWpfTextView wpfViewCurrent = AdaptersFactory.GetWpfTextView(textView);
    ITextBuffer textCurrent = wpfViewCurrent.TextBuffer;
    

    ......但这确实看起来像是一种迂回的做事方式?

2 个答案:

答案 0 :(得分:9)

对于这两者,请查看Align Assignments extension source。它是一个包/ MEF组件,它添加一个命令并在活动窗口中处理它。

你对#1的回答是正确的。执行命令的最佳方法是使用.vsct文件,该文件需要一个包。但是,所有包都意味着您的项目将生成包含嵌入资源(来自.vsct文件)和.pkgdef文件的dll,该文件根据您在包中提供的属性添加注册表项。它(希望)不是太多开销。

对于你的第二个问题,有一种更清洁的方式。查看在活动视图中侦听命令的command filter,而不是全局侦听它们,然后查找活动视图。它允许shell处理命令路由,并专注于实现。

答案 1 :(得分:0)

不完全确定“文本缓冲区”是什么意思,但假设您指的是当前打开的文本文件或当前选择,这里是我在包中访问这些文件的一些代码:

EnvDTE.DTE app = (EnvDTE.DTE)GetService(typeof(SDTE)); 
if (app.ActiveDocument != null && app.ActiveDocument.Type == "Text")
{
   EnvDTE.TextDocument text = (EnvDTE.TextDocument)app.ActiveDocument.Object(String.Empty);
   if (!text.Selection.IsEmpty)
   {
      //work with text.Selection.Text
   }
}

当然,如果您正在进行编辑器扩展,那将会有所不同。