Как работи intellisense в Visual Studio?

Надявам се, че това е валиден въпрос: как работи intellisense във VS2008? Търся това, което се знае за алгоритъма, който използва, за да намери предложенията, кога точно се появява („.“ е само един очевиден тригер), как поведението му може да бъде променено, ако изобщо е възможно, и т.н.

За да поставя този въпрос в контекст: Основният проблем, който се опитвам да разреша, е как да активирам и деактивирам intellisense в части от екрана на редактора и как да променя къде търси, за да попълни полето за предложения.

Всякаква информация е добре дошла.


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


Отговори (7)


Разгледайте тази статия за DIY Intellisense в CodeProject.

person Galwegian    schedule 07.05.2009

По-забавно е обаче да се направи обратно инженерство. Нека разгледаме проблема:

  • трябва да идентифицирате думите, които ви интересуват
  • трябва да намерите възможните опции
  • трябва да ги представите

Първата стъпка означава, че трябва да анализирате кода. Имате ключовите думи C/C**, предварително анализирате различните декларации на функции и класове и ги зареждате в някакъв вид структура от данни. След това анализирате кода и съхранявате имената на класа, променливата и т.н. и ги поставяте в същата структура от данни.

Втората стъпка означава, че искате структура от данни, която ефективно може да търси частична дума и да получи всички думи, които имат този префикс. Можете да направите това с регулярни изрази, но това не е много ефективно. Ефективна структура от данни за този вид търсене е trie, която се обсъжда тук на 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 подобрения, които поддържат алтернативен intellisense, това предполага редица отговори. Ако говорите конкретно за C#, вижте Инструменти | Опции | Текстов редактор | C# | Област Intellisense, за да видите наличните опции за опции за завършване. Що се отнася до използвания алгоритъм(и), вие ще търсите метаданните на асембли, обилно кеширане на членове на типа, MRU списък за последния член, избран за конкретен тип, и т.н. Ако имате по-конкретен въпрос, бих предложил изяснявате.

Вижте примера за DSL (ironpython) и неговата реализация тук.

person Adam Markowitz    schedule 07.05.2009

Не съм виждал никакъв текстов редактор във VS, който да ограничава къде се показва IntelliSense. Всичко е специфично за езика. Ако вашият курсор е разположен в точка, където IntelliSense може да допринесе за валиден токен, тогава той ще бъде използван.

Вярвам, че има някакво взаимодействие с използваната проектна система, но това е, доколкото знам. Също така вярвам, че има примерна проектна система в Visual Studio SDK и това може да ви даде представа.

person John Saunders    schedule 07.05.2009

За такива случаи понякога използвам собствената си версия на InteliSense, която разработих за AutoHotKey, когато искат конкретно поведение. Смисълът на този скрипт е, че може да се използва с всеки редактор или с всеки контрол, приемащ текст. Работи, като записва въвеждането на текст и го интерпретира в синтактичен файл.

Може би можете да го използвате като основа за това, което искате да постигнете. Използвах ISense успешно с няколко езика, които нямат такова нещо, като Csound или дори batch скриптове. Ще бъде възможно да се разшири, за да поддържа C#, като се използва мониторинг на входа в комбинация с Reflection.

Както и да е, с AHK можете дори да контролирате VS intelissense, като "вземете" списъка с елементи, които представя, и го филтрирате, или подобни неща. Може да имате малки проблеми с границите на процеса, но нищо, което да не може да бъде коригирано.

Intellisense ius като цяло, AFAIK, реализиран с помощта на различни методи. Четох, че Delphi е толкова бърз, че внедрява isense чрез прекомпилиране на проекта на всеки токен и това е причината C++ Builder да няма isense, тъй като компилирането му е много бавно.

person majkinetor    schedule 07.05.2009

Що се отнася до вашия въпрос как да промените къде изглежда, краткият отговор е, че не можете. Intellisense в по-голямата си част се осигурява чрез отразяване на сборки, включени във вашия проект (и някои други трикове с C++). Това, което получавате, е резултат от обработката на VS чрез всички сглобки, които сте включили, и всички сглобки от GAC.

Въпреки това, ако искате да предоставите изрични резултати от intellisense от проект, върху който работите, погледнете IVsContextualIntellisenseFilterProvider

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

person Serapth    schedule 07.05.2009