Как я могу написать макрос VS, который копирует текст между файлами? - PullRequest
2 голосов
/ 27 марта 2012

Я задавал этот вопрос на трех разных форумах, и никто не может понять это. Я пытаюсь написать макрос в 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 голосов
/ 28 марта 2012

Вы можете использовать классы VirtualPoint и TextSelection для выполнения операций такого рода. Извиняюсь, что следующее написано на 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...