2009年12月22日 星期二

把Vim折疊(folding)

在我要去上免費課程vim之前,我把「大家來學 Vim一個歷久彌新的編輯器」看過一遍之後,
原本我認為vim的folding是不重要的!但是,在經過上次去上過免費課程vim之後,覺得似乎有那麼一點噱頭~
所以,就打算寫這一篇文章!

突然發現,vim的文章在我的blog越來越多了,所以,就新增一個vim的tag吧~

其實,大部分就是參考「大家來學 Vim一個歷久彌新的編輯器」的內容,新增這一篇文章是可以把在學習過程中使用到的相關資訊補充在這裡!

折疊的產生
zfap 將游標所在處的那個段落折疊成一行。
zf7G 自游標所在處至全文第 7 行折疊起來。
:3,9fold 將第 3 行至第 7 行折疊起來。
5zF 將游標所在處起算 5 行的內容折疊起來。

也可以將所要折疊的部份以 Shift+v 標記起來,然以按 zf 就會將標記的內容折疊起來。

折疊的操作

zo 將游標所在處的折疊打開。open。
zc 將游標所在處已打開的內容再度折疊起來。close。
zr 將全文的所有折疊依層次通通打開。reduce。
zm 將全文已打開的折疊依層次通通再折疊起來。more。
zR 作用和 zr 同,但會打開含巢狀折疊(折疊中又還有折疊)的所有折疊。
zM 作用和 zm 同,但對於巢狀折疊亦有作用。
zi 這是個切換,是折疊與不折疊指令間的切換。
zn 打開全文的所有折疊。fold none。
zN 這是 zn 的相對指令,回復所有的折疊。

折疊的記憶
我們可以使用:mkview把折疊的情形記憶起來,下一次載入同一個檔案時就可以下:loadview,記憶起以前折疊的情況。

另外,這裡要注意一點的是,在Linux下,若你的家目錄下沒有.vimfiles\的話,就出現以下錯誤
Cannot create directory: ~/.vimfiles/view
這個時候,只要在家目錄下,新增一個.vimfiles就可以了。

而在Windows下使用GVimportable的話,就必需要在App\vim\下建立一個vimfiles就可以了~

當完成上述的步驟之後,在到execute mode輸入:mkview就可以把目前的folding情況儲存起來了!而下次打開檔案的時候,在execute mode下輸入:loadview就可以把上次這一個檔案的folding載入進來~

自動折疊
以縮行為依據
:set foldmethod=indent 就會依縮行來折疊,本來預設是 :set foldmethod=normal。請注意,此時手動折疊的設定會被停止無法使用。

以特殊的表示法為依據
:set foldmethod=expr,另外還要設定 :set foldexpr=...,可參考線上使用手冊:h fold-expr的例子。

以語法為依據
這是在定義語法(syntax)檔時同時加入折疊的定義。然後,set foldmethod=syntax就會依照這個語法定義檔去折疊,請:h syn-fold

以是否更改過為依據
這在進入 vimdiff(即 vim -d file1 file2) 時會自動進入foldmethod=diff的模式,因此要 diff 設定項設在同一個螢幕顯示才行。以便整體的瀏覽。當然要自行更改預設值亦可。預設是:

setlocal diff foldmethod=diff scrollbind nowrap foldlevel=1

這樣一來,兩個檔案相同的部份會折疊起來,沒有折疊的部份就是有差異的地方。

以文件上的標誌為依據
這是跟據文章中的標誌(marker)來做折疊。這些標誌,起於{{{,止於}}},這中間的部份會折疊起來。通常這些標誌是藏在註解欄裡頭,例如 C 程式碼的/**/之間,shell script 的#之後,Vim script 的"之後,得視程式語言的不同而定,因此一般的文章就不適合使用了。

這些預設的標誌也可以由 foldmarker 來更改,但為了文件的流通性,建議使用預設值就可以了。

當然,一些程式碼載入時再來設定:set foldmethod=marker就太麻煩了,這個設定可以設在文件內,例如:
#!/bin/sh
# 這是一個 sh script
# {{{
……
這裡是 script 內容,由 vim 打開這
個檔時,這個部份會自動折疊起來。
……
# }}}
# vim:fdm=marker:ts=2

最後一項不是很懂,留到以後再說吧~

參考資料:
把 Vim 折疊(folding)?

1 則留言:

hepha 提到...

這裡能參考自動記憶折疊與打開折疊

vim - Code folding is not saved in my vimrc - Stack Overflow — https://stackoverflow.com/questions/2142402/code-folding-is-not-saved-in-my-vimrc#comment2083579_2142427