如何在Emacs中实现类似Vim的CTRL-x l的完整行自动补全?
例如,在Vim中,如果我输入:
我会收到这样的弹窗:
它显示了在打开的缓冲区中与该前缀匹配的所有行。
例如,在Vim中,如果我输入:
from d<CTRL-X>-l
我会收到这样的弹窗:
![vim line completion popup](https://istack.dev59.com/qkOyQ.webp)
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)
虽然有些麻烦,但你可以结合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 的进一步讨论。
如果您习惯于将列表作为缓冲区进行导航,则Emacs带有multi-occur
。
否则,您应该了解helm
。请参见此答案 https://dev59.com/B2Uq5IYBdhLWcg3wKtbs#14731718
Icicles 命令 icicle-occur
可以实现你所需的功能。它可以让你在多个文件或缓冲区中查找和导航搜索模式匹配项,随着你更改搜索模式,增量更新搜索命中集合。你可以通过应用其他模式逐步细化搜索。你可以直接访问命中项,也可以按照不同的循环顺序在它们之间循环。
查看https://github.com/redguardtoo/eacl - Emacs自动完成行(s)
EAcl 和其他解决方案之间的区别:
通过在当前项目(如果您使用git/svn/mercurial,则自动检测项目根目录)中搜索文件,获得更多的候选项
它可以通过grep来完成多行语句