vim-clap: 高颜值高性能的通用型模糊查找 Vim/NeoVim 插件

https://github.com/liuchengxu/vim-clap 是一个基于 Vim/NeoVim 最新特性 popup/floating_win 的高颜值高性能模糊查找插件:

  1. 所谓高颜值,是指基于 popup/floating_win 弹出一个类似 Alfred 的窗口,不再分割(split)窗口,不会扰动当前的窗口布局。自从有了 popup/floating_win 以后,其实只要不是常驻窗口,都应该使用 popup/floating_win 进行展示。由于

  2. 所谓高性能,是指即将所有耗时操作交给外部的 Rust 扩展,Vim/NeoVim 只是负责展示结果与分派任务,这样即使面对上百万文件,也不会卡住 Vim/NeoVim.


其实类似的插件已经有很多了,从最早期的 ctrlp.vim, unite.vim, 到后期的 command-t, denite.nvim, fzf.vim, leaderf 等等。ctrlp.vim, unite.vim 的优点是纯 vimscript, 但是随之而来的一个无法避免的缺点就是很慢,性能差,一旦出现数据量很大的情况,Vim 可能就卡死了。它们后面的插件在性能上都做了改进,比如 denite.nvim, leaderf 用了 Python,command-t 和 fzf.vim 用了外部扩展,要编译外部模块或者说依赖于外部的二进制程序。

在所有同类插件中, fzf.vim 应该是最成功的的一个,在写 vim-clap 之前,我一直用的都是 fzf.vim, 无论是性能还是 UI, 都是上乘,而且基本是开箱即用,无须复杂的配置。但是自从发现 fzf.vim 无法使用 popup 以后,详情可以继续关注这个 issue. 当时还没有其他任何插件同时支持 neovim 的 floating_win 和 vim 的 popup,同时也没有符合我的“美学”观念的插件 ,我就开始写了 vim-clap。如果对 fzf.vim 与 vim-clap 的区别与联系有兴趣,可以看这个 reddit post.

早期的 vim-clap 的主要优势在于同时支持 floating_win 和 popup,但是性能并不好。直到有了 Rust 扩展以后,vim-clap 才真正成为一个优秀的高可用 fuzzy finder 插件。

安装

  • Vim: :echo has('patch-8.1.2114').
  • NeoVim: :echo has('nvim-0.4').

只要保证 Vim/NeoVim 的版本不太低,就可以安装 vim-clap , 比如使用插件管理器 vim-plug:

Plug 'liuchengxu/vim-clap', {'do': ':Clap install-binary!' }

Rust

本质上,vim-clap 可以在不安装 Rust 的情况下工作,但是由于 VimScript 是一个性能比 Python 还差得多的脚本语言,无法应对复杂或者繁重的处理逻辑。对于一些可能出现数据量非常大的 provider,必然会有一些性能问题,造成插件不可用的情况。比如 :Clap files ~ 在用户目录下查找所有文件,在我的机器上用户目录下有近一百万文件,不使用 Rust 扩展,可能会耗时几十秒,这显然是不能接受的。有兴趣的可以看这个 issue 140, 里面我进行了详细的分析,并提出了一些可能的解决方案。

在所有可能的方案中,我最终采用了 Rust 扩展,Vim/NeoVim 通过异步作业
job 方式分派任务,用 JSON 进行信息交互。因为最近一直都在使用 Rust, 也算是刚好派上了用场,“学以致用”。

如果你还没有安装过 Rust, 请先安装 Rust 环境。因为现在还没有提供 Rust 二进制下载,需要在本地自行编译。即使从来没有接触过 Rust 也不用担心,整个编译步骤很简单,只要确认 Rust 已经安装好以后,打开 Vim/NeoVim 执行下面这条命令就会自动进行编译安装:

:call clap#helper#build_all()

如果你想要手动编译:

# 编译成功后生成一个可执行文件 target/release/maple ,这个就是我们要的 Rust 扩展程序
$ cargo build --release

不过建议使用 :call clap#helper#build_all() 进行安装 ,因为如果你的 Vim/NeoVim 有 python3 支持的话,这个帮助函数还是尝试编译一个 Python 动态模块,这个动态模块对于性能提升非必要,但是可以让你避免在一些不太大的数据集时使用异步作业。

结束语

GitHub: https://github.com/liuchengxu/vim-clap, 欢迎试用。space-vim 的用户启用 fzf layer 并在 .spacevim 中添加 let g:spacevim_enable_clap = 1 即可。

你可能感兴趣的:(Vim)