天天看點

vim 縮進

*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  

 你先輸入了第一行,按下回車後又輸入了第二行的開頭:  

 echo   ~  

 這時你會發現你需要一個額外的縮進。輸入   CTRL-T,結果變為:  

       echo   ~  

 在插入模式下,CTRL-T   指令會加入一個   'shiftwidth'   寬度的縮進,無論光标在目前行的  

 什麼位置。  

       你繼續輸入第二行,按下回車後又輸入了第三行。現在的縮進一切正常。然後你按下  

 回車輸入最後一行,現在的情況如下所示:  

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

 } }         }   ~  

vim