2

我在三个不同的论坛上问过这个问题,没有人能弄清楚。我正在尝试在 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 并捕获它,但是当我这样做录制宏时,它什么也没有显示!!非常沮丧....有什么想法吗?

4

1 回答 1

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

于 2012-03-27T21:17:13.413 回答