对于编写代码,缩进是最基本的概念之一。至于缩进是使用空格还是制表符(Tab),或者缩进是否正好使用一个制表符来表示,很多程序员,特别是 Windows 开发出身的程序员,很容易混淆。幸好,Vim 对于这些概念有非常完整的支持,足以应付各种复杂的情况。以下是相关的主要 Vim 选项:
- shiftwidth(缩进的空格数);
- tabstop(制表符的宽度);
- expandtab(是否在缩进和遇到 Tab 键时使用空格替代;使用 noexpandtab 取消设置);
- softtabstop(软制表符宽度,设置为非零数值后使用 Tab 键和 Backspace 时光标移动的格数等于该数值,但实际插入的字符仍受 tabstop 和 expandtab 控制);
- autoindent(自动缩进,即每行的缩进值与上一行相等;使用 noautoindent 取消设置);
- cindent(使用 C 语言的缩进方式,根据特殊字符如“{”、“}”、“:”和语句是否结束等信息自动调整缩进;在编辑 C/C++ 等类型文件时会自动设定;使用 nocindent 取消设置);
- cinoptions(C 语言缩进的具体方式,请参考“:help cinoptions-values”);
- paste(粘贴模式,会取消所有上述选项的影响来保证后面的操作——通常是从剪贴板粘贴代码——保持原有代码的风格;使用 nopaste 取消设置)。
下面给出一些常用的组合:
- shiftwidth=4 tabstop=4:很多 Windows 出身的程序员会习惯这样的设置,让缩进等于制表符宽度。
- shiftwidth=4 tabstop=8:很多 Unix 程序员的设置,仍使用较常用的 4 格缩进,但制表符宽度为标准的 8。
- cinoptions=>4,n-2,{2,^-2,:2,=2,g0,h2,p5,t0,+2,(0,u0,w1,m1 shiftwidth=2 tabstop=8:标准的 GNU 编码风格的设置,对 Vim 缺省的 C 缩进风格作了很多微调,比如,if 语句下的“{”、“}”要在“if”后缩进两格,但函数定义部分“{”、“}”仍和函数名一行对齐。开源软件经常使用该种缩进风格。
在编辑代码时一个很有用的命令是调整代码缩进,可以很方便地增加(或减少)若干级缩进,并自动根据选项设定使用正确的空格或制表符。只需要使用 “V”选中你要调整的代码行,然后键入“<”(或“>”)即可增加(或减少)一级缩进;在键入“<”(或“>”)之前键入数字则 可以指定增加(或减少)的缩进级数。
我们要讨论的最后一个相关的命令是“:retab”。在设定了 expandtab 选项时,该选项会把所有的制表符转换成空格。在没有设定 expandtab 选项时,使用“:retab!”可把空白字符转换成制表符(可能误转换,慎用),使用“:retab n”可以把 tabstop 重置为 n,并转换含制表符的连续空白字符为适当的制表符和空格的组合以保证含制表符的行看起来没有任何变化。详细信息请参看“:help :retab”。