Usr_28

Nvim :help ページは、生成されます ソース から を使用して tree-sitter-vimdoc パーサーを使用します。


VIM ユーザー マニュアル - 原作者: Bram Moolenaar
折りたたみ
構造化されたテキストは、セクションに分割できます。さらにセクションをサブセクションに分割することもできます。折りたたむことで、セクションを 1 行として表示し、概要を提供できます。この章では、これを実行できるさまざまな方法を説明します。
28.1 折りたたみとは 28.2 手動折りたたみ 28.3 折りたたみの操作 28.4 折りたたみの保存および復元 28.5 インデントによる折りたたみ 28.6 マーカーによる折りたたみ 28.7 構文による折りたたみ 28.8 表現による折りたたみ 28.9 変更されていない行の折りたたみ 28.10 使用する折りたたみ方法
次の章: usr_29.txt プログラム間を移動する 前の章: usr_27.txt 検索コマンドとパターン 目次: usr_toc.txt

折りたたみとは

折りたたみは、バッファ内の行の範囲を画面上で 1 行として表示するために使用されます。折りたたむことで短くする紙のように
+------------------------+ | 行 1 | | 行 2 | | 行 3 | _______________________ | \ \ \________________________\ / 折りたたまれた行 / /________________________/ | 行 12 | | 行 13 | | 行 14 | +------------------------+
テキストは依然としてバッファにあり、変更されません。折りたたみによって影響を受けるのは、行の表示方法のみです。
折りたたみの利点は、セクションの行を折りたたみ、セクションがあることを示す行に置き換えることで、テキストの構造の概要をより把握できることです。

28.2 手動折りたたみ

試してみましょう。段落にカーソルを置いて次のように入力します。
zfap
段落が強調表示された行に置き換わることがわかります。フォールドが作成されました。 zf は演算子で、ap はテキストオブジェクト選択です。 zf 演算子は、任意の移動コマンドと共に使用して、移動したテキストのフォールドを作成できます。 zf はビジュアルモードでも機能します。
テキストをもう一度表示するには、次のように入力して折りたたみを開きます。
zo
そして、次のように入力して折りたたみを開けます。
zc
すべての折りたたみコマンドは「z」で始まります。少し想像力があれば、これが側面から見た折りたたまれた紙のように見えます。「z」の後の文字には、コマンドを覚えやすくするための記憶術的作用があります。
zf F-old 作成 zo O-pen a fold zc C-lose a fold
折りたたみはネストできます。折りたたみを含むテキスト範囲は、もう一度折りたたむことができます。たとえば、このセクションの各段落を折りたたみ、この章のすべてのセクションを折りたたむことができます。試してみましょう。章全体に対する折りたたみを開くと、ネストされた折りたたみは以前の状態に復元されることに気づくでしょう。いくつかは開いているかもしれませんが、いくつかは閉じられているかもしれません。
いくつかの折りたたみを作成し、すべてのテキストを表示したいとします。各折りたたみに行って「zo」と入力する必要があります。これを高速に行うには、次のコマンドを使用します。
zr
これにより、折りたたみが R-educe されます。その反対は
zm
これは折りたたみ M-ore です。「zr」と「zm」を繰り返して、いくつかのレベルのネストされた折りたたみを開いたり閉じたりできます。
深くネストしている場合、次の方法ですべてを開くことができます。
zR
これにより、折りたたみはなくななくなるまで R-educe されます。また、すべての折りたたみは次の方法で閉じることができます。
zM
これにより M-ore and M-ore が折りたたまれます。
zn コマンドを使用して、折りたたみをすばやく無効にすることができます。その後、 zN によって、折りたたみは以前の状態に戻ります。 zi はその 2 つを切り替えます。これは作業を行う上で便利な方法です。
ファイルの概要を取得するための折りたたみを作成します。
作業する場所に移動してください
zi を実行してテキストを確認し、編集します
zi をもう一度実行して移動に戻ります
参照マニュアルの手動フォールドの詳細: fold-manual

28.3 フォールドを使用した作業

