欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程资源 > 编程问答 >内容正文

编程问答

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

发布时间:2025/5/22 编程问答 47 豆豆
生活随笔 收集整理的这篇文章主要介绍了 不用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 == -2return ''endifif l:size < 1024return l:size.' bytes'elseif l:size < 1024*1024return printf('%.1f', l:size/1024.0).'k'elseif l:size < 1024*1024*1024return printf('%.1f', l:size/1024.0/1024.0) . 'm'elsereturn 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 可能不搭。不过我个人来讲,愿意接受这些不足。

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

    《新程序员》:云原生和全面数字化实践50位技术专家共同创作,文字、视频、音频交互阅读

    总结

    以上是生活随笔为你收集整理的不用vim-airline/lightline.vim, 如何使用纯手工制作一个漂亮的 vim 状态栏的全部内容,希望文章能够帮你解决所遇到的问题。

    如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。