Как работает intellisense в Visual Studio? - PullRequest
9 голосов
/ 07 мая 2009

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

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

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

Ответы [ 7 ]

10 голосов
/ 07 мая 2009

Взгляните на эту статью DIY Intellisense на CodeProject.

7 голосов
/ 07 мая 2009

Тем не менее, это более забавно - перепроектировать его. Давайте рассмотрим проблему:

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

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

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

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

0 голосов
/ 07 мая 2009

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

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

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

0 голосов
/ 07 мая 2009

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

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

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

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

0 голосов
/ 07 мая 2009

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

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

0 голосов
/ 07 мая 2009

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

См. Пример DSL (ironpython) и его реализации здесь .

0 голосов
/ 07 мая 2009

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

...