我一直想为Visual Studio创建一个简单的文本操作扩展,现在我终于找到了一些时间来研究如何编写扩展。我想到的可以通过VBA宏来实现,但我宁愿将其作为“真正的”扩展来实现;作为一个学习过程,因为老实说我不能忍受VBA。
经过大量的谷歌搜索,博客阅读,深入研究MSDN和浏览StackOverflow帖子后,我想我已经收集了足够的信息,我可以实现它 - 但我想要一些关于我是否正确处理事情的反馈在我开始乱砍之前:)
我想要的是:
对于#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;
......但这确实看起来像是一种迂回的做事方式?
答案 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
}
}
当然,如果您正在进行编辑器扩展,那将会有所不同。