V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Yggdroot
V2EX  ›  Vim

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

  •  
  •   Yggdroot · 2017-09-07 15:42:18 +08:00 · 15760 次点击
    这是一个创建于 2621 天前的主题,其中的信息可能已经有所发展或是发生改变。

    提到 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 最好的模糊查詢插件

    32 条回复    2018-03-16 12:54:27 +08:00
    tracyone
        1
    tracyone  
       2017-09-07 18:00:43 +08:00 via iPhone
    相见恨晚的,vim 多进程异步执行插件

    https://github.com/tracyone/neomake-multiprocess
    aheadlead
        2
    aheadlead  
       2017-09-07 18:04:34 +08:00
    Star 已送上 试一试
    bigzhu
        3
    bigzhu  
       2017-09-07 18:13:07 +08:00 via Android
    正好在找,用了看看
    TangMonk
        4
    TangMonk  
       2017-09-07 18:21:36 +08:00
    让 ctrlp 使用 ag 啊
    let g:ctrlp_user_command = 'ag %s -l --nocolor -g ""'
    we000
        5
    we000  
       2017-09-07 18:34:03 +08:00
    fzf.vim 路过
    fityme
        6
    fityme  
       2017-09-07 18:38:34 +08:00
    同楼上(虽然已经用 jetbrains 全家桶了
    4faramita
        7
    4faramita  
       2017-09-07 23:13:09 +08:00
    竟然通篇没提 fzf
    mzlogin
        8
    mzlogin  
       2017-09-07 23:39:10 +08:00
    一起在用,还提过两个 Issue,支持一下。
    firenine
        9
    firenine  
       2017-09-08 00:44:03 +08:00
    JB 家的 IDE 双击 shift
    jkmmmm
        10
    jkmmmm  
       2017-09-08 06:21:22 +08:00 via iPhone
    比起 fzf 有什么优势没?
    Shura
        11
    Shura  
       2017-09-08 07:30:38 +08:00 via Android
    Yggdroot
        12
    Yggdroot  
    OP
       2017-09-08 07:51:42 +08:00
    @jkmmmm 大约一年前,fzf 的模糊匹配算法很垃圾,只会根据匹配长度做排序。前几天我又用了下,它的匹配算法好像比以前好了。有空我好好用一下 fzf 做一下对比。
    不过现在已知的比 fzf 最明显的优点是:在 windows 下,fzf 可以说没法用。
    yedashuai
        13
    yedashuai  
       2017-09-08 09:39:20 +08:00
    star 已经献上,虽然是 jetbrains 全家桶爱好者
    Numbcoder
        14
    Numbcoder  
       2017-09-08 09:56:54 +08:00
    我来说一下 fzf 的缺点吧,只能在终端下用,不能在 GVim 和 MacVim 下用
    xomix
        15
    xomix  
       2017-09-08 11:13:21 +08:00
    又见 vim,想起来怎么生成随机字符串的梗………………
    pony279
        16
    pony279  
       2017-09-08 11:42:03 +08:00
    个人喜欢 fzf 的原因是有几十万个文件或更多的时候 ui 几乎没有明显卡顿,LeaderF 在这方面好像还不够,刚刚试了下有点小卡,当然已经比 ctrlp 好很多了。

    fzf 的接口定义的也挺清晰,所以做了一堆拓展,https://github.com/junegunn/fzf.vim 。现在用的比较多的是 FZFAg,FZFHistory,FZFFiles。其中 FZFAg 在 LeaderF 里面找不到对应项。相信这个在 LeaderF 里面也不是什么难事。

    持续关注。
    pony279
        17
    pony279  
       2017-09-08 11:44:04 +08:00
    用 FZF 还有一个弊端,插件需要下载 github 上发布的二进制文件,在新的机器部署的时候经常速度很慢(天朝网络原因)
    tracyone
        18
    tracyone  
       2017-09-08 11:54:27 +08:00 via iPhone
    @pony279 leaderf 有调用外部程序的接口,而且是自动选择那个最快的
    NoAnyLove
        19
    NoAnyLove  
       2017-09-08 11:55:49 +08:00
    看到作者的用户名有点眼熟,然后才发现原来是因为我在用 indentLine
    NoAnyLove
        20
    NoAnyLove  
       2017-09-08 12:02:05 +08:00
    大致看了一下 README,好像没有 CtrlP.vim 那种 CtrlPMixed 混合搜索模式
    simple26
        21
    simple26  
       2017-09-08 12:22:49 +08:00
    @Numbcoder fzf 已经支持在最新的 GVim 中使用了 使用了 Vim 的 terminal 特性

    https://github.com/junegunn/fzf/pull/1019,https://github.com/junegunn/fzf/commit/a8deca2dd92742b7e37783fd5629bef701d236ed

    虽然我已经很少用 Windows 但是应该不是无计可施的 至少 https://github.com/mattn/vim-fz README 的 gif 就是在 Windows 下面使用的 所以相信 fzf 应该也是可用的

    fzf 也不是没有缺点 见 https://github.com/mattn/vim-fz/pull/3

    LeaderF 还是挺好的 比 CtrlP 快
    Chingim
        22
    Chingim  
       2017-09-08 12:37:45 +08:00
    名字有点熟, 原来是 indentLine 的作者, 记得还提交过 PR.

    支持新插件, 待会试试
    tamlok
        23
    tamlok  
       2017-09-08 12:59:54 +08:00 via Android
    之前一直用,但后来因为机器不一定有 python 环境,所以还是用回 ctrlp 了。leaderf 能否提供一个 fallback 呢?统一用 leaderf 的命令,但当没有 python 支持时调用 ctrlp 的命令。谢谢!
    Yggdroot
        24
    Yggdroot  
    OP
       2017-09-08 13:02:21 +08:00
    @tamlok 这项工作不应该是 LeaderF 做的,你可以直接在 vimrc 里做。
    tamlok
        25
    tamlok  
       2017-09-08 13:07:15 +08:00 via Android
    @Yggdroot 所以能不能在项目主页给出一个解决方案?很多人并不一定懂得 vimscript。这样也可以作为解决 python 依赖的一种方法?谢谢
    tracyone
        26
    tracyone  
       2017-09-08 13:08:54 +08:00 via iPhone
    @tamlok 你可以判断 if has("puthon") 加载 leaderf 否则加载 ctrlp ……
    bookit
        27
    bookit  
       2017-09-08 13:23:45 +08:00
    楼主,安装 C 插件之后失败,

    我用的 nvim,是不是没考虑到 nvim 各种配置和 vim 不一样了。。
    Yggdroot
        28
    Yggdroot  
    OP
       2017-09-08 13:28:31 +08:00
    @bookit 没有不一样,兼容 nvim,装 c 跟用的是 vim 还是 nvim 没关系,你可以在 github 上开个 issue,把错误贴出来,这里不适合讨论这个。
    ashfinal
        29
    ashfinal  
       2017-09-08 19:51:54 +08:00
    想知道“快速定位 tag ”是需要额外安装或者设置什么吗?支持哪些文件类型?

    我现在缺一个 outliner 的东东。
    Yggdroot
        30
    Yggdroot  
    OP
       2017-09-08 20:29:33 +08:00
    @ashfinal 需要电脑上装有 ctags,ctags 支持的文件类型都支持。如果需要支持更多的文件类型,使用 https://github.com/universal-ctags/ctags,是 ctags 的维护版本,支持几乎所有语言。
    可以用`ctags --list-languages`查看,你使用的语言肯定在里面。
    acgtyrant
        31
    acgtyrant  
       2018-03-13 15:25:52 +08:00
    一句节约你的时间:这插件不支持 Mixed.
    Yggdroot
        32
    Yggdroot  
    OP
       2018-03-16 12:54:27 +08:00
    @acgtyrant 感觉没必要支持 mixed.
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2798 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 09:06 · PVG 17:06 · LAX 01:06 · JFK 04:06
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.