6

如何在 Emacs 中获得与 Vim 类似的全行完成CTRL-x l

例如,在 Vim 中,如果我输入:

from d<CTRL-X>-l

我会得到一个像这样的弹出窗口:

vim 行完成弹出窗口

它显示了在开放缓冲区中与该前缀匹配的所有行。

4

6 回答 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)
于 2013-07-29T15:57:56.977 回答
1

hippie-expand 这样做,您只需按照此处最后一个答案中的描述进行配置:Emacs 是否具有单词和行完成功能(如 Vim 的插入模式完成)?

于 2013-07-29T16:00:02.687 回答
1

multi-occur如果您愿意将列表作为缓冲区导航,则Emacs 会提供。

否则你应该了解helm。看到这个答案https://stackoverflow.com/a/14731718/903943

于 2013-07-30T01:14:24.750 回答
1

这需要做一些事情,但您可以结合公司完成和 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)

请参阅此帖子的进一步讨论。

于 2017-12-11T23:54:14.423 回答
0

Icicles命令icicle-occur您的要求执行。它使您可以在多个文件或缓冲区的搜索模式匹配中查找和导航,在您更改要搜索的模式时逐步更新搜索命中集。您可以通过应用其他模式逐步细化搜索。您可以直接、单独访问匹配项,也可以以各种循环顺序在它们之间循环访问。

于 2013-08-10T21:17:36.173 回答
0

请参阅https://github.com/redguardtoo/eacl - Emacs 自动完成行

eacl 与其他解决方案的区别:

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

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

于 2017-08-07T01:36:55.140 回答