【问题标题】:Emacs how to auto-complete words of include files on C?Emacs如何自动完成C上包含文件的单词?
【发布时间】:2010-12-03 16:08:55
【问题描述】:

如何让 Emacs 完成 C 包含文件中的单词?

#include <stdio.h>
int main(){
print//<-- this is where I want it to complete printf

最简单的方法是什么? (比Cedet 更简单的东西)

【问题讨论】:

标签: emacs autocomplete


【解决方案1】:

首先为源代码生成标签,并包含您希望能够自动完成的文件。如果您之前没有使用标签表,请参阅我的博文以获取有关 using tags 的提示。

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

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

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

【讨论】:

  • 谢谢!我也很喜欢这个博客:)。
【解决方案2】:

与 complete-tag、dabbrev-expand 或 hippie-expand(dabbrev-expand 类似的东西)不同,CEDET 套件完全按照问题描述的方式执行。当被要求执行完成时,它会查找并发现您已包含 stdio.h,然后在那里查找可能的完成。

CEDET 还做了很多与完成相关的事情,这将提供非常有针对性和正确的建议,而不仅仅是模糊的相似建议。一个副作用是 CEDET 需要花费更多的精力来设置。例如,您需要教它包含文件的位置,有时还需要教它如何处理宏,以及您正在从事的项目是什么样的。

这里有更多细节: link text

【讨论】:

    【解决方案3】:

    您可能想试试 M-/ (dabbrev-expand)。此命令尝试使用当前缓冲区的内容,然后使用相同模式的其他缓冲区的内容来完成紧接在该点之前的标识符(即,您的光标所在的位置)。如果提供的第一个补全不是您想要的,只需继续输入 M-/。如果您有保持单个 emacs 会话持续打开的习惯(如果没有,您应该真正获得),并且打开当前项目中的一些文件,您很可能能够为任何特定前缀找到您想要的扩展。

    因此,为了回答您的原始问题,M-/ 将找到您正在寻找的 printf 补全,如果 (a) 您在正在编辑的缓冲区中的其他任何地方使用了 printf,或者(b) 它出现在您在 emacs 中打开的任何其他 .c 或 .h 文件中。

    【讨论】:

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

    您也可以尝试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...
    猜你喜欢
    • 2011-08-05
    • 1970-01-01
    • 2010-10-14
    • 2023-03-06
    • 2014-09-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-04
    相关资源
    最近更新 更多