1 vim四种自动缩进设置
vim有4种缩进设置:
autoindent
smartindent
cindent
indentexpr
每种缩进单独设置,后边的优先级要高于前边的。比如,当设置了cindent或者indentexpr,再设置smartindent是没有任何作用的。
设置缩进(每种缩进单独设置):
:set autoindent
:set smartindent
:set cindent
:set indentexpr
取消缩进(每种缩进单独设置):
:set noautoindent
:set nosmartindent
:set nocindent
:set noindentexpr
查看每种缩进是否被设置:
:set autoindent?
:set smartindent?
:set cindent?
:set indentexpr?
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
最新评论: