我的用于文本格式化的 vs2008 插件非常慢
Posted
技术标签:
【中文标题】我的用于文本格式化的 vs2008 插件非常慢【英文标题】:my vs2008 addin for textformatting is awfully slow 【发布时间】:2010-11-07 00:22:55 【问题描述】:我写了一个小插件,它对我的 C# 代码进行了一些格式化。 在插件 Exec 方法中,我执行以下操作
try
TextSelection selection = (EnvDTE.TextSelection)_applicationObject.ActiveDocument.Selection;
String foo = String.Empty;
if (!text.IsEmpty)
foo = someCoolObjectThatFormatsText.Format(selection.Text);
selection.Text = foo; // here everything gets painfully slow :-(
catch (Exception)
throw;
当行带有代码“SelectedText.Text = foobar;”是调用,VS一步一步重建选择的每一行。您可以轻松地观看它执行此步骤。但我不明白,为什么这么慢。
有什么提示吗? TIA
【问题讨论】:
呃,我猜你的 'foobar' 应该是 'foo',因为我没有看到事先定义的 'foobar'。 你当然是对的。修好了。 摆脱 try/catch。它什么也没做,因为你所做的只是“扔”; 你是对的,但在真正的插件中,异常是被处理的...... 【参考方案1】:JFTR: 我必须使用 TextSelection.Insert(...),但为了获得视觉工作室的缩进深度,我还必须弄乱选定的文本以跨越整个第一行和最后一行的选择:
TextSelection text = (EnvDTE.TextSelection)_applicationObject.ActiveDocument.Selection;
text.SmartFormat(); // sets the correct indention als studio
/* the following lines will expand the selection to whole lines: */
int lineSpan = text.BottomPoint.Line - text.TopPoint.Line;
text.MoveToPoint(text.TopPoint,false);
text.StartOfLine(vsStartOfLineOptions.vsStartOfLineOptionsFirstColumn,false);
text.LineDown(true,lineSpan);
text.EndOfLine(true);
/* and now my custom textformatting */
text.Insert(someCoolObjectThatFormatsText.Format(text.Text),(int)vsInsertFlags.vsInsertFlagsContainNewText);
text.Collapse();
我真的不知道这是否是更改文本选择的好方法,但它工作正常并且比原始插件代码快得多
【讨论】:
太棒了。是的,只使用selection.Insert(myText);
而不是selection.Text = myText;
是可行的方法,它快得离谱。【参考方案2】:
我没有使用过插件,但由于您只要求“提示”,所以这是我的。
在分配之前尝试禁用屏幕更新。
帮助文件也说,
"设置 Text 属性时,Text 的值会插入到所选文本的前面,然后折叠起来,类似于将文本粘贴到文档中时发生的情况。请注意,此属性的行为与键入时一样编辑器处于插入(即非改写)模式。第 128 个字符之后的任何文本都将被截断。"
这似乎意味着该变量没有按预期覆盖,而是附加,然后删除先前的文本。尝试先清空变量,看看它是否改变了什么。
另外,考虑使用 PasteMethod 替换文本而不是分配。
【讨论】:
不,清空变量不起作用,我之前尝试过。以上是关于我的用于文本格式化的 vs2008 插件非常慢的主要内容,如果未能解决你的问题,请参考以下文章
Visual Studio2008即时自动检查语法错误;用于编写Fortran程序。