LV02-vimscript-03-状态条.md

本文主要是vimscript一些基础知识和操作的相关笔记,若笔记中有错误或者不合适的地方,欢迎批评指正😃。

点击查看使用工具及版本
Windows windows11
Ubuntu Ubuntu16.04的64位版本
VMware® Workstation 16 Pro 16.2.3 build-19376536
点击查看本文参考资料
点击查看相关文件下载
--- ---

一、vim状态条

vim的最下方,有一行东西,如图中所示,它包含了命令缓冲区(我们可以键入命令的地方),还有一个状态条,状态条一般是不显示出来的,除非有两个以上窗口(后边解释)。

在刚启动的时候,键入命令的区域还会显示文件名称等信息;进入下插入模式,会显示插入;录制宏的时候会显示记录中 @a等。

image-20220305184052890

接下来瞅一眼VScode的底栏,瞬间觉得被甩好几十条街。但是其实vim也可以有状态条,并且也是可以配置的,接下来就来看看怎么让它显示我们想要的信息。

image-20220305184530639
VIM: options http://vimcdoc.sourceforge.net/doc/options.html

二、基本语法

1. laststatus选项

这个选项是数值型选项,默认值是1,这个选项控制状态条是否显示。详情可查看vim文档: VIM: options - laststatus

说明
0 永不显示状态条
1 只有在有至少两个窗口时显示状态条
2 总是显示状态条

vim文档可知,默认情况下,只有出现两个窗口以上的时候才会出现状态条,就像这样:

image-20220305185633861

想要设置状态条一直显示的话,可以在命令模式中执行:

1
:set laststatus=2

2. statusline选项

我们可以通过这个选项来自定义每个窗口底部的状态条显示的文字,详情可查看vim文档:VIM: options - statusline

可以在命令模式中执行以下命令来修改当前窗口的状态条显示的内容。

1
:set statusline=format  " format 为格式字符串

statuslineprintf(如果学过C语言的话应该有个大体的印象)风格类似,用 % 来作为某种信息显示的标志,中间可以间杂普通文本。每个状态行项目有如下形式:

1
%-0{minwid}.{maxwid}{item} " % 和 item 必选,其他可选
参数说明
-左对齐项目。如果 minwid 大于项目的长度,缺省是右对齐。
0数值项目前面用零填补。'-' 更优先。
minwid项目的最小宽度,以 '-' 和 '0' 补空。该值不能超过 50。
maxwid项目的最大宽度。如果超过,在文本项目的左侧截短,以 '<' 代替。数值项目则往下移到 maxwid-2 个数位,然后跟 '>'number,其中的 number 是丢失的数位,这非常类似于指数记法。
item单个字符的代码,下面给出描述。

【注意】状态条中的空格需要反斜线(\)进行转义,这是因为set可以同时设置多个选项,这些选项会用空格分隔。

点击查看详细 item

【说明】N 代表数值型;S 代表字符串型;-不适用;F显示标志位。说实话,不是很理解,不过文档有说明。

