vim缩进设置详解

  • Post author:
  • Post category:其他




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配置文件



版权声明:本文为u013511885原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。