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