Emacs中的全行自动完成?

6
如何在Emacs中实现类似Vim的CTRL-x l的完整行自动补全?
例如,在Vim中,如果我输入:
from d<CTRL-X>-l

我会收到这样的弹窗: vim line completion popup 它显示了在打开的缓冲区中与该前缀匹配的所有行。
6个回答

3

这并不提供可供选择的列表(尝试调整autocomplete进行此操作),但除此之外,它能够给出“感觉”。

(defun my-expand-lines ()
  (interactive)
  (let ((hippie-expand-try-functions-list
         '(try-expand-line)))
    (call-interactively 'hippie-expand)))

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

太棒了!现在,能否将其与弹出列表一起使用? - David Wolever
1
@DavidWolever:http://cx4a.org/software/auto-complete/ 是获取弹出窗口的一种方式,但AC是一个庞大的库。我不知道如何使用它。 - mike3996

1

虽然有些麻烦,但你可以结合company completion和hippie-expand,为当前缓冲区的行提供一个弹出式菜单。

首先,你需要定义一个函数来调用hippie-exp.el中修改过的try-expand-line(返回扩展而不是调用he-expand并返回t)并收集所有的扩展:

(defun get-hippie-expand-lines ()
  (let (completions-list candidate)
    (setq candidate (my-try-expand-line nil))
    (if candidate
        (progn
          (push candidate completions-list)
          (while (progn
                   (setq candidate (my-try-expand-line t))
                   (if candidate
                       (push candidate completions-list)
                     nil))))
      nil)
    completions-list))

然后,您可以编写一个小型公司后端,通过公司弹出窗口向您提供完成候选项。
(defun company-hippie-line (command &optional arg &rest ignored)
  (interactive (list 'interactive))
  (cl-case command
    (interactive (company-begin-backend 'company-hippie-line))
    (prefix (and (not (looking-at "[:word:]"))
                 (let (p1 p2)
                  (save-excursion
                    (end-of-line)
                    (setq p2 (point))
                    (back-to-indentation)
                    (setq p1 (point)))
                  (buffer-substring-no-properties p1 p2))))
    (candidates (get-hippie-expand-lines))))
;; Uncomment if you want to get line completion popups whenever found
;; (add-to-list 'company-backends 'company-hippie-line)
(global-set-key (kbd "C-x l") 'company-hippie-line)

请参见 this post 的进一步讨论。


虽然此链接可能回答了问题,但最好在此处包含答案的必要部分并提供参考链接。如果链接页面发生更改,则仅有链接的答案可能会变得无效。-【来自审核】 - Derek Brown
谢谢您的提示,我已经添加了答案的必要部分。 - nandkeypull

1

啊...哪里提到了如何扩展行?我已经四处搜索了,但没有看到明显的东西:\ - David Wolever
基本上,您需要将函数try-expand-line添加到hippie-expand-try-functions-list中(就像您接受的答案中所示)。但是我也从未为此使用过弹出窗口... - jfsantos

1

0

Icicles 命令 icicle-occur 可以实现你所需的功能。它可以让你在多个文件或缓冲区中查找和导航搜索模式匹配项,随着你更改搜索模式,增量更新搜索命中集合。你可以通过应用其他模式逐步细化搜索。你可以直接访问命中项,也可以按照不同的循环顺序在它们之间循环。


0

查看https://github.com/redguardtoo/eacl - Emacs自动完成行(s)

EAcl 和其他解决方案之间的区别:

  • 通过在当前项目(如果您使用git/svn/mercurial,则自动检测项目根目录)中搜索文件,获得更多的候选项

  • 它可以通过grep来完成多行语句


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