2012-03-27 19 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

相关问题