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     "当前文件的类型

第一行我们用=号来清除statusline之前存在的设置。在后面的命令里我们用+=来依次拼接我们的选项。我们同时会对每一行的设置都加上注释,方便别人和自己阅读。

运行下面的命令:


          :set statusline=%l      "当前行
          :set statusline+=/     "分隔符
          :set statusline+=%L     "总行数

现在状态栏只包含文本的当前行号和总行好,看起来就向“12/223”一样。

宽度和填充

一些其他的字符可以用在%后面来改变信息的显示方式,运行下面的命令: :set statusline=%4l

现在行号的显示宽度是4,在行号不足4位的时候前面会自动填充空格的,例如“ 12” ,这样的话,就可以防止状态栏的文本显得比较混乱了。

默认情况下,填充的空格会加在值的左边。运行下面的命令: :set statusline=Current:\ %4l\ Total:\ %dL

现在,你的状态栏可以看起来和下面一样:


     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}

除了%外,其他的项都是可选的。

分开设置

后面我们会继续讨论状态栏的设置的,不过我们还需要讨论一种简单但是很有用的设置。运行下面的命令:


     :set statusline=%f          "当前文件的路径
     :set statusline+=%=       "切换到右边
     :set statusline+=%l          "当前行号
     :set statusline+=/            "分隔符
     :set statusline+=%l         "总行号

现在状态栏里既包含了当前文件的路径,也包含了当前行和总行数,分别在左边和右边显示。%=告诉vim所有在这个后面设置的选项都会显示在状态栏的右边。

练习

  • 浏览:help statusline里的选项,不用担心有些你不知道的东西。
  • 在你的vimrc文件里定义一个你自己的状态栏。一定要使用+=来分隔多行设置项,对于每个设置项要加上注释。
  • 试着用autocmd和setlocal命令来对不同的文件类型设置不同的状态栏,记得要对autocmd进行分组,以免重复。