Emacs有像Vim插入模式补全一样的单词和行补全功能吗?

11

Vim可以使用CTRL-X PCTRL-L来完成单词和行。在Emacs中有一个叫做Company mode的插件,但是这个插件会干扰Emacs中的许多事情(包括全局linum和yasnippets)。我知道在Emacs中可以使用CTRL-/来完成单词,但是是否可以使用之前编写的代码行来完成呢?


我认为这更像是超级用户的问题。 - notnoop
@notnoop <- 这是一个机器人吗?因为我认为我的问题与编程有关。 - alexchenco
1
这个问题涉及到emacs通用编辑器的快捷方式。这是一个超级用户的问题。虽然我理解你在编码时通常需要这样的功能。如果这个问题是关于编写emacs扩展或处理代码完成(使用yasnippets),那么我认为它与编程有关。 - notnoop
5个回答

9

也许你正在寻找 hippie-expand?从该网页(截至本文撰写时):

HippieExpand查看光标前的单词,并尝试以各种方式扩展它,包括从固定列表(如expand-abbrev)扩展,从缓冲区中找到的匹配文本扩展(如dabbrev-expand),或者通过您自己定义的函数进行扩展。它尝试哪些方法以及以什么顺序进行控制由可配置的函数列表控制。

有关完整的完成选项列表,请访问 Emacs Wiki上的完成页面


2
要获得类似于vim的Ctrl-X Ctrl-L的行为,您需要将try-expand-line-all-buffers添加到hippie-expand-try-functions-list中。这将从所有缓冲区而不仅仅是当前缓冲区扩展行。 - ymln

3

在Emacs中,有无数种方法可以实现自动完成。有些是特定于模式的,有些是内联的,有些是可配置的等等。 这里 是一份可能对您有帮助的模式列表。


3
使用数字参数完成一行的补全,例如 M-5 M- / 将按行完成,而单独使用 M- / 则仍然按照常规方式完成。 hippe-expend 函数具有非常有用的功能,即:
通过正数参数直接跳转到此列表中下一个函数的 ARG。通过负数参数或只使用 C-u,撤消扩展。
hippie-expand-try-functions-list 中自定义扩展函数,并将函数 try-expand-line 放在第五个列表元素中,那么您可以使用 M-5 M-/ 按行完成补全。
这个提示非常方便和有用,我强烈推荐它。

FYI,“try-expand-line”是“hippie-expand-try-functions-list”的默认第五个元素。 - ocodo

1
值得注意的是:如果您的窗口管理器没有占用Alt-tab,Emacs将使用Alt-tab进行自动完成(我设置我的窗口管理器使用“Windows键”而不是Alt键,正是出于这个原因)。

1
如果你正在使用evil,这是我使用的最像vim的解决方案:
  (defun my-expand-lines ()
    (interactive)
    (let ((hippie-expand-try-functions-list
           '(try-expand-line-all-buffers)))
      (call-interactively 'hippie-expand)))

  (define-key evil-insert-state-map (kbd "C-x C-l") 'my-expand-lines)

这样,您就可以在插入模式下使用我们的老朋友C-x C-l来完成所有缓冲区的整行自动补全。

感谢@ymln建议使用try-expand-line-all-buffers


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