Emacs如何自动补全C语言中的include文件中的单词?

4
我该如何让Emacs自动补全C语言头文件中的单词?
#include <stdio.h>
int main(){
print//<-- this is where I want it to complete printf

有没有比Cedet更简单的方法?


+1 我也很感兴趣 :) - warren
这是重复的问题,类似的问题有 https://dev59.com/JHM_5IYBdhLWcg3wp0-l 和 https://dev59.com/S3RB5IYBdhLWcg3wSVcI ,我不会感到惊讶如果还有其他类似的问题。这种情况经常出现。 - dmckee --- ex-moderator kitten
我认为这足够具体,值得一试。 - justinhj
4个回答

4

首先为您想要自动完成的源文件和包含文件生成标签。如果之前没有使用过标签表,请参考我的博客文章获取有关使用标签的提示。

现在,如果您有一个包含stdio.h的TAGS表,那么可以使用命令 `complete-tag' 来自动补全“printf”。

也许将 `complete-tag' 绑定到一个快捷键上:

(global-set-key [f3] 'complete-tag) 

谢谢!我也很喜欢这个博客 :)。 - Liran Orevi

4
与complete-tag、dabbrev-expand或类似dabbrev-expand的hippie-expand不同,CEDET套件正是描述问题所需的功能。当被要求执行自动完成时,它会查找并发现您已包含了stdio.h,并在那里查找可能的自动完成选项。
CEDET还提供了许多其他与自动完成相关的功能,这些功能将提供非常专注和正确的建议,而不仅仅是模糊相似的建议。一个副作用是CEDET需要更多的设置工作。例如,您需要告诉它您的包含文件在哪里,有时还需要告诉它如何处理宏以及正在处理的项目的情况。
关于此的更多详细信息请参见: 链接文本

0

你也可以尝试hippie-expand,它有关于搜索补全信息的其他选项。我将M-/绑定到hippie-expand,然后修改了hippie-expand-try-functions-list中元素的顺序如下:

(global-set-key (kbd "M-/") 'hippie-expand)
(setq hippie-expand-try-functions-list '(try-expand-dabbrev try-expand-dabbrev-all-buffers try-expand-dabbrev-from-kill try-complete-file-name-partially try-complete-file-name try-expand-all-abbrevs try-expand-list try-expand-line try-complete-lisp-symbol-partially try-complete-lisp-symbol))

这使得hippie-expand一开始的表现就像普通的M- /,但是重复按下会产生更多可能的扩展。


我尝试过了,但是没用。(打开干净的Emacs会话,评估你上面建议的行,然后打开一个新的C文件并按照Liran所说的做。它没有找到printf...) - Jay

0

你可能想尝试使用M-/(dabbrev-expand)。该命令尝试使用当前缓冲区以及相同模式下其他缓冲区的内容来自动完成光标前即将输入的标识符。如果第一个提供的完成选项不是你想要的,只需继续键入 M-/ 即可。如果你习惯于保持一个单一的emacs会话连续打开(如果你还没有这样做,真的应该学会),并且有当前项目中的几个文件处于打开状态,那么你很可能能够为任何特定前缀找到你想要的扩展。

所以,回答你最初的问题,如果你在正在编辑的缓冲区中的任何地方使用了printf,或者它出现在你在emacs中打开的任何其他 .c 或 .h 文件中,M-/将会找到你在寻找的printf完成选项。


@戴尔:(a) 你是否在你正在编辑的缓冲区中其他地方使用了printf,或者(b)它是否出现在你在emacs中打开的其他任何.c或.h文件中。--好的,但正如Liran所说,我希望它能够进入包含的.h文件中。 - Jay
就dabbrev-expand而言,唯一的解决方法是在您的emacs会话中打开包含文件,例如stdio.h。 如果您愿意编写一些自定义lisp代码来自动加载include文件,那么 hippie-expand可能足够灵活。 在http://www.emacswiki.org/emacs/HippieExpand上还有一些有趣的想法,特别是针对标签的完成概念。 如果这些内容不足以解决问题,您可能需要查看类似CEDET的东西。 - Dale Hagglund

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