フォールドの一部が閉じられている場合、「j」や「k」などの移動コマンドはフォールドを空の単一の行として移動します。これにより、フォールドされたテキストの上で素早く移動できます。
1 行のように、フォールドの yank、削除、配置を実行できます。これは、プログラム内の関数を再注文する場合に非常に便利です。最初に、適切な 'foldmethod' を選択して、各フォールドに完全な関数(またはそれより少し少ない)が含まれていることを確認してください。次に、「dd」で関数を削除し、カーソルを移動して「p」で配置します。関数のいくつかの行がフォールドの上または下に位置する場合は、ビジュアル選択を使用できます
移動する最初の行にカーソルを置きます
「V」を押してビジュアルモードを開始します
移動する最後の行にカーソルを置きます
「d」を押して、選択した行を削除します。
カーソルを新しい位置に移動し、そこで「p」を使用して行を出力します。
フォールドの場所や、zo コマンドが実際に機能する場所を確認または記憶することは、時には難しい場合があります。定義されたフォールドを確認するには
:set foldcolumn=4
ウィンドウの左側に小さな列が表示され、フォールドが示されます。閉じたフォールドには「+」が表示されます。各開いたフォールドの先頭には「-」が表示され、フォールドの次の行には「|」が表示されます。
[foldcolumn] の「+」をクリックすると、マウスを使用してフォールドを開くことができます。その下の「-」または「|」をクリックすると、開いたフォールドが閉じます。
カーソル行のすべてのフォールドを開くには zO を使用します。カーソル行のすべてのフォールドを閉じるには zC を使用します。カーソル行のフォールドを削除するには zd を使用します。カーソル行のすべてのフォールドを削除するには zD を使用します。
挿入モードでは、カーソル行のフォールドは閉じられません。これにより、入力内容を確認できます!
ジャンプしたり、カーソルを左右に移動すると、フォールドは自動的に開きます。たとえば、「0」コマンドはカーソルの下のフォールドを開きます('foldopen' に「hor」(デフォルト)が含まれている場合)。'foldopen' オプションは、特定のコマンドに対してフォールドを開くように変更できます。カーソル下の行を常に開いた状態にするには、次の手順を実行します。
:set foldopen=all
警告: その後、閉じたフォールドに移動できなくなります。一時的にのみ使用して、その後デフォルトに戻すことをお勧めします。
:set foldopen&
フォールドの外に出ると自動的にフォールドを閉じることができます
:set foldclose=all
これにより、カーソルが含まれていないすべてのフォールドに 'foldlevel' が再適用されます。この動作が気に入るかどうかは試してみる必要があります。zm を使用してさらにフォールドし、zr を使用してフォールドを減らします(フォールドを展開します)。
フォールドはウィンドウにローカルです。これにより、1 つのバッファに対して、1 つはフォールド付き、もう 1 つはフォールドなしで、2 つのウィンドウを開くことができます。または、1 つはすべてのフォールドが閉じられていて、もう 1 つはすべてのフォールドが開かれています。

28.4 フォールドの保存と復元

ファイルから解放(編集を開始)すると、フォールドの状態は失われます。後で同じファイルに戻ると、手動で開閉されたすべてのフォールドが既定値に戻ります。フォールドが手動で作成されている場合、すべてのフォールドが消えます! フォールドを保存するには、:mkview コマンドを使用します
:mkview
これにより、ファイルの表示に影響する設定やその他の情報が保存されます。'viewoptions' オプションを使用して、保存される内容を変更できます。後で同じファイルに戻ると、ビューを読み込むことができます
:loadview
一つのファイルに最大10個のビューを格納できます。たとえば、現在のセットアップを3番目のビューとして保存し、2番目のビューを読み込むには
:mkview 3
:loadview 2
行を挿入または削除すると、ビューが無効になる場合があります。ビューが格納される場所を指定するオプションである「viewdir」も確認してください。時折、古いビューを削除したいと思うかもしれません。

28.5 インデントでフォールド

zfを使用してフォールドを定義するのはかなりの作業です。テキストが下位の階層に大きなインデントを付加することで構造化されている場合は、インデントフォールドメソッドを使用できます。これにより、すべての同じインデントを持つ行のシーケンスごとにフォールドが作成されます。インデントが大きい行は、ネストされたフォールドになります。これは多くのプログラミング言語で適切に機能します。
'foldmethod'オプションを設定することで、これを試します
:set foldmethod=indent
それ以降は、zmコマンドとzrコマンドを使用して、フォールドをさらに増やしたり減らしたりできます。この例示テキストでは、簡単に見ることができます
この行はインデントがありません この行は1回インデントがあります この行は2回インデントがあります この行は2回インデントがあります この行は1回インデントがあります この行はインデントがありません この行は1回インデントがあります この行は1回インデントがあります
インデント量とフォールドの深さの関係は、'shiftwidth'オプションに依存します。インデントの'shiftwidth'ごとに1がフォールドの深さに追加されます。これをフォールドレベルと呼びます。
zrコマンドとzmコマンドを使用すると、実際には'foldlevel'オプションが増減します。直接設定することもできます
:set foldlevel=3
これはつまり、'shiftwidth'インデントを3倍するフォールドはすべて閉じられます。foldlevelが低いほど、閉じるフォールドが増えます。'foldlevel'がゼロの場合、すべてのフォールドが閉じられます。zM'foldlevel'をゼロに設定します。反対のコマンドであるzR'foldlevel'をファイルに存在する最も深いフォールドレベルに設定します。
したがって、フォールドを開閉する方法は2つあります。(A) フォールドレベルを設定する。これにより、テキストの構造を表示するために「ズームアウト」、カーソルを移動後、テキストに再び「ズームイン」するという非常に素早い方法が得られます。
(B) zoコマンドとzcコマンドを使用して、特定のフォールドを開閉する。これにより、開きたいフォールドのみが開かれ、他のフォールドは閉じられたままになります。
これらは組み合わせることができます。まず、zmを数回使用してほとんどのフォールドを閉じ、次にzoを使用して特定のフォールドを開きます。またはzRを使用してすべてのフォールドを開き、次にzcを使用して特定のフォールドを閉じます。
ただし、'foldmethod'が「インデント」の場合は、インデントとフォールドレベルの関係と矛盾するため、フォールドを手動で定義することはできません。
リファレンスマニュアルのインデントによるフォールドについての詳細:fold-indent

