如何在 emacs 中实现代码完成?

如何在 emacs 中实现代码完成?

我知道 emacs 支持代码补全。但说实话,我从来都不是一个好的 FAQ 阅读者,至少对于我完全陌生的东西来说是这样。所以我想知道我需要下载什么以及如何让 emacs 可以为我在 C++ 和 Java 中完成一些智能代码补全。或者是否有任何软件包可以为许多主要语言完成代码补全?

答案1

在 emacs 中,跨任何类型的缓冲区工作的基本方法是动态缩写M-/通过点击(又名alt+ /)使用

这将扩展文本以复制当前缓冲区或当前打开的其他缓冲区中已存在的其他字符串。

对于针对 C++ 或 Java(或其他语言)的更广泛的代码完成,您需要查看代码模板或代码片段包。在这个相关问题在 StackOverflow 上。这些讨论中经常提到的一个是yasnippet-- 有一个截屏演示emacs 博客上的这篇文章

答案2

@Doug 的回答有点过时,他的重点是使用预定义的片段来扩展代码。

我认为 OP 的问题是关于智能感知(例如,自动完成类的方法名称)。

  1. 嬉皮士 展开曾经很流行,语法分析器emacs 标签。所以它支持所有 ctags 支持的语言(包括 C++,Java)。但是结果并不完美,因为 ctags 只使用正则表达式来分析代码。参见我的初始化-hippie-expand.el了解详情。你可以先检查hippie-expand-try-functions-list

  2. 自动完成是一款具有精美用户界面(下拉菜单,甚至在控制台窗口中)的现代版本。如果您使用作为后端。智能感知要好得多。要使 clang 工作,您需要安装 auto-complete-clang,它是自动完成的插件。它仅支持 clang 支持的语言(C/C++/Obj-C)。西尔万·本纳指出,你可以使用emacs-eclim作为 Java 解析后端,它实际上调用了 eclipse 的可执行文件。因此自动完成可以支持 Java。请参阅我的初始化自动完成.el了解详情。

  3. 语义提供 UI 和后端解析引擎。速度很慢。下拉 UI 还可以,但需要 X 窗口。智能感知效果比 ctags 好。而且文档对我来说太复杂了。请参阅初始化语义了解详情。

  4. 公司模式与自动完成类似,不同之处在于它将所有内容打包成一个包。例如,C++ 开发人员只需安装公司模式(自动完成需要一些第三方插件)。另一个 UI 差异是公司会向候选人显示自动地。这样您在公司时就可以少按一些键。自定义后,可以在自动完成中执行相同的操作。

总结一下,auto-complete、company 是最受欢迎的两个选择。Semantic 和 hippie-expand 也很受欢迎,但使用较少。其他的就太琐碎了,不便一提,而且它们的功能已经被四大巨头涵盖了。例如,auto-complete 可以使用 yasnippet 作为输入源(auto-complete 提供 UI,但实际候选由 yasnippet 后端生成)。

我建议使用无论是自动完成还是公司作为主要代码完成插件无论是语义还是 hippie-expand 作为补充插件

我使用 company-mode 和 hippie-expand因为,

  • 现在(2017 年),公司模式比自动完成功能维护得更积极,并且拥有更多第三方插件(例如,latex 插件)

  • hippie-expand 不太活跃,但是它不占用TABcompany-mode/semantic/auto-complete 正在使用的键。

如果您使用 C++/Java 的公司模式,您可能需要修改company-backends

关于公司模式的更多建议,

您可能需要调整 的值company-backends。例如,假设其值为(company-eclim company-semantic company-clang (company-dabbrev-code company-gtags company-etags company-keywords))。那么如果company-eclim可以获取非零候选,company则认为您正在编写 Java,因此它将不会在 之后运行后端company-eclim

现在我们来看看(company-dabbrev-code company-gtags company-etags company-keywords)。这四个后端将一起使用。例如,即使company-dabbrev-code成功获取非零候选后,其他三个后端仍会执行。

在现实世界中,经常需要重新调整后端的顺序或者添加新的后端(company-rtags例如)。

答案3

简短回答:我不知道 emacs 中有没有对 java 有用的功能。动态扩展不关心类路径中的库,它对您正在输入的代码一无所知,它只能扩展到缓冲区之一中已经存在的文本。JDE 和 emacs-eclim 尝试提供此功能,但我个人并不满意。

答案4

简短回答:M-/

长答案:RTFM:-)

相关内容