不用vim-airline/lightline.vim, 如何使用纯手工制作一个漂亮的 vim 状态栏
我將 space-vim 的狀態(tài)欄單獨(dú)提取成為一個(gè)插件: https://github.com/liuchengxu... , 可直接安裝試用。
首先看一下最后的效果:
知己知彼,百戰(zhàn)不殆。先來(lái)分析一下使用 airline 與 lightline 有什么好處?
漂亮,酷炫,這毋庸置疑。
airline 與很多插件集成的非常好,真是省心又省力。
那有什么不足之處呢?
airline 可能會(huì)導(dǎo)致 100 ms 的啟動(dòng)延遲。具體可以看這里 https://github.com/liuchengxu..., 這里也有一篇關(guān)于 vim 啟動(dòng)優(yōu)化非常好的文章。
定制性依舊不高,或者說(shuō)深度定制的門檻有點(diǎn)高,不是那么容易上手。我曾經(jīng)嘗試過(guò)深入修改過(guò) airline,不過(guò)并不順利。
它們所提供的信息可能過(guò)于龐雜,顯得有些冗余。
那么如何通過(guò)純手工制作一個(gè)與 airline/lightline 相比也還不錯(cuò)的 statusline 呢?
什么叫不錯(cuò)?這個(gè)因人而異,按照我個(gè)人的審美而言,首先不能太單調(diào)(我只關(guān)心漂不漂亮),其次得顯示出一些有用的信息。那么就會(huì)涉及到以下一些內(nèi)容:
顏色轉(zhuǎn)換,也就是各部分前景色,背景色之類的。
一些有用的信息,比如語(yǔ)法檢查的內(nèi)容信息。
為了漂亮,我們可能還會(huì)選擇添加一些 Unicode 字符進(jìn)去。
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簡(jiǎn)單介紹一下重點(diǎn):%1*[foo]%*, hi User1 ......, 改變的便是 [foo] 部分的 style, 比如前景色,背景色,粗體等等。如果你也想要嘗試自己定制一番,按照個(gè)人喜好照葫蘆畫瓢即可 :p.
上面的示例似乎有些復(fù)雜,下面給出一個(gè)簡(jiǎn)略版本:
set statusline+=%4*\ %F\ %* hi User4 cterm=bold ctermfg=169 ctermbg=239分兩步:
%數(shù)字* + 后面跟上所要在 statusline 中顯示的內(nèi)容 +%*,圈出所要進(jìn)行操作的范圍,比如簡(jiǎn)略版本中為 \ %F \ , 即為 空格 文件的全路徑 空格。
hi User數(shù)字 cterm=bold ctermfg=111 ctermbg=111 gui=bold guifg=111 guibg=111 ,就會(huì) highlight 上面圈出的范圍。 cterm, gui 分別指的是 terminal 與 GUI 環(huán)境。 fg,bg 為前景,背景色。數(shù)字可以自己定義。 hi User1 ... 就會(huì)對(duì) %1* ... %* 所圈中的 ... 進(jìn)行 highlight 操作。
也可以不用數(shù)字,采用自定義名稱。 比如%4* 可替換為%#highlightgroup#, highlightgroup 為一個(gè)自定義的名稱,那么%4*\ %F\ %* 也可以寫為 %#fullPath#\ %F\ %*, hi fullPath ... 進(jìn)行 highlight 就可以了。
至此你應(yīng)該可以操作自己的 statusline 了。這里是 256 色對(duì)照表 , 這里 是我給出的示例出處。
如果你不喜歡 airline 可能導(dǎo)致 vim 啟動(dòng)延遲 100 ms, 或是喜歡無(wú)插件版本的 vim, 就可以使用這個(gè)方法來(lái)進(jìn)行 statusline 的美化了。實(shí)際上,這同樣也適用于 tabline.
順便介紹一下 space-vim 的 statusline 值得關(guān)注的一些部分,[B-1] 代表 buffer 1, 1 為當(dāng)前 buffer 對(duì)應(yīng)的編號(hào)。[TOT 3], TOT 指的是 total, 當(dāng)前共有多少 buffer,可以使用 Tab 快速切換。文件完整路徑后面采用橙色前景色顯示的是 ale 語(yǔ)法檢查的信息。其他部分比較顯然,值得關(guān)注的點(diǎn)也不多就不介紹了。
末了,說(shuō)一下上面的缺點(diǎn):所有 window 的 statusline 都是很相似的,可能不能像 airline/lightline 那樣容易區(qū)分出哪個(gè)是當(dāng)前光標(biāo)所在的 window。 而且跟你的 colorscheme 可能不搭。不過(guò)我個(gè)人來(lái)講,愿意接受這些不足。
僅僅是分享一個(gè)方案,如何選擇取決于你自己。
《新程序員》:云原生和全面數(shù)字化實(shí)踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀總結(jié)
以上是生活随笔為你收集整理的不用vim-airline/lightline.vim, 如何使用纯手工制作一个漂亮的 vim 状态栏的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: springboot @Configur
- 下一篇: vs插件ZunKoIDE