Visual studio intellisense在Visual Studio中是如何工作的?

Visual studio intellisense在Visual Studio中是如何工作的?,visual-studio,intellisense,Visual Studio,Intellisense,我希望这是一个正确的问题:intellisense在VS2008中是如何工作的?我想知道的是,它用来寻找建议的算法,它什么时候弹出(“the”。”只是一个明显的触发器),如果可能的话,如何修改它的行为,等等 将这个问题放到上下文中:我试图解决的主要问题是如何在编辑器屏幕的部分中激活和停用intellisense,以及如何修改搜索位置以填充建议框 欢迎提供所有信息 Eclipse也有这个特性,它是一个开源项目。为什么不通过实际查看代码来了解Eclipse是如何做到的呢?这个问题太宽泛了。由于VS

我希望这是一个正确的问题:intellisense在VS2008中是如何工作的?我想知道的是,它用来寻找建议的算法,它什么时候弹出(“the”。”只是一个明显的触发器),如果可能的话,如何修改它的行为,等等

将这个问题放到上下文中:我试图解决的主要问题是如何在编辑器屏幕的部分中激活和停用intellisense,以及如何修改搜索位置以填充建议框


欢迎提供所有信息

Eclipse也有这个特性,它是一个开源项目。为什么不通过实际查看代码来了解Eclipse是如何做到的呢?

这个问题太宽泛了。由于VS IDE支持多种不同的语言,并且有N种DSL和IDE增强功能支持替代intellisense,这意味着有许多答案。如果您特别提到C#,请查看工具|选项|文本编辑器| C#| Intellisense区域以查看完成选项的可用选项。就使用的算法而言,您需要查找程序集的元数据、类型成员的大量缓存、为特定类型选择的最后一个成员的MRU列表等。如果您有更具体的问题,我建议您澄清


请参阅DSL(ironpython)及其实现的示例。

请在CodeProject上查看此示例。

不过,对其进行反向工程更有趣。让我们考虑这个问题:

  • 你需要确定感兴趣的词语
  • 你需要找到可能的选择
  • 你需要展示它们
现在,第一步意味着您必须解析代码。有了C/C**关键字,就可以预解析各种函数和类声明,并将它们加载到某种数据结构中。然后解析代码,存储类、变量等名称,并将它们放在相同的数据结构中

第二步意味着您需要一个数据结构,该结构可以高效地搜索部分单词并获取所有具有该前缀的单词。您可以使用正则表达式来实现这一点,但这不是很有效。这种搜索的一种有效数据结构是trie,本文对此进行了讨论


一旦你有了一系列的可能性,你就可以展示它。您可能希望保留对可能性树根的引用,以便在有人键入更多字母时实时搜索它们。

我在VS中没有看到任何限制IntelliSense显示位置的文本编辑器。都是特定语言的。如果您的光标位于IntelliSense可能有助于生成有效令牌的位置,则此时将使用它


我相信与正在使用的项目系统有一些交互作用,但据我所知。我还相信Visual Studio SDK中有一个示例项目系统,这可能会给您一个想法。

对于这种情况,我有时会使用我自己开发的IntelSense版本,当我需要特定的行为时。这个脚本的要点是,它可以用于任何编辑器,或者基本上是任何接受文本的控件。它的工作原理是记录文本输入,并根据语法文件进行解释

你也许可以把它作为你想要实现的目标的基础。我成功地将ISense与几种没有这种功能的语言一起使用,比如,甚至是批处理脚本。将其扩展到支持C#将输入监控与反射相结合是可能的

无论如何,使用AHK,您甚至可以通过“获取”它显示的项目列表并对其进行过滤或类似操作来控制VS intelissense。您可能在流程边界方面有一些小问题,但没有无法修复的问题


intellisense通常使用不同的方法实现。我读到Delphi是如此之快以至于它通过重新编译每个令牌上的项目来实现ISSACNSE,这就是为什么C++编译程序在编译速度很慢时没有ISISON的原因。绝大部分智能感知是通过对项目中包含的程序集的反射(以及C++的其他技巧)提供的。您得到的是VS处理所有包含的程序集和GAC中的所有程序集的结果

这就是说,如果您想从正在进行的项目中提供明确的intellisense结果,请查看


最后,要了解一些幕后过程,请查看我正在扩展VS以获得内部特定领域的语言