Vim状态栏显示信息:自定义你的编辑器底部提示

Vim 写代码或改配置时,你有没有盯着屏幕最底下那行小字发过呆?它有时显示 -- INSERT --,有时是 123,45(行号和列号),有时又突然冒出 unixutf-8dos —— 这些不是乱码,是 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} 是文件类型(pythonmarkdown 等)
%y 是文件类型缩写(pymd
%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() 看一眼返回值再调整。