让人相见恨晚的 VIM 插件:模糊查找神器 LeaderF

提到vim的模糊查找插件,很多人第一反应是ctrlp.vim,ctrlp知名度很高,但跟其它的同类插件相比,它的唯一优点是用vimL编写(这让它的性能是所有同类插件中最差的)。本文向大家推荐一款模糊查找插件——LeaderF,无论是从性能还是匹配精度上,都远远超越ctrlp。

LeaderF是什么?

LeaderF是一个用Python写的vim插件,可以在成千上万数十万个文件中,通过模糊查找的方式,快速找到目标文件。它还有很多衍生功能:快速打开或定位某个buffer、最近使用的文件(mru)、tags(包括函数、类、变量等)、命令历史、文件中的某一行、vim的help、marks等等。

查找文件

文件查找是vimer的常用操作,海量文件中快速定位目标文件是很多vimer迫切需要的功能,所以就有了ctrlp这样的插件。但ctrlp性能不佳,而且有时候把目标文件名都输入进搜索栏还是找不到目标文件,最大的问题是它的模糊匹配算法不佳,经常排在前面的跟所要找的相去甚远。LeaderF采用异步检索和精心设计的模糊匹配算法完美地解决了这些问题,当你在根目录(/)按下搜索命令,再也没有想剁手的冲动了; 查找文件时,用更少的键击次数就可以找到目标文件, 延长你的键盘使用寿命 :)

  • 异步检索

    异步检索

  • 模糊查找

    模糊查找

  • 正则表达式查找

    正则

  • 多字节字符查找(中文查找)

    中文

快速定位tags(包括函数、类、变量等)

有了它,tagbar可以淘汰掉了:

tags

查找历史命令

History

切换Colorscheme

Colorscheme


当然还有其他功能就不一一展示了,感兴趣的小伙伴可以查看这里

你不知道的细节

  • 智能大小写(smartcase)

如果输入的搜索字符都是小写字母,则匹配是大小写不敏感的;如果输入大写字母,则只匹配大写字母,小写字母仍然是大小写不敏感的。例如,输入abcDef,可以匹配如下字符串:

abcDef
AbcDef
abcDEf
aBcDeF

但不能匹配:

abcdef
Abcdef

注意abcef仍然是大小写不敏感的
这样可以通过大写字母,在搜索过程中快速缩小搜索范围。

  • 同时打开多个文件

    同时打开多个文件

  • 细化搜索结果

    细化搜索结果

开箱即用

上面所有的功能都不需要额外的配置,只要装好LeaderF插件就可以使用了,不像有的插件,配置就像一门新的脚本语言。

最后

LeaderF还支持写扩展程序,这里是一个样例。

友情链接:LeaderF,也許是Vim最好的模糊查詢插件

本作品采用《CC 协议》,转载必须注明作者和本文链接
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 8

非常赞的想法,以下有几个细节想咨询一下:

1、打开文件时,是否有选项选择 (v)split 或者 tab 的方式打开新文件;
2、在新增文件,函数或者变量后,再次触发搜索命令时是否会将上述新增的加入搜索结果中;
3、在不同的系统中,是否都同时支持 / 和 \ 进行目录的分割;
4、/ 和 \ 对目录的分割的结果是否精确,如输入 f/b/baz 能在下列搜索选项中得到最匹配的结果 foo/bar/baz;ctrlp 这点做得很不好

6年前 评论

@Corrida

  1. 有,具体请看readme或帮助
  2. 新增变量和函数会把新增加入结果中;新增文件不会,做了缓存,需要手动刷新一下,考虑到新增文件的时候不是很多。
  3. Linux是/, windows 是\
  4. 这点你大可放心,甚至你只输baz就可以,它的模糊匹配算法是我经过不断地实践优化过的,可以只输入很少的字符就能找到目标。
6年前 评论

@Yggdroot 关于第三点,能不能利用编程语言里的目录分割常量(如 Python 里的 os.sep)来实现在不同系统下能同时使用 / 或者 \ 对目录进行分割呢?谢谢

6年前 评论

@Corrida 早期是可以,后来发现太麻烦去掉了。而且用/还是\,你是指显示的时候还是搜索的时候?如果是搜索的时候也没必要,根本不需要输入/或者\,LeaderF就可以找到你想要的文件。

6年前 评论

@Yggdroot 是指搜索的时候输入 / 或者 \

只是好奇在 Sublime 中能实现在 Windows 下搜索文件时可以用 / 进行目录切割

6年前 评论

@Corrida LeaderF早期可以这样,但就这一点点功能,会让代码乱很多,我就在一次重构时去掉了(我有代码洁癖)

6年前 评论

发现这款优秀的插件很高兴,但使用中遇到一个问题:
我习惯在源码目录之外新建一个目录专门看代码。通过ln -s 创建目标文件夹的软链接,然后find所有符合条件的c/c++文件输出到一个文件中。cscope可以通过-i 指定source文件正常使用。

但是试了下LeaderF是无法识别这些软链接的文件夹,请问有相应的设置吗?

谢谢

6年前 评论

看了下python脚本,发现已经有了

g:Lf_FollowLinks

可以识别link。

thanks。加上就ok了。

6年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!