2012-03-27 64 views
2

我在三個不同的論壇上提出過這個問題,沒有人可以弄明白。我試圖在VS2010中編寫一個宏,它將複製一些代碼。因此,鑑於這種設置:如何編寫一個在文件之間複製文本的VS宏?

public class foo { 
    //[source1] 
    public overrides string ToString() { 
     return "Hello from Foo" 
    } 
    //[/source1] 
} 

public class bar { 
    //[destination1] 

    //[/destination1] 
} 

...目標是點擊宏和已複製到酒吧的代碼,使其覆蓋的ToString()也。我有一個半工作版本

DTE.Find.FindWhat = "(//\[source1\]{(.|\n)*})//\[/source1\])|//\[destination1\]{(.|\n)*}//\[/destination1\]" 
    DTE.Find.Target = vsFindTarget.vsFindTargetSolution 
    DTE.Find.MatchCase = False 
    DTE.Find.MatchInHiddenText = True 
    DTE.Find.PatternSyntax = vsFindPatternSyntax.vsFindPatternSyntaxRegExpr 
    DTE.Find.ResultsLocation = vsFindResultsLocation.vsFindResultsNone 
    DTE.Find.Action = vsFindAction.vsFindActionReplaceAll 

......只是如果這些類在不同的文件中是完全沒有用的。我無法捕捉到找到的實際匹配;我可以將它們輸出到vsFindResults1,但我無法用宏選擇窗口文本。我可以點擊它,Ctrl-A - > Ctrl-C並捕獲它,但是當我錄製一個宏時,它什麼也不顯示!非常沮喪....任何想法?

回答

0

您可以使用VirtualPointTextSelection類來完成這種操作。抱歉,以下是在C#中,但VB應該看起來非常相似。這不會給你你需要的確切答案,但至少會向你展示一些你需要看的類(TextSelection和VirtualPoint類並不明顯,除非你碰巧知道它們,我認爲)

TextSelection sel=ActiveWindow.Selection; 
sel.StartOfDocument(); 

// Use your find options here: 
if (sel.FindText(textToFind, (int)vsFindOptions.vsFindOptionsNone)) { 
    string matchedSourceText=sel.Text; 

    // use your replacement options here. This sets selection to the replacement text 
    if (sel.FindText(textToReplace, (int)vsFindOptions.vsFindOptionsNone)) { 
    sel.Insert(matchedSourceText, (int)EnvDTE.vsInsertFlags.vsInsertFlagsCollapseToEnd); 
} 

這將向您顯示如何捕獲從選擇中搜索的文本以及如何查找替換文本位置並替換其中的文本。在你的情況下你需要做的是迭代所有的ProjectItems並用matchedSourceText字符串替換文本。

+0

啊,所以我將不得不迭代自己。我會試試這個。 – MrEff 2012-03-28 16:11:45

+0

沒錯。有幾種方法可以做到這一點,但我記得,有一種方法是迭代項目中的ProjectItems。 – 2012-03-28 18:49:23

相關問題