*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;     ~  
 } }         }   ~