不用vim-airline/lightline.vim, 如何使用纯手工制作一个漂亮的 vim 状态栏
我将 space-vim 的状态栏单独提取成为一个插件: https://github.com/liuchengxu... , 可直接安装试用。
首先看一下最后的效果:
知己知彼,百战不殆。先来分析一下使用 airline 与 lightline 有什么好处?
漂亮,酷炫,这毋庸置疑。
airline 与很多插件集成的非常好,真是省心又省力。
那有什么不足之处呢?
airline 可能会导致 100 ms 的启动延迟。具体可以看这里 https://github.com/liuchengxu..., 这里也有一篇关于 vim 启动优化非常好的文章。
定制性依旧不高,或者说深度定制的门槛有点高,不是那么容易上手。我曾经尝试过深入修改过 airline,不过并不顺利。
它们所提供的信息可能过于庞杂,显得有些冗余。
那么如何通过纯手工制作一个与 airline/lightline 相比也还不错的 statusline 呢?
什么叫不错?这个因人而异,按照我个人的审美而言,首先不能太单调(我只关心漂不漂亮),其次得显示出一些有用的信息。那么就会涉及到以下一些内容:
颜色转换,也就是各部分前景色,背景色之类的。
一些有用的信息,比如语法检查的内容信息。
为了漂亮,我们可能还会选择添加一些 Unicode 字符进去。
function! Buf_total_num() return len(filter(range(1, bufnr('$')), 'buflisted(v:val)')) endfunction function! File_size(f) let l:size = getfsize(expand(a:f)) if l:size == 0 || l:size == -1 || l:size == -2 return '' endif if l:size < 1024 return l:size.' bytes' elseif l:size < 1024*1024 return printf('%.1f', l:size/1024.0).'k' elseif l:size < 1024*1024*1024 return printf('%.1f', l:size/1024.0/1024.0) . 'm' else return printf('%.1f', l:size/1024.0/1024.0/1024.0) . 'g' endif endfunction set statusline=%<%1*[B-%n]%* " TOT is an abbreviation for total set statusline+=%2*[TOT:%{Buf_total_num()}]%* set statusline+=%3*\ %{File_size(@%)}\ %* set statusline+=%4*\ %F\ %* set statusline+=%5*『\ %{exists('g:loaded_ale')?ALEGetStatusLine():''}』%{exists('g:loaded_fugitive')?fugitive#statusline():''}%* set statusline+=%6*\ %m%r%y\ %* set statusline+=%=%7*\ %{&ff}\ \|\ %{\"\".(&fenc==\"\"?&enc:&fenc).((exists(\"+bomb\")\ &&\ &bomb)?\",B\":\"\").\"\ \|\"}\ %-14.(%l:%c%V%)%* set statusline+=%8*\ %P\ %* " default bg for statusline is 236 in space-vim-dark hi User1 cterm=bold ctermfg=232 ctermbg=179 hi User2 cterm=None ctermfg=214 ctermbg=242 hi User3 cterm=None ctermfg=251 ctermbg=240 hi User4 cterm=bold ctermfg=169 ctermbg=239 hi User5 cterm=None ctermfg=208 ctermbg=238 hi User6 cterm=None ctermfg=246 ctermbg=237 hi User7 cterm=None ctermfg=250 ctermbg=238 hi User8 cterm=None ctermfg=249 ctermbg=240
简单介绍一下重点:%1*[foo]%*
, hi User1 ......
, 改变的便是 [foo] 部分的 style, 比如前景色,背景色,粗体等等。如果你也想要尝试自己定制一番,按照个人喜好照葫芦画瓢即可 :p.
上面的示例似乎有些复杂,下面给出一个简略版本:
set statusline+=%4*\ %F\ %* hi User4 cterm=bold ctermfg=169 ctermbg=239
分两步:
%数字*
+ 后面跟上所要在 statusline 中显示的内容 +%*
,圈出所要进行操作的范围,比如简略版本中为\ %F \
, 即为空格 文件的全路径 空格
。hi User数字 cterm=bold ctermfg=111 ctermbg=111 gui=bold guifg=111 guibg=111
,就会 highlight 上面圈出的范围。 cterm, gui 分别指的是 terminal 与 GUI 环境。 fg,bg 为前景,背景色。数字可以自己定义。hi User1 ...
就会对%1* ... %*
所圈中的...
进行 highlight 操作。
也可以不用数字,采用自定义名称。 比如%4*
可替换为%#highlightgroup#
, highlightgroup 为一个自定义的名称,那么%4*\ %F\ %*
也可以写为 %#fullPath#\ %F\ %*
, hi fullPath ...
进行 highlight 就可以了。
至此你应该可以操作自己的 statusline 了。这里是 256 色对照表 , 这里 是我给出的示例出处。
如果你不喜欢 airline 可能导致 vim 启动延迟 100 ms, 或是喜欢无插件版本的 vim, 就可以使用这个方法来进行 statusline 的美化了。实际上,这同样也适用于 tabline.
顺便介绍一下 space-vim 的 statusline 值得关注的一些部分,[B-1]
代表 buffer 1, 1 为当前 buffer 对应的编号。[TOT 3]
, TOT 指的是 total, 当前共有多少 buffer,可以使用 Tab
快速切换。文件完整路径后面采用橙色前景色显示的是 ale 语法检查的信息。其他部分比较显然,值得关注的点也不多就不介绍了。
末了,说一下上面的缺点:所有 window 的 statusline 都是很相似的,可能不能像 airline/lightline 那样容易区分出哪个是当前光标所在的 window。 而且跟你的 colorscheme 可能不搭。不过我个人来讲,愿意接受这些不足。
仅仅是分享一个方案,如何选择取决于你自己。