28.6 マーカーを使ったフォールド

テキスト内のマーカーは、フォールド領域の開始と終了を指定するために使用されます。これにより、フォールドに含まれる行を正確に制御できます。欠点は、テキストを変更する必要があることです。
試してください
: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 */
指定レベルに数字でマーカーが付くごとに、折り畳みが始まります。これにより、高いレベルの折り畳みはここで停止します。折り畳みをすべて定義するには、開始マーカーだけを使用できます。他の折り畳みを開始する前に、前の折り畳みを明示的に停止する必要がある場合にのみ、終了マーカーを追加する必要があります。
マーカーを使用した折り畳みの詳細はリファレンスマニュアルを参照してください: fold-marker

28.7 構文による折り畳み

Vim では、各言語ごとに異なる構文ファイルを使用します。これは、ファイル内のさまざまな項目の色を定義します。ターミナルでこの内容をカラー対応で表示している場合は、表示されている色が「help」構文ファイルによって生成されています。構文ファイル内に、「fold」引数を持つ構文項目を追加することができます。これらは、折り畳み領域を定義します。そのためには、構文ファイルを作成して、これらの項目を追加する必要があります。簡単にできるわけではありません。ただし、完了すれば、すべての折り畳みが自動的に実行されます。ここでは、既存の構文ファイルを使用していると想定します。その場合、説明することはありません。上で説明したように、折り畳みを開閉できます。折り畳みは、ファイルを編集すると自動的に作成および削除されます。
構文による折り畳みの詳細はリファレンスマニュアルを参照してください: fold-syntax

28.8 表現による折り畳み

これはインデントによる折り畳みと似ていますが、行のインデントの代わりにユーザー関数が呼び出されて、行の折り畳みレベルが計算されます。テキスト内の何らかのものがどの行をグループにまとめるかを示しているテキストに使用できます。例として、引用されたテキストが行の前に「>」で示されている電子メールメッセージが挙げられます。これらの引用を折り畳むには、次を使用します
: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 は前の値を入力します。その後、編集できます。
表現が複雑な場合は、関数に入れて、'foldexpr' をその関数を呼び出すように設定する必要があります。
表現による折り畳みの詳細はリファレンスマニュアルを参照してください: fold-expr

28.9 変更されていない行の折り畳み

これは、同じウィンドウで 'diff' オプションを設定する場合に役立ちます。 -d オプションを使用すると、そのように設定できます。例
:setlocal diff foldmethod=diff scrollbind nowrap foldlevel=1
同じファイルの異なるバージョンを表示するすべてのウィンドウでこれを実行します。変更されていないテキストは折り畳まれている一方で、ファイル間の違いが明確に表示されます。
詳細については fold-diffを参照してください。

28.10 どの折り畳み方法を使用するか?

これらの可能性をすべて知っているともともとどの方法を選択すべきかわからなくなります。残念ながら、黄金律はありません。ヒントを以下に示します。
編集中の対象言語の構文ファイルにフォールディングが含まれている場合は、選択の上位にくるものです。そのようなファイルがない場合は、作成してみてください。これには、検索パターンの十分な知識が必要です。作成は簡単ではありませんが、うまく機能すれば、フォールドを手動で定義する必要はなくなります。
領域を手動でフォールドするためのコマンドを入力すると、非構造化テキストに利用できます。その後、:mkview コマンドを使用してフォールドを保存および復元します。
マーカー方式では、ファイルを変更する必要があります。ファイルを他のユーザーと共有するか、会社の標準を使用する必要がある場合は、ファイルを共有できないことがあります。マーカーの主な利点は、必要な場所に正確に配置できることです。これにより、フォールドをカットアンドペーストしても、何行か抜け落ちることはありません。また、フォールドに含まれる内容に関するコメントを追加することもできます。
インデントに従ったフォールディングは多くのファイルで機能しますが、どこでもうまく機能するわけではありません。他の方法を使用できない場合に使用します。ただし、アウトラインに対しては非常に有効です。その場合は、各ネストレベルに特定の'shiftwidth'を指定して使用します。
式によるフォールディングは、ほとんどすべての構造化テキストでフォールドを作成できます。指定は、フォールドの開始と終了が認識しやすい場合に特に簡単になっています。 "expr" 方式を使用してフォールドを定義しても確実に目的どおりに動作しない場合は、"manual" 方式に切り替えられます。これによって、定義済みのフォールドは削除されません。手動でフォールドを削除または追加できます。
次のセクション: usr_29.txtプログラム間を移動
著作権: manual-copyrightを参照
メイン
コマンドインデックス
クイックリファレンス