我的用于文本格式化的 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程序。

VS2008 格式化时候乱码 或者 为全为0

保存时自动重新格式化VS2008中整个C/C++源文件的免费工具? [关闭]

VS2008开发WinCE程序编译速度慢的解决办法

如何把VS2008的Solution改成VS2005格式

ASP.NET、VS2008 中的“无法重新格式化文档”