不用vim-airline/lightline.vim, 如何使用纯手工制作一个漂亮的 vim 状态栏

liuchengxu

我将 space-vim 的状态栏单独提取成为一个插件: https://github.com/liuchengxu... , 可直接安装试用。


首先看一下最后的效果:

statusline

知己知彼,百战不殆。先来分析一下使用 airline 与 lightline 有什么好处?

  1. 漂亮,酷炫,这毋庸置疑。

  2. airline 与很多插件集成的非常好,真是省心又省力。

那有什么不足之处呢?

  1. airline 可能会导致 100 ms 的启动延迟。具体可以看这里 https://github.com/liuchengxu...这里也有一篇关于 vim 启动优化非常好的文章。

  2. 定制性依旧不高,或者说深度定制的门槛有点高,不是那么容易上手。我曾经尝试过深入修改过 airline,不过并不顺利。

  3. 它们所提供的信息可能过于庞杂,显得有些冗余。

那么如何通过纯手工制作一个与 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 

分两步:

  1. %数字* + 后面跟上所要在 statusline 中显示的内容 +%*,圈出所要进行操作的范围,比如简略版本中为 \ %F \ , 即为 空格 文件的全路径 空格

  2. 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 语法检查的信息。其他部分比较显然,值得关注的点也不多就不介绍了。

space-vim statusline

末了,说一下上面的缺点:所有 window 的 statusline 都是很相似的,可能不能像 airline/lightline 那样容易区分出哪个是当前光标所在的 window。 而且跟你的 colorscheme 可能不搭。不过我个人来讲,愿意接受这些不足。

仅仅是分享一个方案,如何选择取决于你自己。

阅读 13.9k

区块链技术研究
专注区块链技术
720 声望
113 粉丝
0 条评论
720 声望
113 粉丝
文章目录
宣传栏