在Visual Studio中,智能感知是如何工作的?

14

希望这是一个有效的问题:Intellisense在VS2008中是如何工作的?我想知道它用于查找建议的算法,它什么时候弹出("."只是一个明显的触发器),如果可能的话,如何修改其行为等等。

为了将这个问题放入背景中:我试图解决的主要问题是如何在编辑器屏幕的部分中启用和禁用intellisense,以及如何修改它搜索以填充建议框的位置。

欢迎提供所有信息。

7个回答

14

8
尽管这样反向工程更有趣。 让我们考虑问题:
- 您需要识别感兴趣的单词 - 您需要找到可能的选项 - 您需要呈现它们
现在,第一步意味着您必须解析代码。 您拥有C / C **关键字,预先解析各种函数和类声明,并将它们加载到某种数据结构中。 然后解析代码并存储类,变量等名称,并将它们放入相同的数据结构中。
第二步意味着您需要一个数据结构,它可以高效地搜索部分单词并获取具有该前缀的所有单词。 您可以使用正则表达式来实现,但那不是很有效。 针对这种搜索的高效数据结构是trie,可以在 SO上讨论
一旦您拥有可能性列表,您只需呈现即可。 您可能希望保留对可能性树根的引用,以便在有人键入更多字母时实时搜索它们。

0
Eclipse也有这个功能,而且它是一个开源项目。为什么不通过查看代码来了解Eclipse是如何实现的呢?

我正在扩展VS,用于内部领域特定语言。 - Dervin Thunk

0

这个问题太宽泛了。由于VS IDE支持多种不同的语言,而且有N种DSL和IDE增强功能,支持可选的Intellisense,这意味着会有很多答案。如果你指的是特定的C#语言,那么请参见工具 | 选项 | 文本编辑器 | C# | Intellisense区域,以查看可用的完成选项。至于使用的算法,您需要查找程序集元数据、大量缓存类型成员、特定类型的上一个成员的MRU列表等。如果您有更具体的问题,请说明。

查看DSL(ironpython)的示例及其实现here


0

我在VS中没有看到任何限制IntelliSense出现位置的文本编辑器。这完全取决于语言。如果您的光标位于IntelliSense可能对有效令牌有所贡献的位置,那么它将被使用。

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


0
对于这种情况,我有时会使用我自己开发的InteliSense版本,用于AutoHotKey,当我需要特定的行为时。这个脚本的重点是它可以与任何编辑器或基本上接受文本的控件一起使用。它通过记录文本输入并在语法文件上进行解释来工作。
您可以将其用作实现所需功能的基础。我已经成功地将ISense与几种没有此类功能的语言(如Csound或批处理脚本)一起使用。可以通过使用输入监视和反射相结合来扩展它以支持C#。
无论如何,使用AHK,您甚至可以通过“获取”它呈现的项目列表并过滤它或执行类似操作来控制VS intelissense。您可能会遇到一些进程边界的小问题,但没有什么无法解决的。
据我所知,intellisense通常是使用不同的方法实现的。我读到Delphi非常快,它通过在每个标记上重新编译项目来实现isense,这就是C++ Builder没有isense的原因,因为它的编译速度非常慢。

0
关于你如何更改它查找的问题,简短的回答是,你不能。Intellisense大部分是由项目中包含的程序集反射提供的(以及一些使用C++的其他技巧)。你得到的结果是VS处理你所包含的所有程序集和GAC中的所有程序集的结果。
话虽如此,如果你想从你正在工作的项目中提供明确的Intellisense结果,请查看IVsContextualIntellisenseFilterProvider。
最后,为了了解幕后过程,可以查看这篇博客文章。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接