如何在GNU Emacs中实现类似于Vim的Ctrl-n?

10

Vim 的 Ctrl+N 通常的操作方式是:我输入几个字母,按下 Ctrl+N,Vim 就会根据我所有已打开的缓冲区中的单词提供自动补全功能。

Emacs 的解决方案不必完全相同。我主要是这样使用它的:声明变量,然后在稍后的代码中使用它。但我喜欢这种轻量级的方法,即 解析源代码。


不错的技巧,我不知道Ctrl-n! - ng.
6个回答

20
你需要的是默认情况下绑定到M-/的dabbrev-expand。我没有使用过Vim,但从你的描述来看,它执行了完全相同的操作。

2
值得注意的是,如果 M-/ 第一次不能给出你想要的结果,多次按下它将循环遍历匹配项。 - Boojum
这应该是第一个答案,备选方案排在第二位。 - Andriy Drozdyuk

13

试试 hippie-expand,将其绑定到您喜欢的键上

(global-set-key (kbd "M-/") 'hippie-expand)

与其呈现完成列表,按下绑定键会在原地循环浏览完成项。

为什么叫做“hippie”扩展?我不知道,实际上,我避免看这个函数,因为这个名字既没有信息量,又让人望而却步。直到我读了“Life Is Too Short For Bad Code”的文章之后,我才开始关注它。(在EmacsWiki关于hippie-expand的介绍中,也有一个提出“为什么‘hippie’?”的问题,但无法回答它。)


3
我个人使用自动完成,它提供了一个漂亮的下拉框。您可以选择在激活之前要输入多少个字母,并自定义要显示的内容,包括dabbrev-expand中的内容。

2
;; Allow tab to autocomplete

 (defun indent-or-expand (arg)
   "Either indent according to mode, or expand the word preceding point."
   (interactive "*P")
   (if (and
        (or (bobp)      (= ?w (char-syntax (char-before))))
        (or (eobp) (not (= ?w (char-syntax (char-after))))))
       (dabbrev-expand arg)
     (tab-to-tab-stop)))

 (defun my-tab-fix ()
   (local-set-key [tab] 'indent-or-expand))

 (add-hook 'as-mode-hook         'my-tab-fix)
 (add-hook 'java-mode-hook       'my-tab-fix)
 (add-hook 'c-mode-hook          'my-tab-fix)
 (add-hook 'sh-mode-hook         'my-tab-fix)
 (add-hook 'emacs-lisp-mode-hook 'my-tab-fix)

0

在我看来,问题是我尝试的emacs自动补全无法根据上下文进行完整补全。

例如,如果您使用一个名为foobar()的OOP方法和一个名为foo的参数,M- /将建议您两个选项:foo和foobar。

但是,如果您正在调用对象方法,仅提供“foo”完成是不够的。

有人有解决方案吗?


对我来说不是大问题。C++ 的可靠完成非常困难。 - Paweł Hajdan

0

Aif> 这需要比“hippie expand”提供的更多。如果您编写C/C++代码,可以使用ECB http://ecb.sourceforge.net/,但坦率地说,该项目已经相当死亡,而且这个插件也不是很可靠。如果您需要真正好的智能完成功能,应该尝试Eclipse(CDT)。但如果您编写Python,则Emacs(rope + flymake)与Eclipse(PyDev)一样好。


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