如何编写在文件之间复制文本的VS宏?

时间:2012-03-27 19:44:56

标签: visual-studio-2010 replace visual-studio-macros

我在三个不同的论坛上问过这个问题,没有人能搞清楚。我正在尝试在VS2010中编写一个宏来复制一些代码。所以,鉴于此设置:

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

public class bar {
    //[destination1]

    //[/destination1]
}

...目标是单击宏并将代码复制到bar,以便它也覆盖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并捕获它,但是当我这样做时录制一个宏它没有显示任何内容!非常沮丧....任何想法?

1 个答案:

答案 0 :(得分: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字符串替换文本。