Vimscript 状态条
Vim允许自定义每个窗口底部的状态条显示的文字,你可以通过设置statusline
选项来进行自定义。执行下面的命令:
:set statusline=%f
你可以在状态条上看到当前所编辑文件的路径(相对于当前路径)。再执行这个命令:
:set statusline=%f\ -\ FileType:\ %y
现在你可以在状态条中看到类似foo.markdown - FileType: [markdown]
这样的文字。
如果你熟悉C语言中的printf
或者Python的字符串插值,那么这个选项的格式看起来会比较眼熟。如果不熟悉,你只需要记住以%
开头的字符串会被展开为不同的文字,这取决于%
后面的字符。在上面的示例中,%f
会被替换为文件名,%y
会被替换为文件类型。
注意状态条中的空格需要反斜线进行转义,这是因为set
可以同时设置多个选项,这些选项会用空格分隔,我们在第二章讲过这个。
状态条设置可以很快变得非常复杂,不过有一个更好的办法来设置它们以至于让它们看起来更清晰。执行下面的命令:
:set statusline=%f " 文件的路径
:set statusline+=\ -\ " 分隔符
:set statusline+=FileType: " 标签
:set statusline+=%y " 文件的类型
第一个命令使用=
来设置状态条只显示文件名,从而将之前的所有会在状态条中显示的值都屏蔽掉。之后再使用+=
逐渐添加其他要显示的内容,一次添加一条。同时还使用注释来说明每一条所表示的含义以方便其他的人阅读我们的代码(也会方便我们自己以后阅读)。
执行下面的命令:
:set statusline=%l " 当前行号
:set statusline+=/ " 分隔符
:set statusline+=%L " 总行数
现在状态条只包含当前所在行以及文件的总行数,并且显示成12/223
这个样子。
宽度和边距
可以在%
后面添加额外的字符来改变状态条中信息的显示样式。执行下面的命令:
:set statusline=[%4l]
现在状态条中的文件行数会至少显示为4个字符的宽度(例如:[ 12]
),这可以用于防止状态条中的文字总是令人厌烦地跳来跳去。
默认情况下在值的左边添加边距。执行下面的命令:
:set statusline=Current:\ %4l\ Total:\ %4L
你的状态条看来会是这个样子:
Current: 12 Total: 223
你可以使用-
将边距添加在右边,而不是左边。执行下面的命令:
:set statusline=Current:\ %-4l\ Total:\ %-4L
现在你的状态条看起来会是这个样子:
Current: 12 Total: 223
这样就好看多了,因为数字值是紧挨着它的标签的。
对于会被显示为数字的代码,你可以让Vim使用0代替空格来填充边距。执行下面的命令:
:set statusline=%04l
现在当光标位于第12行的时候你的状态条会显示0012
。
最后,你可以设置一个代码所要输出的值的最大宽度。执行下面命令:
:set statusline=%F
%F
会显示当前文件的_完整_路径。现在执行下面的命令改变最大宽度:
:set statusline=%.20F
如果有必要路径会被删简,像下面这样:
<hapters/17.markdown
这可以用于防止路径或者是其他的很长的代码占用整个行。
通用格式
阅读:help statusline
查看状态条中代码的通用格式:
%-0{minwid}.{maxwid}{item}
除了%
和item外其他都是可选的。
分割
我们不会探讨状态条的更多细节(Vim的文档有非常详细的说明,如果你想学到更多,建议阅读它们),不过我们会介绍一个简单的代码,这个代码可以立即带来价值。执行下面的命令:
:set statusline=%f " 文件的路径
:set statusline+=%= " 切换到右边
:set statusline+=%l " 当前行
:set statusline+=/ " 分隔符
:set statusline+=%L " 总行数
现在状态条的左边会包含文件的路径,当前行/总行数会显示在状态条的右边。%=
这个代码告诉Vim所有在此之后要在状态条上显示的信息都应该右对齐(作为一个整体),而不是左对齐。
练习
浏览:help statusline
中的可用代码。先别在意那些你现在理解不了的代码。
编辑你的~/.vimrc
文件创建一个自定义的状态条。确保在set
中使用+=
来一条一条地定义要显示的代码,并且每一行的设置添加注释来说明每一条的含义。
尝试使用自动命令和setlocal
来为不同的文件定义不同的状态条。确保使用了自动命令组防止自动命令被重复创建(永远记住)。