Usr_28
Nvim :help
頁面,由 產生,來源為 此處,使用 tree-sitter-vimdoc 解析器。
VIM 使用者手冊 - 作者:Bram Moolenaar
摺疊
結構化的文字可以分成不同的段落。段落又可再分成子段落。摺疊功能可以讓您將一個段落顯示為一行,提供一個概觀。本章將說明不同的摺疊方法。
什麼是摺疊?
摺疊用於將緩衝區中的一系列行顯示為螢幕上的一行。就像將一張紙摺疊起來使其變短一樣。
+------------------------+ | 第 1 行 | | 第 2 行 | | 第 3 行 | _______________________ | \ \ \________________________\ / 已摺疊的行 / /________________________/ | 第 12 行 | | 第 13 行 | | 第 14 行 | +------------------------+
文字仍然在緩衝區中,沒有變更。只有行的顯示方式受到摺疊的影響。
摺疊的優點在於您可以透過摺疊某個段落的行,並以一行來取代它,以指示該處是一個段落,從而更好地概觀文字的結構。
試試看:將游標放在某個段落中,然後輸入
zfap
您會看到該段落被一行反白的行所取代。您已建立了一個摺疊。
zf 是一個運算子,而
ap 是一個文字物件選取。您可以將
zf 運算子與任何移動指令搭配使用,為移動過的文字建立摺疊。
zf 也適用於視覺模式。
要再次檢視文字,請輸入以下指令開啟摺疊:
zo
您可以使用以下指令再次關閉摺疊:
zc
所有的摺疊指令都以 "z" 開頭。稍加想像,這看起來就像從側面看去的一張摺疊的紙。 "z" 後面的字母具有助記意義,以便更容易記住這些指令。
zf 建立摺疊 (F-old creation) zo 開啟摺疊 (O-pen a fold) zc 關閉摺疊 (C-lose a fold)
摺疊可以巢狀:包含摺疊的文字區域可以再次摺疊。例如,您可以摺疊本節中的每個段落,然後摺疊本章中的所有章節。試試看。您會注意到,開啟整章的摺疊會還原巢狀摺疊,某些可能已開啟,某些可能已關閉。
假設您已建立多個摺疊,現在想要檢視所有文字。您可以前往每個摺疊並輸入 "zo"。若要更快地執行此操作,請使用此指令:
zr
這會 R-educe (減少) 摺疊。相反的是:
zm
這會摺疊 M-ore (更多)。您可以重複 "zr" 和 "zm" 以開啟和關閉多個層級的巢狀摺疊。
如果您有數個深層的巢狀層級,可以使用以下指令開啟所有層級:
zR
這會 R-educes (減少) 摺疊,直到沒有摺疊為止。您可以使用以下指令關閉所有摺疊:
zM
這會摺疊 M-ore (更多) 和 M-ore (更多)。
您可以使用
zn 指令快速停用摺疊。然後
zN 會還原摺疊的狀態。
zi 會在兩者之間切換。這是一種很有用的工作方式:
建立摺疊以取得檔案的概觀
移動到您想要工作的地方
當某些摺疊關閉時,像 "j" 和 "k" 這樣的移動指令會像移動單個空行一樣在摺疊上移動。這讓您可以快速地在摺疊的文字上移動。
您可以複製、刪除和貼上摺疊,就好像它是單行一樣。如果您想要重新排列程式中的函式,這非常有用。首先,請確保每個摺疊都包含整個函式(或稍微少一點),方法是選取正確的
'foldmethod'。然後使用 "dd" 刪除函式,移動游標並使用 "p" 貼上。如果函式的某些行在摺疊的上方或下方,您可以使用視覺選取:
將游標放在要移動的第一行
按下 "V" 以啟動視覺模式
將游標放在要移動的最後一行
按下 "d" 以刪除選取的行。
將游標移動到新位置,然後將這些行 "p" 貼上。
有時很難看到或記住摺疊的位置,因此
zo 指令實際上的作用位置。若要查看已定義的摺疊:
:set foldcolumn=4
這會在視窗左側顯示一個小欄,以指示摺疊。關閉的摺疊會顯示 "+"。每個開啟的摺疊的開頭會顯示 "-",而摺疊的後續行會顯示 "|"。
您可以使用滑鼠,方法是按一下摺疊欄中的 "+" 以開啟摺疊。按一下 "-" 或其下方的 "|" 會關閉已開啟的摺疊。
若要開啟游標所在行的所有摺疊,請使用
zO。若要關閉游標所在行的所有摺疊,請使用
zC。若要刪除游標所在行的摺疊,請使用
zd。若要刪除游標所在行的所有摺疊,請使用
zD。
當處於插入模式時,游標所在行的摺疊永遠不會關閉。這樣您就可以看到自己輸入的內容!
當您跳轉或左右移動游標時,摺疊會自動開啟。例如,"0" 指令會開啟游標下的摺疊 (如果
'foldopen' 包含 "hor",這是預設值)。可以變更
'foldopen' 選項,以便為特定的指令開啟摺疊。如果您想要游標下的行永遠開啟,請執行以下操作:
:set foldopen=all
警告: 這樣您將無法移動到關閉的摺疊上。您可能只想要暫時使用此設定,然後再將其設定回預設值。
:set foldopen&
您可以讓摺疊在您移出時自動關閉:
:set foldclose=all
這會將
'foldlevel' 重新套用至所有未包含游標的摺疊。您必須試用看看是否喜歡這種感覺。使用
zm 以摺疊更多,並使用
zr 以摺疊更少 (減少摺疊)。
摺疊是視窗本機的。這讓您可以在同一個緩衝區開啟兩個視窗,一個視窗有摺疊,另一個視窗沒有摺疊。或者一個視窗關閉所有摺疊,另一個視窗開啟所有摺疊。
當您放棄一個檔案 (開始編輯另一個檔案) 時,摺疊的狀態會遺失。如果您稍後返回同一個檔案,所有手動開啟和關閉的摺疊都會恢復為預設值。當手動建立摺疊時,所有摺疊都會消失!若要儲存摺疊,請使用
:mkview 指令:
:mkview
這會儲存設定和其他會影響檔案檢視方式的項目。您可以使用
'viewoptions' 選項變更要儲存的內容。當您稍後返回同一個檔案時,可以再次載入檢視:
:loadview
您可以在一個檔案上儲存最多十個檢視。例如,若要將目前的設定儲存為第三個檢視,並載入第二個檢視:
:mkview 3
:loadview 2
請注意,當您插入或刪除行時,檢視可能會失效。另請查看
'viewdir' 選項,該選項指定檢視的儲存位置。您可能需要不時刪除舊的檢視。
使用
zf 定義摺疊會需要很多工作。如果您的文字是透過為較低層級的項目提供較大的縮排來組織,您可以使用縮排摺疊方法。這會為每個縮排相同的行序列建立摺疊。縮排較大的行會變成巢狀摺疊。這適用於許多程式語言。
透過設定
'foldmethod' 選項來嘗試此功能:
:set foldmethod=indent
然後您可以使用
zm 和
zr 指令來摺疊更多或減少摺疊。在此範例文字中很容易看到:
此行未縮排 此行縮排一次 此行縮排兩次 此行縮排兩次 此行縮排一次 此行未縮排 此行縮排一次 此行縮排一次
因此,有兩種方式可以開啟和關閉摺疊:(A) 透過設定摺疊層級。這提供了一種非常快速的方式來「縮小」以檢視文字結構、移動游標,然後再次「放大」以檢視文字。
(B) 透過使用
zo 和
zc 指令來開啟或關閉特定的摺疊。這讓您可以僅開啟您想要開啟的摺疊,而其他摺疊則保持關閉。
這可以結合使用:您可以先多次使用
zm 關閉大多數摺疊,然後使用
zo 開啟特定的摺疊。或者使用
zR 開啟所有摺疊,然後使用
zc 關閉特定的摺疊。
但是當
'foldmethod' 為 "indent" 時,您無法手動定義摺疊,因為這會與縮排和摺疊層級之間的關係衝突。
文字中的標記用於指定摺疊區域的開始和結束。這可以精確地控制哪些行包含在摺疊中。缺點是需要修改文字。
試試看:
:set foldmethod=marker
範例文字,可能出現在 C 程式中:
/* foobar () {{{ */
int foobar()
{
/* return a value {{{ */
return 42;
/* }}} */
}
/* }}} */
請注意,摺疊的行會顯示標記之前的文字。這對於說明摺疊包含哪些內容非常有用。
當移動某些行後,標記無法正確配對時,會非常煩人。可以使用編號標記來避免這種情況。範例:
/* global variables {{{1 */
int varA, varB;
/* functions {{{1 */
/* funcA() {{{2 */
void funcA() {}
/* funcB() {{{2 */
void funcB() {}
/* }}}1 */
在每個編號的標記處,指定層級的摺疊會開始。這會使任何更高層級的摺疊在此處停止。您可以使用編號的起始標記來定義所有摺疊。只有當您想要在另一個摺疊開始之前明確停止摺疊時,才需要加入結束標記。
對於每種語言,Vim 使用不同的語法檔案。這定義檔案中各種項目的顏色。如果您在支援顏色的終端機中使用 Vim 閱讀本文,您看到的顏色是由「help」語法檔案產生的。在語法檔案中,可以加入具有「fold」參數的語法項目。這些定義一個摺疊區域。這需要編寫語法檔案並在其中加入這些項目。這並不容易做到。但一旦完成,所有摺疊都會自動進行。在這裡,我們假設您正在使用現有的語法檔案。那麼就沒有什麼需要解釋的了。您可以像上面解釋的那樣打開和關閉摺疊。當您編輯檔案時,將會自動建立和刪除摺疊。
這與依縮排摺疊類似,但是它不是使用行的縮排,而是調用使用者函式來計算行的摺疊層級。您可以將此用於文本中某些內容指示哪些行屬於一起的情況。一個例子是電子郵件訊息,其中引用的文本由行前的「>」表示。要摺疊這些引號,請使用此方法
:set foldmethod=expr
:set foldexpr=strlen(substitute(substitute(getline(v:lnum),'\\s','',\"g\"),'[^>].*','',''))
您可以在此文字上嘗試一下
> 他寫的引用文字 > 他寫的引用文字 > > 我寫的雙重引用文字 > > 我寫的雙重引用文字
範例中使用的
'foldexpr' 的說明(由內而外):getline(v:lnum) 取得目前行,substitute(...,'\\s','','g') 從行中移除所有空格,substitute(...,'[^>].*','','') 移除開頭 '>' 之後的所有內容,strlen(...) 計算字串的長度,即找到的 '>' 數量
請注意,對於「:set」命令,必須在每個空格、雙引號和反斜線之前插入反斜線。如果這讓您感到困惑,請執行
:set foldexpr
以檢查實際的結果值。若要修正複雜的運算式,請使用命令列完成功能
:set foldexpr=<Tab>
其中
<Tab>
是一個真正的 Tab 鍵。Vim 將填入先前的值,然後您可以對其進行編輯。
當您在同一個視窗中設定
'diff' 選項時,這很有用。
-d 選項會為您執行此操作。範例
:setlocal diff foldmethod=diff scrollbind nowrap foldlevel=1
在每個顯示同一檔案不同版本的視窗中執行此操作。您將清楚地看到檔案之間的差異,而未變更的文字會被摺疊起來。
所有這些可能性都讓您想知道應該選擇哪種方法。不幸的是,沒有黃金法則。以下是一些提示。
如果存在用於您正在編輯的語言的摺疊語法檔案,那可能就是最佳選擇。如果沒有,您可以嘗試編寫它。這需要對搜尋模式有很好的了解。這並不容易,但是當它運作時,您將不必手動定義摺疊。
輸入命令來手動摺疊區域可用於非結構化文字。然後使用
:mkview 命令來儲存和還原您的摺疊。
標記方法要求您變更檔案。如果您與其他人共享檔案,或者您必須符合公司標準,您可能不被允許加入它們。標記的主要優點是您可以將它們放在您想要的確切位置。這避免了當您剪下並貼上摺疊時遺漏一些行。而且您可以新增關於摺疊中包含內容的註解。
依縮排摺疊是一種可以在許多檔案中運作的方法,但並不總是很好。當您無法使用其他方法時,請使用它。但是,它對於大綱非常有用。然後,您會針對每個巢狀層級特別使用一個
'shiftwidth'。
使用運算式摺疊幾乎可以在任何結構化文字中進行摺疊。指定它非常簡單,尤其是當可以輕鬆識別摺疊的開始和結束時。如果您使用「expr」方法來定義摺疊,但它們與您想要的不完全相同,您可以切換到「manual」方法。這不會移除已定義的摺疊。然後您可以手動刪除或新增摺疊。