Расширение Visual Studio 2010, которое выполняет расширение кода - PullRequest
8 голосов
/ 01 июля 2011

Я хочу создать расширение Visual Studio 2010 VSIX, которое расширяет некоторый текст на основе вызова метода (используя синтаксис на основе селектора Zen Coding ).В идеале пользователь должен набрать строку текста, нажать горячую клавишу, и строка текста будет развернута.

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

Некоторые ссылки, на которые я смотрел:

Обновление: я знаю, что Resharper и CodeRush делают подобные вещи.Я хотел бы сделать это как отдельный плагин, если это возможно.

Ответы [ 3 ]

9 голосов
/ 01 июля 2011

Похоже, вы ищете хороший пример / справку о том, как выполнять обработку клавиатуры для вставки текста в буфер Visual Studio.

К сожалению, это не тот вопрос, на который есть прямой ответ. Работа с клавиатурой в Visual Studio в лучшем случае сложна, а время от времени тянет за волосы. Я постарался сделать этот ответ максимально простым, но, к сожалению, тема не поддается простоте

Для начала существует как минимум 5 различных механизмов, с помощью которых Visual Studio направляет ввод с клавиатуры в команды.

Какой из них вам нужно подключить, зависит от нескольких факторов

  • В каких версиях Visual Studio надстройка должна работать?
  • Какой тип надстройки вы будете собирать: реальный Addin, Vs Package или VSIX
  • Как глубоко вы заботитесь о победе в битве за ввод с клавиатуры

То, что вам нужно подключить, во многом зависит от того, как вы хотите, чтобы ваш плагин работал, и в каких версиях Visual Studio вы хотите, чтобы он работал. Хотя есть 2 основных маршрута, которые вы можете выбрать, хотя

Первый - это разработка пакета Visual Studio и регистрация DTE.Command для каждой горячей клавиши в вашем расширении. Затем вам нужно добавить IOleCommandTarget в цепочку фильтров IVsTextView s для обработки ваших команд. Такой подход позволит вам обрабатывать ваши горячие клавиши в большинстве сценариев.

Второй - разработать VSIX, подключиться к цепочке IOleCommandTarget IVsTextView и перехватить реальные команды Visual Studio, которые отображаются на ваши горячие клавиши.

У обоих этих подходов есть свои взлеты и падения, но мой ответ уже слишком длинный. Если вы можете дать мне более подробную информацию, я постараюсь дать вам более краткий и полезный ответ.

Что касается примеров. VsVim выполняет довольно обширную обработку клавиатуры для Visual Studio и имеет пример для любого из перечисленных выше методов.

Дайте мне знать, какой из них вас интересует, и я могу указать вам правильное место в исходном коде.

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

EDIT

Джон указал в комментариях VSIX + IOleCommandTarget route

Это ИМХО самый простой подход. Однако следует помнить, что привязки команд влияют на данные, которые передаются по цепочке IOleCommandTarget. Привязка команд Visual Studio происходит до того, как данные передаются в цепочку IOleCommandTarget. Поэтому, если заданный клавишный ввод связан с командой, он будет передан IOleCommandTarget как команда, а не клавиатурный ввод.

Например, CTRL-Z обычно сопоставляется команде Visual Studio Undo. Если пользователь нажмет CTRL-Z, то IOleCommandTarget увидит команду Отменить, а не ввод с клавиатуры CTRL-Z.

Вот несколько примеров, которые могут вас заинтересовать

  • VsCommandTarget : пример реализации IOleCommandTarget
  • OleCommandUtil : используется для преобразования данных, передаваемых в IOleCommandTarget, в фактические команды и ввод с клавиатуры
  • HostFactory : подробно рассказывается, как на самом деле подключить IOleCommandTarget к IVsTextView из расширения VSIX.
1 голос
/ 01 июля 2011

Я бы посмотрел на построение на живых шаблонах ReSharper.Вы можете многое сделать с помощью макросов, чтобы сделать расширение более интеллектуальным, чем простое заполнение пробелов.Я не эксперт в этой области, но я видел несколько довольно сложных шаблонов, построенных таким образом.

1 голос
/ 01 июля 2011

Может быть, это может помочь: http://resharperpowertoys.codeplex.com/wikipage?title=ZenCoding

Он использует ReSharper в качестве хоста подключаемого модуля.

...