在之前的一系列文章中,我们对Emacs做了一些小范围的定制,目前它已经可以很好的模拟vim的一些基础功能。我们也在模拟vim基础功能之上做了一些能力的提升。本篇我们将对Emacs自带的补全系统做一个升级,并且给出一些搜索和替换的方案,进一步提升Emacs的效率
Emacs上有很多很好用的补全插件,著名的有前期的 ivy 体系和当前社区比较火的vertico 体系。为了与时俱进,而且Emacs-China中的很多帖子也推荐使用vertico,所以这里我也介绍这个体系中的插件。
vertico 体系中包括下面几个插件:
- vertico
- consult
- corfu
- marginalia
- orderless
consult
consult 插件提供了一系列的查找和补全命令
(use-package consult
:ensure t
:bind
(("C-s" . consult-line)))
这样我们可以通过使用 C-s
来进行搜索
vertico
默认情况下,我们使用M-x
输入命令时没有补全提示,但是可以使用TAB 键补全。我们可以通过命令 icomplete-mode
来启用这个mode,以便在输入命令时能拥有一个补全。
但是这个补全采用的是横向排版的方式,显示上也不太直观。这里我们可以通过vertico 插件对补全进行增强。vertico 提供了一个垂直样式的补全系统。我们可以通过下列代码来安装并启用它
(use-package vertico
:ensure t
:hook (after-init . vertico-mode))
重启emacs之后,再执行 M-x
之后发现它已经可以竖直的显示命令,并且会列出可能的命令了。可以使用 C-n
、C-p
来选择下一个或者上一个命令
orderless
顾名思义,orderless 提供一种无序补全。它可以将一个搜索的范式变成数个以空格分隔的部分,各部分之间没有顺序,你要做的就是根据记忆输入关键词、空格、关键词。它改变了我们使用和思考的习惯,我们不再需要关心信息的顺序,我们只需要在脑海中搜索关键信息片段,然后把这些片段组合起来即可,剩下的都交给Emacs。
例如我们要输入 package-refresh-contents
来刷新包管理里面的源。常规的做法我们需要先输入 pack
等等字符,然后由补全信息给我们提示,加入 orderless
之后,可以凭借模糊的记忆输入类似 refre pack
这样的片段来进行匹配
(use-package orderless
:ensure t
:init
(setq completion-styles '(orderless)))
orderless 是针对整个minibuffer进行增强的,只要是使用minibuffer的地方都可以使用。例如我们上面使用了 consult 插件并且绑定了 C-s
来进行搜索,这里我们就可以使用orderless 来配合完成搜索功能
marginalia
marginalia 可以给minibuffer中候选条目显示一段注释或者其他信息。
其实不光是执行命令的时候marginalia是启用的,现在只要是minibuffer中的选项,marginalia都是可以使用的,例如使用 switch-buffer
和 find-file
或者使用帮助信息的时候也可以展示相关信息
corfu
corfu 可以让我们通过弹窗进行补全。
(use-package corfu
:ensure t
:hook (after-init . global-corfu-mode)
:custom
(corfu-auto t)
(corfu-auto-deply 0)
(corfu-min-width 1)
:init
(corfu-history-mode)
(corfu-popupinfo-mode))
在安装完成之后,我们在编写相关配置的时候可以配合orderless,只输入函数的部分,仅仅凭借模糊的记忆让Emacs自己来匹配我们想要的内容,极大的提高了输入的效率
cape
corfu 插件仅仅是一个补全的前端,它需要补全后端提供数据。好在Emacs 自己提供了有关elisp 的补全后端,所以上面在测试corfu补全的时候可以出现。但是在其他文本类型不会产生补全选项。而cape则是集成了多种补全后端,它与corfu联合起来可以起到很好的补全效果
(use-package cape
:ensure t
:init
(add-to-list 'completion-at-point-functions #'cape-dabbrev)
(add-to-list 'completion-at-point-functions #'cape-file)
(add-to-list 'completion-at-point-functions #'cape-keyword)
(add-to-list 'completion-at-point-functions #'cape-ispell)
(add-to-list 'completion-at-point-functions #'cape-dict)
(add-to-list 'completion-at-point-functions #'cape-symbol)
(add-to-list 'completion-at-point-functions #'cape-line))
上述代码中 completion-at-point-functions 保存的是Emacs在补全时调用的相关函数来获取补全项,我们将cape 的相关函数添加到这个列表中,供Emacs在触发补全时调用。
到此为止,我们对Emacs自身的补全进行了加强。进一步提升了编辑的效率
评论 (0)