略微加速

略速 - 互联网笔记

vim缩进设置详解

2022-06-07 leiting (3022阅读)

标签 Vim

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



北京半月雨文化科技有限公司.版权所有 京ICP备12026184号-3