SpaceVim试用体验
初见
第一次认识SpaceVim是在阮一峰的每周分享博客上。本人一直是一个Vim控,长期致力于折腾Vim各种工具,也不知道真的能提升多少效率,但就是爱折腾。之前一直使用spf13的vimrc配置,也有好几年时间了。这次一见SpaceVim,瞬间有一种莫名的高级感。但初试之下,又发现工作方式与spf13的配置或者插件集相差很大。无法立即迁移,于是便心生试用一段时间的想法。
本人Vim的常用场景是:
- 看代码,编辑代码,主要是C/C++,顶多加上python,javascript
- 要求支持cscope,tags
- 方便强大的grep + quickfix
- 自动补全 + snippets
下面针对这几个场景一一谈谈SpaceVim的使用体验
SpaceVim介绍
按下本人的需求不表,先聊一聊SpaceVim本身标榜的和我觉得比较有特色的feature。安装啥的就不说了,直接官网都有介绍,curl+bash分分钟搞定的事情。
welcome page
SpaceVim让我一件倾心的就是这个welcom page。花哨的主题,别致的status line,还能选最近打开的文件。颜值与功能都在线。
是不是很炫酷,这张图的主界面就是welcome page。可以在上面选择最近打开的项目。当你切换路径时,这些项目也会跟着更新。
下面是vim-which-key(纠正:不是vim-which-key,经作者说明,是SpaceVim 内部集成的leaderguide, 基于一个很老的插件上修改的),可以提示快捷键。解决了vim初学者的痛点。
右侧是SpaceVim的默认文件管理器vimfiler界面。同时,你也可以选择老牌的NERDTree或者最新的defx。他们各擅胜场,没有绝对的优劣。
flygrep
flygrep目前已经从SpaceVim中独立出来,也就是说普通的Vim用户也可以独立安装使用该插件。
所谓的flygrep也就是一个异步搜索的工具。不用等待搜索完全结束才能查看搜索结果。而是结果列表不断的被填充。另一个优点是对搜索结果的过滤集成了类似denite的fuzzy finder。但是不能做到denite的强大配置。
放个动图,感受一下grep on the fly的异步搜索:
使用下来,感觉虽然可用,好用,但功能不够强大。不能随心所欲的制定搜索策略。比如设置文件过滤啊,搜不搜hidden文件啊,等等。其实也就是不能对类grep工具,例如rg,ag,ack,grep等等,物尽其用。
Asynchronous plugin manager
先放官网动图感受一下:
SpaceVim采用了Shougo大神的dein插件管理器。和老牌的Vundle比呢,就是可以异步操作,速度上和使用体验上提升了一个等级。Vundle安装插件是要一个一个来的,上图里面dein就可以大家一起来,并发操作。
layers
SpaceVim一大特色就是基于layers来管理插件集合和配置集合。据说是学spacemacs的。目前SpaceVim提供的layers在Available layers可以看到。在init.toml中可以配置。功能挺强大。
不过spf13中就有这样的概念,不过spf13通过的是vim的g:变量来管理,听起来没有SpaceVim这么酷炫。
另外,虽然现在layer已经挺丰富了,但试用下来,感觉对我这样的Vim老菜鸟,并没有什么质的提升。目前尝试过下面几个layer:
-
autocomplete:这个必须要使用的,基于neocomplete或者YCM。没感觉到和裸vim上使用有什么差别
-
cscope:这个提供基本cscope的快捷键,且可以帮助管理cscope数据库文件
-
denite:这个就比较强大了,Shougo大神的插件,使用很复杂,但是功能也真强大,放到后面说
-
leaderf:这个也很厉害,据说是国人写的,搜索速度比纯grep不知道强到哪里去了,但是SpaceVim目前对其支持还没到位。另外相比denite+现代grep(例如rg,ag),速度也没有很大的优势,但是界面要易于上手一些。
-
gtags:类似cscope,就是工具变成GNU global
-
lang#c/python/sh/vim:提供各语言的相关插件,没感觉出来有什么特别的。可能更多的是自动补全的整合和格式的调整吧。
-
language-server-protocol:这个对于我是一个很新的概念,使用过IDEA类IDE的同学一定对IDE的强大印象深刻。我本来以为lsp能让Vim达到IDEA那个水平,提供类似:
- 基于编译级别的补全提示
- 语法检查
- 文档查询
但似乎是我太理想化了,显然现在的language server还做不到。因为工作在C环境,尝试过clangd和cquery。都不太可用。但感觉这是未来发展的方向。有一天Vim也能发展到VS code那样。
-
shell:提供内嵌命令行,可用,但是貌似bug很多,还不如Ctrl+Z切出去省心。
-
sudo:这个很好,解决了一个痛点。就是开启文件后,如果忘记打sudo开启,可以在保存的时候申请sudo权限。
-
tmux:提供了Vim和tmux的深度整合。例如并排开了两个tmux window,每个window开了一个SpaceVim,那么这两个窗口之间,就可以通过指定的快捷键进行跳转。但有个小问题,该layer会更改tmux的主题,但是似乎更改后的主题对tmux的功能支持不好。例如,prefix+m标记window的时候,标签上不显示那个小m。还不是很完美。
SpaceVim体验
回到我的需求上来,挨个验证SpaceVim能不能满足要求。
代码跳转
cscope/tags
原生Vim对tags, cscope的支持不变。也就是说
- 在有tags文件的情况下,ctrl+]跳转仍然可用,没有问题
- 在链接了cscope.out的情况下,所有cs find操作也仍然可用,且如原生Vim一样,可以通过quick fix窗口操作。
也就是说,SpaceVim至少守住了下限,Vim提供的功能没有被破坏。兼容性不错,点个赞。
gtags
在tags,cscope之外,还有个gtags,这个是通过GNU提供的二进制工具gtags来建立索引,通过global工具来搜索, 这俩是一套。官网链接在此:global。
globa提供了类似cscope的功能,也可以搜索饮用,也可以grep。功能同cscope有点重复。Vim通过一个古老的插件gtags.vim对其提供支持。
SpaceVim通过一个gtags layer对gtags也提供了支持。当你在init.toml中enable该layer时,SpaceVim就会激活一个叫Gtags的命令,它由SpaceVim的gtags layer提供。
基本功能可用:
- :Gtags -x func可以查找定义
- :Gtags -r func可以查找饮用
- 其他命令可以通过:h Gtags查看帮助。帮助文档清晰易用,给作者点个赞。
在我看来,Gtags的唯一好处是可以和Denite融合。这个放到Denite那里再说,总之就是方便过滤搜索结果。
说完Gtags的好处,现在开始吐槽。我很想要的一个功能却有bug。根据文档:Gtags -f %可以显示本文件的文件名,但一执行就报错:“Error: No tags found in xxx”。debug出来原因是因为调用global工具前,环境变量没设置正确。目前已经给作者提供了PR,但似乎作者并没有意识到这个问题,一直没有被pick。关于这个bug可能另开一篇比较合适。如果和我遇到同样问题,可以试试我的fork——zhougy0717/gtags.vim
随心所欲的搜索
FlyGrep是SpaceVim的一大卖点。FlyGrep可以支持多种搜索工具,按照使用优先级是: rg, ag, pt, ack then grep。从SpaceVim的搜索快捷键配置上可以看出,作者可能确实颇用心在猜测用户的使用场景。感受一下吧:
[SPC] + s
[SPC] + s + a
自动补全
通过SpaceVim autocomplete实现。其底层依赖的插件是Shougo/deoplete.nvim。不知道和原生Vim+插件有什么差别。SpaceVim提供了一些特别的快捷键,但不知道有啥用。总体体验,至少不低于原生Vim。
SpaceVim提供的增强功能
Denite集成
是SpaceVim让我认识了Denite,但Denite并不依赖于SpaceVim。也就是原生Vim也可以使用Denite插件。Denite是Shougo大神新出的插件精品,关于这个的介绍也有很多了。Denite的作用是使用fuzzy finder来过滤Vim中的各种信息。这些信息就是Denite source。Denite本身支持一些source,另外也有一些external sourc可以安装。每个external source都是以一个Vim插件的形式存在。例如:ozelentok/denite-gtags是一个Denite过滤gtags搜索结果的插件。
Denite支持的source,可以通过:Denite source来查看,例如:
command, default_opts, recursive_opts, args[1]..., pattern_opt, args[2]..., separator, args[0]... or final_opts] command line.
command, default_opts, recursive_opts, pattern_opt, separator和final opts是可配置参数。如果你用的是rg,可以在bootstrap脚本里这样配置Denite
call denite#custom#var('grep', 'command', ['rg'])
call denite#custom#var('grep', 'default_opts',
\ ['--hidden', '--vimgrep', '--smart-case'])
call denite#custom#var('grep', 'recursive_opts', [])
call denite#custom#var('grep', 'pattern_opt', ['--regexp'])
call denite#custom#var('grep', 'separator', ['--'])
call denite#custom#var('grep', 'final_opts', [])
- command: 设置默认运行的类grep命令,当然后面的选项和参数要和这个命令匹配
- default_opts: 可以设置你想要的参数
- pattern_opt: 设置grep命令对应的搜索正则的参数,例如:rg是--regexp,grep就是-E
- separator: 这个通常不用修改
- final_opts: 在路径后面,如果还需要输入参数,可以放在这里
关于arg[0..2],参考:
Source args: 0. path string or list of paths 1. string or list of arguments 2. pattern string or list of patterns
- arg[0]: 放需要搜索的路径名
- arg[1]: 可以放任意想放的参数
- arg[2]: 同上可以放任意想放的参数,因为跟在pattern_opt后面,可以放正则式。经过试验得知,这里的正则不是Vim正则,而是python正则。
有时候一些工具对参数顺序有关系,所以写的时候慎重。
例子:笔者用的是ag
搜索所有.c/.h/.cpp文件中的字符:Denite grep:./:'--cc':'\b__sched\b'
搜索.diff文件中的字符:Denite grep:./:'-G ".diff"':'\b__sched\b'
搜索包含隐藏文件:Denite grep:./:'--hidden':'\b__sched\b'
Welcome界面
如开篇所提,颜值功能都在线的Welcome界面,怎么都充满了高级感
方便的UI toggle
<Leader>+数字:选择对应的tab
Denite选择color schems
project管理功能:project目录,.project_alt.json
还有很多其他功能值得去发现
总结
SpaceVim目前bug还很多,例如NERD commenter的visual模式下基本不可用。Gtags,cscope都有问题。但毕竟瑕不掩瑜,基础功能不弱于原生Vim,还有其他这么多高颜值,好用的功能,相信SpaceVim未来也有一个好的发展。