我们经常可以看到在一些功能强大的IDE中,可以将一段代码,一个函数,一段标签围起来的代码折叠到一行,方便浏览和整体把握程序。在VIM中我们 也可以通过VIM提供的相关命令来对代码或文本进行折叠,以下是站长在网上收集的一篇讲述VIM折叠的文章。以下是折叠一段文本文件的示例:
1. 折叠方式 可用选项 ‘foldmethod’ 来设定折叠方式:set fdm=***** 。 有 6 种方法来选定折叠: manual 手工定义折叠 indent 更多的缩进表示更高级别的折叠 expr 用表达式来定义折叠 syntax 用语法高亮来定义折叠 diff 对没有更改的文本进行折叠 marker 对文中的标志折叠 注意,每一种折叠方式不兼容,如不能即用expr又用marker方式,我主要轮流使用indent和marker方式进行折叠。
使用时,用:set fdm=marker 命令来设置成marker折叠方式(fdm是foldmethod的缩写)。 要使每次打开vim时折叠都生效,则在.vimrc文件中添加设置,如添加:set fdm=syntax,就像添加其它的初始化设置一样。
2. 折叠命令 选取了折叠方式后,我们就可以对某些代码实施我们需要的折叠了,由于我使用indent和marker稍微多一些,故以它们的使用为例: 如果使用了indent方式,vim会自动的对大括号的中间部分进行折叠,我们可以直接使用这些现成的折叠成果。 在可折叠处(大括号中间): zc 折叠 zC 对所在范围内所有嵌套的折叠点进行折叠 zo 展开折叠 zO 对所在范围内所有嵌套的折叠点展开 [z 到当前打开的折叠的开始处。 ]z 到当前打开的折叠的末尾处。 zj 向下移动。到达下一个折叠的开始处。关闭的折叠也被计入。 zk 向上移动到前一折叠的结束处。关闭的折叠也被计入。
当使用marker方式时,需要用标计来标识代码的折叠,系统默认是{{{和}}},最好不要改动之:) 我们可以使用下面的命令来创建和删除折叠: zf 创建折叠,比如在marker方式下: zf56G,创建从当前行起到56行的代码折叠; 10zf或10zf+或zf10↓,创建从当前行起到后10行的代码折叠。 10zf-或zf10↑,创建从当前行起到之前10行的代码折叠。 在括号处zf%,创建从当前行起到对应的匹配的括号上去((),{},[],<>等)。 zd 删除 (delete) 在光标下的折叠。仅当 ‘foldmethod’ 设为 “manual” 或 “marker” 时有效。 zD 循环删除 (Delete) 光标下的折叠,即嵌套删除折叠。 仅当 ‘foldmethod’ 设为 “manual” 或 “marker” 时有效。 zE 除去 (Eliminate) 窗口里“所有”的折叠。 仅当 ‘foldmethod’ 设为 “manual” 或 “marker” 时有效。
台湾网站上看到的:
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://hi.baidu.com/simp/blog/item/b0ac04ced4e32230b600c8e5.html