*fold.txt* For Vim バージョン 8.1. Last change: 2019 Jun 02 VIMリファレンスマニュアル by Bram Moolenaar
折疊 (Folding)
ユーザーマニュアルの 28 章に折疊についての紹介がされてゐる。|usr_28.txt|
1. 折疊方法 | |fold-methods| |
2. 折疊コマンド | |fold-commands| |
3. 折疊オプション | |fold-options| |
4. 折疊の振舞 | |fold-behavior| |
{|+folding| 機能無しでコンパイルした場合には利用できない}
折疊を行ふ方法は ’foldmethod’ オプションで設定できる。
’foldmethod’ を "manual" 以外の値に設定すると、存在してゐる折疊は全て削除され新たな折疊が作成される。"manual" に切換へた時には既存の折疊は削除されない。これを利用すればまず自動的に折疊を定義し、それから手動で變更することが可能である。
折疊方法は 6 つの中から選擇できる:
manual | 手動で折疊を定義する |
indent | インデントの數を折疊のレベル (深さ) とする |
expr | 折疊を定義する式を指定する |
syntax | 構文强調により折疊を定義する |
diff | 變更されてゐないテキストを折疊對象とする |
marker | テキスト中の印で折疊を定義する |
折疊領域を定義するためにコマンドを手動で利用する。これはテキスト中の折疊を行ふ箇所をスクリプトにより解析するのに使ふこともできる。
折疊のレベルは折疊の入れ子の深さとなる。ある行範圍の折疊レベルを增やすには、折疊がある同じ範圍に對して再び折疊を設定する。
手動折疊はファイルを抛棄すると失はれる。折疊を保存するには |:mkview| コマンドを使用する。後に復元するには |:loadview| を使用する。
折疊は各行のインデントにより自動的に定義される。
折疊レベルは各行のインデント量を、’shiftwidth’ で割る (端數切捨て) ことで計算される。同じかより高い折疊レベルを持つた一續きの範圍は 1 つの折疊を形成し、より高いレベルを持つた範圍はその中で入れ子の折疊となる。
折疊の入れ子は ’foldnestmax’ によつて制限される。
ある行ではインデントを無視して直ぐ上か下の行のうち、低いほうの折疊レベルが使用される。無視されるのは完全な空行か、空白文字だけからなる行、および ’foldignore’ の文字で始まる行である。’foldignore’ の文字の前に空白文字があつても無視される。C ではプリプロセッサー行を無視するために "#" を使用する。
他の方法で無視する行を定義するには、"expr" の方法を使用する。’foldexpr’ の中で、ある行のインデントを取得するのに、函數|indent()|を使ふことができる。
折疊は "indent" 方式のやうに、折疊レベルによつて自動的に定義される。’foldexpr’ オプションの値は、各行についてこの折疊レベルを計算するためにスクリプトとして實行される。例:
タブで始まる一聯の行範圍を 1 つの折疊にまとめる:
:set foldexpr=getline(v:lnum)[0]==\"\\t\"
折疊レベルを計算するのに Vim script の函數を呼び出す:
:set foldexpr=MyFoldLevel(v:lnum)
空行で仕切られた「段落」を折疊とする:
: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
Note:
バックスラッシュ (日本では \ 記號)が ":set" の流儀で、通常とは異なるキャラクタ (空白文字、バックスラッシュ、ダブルクォート、その他、詳細は |option-backslash| 參照) をエスケープしてゐることに注意。
式が評價される際の前提條件は以下の通り:
値 | 意味 |
---|---|
0 | 對象行は折疊に含まれない |
1, 2, .. | 對象行はこのレベルの折疊に含まれる |
-1 | 折疊レベルを未定義とし、對象行の直前か直後の行のうち低い方を、對象行のレベルとする。 |
"=" | 直前の行と同じレベルを使用する |
"a1", "a2", .. | 直前の行のレベルを +1, +2 して、結果を現在の行に適用する。 |
"s1", "s2", .. | 直前の行のレベルを -1, -2 して、結果を現在の行に適用する。 |
"<1", "<2", .. | 指定したレベルの折疊を對象行で終了する |
">1", ">2", .. | 指定したレベルの折疊を對象行から開始する |
折疊は直前の行の折疊レベルより高い (低い) 行から開始 (終了) されるので、折疊の開始 (終了) マーク ">1" ("<1") は明示的に指定する必要は無い。
式に副作用があつてはならない。バッファ內のテキストや、カーソルの位置や、檢索パターン、オプションその他。どれひとつ變更してはならない。ただし、注意深く行へば、變更してもそれを復元しておけばよい。
式にエラーがあるか、結果が認識できない時には、何のエラーメッセージも表示せずに折疊レベルは 0 に設定される。’debug’ オプションに "msg" を設定すれば、エラーメッセージが表示されるやうになるので、デバッグに利用できる。
Note:
各行について式評價が實行されるので、この折疊方式は非常に動作が遲くなる可能性がある!
"=", "a", そして "s" は極力避けるやうにする。なぜなら Vim はそれらが使はれると、折疊レベルが定義された行が見つかるまで戾つて、幾度も檢索を行はなければならないからだ。これは動作が遲くなることがある。
"a1" と "s1" の使用例: C 言語の複數行コメントを折りたたむ場合、"/*" を含む行では "a1" を返してその開始位置を、"*/" を含む行では "s1" を返してその終了位置を示す:
if match(thisline, '/\*') >= 0 return 'a1' elseif match(thisline, '\*/') >= 0 return 's1' else return '=' endif
ただし、單一行コメント內、文字列リテラル內などではこれは正しく機能しない。
フォールドレベルを調べるには |foldlevel()| を使ふのが便利である。レベルがわからないときは -1 を返すことに注意すること。フォールドがその行で終はつてゐるときには行頭のレベルを返す。
折疊が適切に更新されない場合がある。その場合は |zx| か |zX| を使つて强制的に更新すること。
折疊が "fold" 引數を持つ構文要素によつて定義される。|:syn-fold|
折疊レベルは入れ子によつて定義される。入れ子の深さは ’foldnestmax’ によつて制限される。
シンタックスの同期の設定に注意すること。これが正しく設定されてゐないとフォールドが閒違つたハイライトで表示される。これは特に複數行にマッチするシンタックスで問題になる。そのやうなときには次のやうな力技がある:
:syn sync fromstart
テキストの變更された箇所とその近邊以外が自動的に折疊として定義される。
この方法は現在のウィンドウに對して ’diff’ オプションが設定されてゐる時にだけ正しく働き、變更點が表示される。さうでない場合バッファ全體が 1 つの大きな折疊となる。
コンテキスト (の行數) を指定するのに ’diffopt’ を使ふことができる。これにより變更點の近邊の折疊に含まない行數を指定できる。下の例では 8 行表示するやうに設定してゐる:
:set diffopt=filler,context:8
省略した場合には 6 行が表示される。
’scrollbind’ が設定されてゐるとき、Vim は他のウィンドウと見た目が同じになるやうにフォールドを開いた狀態に保たうとする。
テキスト中の印により折疊の開始と終了地點を指定する。これにより明確に折疊を設定することができる。また誤つた行を含むことなく、折疊を削除・設定できる。通常 ’foldtext’ オプションは折疊の行に表示されるテキストとして、印の直前のテキスト設定する。これにより折疊に名前を設定することが可能になる。
印には折疊レベルを含むことができ、また開始と終了で對になる文字を使ふこともできる。必ずしも終了の印を加へる必要はなく、また對がない印が無い場合の問題も避けられるので、レベルを含んだはうがより簡單である。例:
/* グローバル變數 {{{1 */ int varA, varB; /* 函數 {{{1 */ /* funcA() {{{2 */ void funcA() {} /* funcB() {{{2 */ void funcB() {}
折疊は印 "{{{" で開始する。印の後ろの番號は折疊レベルを示す。現在の折疊レベルと異なるレベルが印によつて與へられた時に何が起こるかは、そのレベルの差に依存する:
番號は折疊レベルを示す。0 を使ふことはできない (レベル 0 の印は無視される)。特定のレベルの折疊を終了させるため "}}}" 數字を付けて使ふことができる。その印の直後の行の折疊レベルは示されたレベルよりも 1 つだけ低くなる。Vim は指定されたレベルにマッチする印を檢索はしないことに注意 (計算に時閒がかかりすぎてしまふので)。例:
{{{1 ここからレベル 1 の折疊 {{{3 ここからレベル 3 の折疊 }}}3 ここからレベル 2 の折疊
折疊を定義するのに對になる "{{{" と "}}}" を使用することもできる。折疊レベルは "{{{" 1 つにつき 1 ずつ增加し、"}}}" 1 つにつき 1 ずつ減少する。印同士の對應關係を維持するやうに氣をつけること! 例:
{{{ ここからレベル 1 の折疊 {{{ ここからレベル 2 の折疊 }}} ここからレベル 1 の折疊
番號付きの印と番號無しの印を混ぜて使用することもできる。大きな折疊には番號付きの印を使用し、函數中の小さな折疊などには番號無しの印を使ふと便利だらう。一例を擧げれば、ファイルの "構造體定義" や "ローカル變數" それから "函數定義" のやうな部分にはレベル 1 (番號付き) の折疊を使用する。
そして 1 つ 1 つの定義や函數實裝にはレベル 2 の折疊を使用し、函數內部 (例へばあるブロックなど) には番號無しの印を使用する。かうしておけば函數の中で折疊を分割するやうな變更を行ふ時に、印にレベルを付け直す必要はなくなる。
印は ’foldmarker’ オプションにより變更できる。Vim ユーザー閒でファイルを交換できるやうにするためには、このオプションのデフォルトである "{{{,}}}" は變更しないことが推奬される。ファイルによつてそれがどうしても必要な時 (例へば別のエディタで作成した折疊を示す異なる印を含んでゐる時や、ファイル內容の制約によりデフォルトの印が問題を起こすため、それを使ふことができない場合) にだけ變へるやうに。
印による折疊を作成するのに "zf" コマンドを使用することができる。Vim がユーザーに代はつて印を插入する。Vim は ’foldmarker’ で指定された開始の印と終了の印を追加する。印は行末に追加される。’commentstring’ が空でなければそれが使用される。これは次のやうな時には正しく働かない:
一般的に、既に番號付き折疊が存在する場合には、Vim に印を作成させるのは良いアイデアではない。
印による折疊を削除するのに "zd" コマンドを使用することができる。Vim がユーザーに代はつて印を削除する。Vim は ’foldmarker’ で指定された開始の印と終了の印を檢索する。印の周りにある ’commentstring’ に適合するテキストは可能な限り削除される。 これは次のやうな時には正しく働かない:
全ての折疊コマンドは "z" で始まつてゐる。ヒント: "z" は紙片を折つた樣子を橫からみた姿に見える。
折疊を作成する操作。
’foldmethod’ が "manual" か "marker" の時だけ動作する。"manual" の時には新しい折疊は閉ぢられる。’foldenable’ がセット (有效化) される。
|fold-create-marker| も參照。
[count] 行を折疊として作成する。"zf" と同じやうに動作する。
{range} で示された範圍を折疊にする。"zf" と同樣に動作する。
カーソルの位置にある折疊を 1 つ削除する。カーソルが折疊になつてゐる行にある場合には、その折疊が削除される。入れ子になつた折疊は 1 レベル分が削除される。ビジュアルモードでは選擇された範圍の全ての折疊 (partially) の 1 レベル分が削除される。
Careful:
これは期待したよりも餘計に折疊を削除し易く、また手動折疊に對してはアンドゥもできないので注意が必要。’foldmethod’ が "manual" か "marker" の時だけ動作する。|fold-delete-marker| も參照。
カーソルの位置の折疊を再歸的に削除する。ビジュアルモードでは、選擇された範圍內の入れ子も含め全ての折疊 (partially) が削除される。’foldmethod’ が "manual" か "marker" の時だけ動作する。
|fold-delete-marker| も參照。
ウィンドウにある全ての折疊を削除する。’foldmethod’ が "manual" か "marker" の時だけ動作する。
|fold-delete-marker| も參照。
’foldminlines’ よりも少ない行數の折疊は常に開いたやうに表示される。從つて以下のコマンドは小さな折疊に關しては異なつた働きを持つ。
カーソルの下の折疊を一段階開く。カウントが與へられた場合には、複數の深さの折疊が開かれる。ビジュアルモードでは、選擇された範圍にある全ての折疊が 1 レベル開かれる。
カーソルの下の折疊を再歸的に全て開く。カーソルのある行を含まないフォールドは變更されない。
ビジュアルモードでは、選擇された範圍の全ての折疊が、部分的に選擇されてゐただけでも全て完全に開かれる。
カーソルの下の折疊を一段階閉ぢる。カウントが與へられた場合には、複數の深さの折疊が閉ぢられる。ビジュアルモードでは、選擇された範圍にある全ての折疊が 1 レベル閉ぢられる。’foldenable’ がセット (有效化) される。
カーソルの下の折疊を再歸的に全て閉ぢる。カーソルのある行を含まないフォールドは變更されない。
ビジュアルモードでは、選擇された範圍の全ての折疊が、部分的に選擇されてゐただけでも全て完全に閉ぢられる。’foldenable’ がセット (有效化) される。
折疊が閉ぢてゐた場合: それを開く。折疊が入れ子になつてゐる時には、"za" を何度も使ふ必要がある。カウントが與へられた場合には、複數の閉ぢられた折疊が開かれる。
折疊が開いてゐた場合: それを閉ぢ ’foldenable’ をセットする。繰り返し使つても閉ぢた折疊が開くだけだから、これは 1 レベル開くだけである。カウントが與へられた場合には、複數の折疊が閉ぢられる (これは "za" を複數回繰り返した場合の動作と同じではない)。
折疊が閉ぢてゐた場合: 再歸的に開く。折疊が開いてゐた場合: 再歸的に閉ぢ ’foldenable’ をセットする。
カーソル行を表示する: カーソルのある行がちやうど表示されるレベルまで折疊を開く。
折疊を更新する: 手動で行つた折疊の開閉操作をアンドゥする: ’foldlevel’ を再適用し、"zv" を行ふ: カーソル行を表示する。
折疊の計算を强制するのにも使へる。これは ’foldexpr’ を使つてゐてバッファが變更されたにもかかはらず折疊が適切に更新されないやうな場合に便利である。
手動で行つた折疊の開閉操作をアンドゥする: ’foldlevel’ を再適用する。折疊の計算を强制するのにも使へる (|zx| と同樣)。
折疊をより閉ぢる: ’foldlevel’ を |v:count1| 減少させる。’foldlevel’ が既に 0 ならば何も起こらない。’foldenable’ がセット (有效化) される。
全ての折疊を閉ぢる: ’foldlevel’ に 0 を設定する。’foldenable’ がセット (有效化) される。
折疊をより開く: ’foldlevel’ を |v:count1| 增加させる。
全ての折疊を開く: ’foldlevel’ に最大の折疊レベルを設定する。
{range} の範圍の折疊を開く。[!] が付け加はると全ての折疊が開かれる。{range} 範圍內の全てのテキストを見るのに役立つ。[!] が無い時は1レベル分の折疊が開かれる。
{range} の範圍の折疊を閉ぢる。[!] が付け加はると全ての折疊が閉ぢられる。{range} 範圍內の全てのテキストを隱すのに役立つ。[!] が無い時は1レベル分の折疊が閉ぢられる。
折疊しない: ’foldenable’ をリセットする。全ての折疊が開かれる。
折疊する: ’foldenable’ をセットする。全ての折疊が ’foldenable’ がリセットされる以前と同樣になる。
’foldenable’ を反轉する。
現在の開いてゐる折疊の先頭へ移動する。既に先頭にゐるのならば、それを含む外側の折疊の先頭へ移動する。外側の折疊が無い場合は、コマンドは失敗する。
カウントが與へられた場合には、[count] 回繰り返される。
現在の開いてゐる折疊の末尾へ移動する。既に末尾にゐるのならば、それを含む外側の折疊の末尾へ移動する。外側の折疊が無い場合は、コマンドは失敗する。
カウントが與へられた場合には、[count] 回繰り返される。
カーソルより下方の折疊へ移動する。閉ぢられた折疊が 1 つの折疊として數へられる。
カウントが與へられた場合には、[count] 回繰り返される。このコマンドは |operator| のやうに使ふことができる。
カーソルより上方の折疊へ移動する。閉ぢられた折疊が 1 つの折疊として數へられる。
カウントが與へられた場合には、[count] 回繰り返される。このコマンドは |operator| のやうに使ふことができる。
閉ぢた折疊の中以外の全ての行に對して {cmd} を實行する。[range] が與へられた時は、その範圍だけが對象となる。
コマンドが各行に對して實行される時にはカーソルはその對象となる行に置かれてゐる。
これは ":global
" コマンドのやうに動作する: まず閉ぢられた折疊に入つてゐない全ての行がマークされる。それからマークされた全ての行に對して {cmd} が實行される。だから {cmd} が折疊に對して變更を加へても、コマンドの實行には影響が無い (もちろん行が消された時は除く)。
例:
:folddoopen s/end/loop_end/ge
Note:
"e" フラグには "end" がマッチしなかつた時にエラーメッセージが表示させない效果がある。
閉ぢた折疊の中にある全ての行に對して {cmd} を實行する。その他は ":folddoopen
" と同じ。
閉ぢられた折疊の色は Folded グループによつて設定される |hl-Folded|。折疊表示カラムの色は FoldColumn グループによつて設定される |hl-FoldColumn|。色の設定例:
:highlight Folded guibg=grey guifg=blue :highlight FoldColumn guibg=darkgrey guifg=white
’foldlevel’ は數を設定するオプションである: 大きな數を設定するとより多くの折疊が開かれる。
’foldlevel’ は變更された時に適用される。その後に手動で折疊を開いたり閉ぢたりできる。
値を增やした時には、新しいレベルの値以上の折疊が開かれる。手動で開かれてゐた折疊は閉ぢられない。
値を減らした時には、新しいレベルの値以上の折疊が閉ぢられる。手動で閉ぢられてゐた折疊は開かれない。
’foldtext’ は式を指定する文字列オプションである。この式は閉ぢられた折疊を示すテキストを得るために評價實行される。例:
:set foldtext=v:folddashes.substitute(getline(v:foldstart),'/\\*\\\|\\*/\\\|{{{\\d\\=','','g')
これは折疊の最初の1行を、"/*" と "*/" を追加し "{{{" を削除して表示する。
Note:
多めのバックスラッシュ (\ 記號) はある文字が ":set
" コマンドに解釋されてしまふのを避けるために使用されてゐる。これは以下のやうに函數を定義するとより簡單になる::set foldtext=MyFoldText() :function MyFoldText() : let line = getline(v:foldstart) : let sub = substitute(line, '/\*\|\*/\|{{{\d\=', '', 'g') : return v:folddashes . sub :endfunction’foldtext’ は |sandbox| 環境下で實行評價される。現在のウィンドウはそのラインの屬するウィンドウへ設定される。エラーは無視される。
省略値は |foldtext()| である。これはほとんどのタイプの折疊に對して妥當なテキストを返す。それが氣に入らないのならば、獨自の式を ’foldtext’ に設定することができる。その式中では以下の特別な Vim 變數を使用することができる:
v:foldstart | 折疊の先頭の行番號 |
v:foldend | 折疊の末尾の行番號 |
v:folddashes | 折疊レベルを表現したダッシュ (-) 記號を含む文字列。 |
v:foldlevel | 折疊のレベル |
結果の文字列中のタブ文字は 1 つの空白文字に置き換へられ、表示不可能な文字は表示可能な文字に作り變へられる。
結果の文字列はウィンドウに合ふやうに切り捨てられ、折り返されることはない。テキストの後ろに餘白があれば、’fillchars’ で指定された文字で充たされる。
Note:
":set
" コマンドが解釋してしまふ文字: 空白、バックスラッシュ (\ 記號) そしてダブルクォートを使ふ場合にはバックスラッシュが必要である。|option-backslash|
’foldcolumn’ は、ウィンドウの端に確保される折疊を示すカラムの幅を指定する數。0 ならば、折疊表示カラムは確保されない。通常は 4 から 5 が一般的。使ひ物になる最小値は 2 であるが、1 にしてもいくらかの情報を提供する。最大値は 12。
折疊表示カラムには、開いた折疊の先頭に ’-’ が續いて ’|’ が表示される。このカラムは開いた折疊が終了した位置で終了する。入れ子になつた折疊では、それを含む折疊の1つ左側に表示される。
閉ぢた折疊は ’+’ で表示される。
全ての折疊を表示できないほど折疊表示カラムが狹いときには、入れ子のレベルが數字で表示される。
折疊表示カラムをクリックすることで、マウスにより折疊を開閉することができる:
’foldenable’ ’fen’: | 無效に設定すると全ての折疊が開く。 |
’foldexpr’ ’fde’: | 式 ("expr’) による折疊で使用される。 |
’foldignore’ ’fdi’: | インデントによる折疊で使用される。 |
’foldmarker’ ’fmr’: | 印による折疊で使用される印を定義する。 |
’foldmethod’ ’fdm’: | 現在の折疊方法の名稱。 |
’foldminlines’ ’fml’: | 閉ぢた狀態で表示されるべき折疊の、スクリーン上での最小行數 |
’foldnestmax’ ’fdn’: | インデント及び構文折疊での最大入れ子數 |
’foldopen’ ’fdo’: | 閉ぢてゐる折疊を開くコマンドの種類 |
’foldclose’ ’fcl’: | カーソルの下ではない折疊をいつ閉ぢるか。 |
カーソルを上下に移動させたりスクロールさせると、カーソルは一聯の折疊行の先頭へ移動する。カーソルが既に折疊の行にあれば、カーソルは次の折疊ではない行か、閉ぢられた折疊へ移動する。
折疊の行にカーソルがある時には、カーソルは常に先頭のカラムに表示される。ルーラーは實際のカーソルの位置を示すが、行が折疊の場合には、そこに實際に表示することはできない。
移動コマンドは一聯の折疊を空行として扱ふ。例へば、"w" コマンドは一旦先頭のカラムで停止する。
插入モードでは、カーソルのある行は決して折疊にならない。このため何を入力してゐるかわからなくなることはない!
オペレータを使用したときには、閉ぢた折疊は全體が含まれる。だから "dl" はカーソルの下の閉ぢた折疊の全體を削除してしまふ。
バッファの行に作用するExコマンドの作用範圍は、開始位置と終了位置ともに閉ぢられた折疊のそれらへ、それぞれ補正される。よつて以下のコマンドを:
:s/foo/bar/g
閉ぢた折疊へカーソルを合はせて實行すると、折疊內の全ての行にある "foo" が "bar"へ置き換へられてしまふ。
これは |:folddoopen| と |:folddoclosed| に對してはあてはまらない。
(同一セッション中で) 以前に編輯したバッファに對しては、最後の折疊設定が再び使用される。手動折疊では以前に定義された折疊が復元される。全ての折疊方法で、手動で開閉した折疊は復元される。同じウィンドウで同じバッファが編輯される時は、以前の編輯時の値が使用される。さうでなければそのウィンドウで最後に編輯されてゐたバッファの値が使用される。