你应该遇到过在VIM中写代码,但是在其它编辑器中显示错乱的情况,这是因此没有对VIM进行正确的配置。
高级语言配置
首先介绍在VIM中写高级语言(c, c++, java)的配置。
首先这些高级语言都是使用空格进行缩进的,因此需要在VIM中设置set expandtab
把tab键转换为空格。
其次,这些高级语言的代码中,一个tab键是代表4个空格的,所以需要设置set tabstop=4
。
最后,这些高级语言的自动缩进,也是使用4个空格,因此需要设置set shiftwidht=4
。
因此把这些设置项添加到~/.vimrc
中,写出的代码,在任何编辑器中都不会显示错乱。
脚本语言配置
我在写shell脚本时,遇到过空格和制表符的问题。因此我的vim配置是使用上面的高级语言的配置,因此在shell脚本中没有制表符,但是shell中有一个here document语法,它有一种形式,只会忽略每一行前面的制表符,但是空格是不允许的。因此我大胆地对shell脚本的进行了配置。
首先,我不需要把制表符转为空格,所以设置set noexpandtab
。
其实,tab缩进习惯使用4个空格,因此设置set tabstop=4
。
然后,自动缩进也是使用4个空格,因此设置set shiftwidth=4
。
关于softtabstop
很多人对softtabstop
很疑惑,这个说起来有点复杂,我一步一步来解释。
首先要明白softtabstop
的默认值。 如果没有设置set expandtab
,那么softtabstop
默认值是tabstop
的值。否则默认为0
,代表关于这个特性。
那么在高级语言的配置中,设置过set expandtab
,那么这个特性默认是关闭,没什么问题。
在脚本语言配置中,因为需要使用制表符,所有设置的是set noexpandtab
,并且我们要求一个tab显示4个空格的宽度,也就是set tabstop=4
,那么softtabstop
默认为4,然而也没有什么问题。
那么softtabstop
的特性是什么呢?首先,你要明白,它是针对插入模式的。
以脚本的配置为例,
- 默认情况下,
tabstop=4
,softabtop=4
。在插入模式下,如果按一下tab键,那么会插入一个制表符,屏幕上显示四个空格的宽度,如果此时使用删除键,那么只需要按一次,即可删除这个制表符。这个行为正是我们所期望的。 - 如果我们设置
softtabstop=3
,而tabstop=4
保持不变。那么,在插入模式下,按一下tab键,屏幕上会显示三个空格的宽度,此时并没有插入制表符,而是三个空格,如果此时再使用删除键,会一次性把这三个空格一起删除。 - 如果我们设置
softtabstop=5
,而tabstop=4
保持不变。那么,在插入模式下,按一次tab键,屏幕上会显示五个空格的宽度,此时插入的是一个制表符和一个空格,因此制表符是四个空格宽度,再加上一个空格的宽度,正好等于softtabstop=5
。如果再按删除键,也会一次性删除5个宽度,也就是一次性把空格和制表符一起删除。
那么这个softtabstop
究竟有什么用呢?其实对我们程序员来说,没有什么鸟用。但是日常工作中,一个tab键的宽度默认是8,例如打印机就是这样,并且不会把制表符展开为空格,因此softtabstop
默认为tabstop
的值,也就是8。如果我们在vim中编辑文件时,我们想按tab键只显示四个宽度,那么我们可以设置softtabstop=4
,如此一来,在插入模式下,按一个tab和按一次删除键,都是执行四个宽度,并且如果按两下tab,会转换为制表符。
结束
给出我的~/.vimrc
中的配置
" 以下为高级语言(c, c++ ,java)配置
" 这些语言都是使用空格进行缩进,因此需要把制表符转换为空格
set expandtab
" 高级语言使用tab键缩进长度为4
set tabstop=4
" 高级语言的自动缩进也是4个空格的长度
set shiftwidth=4
" 以下为脚本的配置
" set noexpandtab
" set shiftwidth=4
" set tabstop=4
" softtabstop只针对不是写代码的情况,例如需要打印的文档,配置如下
" set noexpandtab
" set tabstop=8
" set shiftwidth=4
" set softtabstop=4
现在你应该明白了tabstop
, shiftwidth
, expandtab
, noexpandstop
, softtabstop
的意思吗?如果你还遇到其它问题,欢迎留言讨论。