Emacs 当前文件快速查找内容

使用 Emacs 也已经两年多了,积累了不少经验,也一直在安利,不过效果不佳。是时候跟大家分享一些我使用 Emacs 的技巧了,不求安利,只求相互交流。

本文主要介绍 Emacs 里面查找当前文件内容(当前 buffer)的一些方法,它们各有优势,所以我就不一一对比了。

我会在这里介绍它们的用法,并且给出我自己的使用场景。

注:关于插件和 Emacs 的用法,最好的方法其实是录制视频或者制作 Gif,但是录制视频真的花时间,因为还要上传。这里先欠着,后面的zilongshanren/Spacemacs-rocks 再补上。

但是文字有时候非常简洁,可以节约大家的时间。

作为一个资深的 Vim 党,Vim 本身的搜索是一定会经常用到的。一般在 normal state 的时候搜索当前文件里的一些关键字,我会优等考虑使用/来搜索。

而且搜索完成以后,可以按 n/N 来查找“上一个”和“下一个”。

如果要搜索当前光标下面的符号,我会使用bling/evil-visualstar 来搜索,只需要把光标停在你想要搜索的符号上面,然后按一个*就可以了。

通过syohex/emacs-evil-anzu 可以在状态栏显示出当前匹配的 item 个数。

它最大的优点就是简单方便,native to vim 用户。

Swiper

此插件是我最喜爱的 Lisp 黑客 abo-abo (Oleh Krehel) 所写,我的 Emacs 里面配置了很多他写的插件,最好用的是 lispy,hydra,avy 和 ace-window。大家从他的 Github 主页上面也可以看出来这些插件在 Emacs 社区的受欢迎程度。

此插件不具有侵入性,它是 Emacs 内置命令 isearch-forward 的增强,一般绑定的快捷键就是 c-s。所以,学习此插件的用法没有任何成本。

重复按 c-s 可以不停地查找一下个,按 c-r 可以查找上一个。 如果匹配的项目不止一个的时候,可以在下面有一个 mini buffer 可以预览,这个才是 swiper 的 killer feature。

在这个预览窗口里面,我绑定了 c-j/c-k 来上下选择,不习惯 Vim 的同学可以使用原来的 c-n/c-p 来选择。

当你移动选择 item 的时候,你会发现当前 buffer 里面的光标也会跟着移动到对应的匹配项。如果你按 c-g 取消,你的光标还是会回到原来你按 c-s 的地方。(是不是有点晕。。。试试就知道怎么回事了。)

如果在 emacs state 我一般会选择使用 swiper 来查找想要的内容,而不会先回到 evil normal 状态,再按/来搜索。

关于 Swiper 更多的介绍可以参考原作者的项目文档和博客。

swiper 最大的优点就是可以在不切换模式的前提下提供最方便地搜索和预览功能。

Helm-swoop

这又是一个大杀器,如果只是针对当前文件,它的功能和 swiper 一样牛叉(甚至更牛叉)。不过它的 UI 会比 swiper 好看一点点(至少我觉得是)。

但是它有一个 swiper 没有的特性。当你查找一个字符串以后,还可以空格后继续过滤你想要查找的文本。

打个比方,我现在有这样一段代码。

var sprite = new cc.sprite();
mysprite = sprite;

如果你查找 sprite,你会搜索到两行,此时,你空格后再输入 var 就可以再过滤得到

var sprite = new cc.sprite();

赶紧试试吧,用过的都说好。helm-swoop 还有许多其它功能,比如多行查找等,这里就不多说了,看文档吧。

好看的 UI 和持续过滤的功能是它最大的优点。

Helm-semantic-or-imenu

这个功能在 spacemacs 里面对应的快捷键是 SPC sl,我在 spacemacs rocks 的第一个视频里面已经演示了,这里就不多说了。

它在编程的时候用来查找当前文章中的函数列表是最好用的,当然也可以用来查找 markdown 和 org 中的 heading。

另外,通过配置 imenu-generic-expressions,它还可以用来查找任意你想要查找的 patten。

我在 reddit 里面提问就解决了一个 mocha 测试文件里面查找测试例的问题。How to show mocha test names in imenu list. : emacs

此命令通常都是在浏览和阅读代码的时候使用,因为 Vim normal mode 是浏览代码最好的方式,所以,此命令通常在 normal state 下面使用。

优点:不需要过多的输入,就可以查找想要的内容

occur

这个命令我平时用的不多,也是最近才开始使用的。我想说,它真的非常强大,它可以生成一个 buffer 来显示你要查找的内容。

然后,在这个 buffer 里面按 e 进入 occur-edit-mode,然后你就可以直接编辑你查找到的内容了,编辑完后按 c-c c-c 就可以保存并回到 occur-mode 了。

很强大有木有???!

当然对于查找和替换,我有时候更多地是使用 helm-ag,iedit 和 multiple cursor。 但是 occur 绝对也是比较好的轻量级方案。

最后

Emacser,你是如何在当前文件快速查找你想要的内容的呢?欢迎在下方留言。