Fold(折りたたみ)
Nvim の :help
ページは、生成されたもので、ソース(tree-sitter-vimdoc パーサー使用)から作成されています。
'foldmethod' を "manual" 以外の値に設定すると、すべての折りたたみは削除され、新しい折りたたみは作成されます。"manual" メソッドに切り替えても、既存の折りたたみは削除されません。これは、最初に自動的に折りたたみを定義してから、手動で変更する場合に役立ちます。
折りたたみの選択方法は6種類あります:manual 手動で折りたたみ領域を定義する indent インデントレベルで折りたたみ領域を定義する expr 式を指定して折りたたみ領域を定義する syntax シンタックスハイライトで定義された折りたたみ diff 変更されていないテキストに対する折りたたみ marker テキスト内のマーカーで定義された折りたたみ
コマンドを使用して、折りたたみ領域を手動で定義します。テキストを解析して折りたたみを見つけるスクリプトでも使用できます。
折りたたみレベルは、そのネストによってのみ定義されます。行範囲の折りたたみレベルを増やすには、その中に同じ行を持つ折りたたみを作成します。
手動で作成された折りたたみは、ファイルを終了すると失われます。折りたたみを保存するには、
:mkview コマンドを使用します。ビューは後で
:loadview で復元できます。
折りたたみは、行のインデントによって自動的に定義されます。
折りたたみレベルは、行のインデントを
'shiftwidth' で割った値(小数点以下切り捨て)から計算されます。同じまたはより高い折りたたみレベルを持つ行のシーケンスは、より高いレベルの行がネストされた折りたたみとなる折りたたみとして構成されます。
空行、空白行、および
'foldignore' に指定された文字で始まる行は無視され、上または下の行の折りたたみレベル(どちらか低い方)が使用されます。
'foldignore' の文字をチェックする前に、空白はスキップされます。C言語の場合、プリプロセッサ行を無視するには "#" を使用します。
"indent" メソッドと同様に、折りたたみは折りたたみレベルによって自動的に定義されます。
'foldexpr' オプションの値は、行の折りたたみレベルを取得するために評価されます。例:これは、タブで始まる連続するすべての行に対して折りたたみを作成します。
:set foldexpr=getline(v:lnum)[0]==\"\\t\"
これは、空行で区切られた段落を折りたたみにします。
:set foldexpr=getline(v:lnum)=~'^\\s*$'&&getline(v:lnum+1)=~'\\S'?'<1':1
これは同じことを行います。
:set foldexpr=getline(v:lnum-1)=~'^\\s*$'&&getline(v:lnum)=~'\\S'?'>1':1
バックスラッシュは、":set" で異なる処理が行われる文字(スペース、バックスラッシュ、二重引用符など)をエスケープするために使用されなければなりません(
option-backslashを参照)。
最も効率的な方法は、引数なしで関数を呼び出すことです。
:set foldexpr=MyFoldLevel()
関数は v:lnum を使用する必要があります。
expr-option-function を参照してください。
式が評価される条件は以下のとおりです。
現在のバッファとウィンドウが行に対して設定されます。
"v:lnum" 変数に行番号が設定されます。
結果は、次のように折りたたみレベルに使用されます:値 意味 ~ 0 行は折りたたみの中にない 1, 2, .. 行はこのレベルの折りたたみの中にある -1 折りたたみレベルが未定義の場合、この行の前または後の行の折りたたみレベルのうち、低い方が使用される。 "=" 前の行の折りたたみレベルを使用する "a1", "a2", .. 前の行の折りたたみレベルに1, 2, .. を加算し、現在の行に使用します "s1", "s2", .. 前の行の折りたたみレベルから1, 2, .. を減算し、次の行に使用します "<1", "<2", .. このレベルの折りたたみはこの行で終わる ">1", ">2", .. このレベルの折りたたみはこの行で始まる
">1" ("<1") で折りたたみの開始(終了)をマークする必要はありません。折りたたみレベルが前の行の折りたたみレベルより高くなると(低くなると)、折りたたみは開始(終了)します。
式には副作用があってはなりません。バッファ内のテキスト、カーソルの位置、検索パターン、オプションなどは変更してはなりません。注意深く行う場合は、変更して復元できます。
式にエラーがある場合、または結果の値が認識されない場合、エラーメッセージは表示されず、折りたたみレベルは0になります。デバッグのために、
'debug' オプションを "msg" に設定すると、エラーメッセージが表示されます。
注記:式はすべての行に対して評価する必要があるため、この折りたたみ方法は非常に遅くなる可能性があります!
"=", "a"、および "s" の戻り値は避けてください。Vim は多くの場合、折りたたみレベルが定義されている行を逆方向に検索する必要があるためです。これは遅くなる可能性があります。
"a1" と "s1" の使用例:複数行の C 言語コメントでは、「/*」を含む行は折りたたみを開始するために "a1" を返し、「*/」を含む行はその行の後に折りたたみを終了するために "s1" を返します。
if match(thisline, '/\*') >= 0
return 'a1'
elseif match(thisline, '\*/') >= 0
return 's1'
else
return '='
endif
ただし、これは単一行コメント、文字列などでは機能しません。
foldlevel() は、前の折りたたみレベルに対する折りたたみレベルを計算するのに役立ちます。ただし、foldlevel() は、レベルがまだ不明な場合は -1 を返す可能性があります。また、行の先頭でのレベルを返し、折りたたみはその行で終了する可能性があります。
折りたたみがきちんと更新されない場合があります。
zx または
zX を使用して、折りたたみの更新を強制できます。
適切な構文同期を指定する必要があります。これが正しく行われないと、折りたたみは表示されるハイライトと異なる可能性があります。これは、複数行に一致するパターンを使用する場合に特に関連します。疑問がある場合は、総当たり法の同期を試してください。
:syn sync fromstart
折りたたみは、変更の一部ではないテキストまたは変更に近いテキストに対して自動的に定義されます。
このメソッドは、
'diff' オプションが現在のウィンドウに対して設定され、変更が表示されている場合にのみ正しく機能します。それ以外の場合は、バッファ全体が1つの大きな折りたたみになります。
'diffopt' オプションを使用して、コンテキストを指定できます。つまり、折りたたみと変更の間で折りたたみを含まない行の数です。たとえば、8行のコンテキストを使用するには
:set diffopt=filler,context:8
デフォルトのコンテキストは6行です。
'scrollbind' も設定されている場合、Vim は他の diff ウィンドウで同じ折りたたみを開いたままにしようとします。そのため、同じテキストが表示されます。
テキスト内のマーカーは、折りたたみが始まる場所と終わる場所を示します。これにより、折りたたみ範囲を正確に指定できます。これにより、間違った行を含めるリスクなしに、折りたたみを行うことができます。
'foldtext' オプションは通常、マーカーの前にあるテキストが折りたたまれた行に表示されるように設定されます。これにより、折りたたみ名を設定することができます。
マーカーにはレベルを含めることも、一致するペアを使用することもできます。レベルを含める方が簡単です。終了マーカーを追加する必要がなく、マーカーペアが一致しないという問題を回避できます。例
/* global variables {{{1 */
int varA, varB;
/* functions {{{1 */
/* funcA() {{{2 */
void funcA() {}
/* funcB() {{{2 */
void funcB() {}
{{{ }}} 折りたたみが "{{{" マーカーで始まります。次の数字は折りたたみレベルを指定します。現在の折りたたみレベルとマーカーで指定されたレベルの差によって何が起こるか異なります:1. 同じ折りたたみレベルのマーカーが検出されると、前の折りたたみは終了し、同じレベルの別の折りたたみが始まります。2. より高い折りたたみレベルのマーカーが見つかった場合、ネストされた折りたたみが始まります。3. より低い折りたたみレベルのマーカーが見つかった場合、このレベルまでのすべての折りたたみは終了し、指定されたレベルの折りたたみが始まります。
この数字は折りたたみレベルを示します。0は使用できません(レベル0のマーカーは無視されます)。数字を使用して "}}}" を使用して、終了する折りたたみのレベルを示すことができます。次の行の折りたたみレベルは、指定されたレベルより1つ少なくなります。Vim は一致するマーカーのレベルをさかのぼって確認しません(時間がかかりすぎるため)。例
{{{1
fold level here is 1
{{{3
fold level here is 3
}}}3
fold level here is 2
折りたたみ定義には、"{{{" と "}}}" マーカーの一致するペアを使用することもできます。それぞれの "{{{" は折りたたみレベルを1つ増やし、それぞれの "}}}" は折りたたみレベルを1つ減らします。マーカーが一致するように注意してください!例
{{{
fold level here is 1
{{{
fold level here is 2
}}}
fold level here is 1
番号付きマーカーと番号なしマーカーの両方を使用できます。これを行う便利な方法は、大きな折りたたみには番号付きマーカーを使用し、関数内ではローカルに番号なしマーカーを使用することです。たとえば、ファイルのセクション(「構造体定義」、「ローカル変数」、「関数」など)にはレベル1の折りたたみを使用します。各定義と関数にはレベル2のマーカーを使用し、関数内には番号なしマーカーを使用します。関数の変更によって折りたたみ分割を行う場合、マーカーの番号を付け直す必要はありません。
マーカーは、
'foldmarker' オプションで設定できます。Vimユーザー間でファイルを交換できるように、このオプションはデフォルト値の"{{{,}}}"のままにしておくことをお勧めします。ファイルに必要な場合(例:別の折りたたみエディターのマーカーが含まれている場合、またはデフォルトのマーカーがファイルの言語で問題を引き起こす場合)のみ変更してください。
fold-create-marker "zf"を使用して、マーカーによって定義された折りたたみを作成できます。Vimは自動的にマーカーを挿入します。
'foldmarker'で指定された開始マーカーと終了マーカーが追加されます。マーカーは行末に追加されます。
'commentstring'が空でない場合は、それが使用されます。ただし、以下の状況では正しく動作しません。
その行に既にレベル番号付きのマーカーが含まれている場合。Vimは処理方法が分からなくなります。
近くの折りたたみで、邪魔になるレベル番号がマーカーに含まれている場合。
その行がコメント内にあり、
'commentstring'が空ではなく、入れ子になったコメントが機能しない場合。例えば、C言語でコメント内に
/* {{{ */
を追加すると、既存のコメントが切り捨てられます。マーカーをコメントの前または後に配置するか、手動でマーカーを追加してください。既にレベル番号付きのマーカーがある場合、Vimにマーカーを作成させるのは一般的に良い考えではありません。
fold-delete-marker "zd"を使用して、マーカーによって定義された折りたたみ削除できます。Vimは自動的にマーカーを削除します。Vimは、折りたたみの開始と終了で
'foldmarker'で指定された開始マーカーと終了マーカーを検索します。マーカー周辺のテキストが
'commentstring'と一致する場合は、そのテキストも削除されます。ただし、以下の状況では正しく動作しません。
1行に複数のマーカーが含まれており、そのうちの1つがレベルを指定している場合。折りたたみ削除の目的が達成されるかどうかを確認せずに、最初のものだけが削除されます。
マーカーにレベル番号が含まれており、複数の折りたたみを同時に開始または終了するために使用されている場合。
すべての折りたたみコマンドは"z"で始まります。ヒント:"z"は側面から見ると折り畳まれた紙のように見えます。
zF zF [count]行の折りたたみを作成します。"zf"と同様に機能します。
:{range}fo[ld]
:fold :fo {range}
内の行の折りたたみを作成します。"zf"と同様に機能します。
zd E351 zd カーソル位置にある折りたたみ1つを削除します。カーソルが折り畳まれた行にある場合、その折りたたみは削除されます。入れ子になった折りたたみは1レベル上に移動します。ビジュアルモードでは、選択範囲内のすべての折りたたみ(部分的にも)の1レベルが削除されます。注意:これにより、予期しない数の折りたたみが多く削除される可能性があり、手動折りたたみには元に戻す機能がありません。これは、
'foldmethod'が"manual"または"marker"の場合にのみ機能します。
fold-delete-markerも参照してください。
zD zD カーソル位置にある折りたたみを入れ子まで再帰的に削除します。ビジュアルモードでは、選択範囲内のすべての折りたたみ(部分的にも)、およびそれらに入れ子になったすべての折りたたみは削除されます。これは、
'foldmethod'が"manual"または"marker"の場合にのみ機能します。
fold-delete-markerも参照してください。
'foldminlines'より小さい折りたたみは、常に開いているように表示されます。そのため、以下のコマンドは小さな折りたたみに対して異なる動作をする場合があります。
zo zo カーソル下の折りたたみ1つを開きます。数が指定されている場合は、その深さまで開きます。ビジュアルモードでは、選択範囲内のすべての行について、折りたたみの1レベルが開きます。
zO zO カーソル下のすべての折りたたみを入れ子まで再帰的に開きます。カーソル行を含まない折りたたみは変更されません。ビジュアルモードでは、選択範囲内にあるすべての折りたたみ(部分的に選択されているものも含む)が開きます。
zc zc カーソル下の折りたたみ1つを閉じます。数が指定されている場合は、その深さまで閉じます。ビジュアルモードでは、選択範囲内のすべての行について、折りたたみの1レベルが閉じられます。
'foldenable'が設定されます。
zC zC カーソル下のすべての折りたたみを入れ子まで再帰的に閉じます。カーソル行を含まない折りたたみは変更されません。ビジュアルモードでは、選択範囲内にあるすべての折りたたみ(部分的に選択されているものも含む)が閉じられます。
'foldenable'が設定されます。
za za 要約:カーソル下の折りたたみを切り替えます。閉じた折りたたみにある場合:開きます。折りたたみに入れ子がある場合は、"za"を数回使用する必要がある場合があります。開いた折りたたみにある場合:閉じ、
'foldenable'を設定します。これは1レベルのみ閉じます。"za"を再び使用すると折りたたみが開きます。数が指定されている場合は、その数の折りたたみ閉じられます("za"をその回数繰り返すこととは異なります)。
zA zA 閉じた折りたたみにある場合:入れ子まで再帰的に開きます。開いた折りたたみにある場合:入れ子まで再帰的に閉じ、
'foldenable'を設定します。
zv zv カーソル行を表示:カーソルがある行が折り畳まれていないようにするのに十分な折りたたみのみを開きます。
zx zx 折りたたみを更新する:手動で開閉した折りたたみを取り消します。
'foldlevel'を再適用してから"zv"を実行します:カーソル行を表示します。また、折りたたみの再計算も強制します。これは、
'foldexpr'を使用していて、折りたたみが正しく更新されないような方法でバッファーが変更された場合に役立ちます。
:foldo :foldopen :{range}foldo[pen][!]
{range}
内の折りたたみを開きます。[!]を追加すると、すべての折りたたみが開きます。
{range}
内のすべてのテキストを表示するのに役立ちます。[!]がない場合は、折りたたみの1レベルが開きます。
:foldc :foldclose :{range}foldc[lose][!]
{range}
内の折りたたみ閉じます。[!]を追加すると、すべての折りたたみ閉じられます。
{range}
内のすべてのテキストを隠すのに役立ちます。[!]がない場合は、折りたたみの1レベル閉じられます。
折りたたみ上を移動する
[z [z 現在開いている折りたたみの先頭に移動します。既に先頭にある場合は、それを含む折りたたみの先頭に移動します。含む折りたたみがない場合は、コマンドは失敗します。数が使用されている場合は、コマンドを[count]回繰り返します。
]z ]z 現在開いている折りたたみの末尾に移動します。既に末尾にある場合は、それを含む折りたたみの末尾に移動します。含む折りたたみがない場合は、コマンドは失敗します。数が使用されている場合は、コマンドを[count]回繰り返します。
zj zj 次の折りたたみの先頭に下方向に移動します。閉じた折りたたみは1つの折りたたみとしてカウントされます。数が使用されている場合は、コマンドを[count]回繰り返します。このコマンドは
オペレーターの後で使用できます。
zk zk 前の折りたたみの末尾に上方向に移動します。閉じた折りたたみは1つの折りたたみとしてカウントされます。数が使用されている場合は、コマンドを[count]回繰り返します。このコマンドは
オペレーターの後で使用できます。
:[range]foldd[oopen]
{cmd}
:foldd :folddo :folddoopen 閉じていない折りたたみの中にないすべての行で
{cmd}
を実行します。[range]が指定されている場合は、これらの行のみが使用されます。
{cmd}
が実行されるたびに、カーソルはその行に配置されます。これは":global"コマンドと同様に機能します。最初に、閉じていない折りたたみの中にないすべての行にマークが付けられます。次に、マークされたすべての行に対して
{cmd}
が実行されます。したがって、
{cmd}
が折りたたみを変更した場合でも、実行場所には影響しません(もちろん、行が削除された場合を除きます)。例
:folddoopen s/end/loop_end/ge
"end"が一致しない場合にエラーメッセージが表示されないようにするため、"e"フラグの使用に注意してください。
:[range]folddoc[losed]
{cmd}
:folddoc :folddoclosed 閉じた折りたたみの中にあるすべての行で
{cmd}
を実行します。それ以外は":folddoopen"と同様です。
閉じた折りたたみの色は、Foldedグループ
hl-Foldedで設定されます。折りたたみ列の色は、FoldColumnグループ
hl-FoldColumnで設定されます。色の設定例
:highlight Folded guibg=grey guifg=blue
:highlight FoldColumn guibg=darkgrey guifg=white
'foldlevel'は数値オプションです。値が大きいほど、より多くの折り畳まれた領域が開かれます。
'foldlevel'が0の場合、すべての折りたたみは閉じられます。
'foldlevel'が正の場合、一部の折りたたみは閉じられます。
'foldlevel'が非常に大きい場合、すべての折りたたみが開きます。
'foldlevel'は変更されると適用されます。その後、手動で折りたたみを開閉できます。増加させた場合、新しいレベルより上の折りたたみは開きます。手動で開かれた折りたたみは閉じられません。減少させた場合、新しいレベルより上の折りたたみは閉じられます。手動で閉じられた折りたたみは開かれませn。
'foldtext'は、式を指定する文字列オプションです。この式は評価され、閉じられた折りたたみに対して表示されるテキストが取得されます。例
:set foldtext=v:folddashes.substitute(getline(v:foldstart),'/\\*\\\|\\*/\\\|{{{\\d\\=','','g')
これは、折り畳みの最初の行を示しており、「/*」、「*/」、および「{{{」は削除されています。コロンセッティングコマンドによって一部の文字が解釈されないように、バックスラッシュを使用していることに注意してください。関数を定義して呼び出す方がはるかに簡単です。
:set foldtext=MyFoldText()
:function MyFoldText()
: let line = getline(v:foldstart)
: let sub = substitute(line, '/\*\|\*/\|{{{\d\=', '', 'g')
: return v:folddashes .. sub
:endfunction
'foldtext' の評価は、
サンドボックスで行われます。現在のウィンドウは、その行を表示するウィンドウに設定されます。
エラーは無視されます。デバッグするには、
'debug' オプションを "throw" に設定します。
デフォルト値は
foldtext() です。これは、ほとんどの種類の折り畳みに対して妥当なテキストを返します。気に入らない場合は、独自の
'foldtext' 式を指定できます。これは、次の特別な Vim 変数を使用できます。v:foldstart(折り畳みの最初の行番号)、v:foldend(折り畳みの最後の行番号)、v:folddashes(折り畳みレベルを表すダッシュを含む文字列)、v:foldlevel(折り畳みの折り畳みレベル)
結果が
リストの場合、解析され、「オーバーレイ」仮想テキストのように描画されます(
nvim_buf_set_extmark()を参照)。それ以外の場合は、結果が文字列に変換され、タブはスペースに置き換えられ、印刷できない文字は印刷可能な文字になります。
結果の行はウィンドウに収まるように切り詰められ、折り返されることはありません。テキストの後にスペースがある場合、
'fillchars'で指定された文字で埋められます。
'foldtext' 式が s: または
<SID>で始まる場合、スクリプトIDに置き換えられます(
ローカル関数)。例
set foldtext=s:MyFoldText()
set foldtext=<SID>SomeFoldText()
コロンセッティングコマンドが異なる方法で処理する文字(スペース、バックスラッシュ、二重引用符)には、バックスラッシュを使用する必要があることに注意してください。
option-backslash
'foldcolumn' は数値であり、折り畳みを示すウィンドウの側面の列の幅を設定します。0の場合、foldcolumnはありません。通常の値はauto:9です。最大値は9です。
開いている折り畳みは、上に「-」、下に「|」の文字を持つ列で示されます。この列は、開いている折り畳みが終わるところで停止します。折り畳みがネストされている場合、ネストされた折り畳みは、それが含まれている折り畳みの右側に1文字配置されます。
閉じている折り畳みは「+」で示されます。
fold columnが狭すぎてすべてのネストされた折り畳みを表示できない場合、ネストレベルを示す数字が表示されます。
マウスを使用して、fold columnをクリックすることで折り畳みを展開および折りたたむこともできます。
「+」をクリックして、この行で閉じている折り畳みを展開します。
他の空白以外の文字をクリックして、この行で開いている折り畳みを閉じます。
その他のオプション
カーソルを上下に移動したり、スクロールしたりすると、カーソルは折り畳まれた行のシーケンスの最初の行に移動します。カーソルが既に折り畳まれた行にある場合、次の展開された行または次の閉じられた折り畳みに移動します。
カーソルが折り畳まれた行上にある間、カーソルは常に最初の列に表示されます。ルーラーには実際のカーソル位置が表示されますが、行が折り畳まれているため、そこに表示することはできません。
多くの移動コマンドは、折り畳まれた行のシーケンスを空行のように扱います。「w」コマンドは、最初の列で一度停止します。
閉じられた折り畳み内で検索を開始すると、現在の折り畳み内では一致が見つかりません。前方検索は常に閉じられた折り畳みの終わりから開始され、後方検索は閉じられた折り畳みの始めから開始されるようなものです。
挿入モードでは、カーソル行は折り畳まれません。これにより、入力内容を確認できます。
演算子を使用する場合、閉じられた折り畳みは全体として含まれます。したがって、「dl」はカーソル下の閉じられた折り畳みをすべて削除します。
バッファ行で動作するExコマンドの場合、範囲は常に閉じられた折り畳みの最初の行で始まり、閉じられた折り畳みの最後の行で終わるように調整されます。したがって、このコマンド
:s/foo/bar/g
を閉じられた折り畳みでカーソルを使用して使用すると、折り畳みのすべての行で「foo」が「bar」に置き換えられます。
:folddoopen と
:folddoclosed には適用されません。
以前に編集されたバッファを編集する場合、最後に使用された折り畳み設定が再び使用されます。手動折り畳みの場合は、定義済みの折り畳みが復元されます。すべての折り畳み方法について、手動で開いたり閉じたりした折り畳みが復元されます。このバッファがこのウィンドウで編集されている場合、その時点での値が使用されます。それ以外の場合は、バッファが最後に編集されたウィンドウの値が使用されます。