摺疊:
vim裡的摺疊命令都以z開頭,有6種摺疊方式:manual,indent,expr,syntax,diff,marker。其中,manual所最基本的,它的命令是通用的,掌握了manual的基本命令,摺疊也就差不多了。要確認摺疊功能開啟:set foldenable。
對摺疊基本操作(當前游標所在之摺疊):za(切換摺疊狀態),zc(關閉摺疊,就是摺疊起來),zd(刪除摺疊),當a、c、d大寫時,則動作是遞迴的。建立摺疊是zf結合游標移動命令(將游標放在函數的開括弧上,用zf%,可方便的將函數折起來)。z0遞迴開啟摺疊。
摺疊裡面有個基本概念,即摺疊層次,就是設定foldlevel選項的值,zM將foldlevel置0,zm、zr分別使foldlevel遞減與遞增。foldlevel與indent類型的摺疊連用,就算所謂的大綱摺疊(set foldmethod=indent),它根據自動縮排shiftsidth的值進行摺疊,最外一層的縮排為第0層次,由此往裡數,大綱摺疊會將foldlevel層次裡的縮排摺疊起來。這種摺疊與zr、zm連用,看代碼比較方便。
:set foldcolumn=n命令定義了左摺疊欄的寬度,預設是0。該欄用“|”顯示摺疊層次。
:set foldmethod=syntax,即用文法定義摺疊,它會將C代碼裡相應的大括弧摺疊起來。
縮排
vim提供4種縮排,:set indenttype。indenttyep可為autoindent、smartindent、cindent、indentexpr。其中,autoindent與vi的autoindent類似,smartindent則是對其做了點加強,可識別基礎C文法,如下:
a、在{後的下一行
b、以cinwords選項中包含的關鍵字開始的行
c、以}結尾的新行
d、游標在含}的行上,用大寫字母O命令,可向上建立新的一行,自動縮排
cindent和indentexpr比較適合C程式員。cindent定義了一般C代碼裡需要的縮排,而indentexpr則威力更強,更靈活,可隨意定義自己的縮排風格。cindent的動作由三個選項定義:
1、cinkeys,定義了一些鍵盤按鍵組合,vim遇到它們時會重新估算當前行的縮排,選項裡面的值用逗號分隔:如0{,0},0),:,0#,!^F,o,O,e,其中0x表示一行的開頭是字元x是,重新估算當前縮排,對於0#,它的縮排距離與前一個#開頭的行相同,#define就很方便了;對於冒號,若:是段標籤或case語句,則重新估算縮排。!x表示,當按下x鍵時,重新估算當前行縮排,注意是插入模式下的按鍵,預設是CTRL+F;o表示當建立任意行時,估算建立行的縮排,無論是插入模式的斷行符號還是命令模式的o命令;O表示在當前行之上建立的新行;e就是else,直到else的最後一個e之前,vim不會識別這種情況。
此外,cinkeys還有個專用關鍵字,如=word和=~word,一旦新行中出現匹配字串word,重新估算縮排,=~word與=word相反,即不出現它的話,估算縮排,且忽略大小寫。
2、cinwords,定義了一些關鍵字,輸入這些關鍵字時,下一行將觸發額外的縮排,其預設值是:if,else,while,do,for,switch。這些關鍵字要分大小寫。
3、cinoptions,這個選項控制vim在C的上下文中重新縮排文本行的行為。:set cinoptions=選項值,它的選項值比較多,下面列舉一些常用的。
fn,{n,設定方式為:set cinoptions=fn,{n,fn是定義了非嵌套的花括弧"{"的縮排距離,預設是0,{與f的行為同,只是它套用到嵌套的開始花括弧"{",預設也是0。
}n,定義結尾的花括弧"}"的位移量,預設為0。
:n,=n,bn,這三個控制case語句的縮排,:n使得vim將case的標籤縮排n個字元(從對應的switch語句開始計算),預設是一個shiftwidth,=n是的case下的行相對於case的縮排,預設是shiftwidth,bn定義了break語句的位置,預設是0,即與相應的case對齊。
)n,*n,這2個設定掃描行數,)n設定vim尋找非結尾括弧的行數,預設是20,*n是設定尋找為結束的注釋掃描行,預設是30。
cinoptions已經有比較全的預設值了,基本不用我們修改。
總結:cinkeys和cinwords定義了觸發vim重新估算縮排的鍵和動作,vim則是根據cinoption裡的設定來進行或重新進行縮排
indentexpr的設定回覆蓋cindent。目錄$VIMRUNTIME/indent下,有很多程式設計語言對應的縮排格式檔案,在.vimrc檔案中載入它們便可用了。關閉縮排的命令式:filetype indent off
當粘貼文本時,自動縮排可能會使得文本很亂,只要:set paste,就可粘貼純文字,不會被縮排,用:set nopasete恢複自動縮排。