*30.2* C 文件缩进
合理的缩进会使程序更容易理解。Vim 提供了多种方法来简化这项工作。 要对 C 程序缩进,请设定 'cindent' 选项。Vim 相当地了解 C 程序,它会尽可能地 为你自动缩进。通过 'shiftwidth' 选项,你可以指定下一级的缩进空格数。4 个空格的 效果很好。用一个 ":set" 命令就可做到: > :set cindent shiftwidth=4 设定了这一选项之后,当你输入了一个语句,比如 "if (x)" 后,下一行会自动向下一级 缩进。 if (flag) 自动缩进 ---> do_the_work(); 自动取消缩进 <-- if (other_flag) { 自动缩进 ---> do_file(); 保持缩进 do_some_more(); 自动取消缩进 <-- } 当你在大括号 ({}) 内输入时,语句会在开始处缩进,而在结束处取消缩进。每次输入'}' 后都会取消缩进,因为 Vim 不知道你下一步将要输入什么。 自动缩进还能帮助你提前发现代码中的错误。比如当你输入了一个'}'后,如果发现比 预想中多的缩进,那可能缺少了一个 '}'。请用 "%" 命令查找与你输入的 '}' 相 匹配的 '}'。 缺少 ')' 和 ';' 同样会引起额外的缩进。当你发现比预料中多的空格时,最好检查 一下之前的代码。 当你的代码没有被正确地排列,或者你插入或删除了某些行时,你需要重新进行代码缩进。 操作符 "=" 能完成这项功能,最简单的格式是: > == 这会缩进当前行。像其它的操作符一样,有三种方式使用它。可视模式下,"=" 缩进 选中的行。一个有用的文本对象是 "a{"。它会选中当前 {} 区。这样,要重新缩进光标 所在代码块: > =a{ 你还可以重新缩进整个文件: > gg=G //这个很强的 但是,不要对已经手工缩进的文件使用此命令。自动缩进的确做得很好,但在某些情况下 你也许确实需要手工缩进。 设 定 缩 进 风 格 不同的人有不同的缩进风格。在默认情况下,Vim 采用了 90% 的程序员都使用的一种方式 并能很好地完成工作。但是,如果你想使用其它的风格,你可以通过 'cinoptions' 选项 来设定。 'cinoptions' 默认为空,Vim 会使用默认风格。你可以在你希望改变的地方添加相应 的项目。例如,要使大括号的缩进如下所示: if (flag) ~ { ~ i = 8; ~ j = 0; ~ } ~ 请使用这个命令: > :set cinoptions+={2 还有很多其它的项目可供使用。请参考 |cinoptions-values|。 ============================================================================== *30.3* 自动缩进 你无需每次编辑 C 文件时都手工设定 'cindent' 选项。通过下面的命令你可以使它自动 化: > :filetype indent on 实际上,它不仅为 C 文件打开了 'cindent' 选项。首先,它会使 Vim 自动检查文件 类型。语法高亮同样需要此功能。 一旦文件类型被识别,Vim 会为此类型的文件查找相关的缩进文件。(Vim 的发行 中包含了适合多种不同编程语言的缩进文件。)该缩进文件将会被用来缩进当前文件。 如果你不喜欢这项功能,可以将它关闭: > :filetype indent off 如果你不想为某种特定类型的文件进行缩进,你可以这样做: 首先建一个只包括下行的文件: > :let b:did_indent = 1 然后将其重命名为: {directory}/indent/{filetype}.vim {filetype}是文件类型的名字,比如 "cpp" 或 "java"。你可以用下面的命令来得到 Vim 识别到的文件类型名: > :set filetype 对本文件,输出会是: filetype=help ~ 这样你就可以用 "help" 来表示 {filetype}。 对 {directory} 部分,你需要根据你的运行时目录来设定。请查看下面命令的输出: > set runtimepath 请使用第一项(也就是第一个逗号前的名字)。如果上面命令的输出是: runtimepath=~/.vim,/usr/local/share/vim/vim60/runtime,~/.vim/after ~ 你需要使用 "~/.vim"来表示 {directory}。这样最后的文件名就是: ~/.vim/indent/help.vim ~ 除了关闭缩进选项,你还可以编写自己的缩进文件。请参考|indent-expression|。 ============================================================================== *30.4* 其它缩进 最简单的自动缩进通过 'autoindent' 选项来完成,它会延续上一行的缩进。稍微聪明点的 是 'smartindent',这个选项对那些没有缩进文件可用的编程语言很有用。'smartindent' 选项没有 'cindent' 选项聪明,但要比'autoindent'聪明些。 如果 'smartindent' 被设定,新一级的缩进会添加在每个 '{' 处(在 '}' 处清除)。 另外,对于 'cinwords' 选项所设定的所有单词也会添加新一级的缩进。所有以 '#' 开始 的行都会被特殊处理:所有缩进都被清除。这样做是为了保持所有的预处理命令都在第一 列开始。缩进会在下一行中恢复。 修 正 缩 进 当你利用 'autoindent' 和 'smartindent' 选项延续上一行的缩进时,有很多时候你都 需要添加或删除一个'shiftwidth'宽度的缩进。一个快速的方法是在插入模式下利用 CTRL-D 和 CTRL-T 命令。 比如,当你需要输入以下的 shell 脚本时: if test -n a; then ~ echo a ~ echo "-------" ~ fi ~ 设定了这样的选项: > :set autoindent shiftwidth=3 你先输入了第一行,按下回车后又输入了第二行的开头: if test -n a; then ~ echo ~ 这时你会发现你需要一个额外的缩进。输入 CTRL-T,结果变为: if test -n a; then ~ echo ~ 在插入模式下,CTRL-T 命令会加入一个 'shiftwidth' 宽度的缩进,无论光标在当前行的 什么位置。 你继续输入第二行,按下回车后又输入了第三行。现在的缩进一切正常。然后你按下 回车输入最后一行,现在的情况如下所示: if test -n a; then ~ echo a ~ echo "-------" ~ fi ~ 要删除这个多余的缩进,可以在最后一行输入 CTRL-D。这会删除一个 'shiftwidth' 宽度的 缩进,无论光标在行中的什么位置。 在普通模式下,你可以用 ">>" 和 "<<" 命令来完成缩进的修正。'>' 和 '<' 是操作符, 因此你可以使用通常的那三种方式来指定你要缩进的行。一个有用的组合是: > >i{ 这个命令会缩进当前{}区内的行,'{' 和 '}' 本身并不被缩进。( ">a{" 会包括它们。) 在下面的例子中,光标停留在"printf"上: 原文 ">i{" 之后 ">a{" 之后 if (flag) if (flag) if (flag) ~ { { { ~ printf("yes"); printf("yes"); printf("yes"); ~ flag = 0; flag = 0; flag = 0; ~ } } } ~