用 Vim 写代码或改配置时,你有没有盯着屏幕最底下那行小字发过呆?它有时显示 -- INSERT --,有时是 123,45(行号和列号),有时又突然冒出 unix、utf-8 或 dos —— 这些不是乱码,是 Vim 在悄悄告诉你当前文件的实时状态。
状态栏默认就带信息,但默认很“低调”
默认情况下,Vim 并不开启状态栏(statusline)。只有当你进入插入模式、命令行模式,或者执行了某些操作(比如搜索),底部才临时出现一行提示。想让它常驻显示?加一句:
set laststatus=2
把它写进 ~/.vimrc,重启 Vim 或执行 :source ~/.vimrc,状态栏就稳稳地钉在窗口最下方了。
想看什么,自己说了算
Vim 的状态栏支持高度定制。比如,你想同时看到文件名、编码、行号、当前模式、光标位置,可以这样写:
set statusline=%f%h%m%r%=%k[%{&ff}][%{&fenc?:&fenc:'none'}][%{&ft}]%y[%l,%v][%p%%]
拆开来看:
%f 是文件名(不含路径)
%{&ff} 显示文件格式(unix//mac)
%{&fenc?:&fenc:'none'} 显示文件编码,空则显示 none
%{&ft} 是文件类型(python、markdown 等)
%y 是文件类型缩写(py、md)
%l,%v 是当前光标所在行列号
%p%% 是已滚动到全文的百分比
让状态栏更“懂你”的小技巧
如果你常用多个窗口,可以加个窗口编号提示:
set statusline+=%#warningmsg#%{winidx()}
想区分普通模式和插入模式?用颜色高亮:
set statusline+=%#warningmsg#%{mode()=="i"?"[INSERT]":"[NORMAL]"}
保存后重载配置,插入模式下状态栏就会变成醒目的 [INSERT],一目了然。
别忘了兼容性:NeoVim 用户注意
NeoVim 默认启用状态栏,且语法略有不同。比如要显示当前模式,NeoVim 推荐用:
set statusline=%{mode()=='i'?'INSERT':'NORMAL'}
而老版 Vim 更倾向用 mode() 返回字符串判断。实际写的时候,建议先 :echo mode() 看一眼返回值再调整。