Как IntelliSense работает в Visual Studio?

Я надеюсь, что это правильный вопрос: как работает intellisense в VS2008? Меня интересует то, что известно об алгоритме, который он использует для поиска предложений, когда именно он появляется («.» — это всего лишь один из очевидных триггеров), как его поведение можно изменить, если это вообще возможно, и т. д.

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

Вся информация приветствуется.


person Dervin Thunk    schedule 07.05.2009    source источник


Ответы (7)


Взгляните на эту статью Intellisense своими руками на сайте CodeProject.

person Galwegian    schedule 07.05.2009

Однако гораздо интереснее реконструировать его. Рассмотрим проблему:

  • вам нужно определить интересующие слова
  • нужно найти возможные варианты
  • вам нужно представить их

Теперь первый шаг означает, что вам нужно разобрать код. У вас есть ключевые слова C/C**, вы предварительно анализируете различные объявления функций и классов и загружаете их в какую-то структуру данных. Затем вы анализируете код и сохраняете имена классов, переменных и т. д. и помещаете их в одну и ту же структуру данных.

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

Когда у вас есть список возможностей, вы просто представляете его. Вы, вероятно, захотите сохранить ссылку на корень дерева возможностей, чтобы вы могли искать их в режиме реального времени, когда кто-то набирает новые буквы.

person Charlie Martin    schedule 07.05.2009

Eclipse также имеет эту функцию, и это проект с открытым исходным кодом. Почему бы не проверить, как это делает Eclipse, взглянув на код?

person Peter D    schedule 07.05.2009
comment
Я расширяю VS для внутреннего предметно-ориентированного языка - person Dervin Thunk; 07.05.2009

Этот вопрос слишком широк. Поскольку существует ряд различных языков, которые VS IDE поддерживает «из коробки», И существует N улучшений DSL и IDE, которые поддерживают альтернативный интеллект, это подразумевает ряд ответов. Если вы говорите конкретно о C#, см. Инструменты | Опции | Текстовый редактор | С# | Область Intellisense, чтобы просмотреть доступные параметры завершения. Что касается используемого алгоритма [ов], вы будете искать метаданные сборок, обильное кэширование членов типа, список MRU для последнего члена, выбранного для определенного типа, и т. д. Если у вас есть более конкретный вопрос, я бы предложил вы уточняете.

См. пример DSL (железный питон) и его реализацию здесь.

person Adam Markowitz    schedule 07.05.2009

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

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

person John Saunders    schedule 07.05.2009

В таких случаях я иногда использую собственную версию InteliSense, разработанную для AutoHotKey, когда я хочется определенного поведения. Суть этого скрипта в том, что его можно использовать с любым редактором или вообще с любым элементом управления, принимающим текст. Он работает, записывая ввод текста и интерпретируя его в файле синтаксиса.

Возможно, вы можете использовать его как основу для того, чего хотите достичь. Я успешно использовал ISense с несколькими языками, в которых нет такой функции, например Csound или даже с пакетным скрипты. Его можно будет расширить для поддержки C#, используя мониторинг ввода в сочетании с Reflection.

В любом случае, с AHK вы даже можете управлять VS intelissense, «взяв» список элементов, которые он представляет, и отфильтровать его или что-то подобное. У вас могут быть небольшие проблемы с границами процессов, но ничего нельзя исправить.

Как правило, Intellisense ius, насколько я знаю, реализуется с использованием разных методов. Я читал, что Delphi настолько быстр, что реализует isense путем перекомпиляции проекта на каждом токене, и по этой причине C++ Builder не имеет isense, так как компилируется очень медленно.

person majkinetor    schedule 07.05.2009

Что касается вашего вопроса о том, как изменить внешний вид, краткий ответ: вы не можете. Intellisense по большей части обеспечивается отражением сборок, включенных в ваш проект (и некоторыми другими трюками с C++). То, что вы получаете, является результатом обработки VS всех включенных вами сборок и всех сборок из GAC.

Тем не менее, если вы хотите предоставить явные результаты IntelliSense из проекта, над которым вы работаете, загляните в IVsContextualIntellisenseFilterProvider

Наконец, чтобы получить некоторое представление о закулисном процессе, проверьте эту сообщение в блоге

person Serapth    schedule 07.05.2009