item类型说明
f S 缓冲区的文件路径,保持输入的形式或相对于当前目录。
FS 缓冲区的文件完整路径。
tS 缓冲区的文件的文件名 (尾部)。
mF 修改标志位,文本是 "[+]";若 'modifiable' 关闭则是 "[-]"。
MF 修改标志位,文本是 ",+" 或 ",-"。
rF 只读标志位,文本是 "[RO]"。
RF 只读标志位,文本是 ",RO"。
hF 帮助缓冲区标志位,文本是 "[help]"。
HF 帮助缓冲区标志位,文本是 ",HLP"。
wF 预览窗口标志位,文本是 "[Preview]"。
WF 预览窗口标志位,文本是 ",PRV"。
yF 缓冲区的文件类型,如 "[vim]"。
YF 缓冲区的文件类型,如 ",VIM"。
qS "[Quickfix List]"、"[Location List]" 或空。
kS "b:keymap_name" 的值或使用 :lmap 映射时的 'keymap':""。
nN 缓冲区号。
bN 光标所在字符的值。
BN 同上,以十六进制表示。
oN 光标所在字节在文件中的字节偏移,第一个字节为 1。助记: 从文件开始的偏移 (Offset) (加上 1){仅当编译时加入 +byte_offset 特性才有效}
ON 同上,以十六进制表示。
NN 打印机页号。(只用于 'printheader' 选项。)
lN 行号。
LN 缓冲区里的行数。
cN 列号。
vN 虚拟列号。
VN 虚拟列号,表示为 -{num}。如果等于 'c' 的值,不显示。
pN 行数计算在文件位置的百分比,如同 CTRL-G 给出的那样。
PS 显示窗口在文件位置的百分比,类似于 'ruler' 描述的百分比。长度总是为 3,除非经过翻译。
aS 参数列表状态,就像缺省标题里的那样。({current} of {max})如果参数列表里的文件数为零或一,空字符串。
{NF计算 '%{' 和 '}' 之间的表达式,并返回其结果替代。注意 结束的 '}'之前没有 '%'。表达式不能包含 '}' 字符,要绕过这点,请调用函数。见下 stl-%{ 。
(- 项目组的开始。可以用来为某组项目设置宽度和对齐。后面某处必须有%)。
)- 项目组的结束。不能指定宽度域。
TN 用于 'tabline': 标签页 N 标签的开始。最后一个标签之后用 %T。鼠标点击时用此信息。
XN 用于 'tabline': 关闭标签页 N 标签的开始。%X 则用来结束当前标签。例如: %3Xclose%X,用 %999X 来代表 "关闭当前标签页" 那个符号。鼠标点击时用此信息。
<- 如果行过长,在什么地方截短。缺省是在开头。不能指定宽度域。
=- 左对齐和右对齐项目之间的分割点。不能指定宽度域。
#- 设置高亮组。必须后面跟名字,然后又是 #。这样,%#HLname# 代表高亮组 HLname。包括非当前窗口的状态行都使用相同的高亮组。
*- 设置高亮组为 User{N},其中的 {N} 取自 minwid 域,比如 %1*。用 %*或者 %*0 可以恢复 normal 高亮。User{N} 和 StatusLine 的区别也会应用到非当前窗口的状态行使用的 StatusLineNC 上。数字 N 必须从 1 到 9。

2.1 显示当前文件路径

在命令模式中执行:

1
:set statusline=%f

效果如下图所示:

image-20220305192018238

2.2 显示当前文件类型

在命令模式中执行:

1
:set statusline=FileType:%y

效果如下图所示:

image-20220305192227539

2.3 显示光标位置

在命令模式中执行:

1
:set statusline=%l-%c

效果如下图所示:

image-20220305203455992

2.4 文件修改标志

在命令模式中执行:

1
:set statusline=%m   " 文件被修改会显示 +

然后进入插入模式修改文件,效果如下图所示:

image-20220305204139297

2.5 同时显示多种信息

上边我们已经可以显示很多的文件信息了,那么如何让他们显示都显示在状态条,以便于我们实时查看文件状态以及各种信息呢?在命令模式中执行:

1
2
" 注意 空格要用 \ 进行转义
:set statusline=%f\ -\ FileType:%y\ -\ %l-%c\ -\ %m

效果如下图所示:

image-20220305204726081

其实这样写还是有些难以分辨,并不能很清楚的知道哪一部分是做什么的,我们还可以这样来写,在命令模式中执行:

1
2
3
4
5
6
7
8
:set statusline=%f         " 文件的路径
:set statusline+=\ -\ " 分隔符
:set statusline+=FileType: " 标签
:set statusline+=%y " 文件的类型
:set statusline+=\ -\ " 分隔符
:set statusline+=%l-%c " 光标位置
:set statusline+=\ -\ " 分隔符
:set statusline+=%m " 修改标记

第一个命令使用=来设置状态条只显示文件名,从而将之前的所有会在状态条中显示的值都屏蔽掉。之后再使用+=逐渐添加其他要显示的内容,一次添加一条。同时还使用注释来说明每一条所表示的含义以方便识别。

2.6 显示信息配色

状态条的颜色是支持自定义的,*就可以调用自定义的配色方案,接下来就来了解下吧。具体的也可以查看官方文档:VIM: syntax

按照配色部分说明,我们可以做如下配色,以便于调用,将该配色信息写入~/.vimrc文件以便于调用。

1
2
3
4
5
hi User1 cterm=none ctermfg=3 ctermbg=0
hi User2 cterm=none ctermfg=4 ctermbg=0
" cterm 彩色终端的属性,设置字体粗体,斜体,正体
" ctermfg 彩色终端前景色 0 - 255
" ctermbg 彩色终端背景色 0 - 255

在命令模式下执行:

1
:set statusline=%1*%f%*\ %2*%y%*

效果如下图所示:

image-20220305215333495

三、定制自己的状态条

其实可以通过插件来进行状态条的定义,可能会更好看,但是什么都不装,使用原始配置的话,可能启动速度会更快。这一次我直接修改用户配置文件~/.vimrc,毕竟窗口设置的只能窗口使用,配置文件设置了才是永久生效。在~/.vimrc文件中添加以下内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
set laststatus=2               " 开启状态条
" 状态条显示信息配置
set statusline=%1*\%<%.50F\ %* " 显示文件名和文件路径 (%<应该可以去掉)
set statusline+=%=%2*\%y%m%r%h%w\ %* "显示文件类型及文件状态
set statusline+=%3*\[%{&ff}]\[%{&fenc}]\ %* "显示文件编码类型
set statusline+=%4*\ row:%l/%L,col:%c\ %* "显示光标所在行和列
set statusline+=%5*\%3p%%\%* "显示光标前文本所占总文本的比例
" 颜色配置
hi User1 cterm=none ctermfg=15 ctermbg=0
hi User2 cterm=none ctermfg=208 ctermbg=0
hi User3 cterm=none ctermfg=169 ctermbg=0
hi User4 cterm=none ctermfg=100 ctermbg=0
hi User5 cterm=none ctermfg=green ctermbg=0
点击查看参数说明
%n*\ ... \%*n 为上边的1, 2, 3, 4, 5表示调用配色方案中的User{n},每行结束处会恢复原来的高亮,使后边显示的文字颜色不受影响
%<如果状态行过长,在何处换行
%F完整文件路径名
%.50F文件路径名长度不超过50,超过则进行缩写
%=在此之后的内容,显示在状态栏上时右对齐
%y文件类型
%m如果缓冲区已修改则表示为[+]
%r如果缓冲区为只读则表示为[RO]
%h如果为帮助缓冲区显示为[Help]
%w如果为预览窗口则显示为[Preview]
%{&ff}显示文件系统类型
%{&fenc}显示文件编码
%l光标所在行数
%L文件总行数
%c光标所在列数
%p当前行数占总行数的的百分比

效果如下图所示:

image-20220305220457529