Emacs ivy 小技巧

现在 ConsultVertico 之类的轻量级 completion framework ,和 Emacs 28 之后自带的 icomplete-vertical 似乎成为了 Emacs 中的“潮流”。不过目前我还是更习惯使用 ivy。这里不讨论各种工具的好坏,也不介绍 ivy 如何使用,只是记录下我在 ivy 中还会不经意发现的一些好用的小功能。

下面动图中的例子均在 ivy 的源码中操作。虽然 ivy 、swiper 、counsel 为三个不同的包,不过为了方便起见,这里就不做区分了。

逐步缩小搜索范围

有时候我们可能不能一步搜索到位,就需要逐步缩小缩小搜索的范围。在 ivy 中使用 Shift-SPC 就能在现有的候选中,再次进行搜索。

下面这个例子是在 ivy 的源码中,先搜索 ivy-read ,再在上一步的候选中搜索 defun 。其中 ⎵sg (SPC-sg) 是我设置的 cousel-grep-or-swiper 的快捷键。

搜索替换

借助 ivy ,可以在 narrow (缩小搜索范围)之后再对其中的文本进行替换。这里介绍两种方法,还有很多的其他的方法,不过这两种方法对我来说已经足够了。

ivy-occur

使用 ivy 搜索之后按 C-c C-o 可以进入 ivy-occur buffer ,ivy-occur buffer 是只读的,需要借助 wgrep 来把它变为可写的,再进行替换。在 ivy-occur buffer 中,C-x C-q 可以进入 wgrep-mode ,下面的例子中我把 ivy 替换成 completion ,按 C-c C-c 保存更改。而且不止可以替换,其他任何的编辑操作都是可行的。

M-q 进行 query-replace

搜索过程中按 M-q 可以直接对当前搜索的词进行替换,使用的是 Emacs 内置的 query-replace ,但是能实时显示替换后的词,和 anzu 的效果类似。

ivy-avy

使用 ivy-avy ,用 avy 来跳转搜索结果(avy 的基本用法和设计哲学,可以参看这篇文章 avy can do anything)。ivy-avy 在 melpa 上是一个单独的包,需要单独安装。在 ivy 中使用快捷键 C-' 可以调出 avy 。

counsel-rg 添加任意 flag

ivy 通过 counsel 中提供了与 ripgrep 的集成,counsel-rg 。我们可以在 Emacs 配置文件中设置 rg 的参数。但是这样设置后是全局生效的,如果我们在使用 counsel-rg 时,临时需要添加额外的 flag, 在输入 -- 之后可以便可添加。如下例(⎵si (SPC-si) 是我设置的 cousel-rg 的快捷键。),我在 ivy 文件夹中搜索 defun ,显示出文件夹下所有文件中的 defun 字段,包括 org 文件、texi 文件等等。如果我只想搜索所有 elisp 文件中的 defun 字段,在搜索的关键词之后再输入 --,之后添加一个 glob 选项 -g*.el ,就限定在 elisp 文件中搜索 defun 了。其他所有合法的 flag 都可以这样添加。

Arch Linux 使用“更旧”的内核

在 Arch Linux 上安装 EAF