11. 把 Vim 折疊(folding)?
把 Vim 折疊(folding)後,然後可以放入口袋?呵呵,當然不是這樣啦!這是 Vim 的一個很特殊功能(原始 vi 及一般的 vi clone 皆無此功能)。簡單的說,就是可以將文章內容,依據他的結構,把多行內容集中於其中一個代表行來顯示,螢幕上只看得到章節標題那一代表行,這樣整個文章結構就一目了然,真正要閱讀其他內容時,再由簡單的按鍵或滑鼠來打開。這對於不含目錄結構的文件或程式碼很有用處。
11.1 手動折疊
折疊的行為表現是由 foldmethod[fdm] 這個設定項來控制的,這個設定項預設是 manual,就是手動設定,這是本節所要敘述的最基本折疊方式。其他折疊方式會在下一節介紹,折疊的方式,其中會有互相衝突的地方,使用上請注意一下。
11.1.1 折疊的產生
手動產生折疊的指令是 zf、zF、:fo[ld],以下以例子來說明較清楚。
zfap | 將游標所在處的那個段落折疊成一行。 |
zf7G | 自游標所在處至全文第 7 行折疊起來。 |
:3,9fold | 將第 3 行至第 7 行折疊起來。 |
5zF | 將游標所在處起算 5 行的內容折疊起來。 |
也可以將所要折疊的部份以 Shift+v 標記起來,然以按 zf 就會將標記的內容折疊起來。
11.1.2 折疊的操作
zo | 將游標所在處的折疊打開。open。 |
zc | 將游標所在處已打開的內容再度折疊起來。close。 |
zr | 將全文的所有折疊依層次通通打開。reduce。 |
zm | 將全文已打開的折疊依層次通通再折疊起來。more。 |
zR | 作用和 zr 同,但會打開含巢狀折疊(折疊中又還有折疊)的所有折疊。 |
zM | 作用和 zm 同,但對於巢狀折疊亦有作用。 |
zi | 這是個切換,是折疊與不折疊指令間的切換。 |
zn | 打開全文的所有折疊。fold none。 |
zN | 這是 zn 的相對指令,回復所有的折疊。 |
那這個 zn 和 zR 不是都一樣嗎?不是的,zR 的作用於 foldlevel 這個設定項,是控制折疊的層次,而 zn 則是作用於 foldenable 這個設定項,他是不管層次的,只有全關或全開。當然,所得到的結果有許多情形下是一樣的,但裡子不一樣,這在寫Vim script 時得小心分辨。
通常,游標在折疊處向左或向右移的話,折疊也會自動打開。在進入編輯模式,例如按 i 或 o,這是也會自動打開折疊。
其他的複製、刪除及替換等動作還是可以和一般正常文稿一樣的操作,例如 dd 就會刪掉一整個折疊,yy 會複製一整個折疊,p 會貼上一整個折疊。把整個折疊就當做是一行就行了。
11.1.3 折疊的記憶
手動折疊,在下一次開檔時就消失了,但我們可以使用 :mkview 把折疊的情形記憶起來,下一次載入同一個檔案時就可以下 :loadview,記憶起以前折疊的情況。當然,使用手動折疊及記憶,在操作上並不是很方便,除非是把他寫成Vim script 來叫用。因此下一節要談到自動折疊,這可能會比較實用一點。
11.2 自動折疊
這裡比較實用的是依文件內的標誌來折疊,因此其他的方式就只稍微介紹了。
11.2.1 以縮行為依據
:set foldmethod=indent 就會依縮行來折疊,本來預設是 :set foldmethod=normal。請注意,此時手動折疊的設定會被停止無法使用。
11.2.2 以特殊的表示法為依據
:set foldmethod=expr,另外還要設定 :set foldexpr=...,可參考線上使用手冊 :h fold-expr 的例子。
11.2.3 以語法為依據
這是在定義語法(syntax)檔時同時加入折疊的定義。然後,set foldmethod=syntax 就會依照這個語法定義檔去折疊,請 :h syn-fold。
11.2.4 以是否更改過為依據
這在進入 vimdiff(即 vim -d file1 file2) 時會自動進入 foldmethod=diff 的模式,因此要diff 設定項設在同一個螢幕顯示才行。以便整體的瀏覽。當然要自行更改預設值亦可。預設是:
setlocal diff foldmethod=diff scrollbind nowrap foldlevel=1
這樣一來,兩個檔案相同的部份會折疊起來,沒有折疊的部份就是有差異的地方。
11.2.5 以文件上的標誌為依據
這是跟據文章中的標誌(marker)來做折疊。這些標誌,起於 {{{,止於 }}},這中間的部份會折疊起來。通常這些標誌是藏在註解欄裡頭,例如 C 程式碼的 /* 及 */ 之間,shell script 的 # 之後,Vim script 的 " 之後,得視程式語言的不同而定,因此一般的文章就不適合使用了。
這些預設的標誌也可以由 foldmarker 來更改,但為了文件的流通性,建議使用預設值就可以了。
當然,一些程式碼載入時再來設定 :set foldmethod=marker 就太麻煩了,這個設定可以設在文件內,例如:
#!/bin/sh # 這是一個 sh script # {{{ …… 這裡是 script 內容,由 vim 打開這 個檔時,這個部份會自動折疊起來。 …… # }}} # vim:fdm=marker:ts=2http://edt1023.sayya.org/vim/node12.html