通用代码完成库/工具

时间:2012-09-07 23:02:05

标签: autocomplete code-completion

我正在尝试在我最喜欢的编辑器中设置正确的代码完成,让我们称之为AnEditor,以避免互联网充满的程序特定的答案。 (而且语言是ALanguage,你知道。)编辑器有两个我喜欢的功能:它在控制台和GUI中一样好,所以我可以通过网络使用它,并且它具有很大的可扩展性。所以我不愿意使用一个完整的IDE。但是编辑器没有可靠的代码完成,但如果我找到一个合适的解决方案,它可以插入。

我在 [editor / IDE Y] 中搜索了一大堆关于“ [语言X] 完成的问题和解决方案”。似乎每个新IDE都从头开始为每种语言实现代码完成,解析器和所有语言。每个更简单的编辑器(包括AnEditor)都会执行以下操作之一:

  • 仅完成标准库函数名称,
  • 或者使用ctags提供基于正则表达式的“基于正则表达式”的解析(对于非C程序),并且不应该告诉你刚才输入的变量的类型,这对于真正的代码完成不是很有用,
  • 如果编辑器可以使用插件进行扩展,还有其他方法,但它们通常可以归结为上面的或多或少的变态组合,以及大量的自定义正则表达式。

现在,问题是,为什么我们不能有一个声音代码完成库,我可以插入AnEditor和其他人到ABigIDE?据我所知(解读C指针丛林不是我的目标),答案应该看起来像这样:

  • yacc / lex / bison(或静态分析器)风格的通用解析器,在编写过程中以某种方式放松以容忍代码,能够理解JavaDoc风格的注释。并且速度最快,因此可以在飞行中使用
  • 一个索引,可以告诉类'成员,方法'签名及其在文件中的位置(ctags现在这样做),从JavaDoc注释中返回值和其他文档
  • 另一个知道变量类型的索引,以及根据当前写入的文件或代码中的位置来告诉类型的函数

因此,要完成某些语言的工作,您需要为语言编写解析器规则,在标准库和项目上构建索引,召唤类型识别函数并查找类的成员和文档。或者只是列出类和成员,如果你正在处理对象构造或静态调用。

如果Eclipse,Netbeans和JetBrains已经用Java成功完成了它(因此我应该plug Eclipse to AnEditor),为什么没有人能够以不那么臃肿和更普遍的方式做到这一点?或者我错过了什么,未来已经潜伏在某个地方?

1 个答案:

答案 0 :(得分:0)

因此:到目前为止,微软已经解决了所有人中的这个确切问题。 ‘Language servers’ provide a protocol to plug language-specific semantics-aware completion and other features to different editors and IDEs.

值得注意的是,“语言服务器”倾向于以它们解析的相同语言开发。对于较慢的语言(例如Python),这可能是一个可疑的决定。

对于某些语言,类似的解决方案可在一段时间内使用,而与Langservers无关,例如Tern for JSScionghc-mod用于Haskell等。它们通常主要用于Emacs和Vim。可以预见,这种解决方案主要出现在非主流语言中,例如所有的JS编译语言,而且弹出的速度似乎比为每个编辑器/ IDE开发单独的插件要快。