Vim 的Ctrl+N通常是这样工作的:我输入几个字母,点击Ctrl+ N,Vim 会根据我所有打开的缓冲区中的单词为我提供补全。
Emacs 的解决方案不必完全相同。我主要是这样使用它:声明变量,然后在以后的代码中使用它。但我喜欢不解析源代码的轻量级方法。
Vim 的Ctrl+N通常是这样工作的:我输入几个字母,点击Ctrl+ N,Vim 会根据我所有打开的缓冲区中的单词为我提供补全。
Emacs 的解决方案不必完全相同。我主要是这样使用它:声明变量,然后在以后的代码中使用它。但我喜欢不解析源代码的轻量级方法。
你想要 dabbrev-expand,默认绑定到 M-/。我没有使用过 Vim,但从你的描述来看,它的作用完全相同。
试试 hippie-expand,绑定到你最喜欢的键
(global-set-key (kbd "M-/") 'hippie-expand)
而不是呈现完成列表,而是通过就地完成重复点击绑定键循环。
为什么“嬉皮”-展开?我不知道,实际上我避免查看该函数,因为该名称没有提供信息且令人反感,直到我阅读了“Life Is Too Short For Bad Code”的文章。(hippie-expand 上的 EmacsWiki 条目也问“为什么是‘嬉皮士?’”,但也无法回答。)
我个人使用AutoComplete它为您提供了一个不错的下拉框。您可以选择在激活之前要输入多少个字母,并自定义要显示的内容,包括 dabbrev-expand 中的内容。
;; 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() 和参数 foo 编写一些 OOP,M-/ 将建议您同时使用 foo 和 foobar。
但是,如果您正在调用对象方法,而不是仅仅提供“foo”完成,那就太好了。
有没有人有解决方案?
Aif> 这需要的远不止“嬉皮士扩展”所能提供的。如果你编写 C/C++ 代码,你可以使用 ECB http://ecb.sourceforge.net/但坦率地说,这个项目已经死了,这个插件不是很可靠。如果您需要非常好的智能补全,您应该尝试 Eclipse (CDT)。但是如果你编写 python 代码,那么 Emacs (rope + flymake) 和 Eclipse (PyDev) 一样好。