vim(六) 折疊

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=2
http://edt1023.sayya.org/vim/node12.html

你可能感兴趣的:(vim(六) 折疊)