1 vim四种自动缩进设置
vim有4种缩进设置:
-
autoindent
-
smartindent
-
cindent
-
indentexpr
这四种缩进设置,后边的优先级要高于前边的。比如,当设置了
cindent
或者
indentexpr
,再设置
smartindent
是没有任何作用的。
1.1 没有设置任何缩进
通过类似
:set autoindent?
的命令,查看四种缩进设置,发现没有设置任何缩进的话,那么,在vim编辑期间,回车所创建的新行,是没有缩进的,光标停留在行首。
1.2 autoindent
跟随上一行的缩进方式。比如,当前行有一个一个tab,那么此时敲回车,新行也会有一个tab;如果当前行有两个空格,那么回车,新行会有两个空格。
1.3 smartindent
用于处理类C编程语言的缩进,也可以用于其他语言,主要规则有:
-
以
{
结尾的行,开启新行会触发缩进 -
以
cinwords
变量开始的行,开启新行会触发缩进(
:set cinwords?
查看该变量为
if,else,while,do,for,switch
) -
在vim的normal mode下,使用o或O创建新行时,若新行在一对
{}
内,则新行要基于
{}
产生一次缩进。 -
其他规则不再多说,详情可
:help smartindent
,总之就是
smartindent
主要是针对类C语言,也可以处理其他语言,满足基本的缩进需求。
1.4 cindent
C语言的缩进方式,并且是一种可以配置的缩进方式,比上述两种缩进要更严格,
C开发者建议使用该缩进方式
。具体的配置方法,可以通过
:help C-indenting
查看。
1.5 indentexpr
不懂,笔者没有对该类型进行了解。有兴趣的读者可以
:help indentexpr
2 制表符tab设置
2.1 tabstop
首先要知道的是,tab键表示制表符,即
\t
,它是一个字符。
tabstop
决定的是,当键入一个制表符时,显示的空白区域等于几个空格。比如
tabstop
设置为3,那么当键入一个制表符,那么它相当于3个空格(但它不是空格,它是一个字符,按一次退格键就可以删掉这个宽度为3的制表符)。
总之就是,tabstop决定的是,
\t
这个东西在
vim
里,显示的宽度;同一个制表符,用不同的软件打开有可能显示的效果是不一样的(
不同的软件解析制表符宽度不一定相同
)。
2.2 softtabstop
有时候只用
tabstop
是不能满足需求的。直接举例子:
:set tabstop=4
:set softtabstop=3
当在
vim
敲击tab键时,它并不会直接写入一个
\t
,而是写入3个空格;当再次敲击tab键时,最终的效果是一个
\t
后跟两个空格,
\t
显示为4个空格(但它不是空格,是制表符)。可以这样理解,当再次敲击tab键时,生成的也是3个空格,但是
vim
会把上一个tab键的3个空格,一起合并计算,那就是6个空格,6个空格中的前4个空格,可以作为一个
\t
,所以最终结果为一个
\t
后跟两个空格。
再举一个例子,比如先敲击11个空格,如果此时按tab,由于
softtabstop
为3,比11大且是3的倍数的最小整数为12,所以此时可以理解为再补上一个空格,共计12个空格,然后12个空格按照
tabstop
的设置,转换成12/4=3个制表符,即最终的效果是3个制表符。
2.3 shiftwidth
shiftwidth
可以理解为与tab键无关,它指示的是当自动缩进发生时,缩进的格数。比如
shiftwidth
为2且
vim
开启了自动缩进,每发生一次缩进,就会缩进2个格,但如果设置的
tabstop
为4,那么会自动将4个空格转换为一个
\t
。
2.4 expandtab
为了避免不同开发者、不同的开发环境导致显示错乱,错乱的原因有很多,这里举例一种:
shiftwidth=2
,
tabstop=4
,不考虑
softtabstop
(如果考虑上
softtabstop
会更乱)。整个代码中,一级缩进缩进了两个空格,二级缩进为四个空格,但是,二级缩进的四个空格会被转换为一个
\t
。如果代码到了其他开发者那里,他的配置恰好是一个制表符显示为两个空格的宽度,那么在他这里,就没办法区分一级缩进和二级缩进了(当然,他可以重新配置他的编辑器对于制表符的解析)。
为了解决上边的问题,有时更建议在代码中开启
set expandtab
这个选项,它将会把所有的
\t
转换为空格。
需要注意的是,千万不要再需要制表符的文件中打开,否则会出问题,比如Makefile需要制表符,但是把制表符转换成空格,Makefile就会报错了
3 SEE ALSO
vim
中执行
:help C-indenting
:主要讲述cindent的配置方法(不配置也行,即使用默认配置)
:help smartindent
:help autoindent
vim字符编码详解
vimrc配置文件