如何在 Emacs 中获得与 Vim 类似的全行完成CTRL-x l
?
例如,在 Vim 中,如果我输入:
from d<CTRL-X>-l
我会得到一个像这样的弹出窗口:
它显示了在开放缓冲区中与该前缀匹配的所有行。
如何在 Emacs 中获得与 Vim 类似的全行完成CTRL-x l
?
例如,在 Vim 中,如果我输入:
from d<CTRL-X>-l
我会得到一个像这样的弹出窗口:
它显示了在开放缓冲区中与该前缀匹配的所有行。
这并没有给出一个可供选择的列表(尝试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)
hippie-expand 这样做,您只需按照此处最后一个答案中的描述进行配置:Emacs 是否具有单词和行完成功能(如 Vim 的插入模式完成)?
multi-occur
如果您愿意将列表作为缓冲区导航,则Emacs 会提供。
否则你应该了解helm
。看到这个答案https://stackoverflow.com/a/14731718/903943
这需要做一些事情,但您可以结合公司完成和 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)
请参阅此帖子的进一步讨论。
Icicles命令icicle-occur
您的要求执行。它使您可以在多个文件或缓冲区的搜索模式匹配中查找和导航,在您更改要搜索的模式时逐步更新搜索命中集。您可以通过应用其他模式逐步细化搜索。您可以直接、单独访问匹配项,也可以以各种循环顺序在它们之间循环访问。
请参阅https://github.com/redguardtoo/eacl - Emacs 自动完成行
eacl 与其他解决方案的区别:
它通过 grepping 当前项目中的文件获得更多候选者(如果您使用 git/svn/mercurial,则会自动检测到项目根目录)
它可以通过grepping完成多行语句