Создание простого текстового манипулирующего расширения Visual Studio 2010 - PullRequest
6 голосов
/ 03 ноября 2010

Я давно хотел создать простое расширение для работы с текстом для Visual Studio, и теперь я наконец-то нашел время для изучения написания расширений.То, что я имею в виду, может быть достигнуто с помощью макросов VBA, но я бы предпочел реализовать это как «реальное» расширение;как учебный процесс, и потому, что я, честно говоря, терпеть не могу VBA.

После значительного количества поиска в Google, чтения блогов, поиска в MSDN и просмотра сообщений StackOverflow, я думаю, что я собрал достаточно информации, чтобыреализовать это - но я хотел бы получить некоторые отзывы о том, подхожу ли я к вещам прямо перед тем, как начать взламывать:)

Что я хотел бы:

  1. Регистрация команд, которыепользователи могут привязывать горячие клавиши через Сервис-> Параметры-> Клавиатура.
  2. Изменение текстового буфера активного окна при вызове команд.
  3. Меня не волнуют меню или панели инструментов,но знаете, как добавить его через файлы .vsct (есть ли лучшие варианты?)

Для # 1, кажется, мне нужно сделать полный VSPackage, файл .vsct и так далее - нет ничего хорошегои легко ли использовать точку расширения MEF?(Возможно, экспортируйте IWpfTextViewCreationListener и возитесь с ручной обработкой горячих клавиш - но это было бы серьезным хаком).

Для # 2 я не уверен, как получить ITextBuffer для активногодокумент.Я мог бы пройти через DTE.ActiveDocument, но я не уверен, как получить ITextBuffer из этого.В качестве альтернативы, я мог бы сделать что-то вроде ...

var txtMgr = (IVsTextManager)ServiceProvider.GetService(typeof(SVsTextManager));
IVsTextView textViewCurrent;
txtMgr.GetActiveView(true, null, out textView);
IWpfTextView wpfViewCurrent = AdaptersFactory.GetWpfTextView(textView);
ITextBuffer textCurrent = wpfViewCurrent.TextBuffer;

... но это точно выглядит как обходной путь?

Ответы [ 2 ]

9 голосов
/ 04 ноября 2010

Для обоих из них взгляните на источник расширения Align Assignments . Это компонент package / MEF, который добавляет команду и обрабатывает ее в активном окне.

Ваш ответ на # 1 правильный. Лучший способ выполнять команды - использовать файл .vsct, для которого требуется пакет. Однако все, что означает пакет, это то, что ваш проект будет создавать dll со встроенными ресурсами (из файла .vsct) и файлом .pkgdef, который добавляет ключи реестра в соответствии с атрибутами, указанными в пакете. Это (надеюсь) не слишком много накладных расходов.

Для вашего второго вопроса есть более чистый способ. Взгляните на фильтр команд , который прослушивает команды в активном представлении вместо глобального их прослушивания, а затем находит активное представление. Это позволяет оболочке обрабатывать маршрутизацию команд и просто концентрируется на реализации.

0 голосов
/ 03 ноября 2010

Не совсем уверен, что вы подразумеваете под «текстовым буфером», но при условии, что вы имеете в виду либо текущий открытый текстовый файл, либо текущий выбор, вот некоторый код, который у меня есть в пакете для доступа к ним:

EnvDTE.DTE app = (EnvDTE.DTE)GetService(typeof(SDTE)); 
if (app.ActiveDocument != null && app.ActiveDocument.Type == "Text")
{
   EnvDTE.TextDocument text = (EnvDTE.TextDocument)app.ActiveDocument.Object(String.Empty);
   if (!text.Selection.IsEmpty)
   {
      //work with text.Selection.Text
   }
}

Конечно, если вы делаете расширение для редактора, оно будет другим.

...