Vim 的 Ctrl+N 通常的操作方式是:我输入几个字母,按下 Ctrl+N,Vim 就会根据我所有已打开的缓冲区中的单词提供自动补全功能。
Emacs 的解决方案不必完全相同。我主要是这样使用它的:声明变量,然后在稍后的代码中使用它。但我喜欢这种轻量级的方法,即 不 解析源代码。
Vim 的 Ctrl+N 通常的操作方式是:我输入几个字母,按下 Ctrl+N,Vim 就会根据我所有已打开的缓冲区中的单词提供自动补全功能。
Emacs 的解决方案不必完全相同。我主要是这样使用它的:声明变量,然后在稍后的代码中使用它。但我喜欢这种轻量级的方法,即 不 解析源代码。
试试 hippie-expand,将其绑定到您喜欢的键上
(global-set-key (kbd "M-/") 'hippie-expand)
与其呈现完成列表,按下绑定键会在原地循环浏览完成项。
为什么叫做“hippie”扩展?我不知道,实际上,我避免看这个函数,因为这个名字既没有信息量,又让人望而却步。直到我读了“Life Is Too Short For Bad Code”的文章之后,我才开始关注它。(在EmacsWiki关于hippie-expand的介绍中,也有一个提出“为什么‘hippie’?”的问题,但无法回答它。)
;; 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)
在我看来,问题是我尝试的emacs自动补全无法根据上下文进行完整补全。
例如,如果您使用一个名为foobar()的OOP方法和一个名为foo的参数,M- /将建议您两个选项:foo和foobar。
但是,如果您正在调用对象方法,仅提供“foo”完成是不够的。
有人有解决方案吗?
Aif> 这需要比“hippie expand”提供的更多。如果您编写C/C++代码,可以使用ECB http://ecb.sourceforge.net/,但坦率地说,该项目已经相当死亡,而且这个插件也不是很可靠。如果您需要真正好的智能完成功能,应该尝试Eclipse(CDT)。但如果您编写Python,则Emacs(rope + flymake)与Eclipse(PyDev)一样好。