9

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

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

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

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

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

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

如果 Eclipse、Netbeans 和 JetBrains 已经在 J​​ava 中成功地完成了它(所以我应该将Eclipse 插入 AnEditor),为什么没有人能以一种不那么臃肿和更通用的方式来做呢?还是我错过了什么,未来已经潜伏在某个地方?

4

1 回答 1

1

所以:到目前为止,几乎所有的人都解决了这个确切的问题。“语言服务器”提供了一种协议,可以将特定语言的语义感知完成和其他功能插入到不同的编辑器和 IDE。

值得注意的是,“语言服务器”往往是用它们解析的相同语言开发的。在 Python 等速度较慢的语言中,这可能是一个值得怀疑的决定。

对于某些语言,类似的解决方案在一段时间内可用,独立于 Langservers ——例如用于 JS 的 Tern、用于Haskell 的Scionghc-mod等。这些往往主要服务于 Emacs 和 Vim。可以预见,这样的解决方案主要出现在非主流语言上,就像所有编译成 JS 的语言一样——它们的出现似乎比为每个编辑器/IDE 开发单独的插件更快。

于 2019-09-18T12:24:24.897 回答