2009-06-30 22 views
3

我寫了一個小插件,它做了一些我的C#代碼的格式化。在加載項 exec方法i執行以下我的vs2008插件用於textformatting非常慢

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

+1

爾的方式更快,我猜你的「foobar的」應該是'foo',因爲我沒有看到預先定義的'foobar'。 – 2009-07-03 14:47:07

+0

你當然是對的。修復。 – helpless 2009-07-08 07:51:46

+0

擺脫try/catch。它沒有做任何事情,因爲你所做的只是「扔」; – 2009-07-08 07:54:06

回答

2

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(); 

我真的不知道這閹是改變textselections一個很好的方式,但它工作正常,並比原來的插件代碼

0

我沒有使用過插件,但既然你只是要求'提示',這裏是我的。

嘗試禁用屏幕更新,然後再進行分配。

而且幫助文件說,

「當文本屬性設置,文字的值插入所選文本的前面,然後暈倒,類似於當文本粘貼到文檔中會發生什麼。請注意,該屬性的行爲與編輯器插入時(即非超類型)模式下的輸入方式相同,第128個字符後的任何文本都被截斷。

這似乎暗示該變量未按預期過份寫入,而是附加上,然後刪除前一個文本。嘗試先清空變量,看看它是否改變了任何東西。

此外,請考慮使用PasteMethod替代文本而不是分配。