如何在emacs中完成代码?


20

我知道emacs支持代码完成。但是老实说,我从来不是一个很好的FAQ读者,至少对于我是一个全新的东西而言。所以我想知道我需要下载什么,以及如何使emacs可以用C ++和Java为我完成一些智能代码完成。还是有一些软件包可以对许多主要语言进行代码完成?

Answers:


27

可以在emacs中的任何类型的缓冲区上工作的基本方式是点击(aka + )使用的动态缩写M-/alt/

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

要获得特定于C ++或Java(或其他语言)的语言的更广泛的代码完成功能,您需要查看代码模板或代码段包。在StackOverflow的相关问题中有一些讨论。这些讨论中通常提到的一个是yasnippet- 此帖子在emacs博客上有一个截屏演示。


+1。您可能还想complete.el尝试一下标准库。它非常老,鲜为人知,但是它提供的缓冲区内完成类型可能很有用。M-x find-library complete,然后阅读文件中的注释。
提请

21

@Doug的答案有点过时了,他的重点是通过使用预定义的代码片段进行代码扩展。

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

  1. 嬉皮扩展曾经很流行,语法分析器是emacs标签。因此它支持ctags支持的所有语言(包括C ++,Java)。但是结果并不完美,因为ctags仅使用正则表达式来分析代码。有关详细信息,请参见我的init-hippie-expand.el。您可以先检查的值hippie-expand-try-functions-list

  2. 自动完成功能是一种具有精美用户界面(下拉菜单,甚至在控制台窗口中)的现代功能。如果您使用clang作为后端。智能感知要好得多。要使clang正常工作,您需要安装auto-complete-clang,它是auto-complete的插件。它仅支持clang支持的语言(C / C ++ / Obj-C)。正如Sylvain Benner指出的那样,您可以将emacs-eclim用作Java解析后端,该后端实际上调用eclipse的可执行文件。因此,自动完成功能可以支持Java。有关详细信息,请参见我的init-auto-complete.el

  3. 语义提供UI和后端解析引擎。太慢了 下拉UI可以,但需要X窗口。智能感知的结果优于ctags。这份文件对我来说太怪异了。有关详细信息,请参见init-semantic.el

  4. 公司模式类似于自动完成,区别在于它将所有内容打包到一个包中。例如,C ++开发人员只需要安装公司模式(自动完成需要一些第三方插件)。UI的另一个区别是公司将自动显示候选人。因此,您在公司中按的键较少。自定义后,可以在自动完成中执行相同的操作。

综上,自动完成,公司是最受欢迎的两种选择。语义和嬉皮扩展也受到欢迎,但使用较少。其他人则微不足道,四大巨头已经涵盖了它们的功能。例如,自动完成可以使用yasnippet作为输入源(自动完成提供UI,但是实际的候选者由yasnippet后端生成)。

我建议使用自动完成或公司作为主要代码完成插件,语义或嬉皮扩展作为补充插件

我使用公司模式和嬉皮扩展,因为,

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

  • hippie-expand不是很活跃,但是它不占用TAB公司模式/语义/自动完成功能使用的密钥

如果您将公司模式用于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例如)。


哪个是Emacs 24中用于乳胶的最佳自动完成软件包?
攻读博士学位

@doctorate我认为您需要使用自动完成功能及其源代码emacswiki.org/emacs/AutoCompleteSources,但是我是程序员而不是乳胶用户,因此您最好在Google plus Emacs社区仔细检查,那里有很多学者。
陈斌

请注意,公司模式也支持乳胶。因此,我建议公司而不是自动完成
chen bin

2

简短的答案:我不知道emacs对Java有用。动态扩展并不关心您的类路径中的库,它对您键入的代码一无所知,它只能扩展为其中一个缓冲区中已经存在的文本。JDE和emacs-eclim尝试提供此功能,但个人并不令我印象深刻。


0

简短答案: M-/

长答案:RTFM :-)


6
+1,上帝,我希望我看到的下一个问题是“需要使用RTFM命令提供帮助”
rownage 2011年

@rownage:哦,多数民众赞成在``info-emacs-manual'`(C-h r
SamB 2011年

1
怎么C-h k M-/
Doug Harris
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.