如何在Emacs中获得全线完成,类似于Vim的CTRL-x l
?
例如,在Vim中,如果我输入:
from d<CTRL-X>-l
我会得到一个像这样的弹出窗口:
显示在开放缓冲区中与该前缀匹配的所有行。
答案 0 :(得分:2)
这不提供可供选择的列表(尝试调整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)
答案 1 :(得分:1)
hippie-expand会这样做,您只需按照上一个答案的说明对其进行配置:Does Emacs has word and line completion (like Vim's insert mode completion)?
答案 2 :(得分:1)
如果您习惯将列表导航为缓冲区,则Emacs会附带multi-occur
。
否则你应该了解helm
。请参阅此回答https://stackoverflow.com/a/14731718/903943
答案 3 :(得分:0)
Icicles 命令icicle-occur
执行您的要求。它允许您在多个文件或缓冲区中的搜索模式匹配中查找和导航,在您更改要搜索的模式时逐步更新搜索命中集。您可以通过应用其他模式逐步优化搜索。您可以直接,单独访问匹配,也可以在各种循环次序中循环访问。
答案 4 :(得分:0)
请参阅https://github.com/redguardtoo/eacl - Emacs自动完成行
eacl与其他解决方案之间的区别:
通过在当前项目中点击文件获得更多候选项(如果使用git / svn / mercurial,则会自动检测项目根目录)
它可以通过grepping
答案 5 :(得分:-1)
需要一些操作,但您可以将公司完成和嬉皮扩展结合起来,为您提供当前缓冲区中的行的弹出菜单。
首先,您需要定义一个函数来调用try-expand-line(修改为返回扩展而不是调用he-expand并返回t)来自hippie-exp.el并收集所有扩展:
(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的进一步讨论。