1 *fold.txt* For Vim バージョン 7.1. Last change: 2007 May 11
4 VIMリファレンスマニュアル by Bram Moolenaar
7 折畳(folding) *Folding* *folding*
9 ユーザマニュアルの28章に折畳についての紹介がされている。|usr_28.txt|
11 1. 折畳方法 |fold-methods|
12 2. 折畳コマンド |fold-commands|
13 3. 折畳オプション |fold-options|
14 4. 折畳の振舞 |fold-behavior|
17 {+folding機能無しでコンパイルした場合には利用できない}
19 ==============================================================================
20 1. 折畳方法 *fold-methods*
22 折畳を行なう方法は'foldmethod'オプションで設定できる。
24 'foldmethod'を"manual"以外の値に設定すると、存在している折畳は総て削除され新た
25 な折畳が作成される。"manual"に切換えた時には既存の折畳は削除されない。これを利
26 用すればまず自動的に折畳を定義し、それから手動で変更することが可能である。
30 indent インデントの数を折畳のレベル(深さ)とする
33 diff 変更されていないテキストを折畳対象とする
34 marker テキスト中の印で折畳を定義する
37 手動(MANUAL) *fold-manual*
39 折畳領域を定義するためにコマンドを手動で利用する。これはテキスト中の折畳を行な
40 う箇所をスクリプトにより解析するのに使うこともできる。
42 折畳のレベルは折畳の入れ子の深さとなる。ある行範囲の折畳レベルを増やすには、折
43 畳がある同じ範囲に対して再び折畳を設定する。
45 手動折畳はファイルを放棄すると失われる。折畳を保存するには|:mkview|コマンドを
46 使用する。後に復元するには|:loadview|を使用する。
49 インデント(INDENT) *fold-indent*
51 折畳は各行のインデントにより自動的に定義される。
53 折畳レベルは各行のインデント量を、'shiftwidth'で割る(端数切捨て)ことで計算され
54 る。同じかより高い折畳レベルを持った一続きの範囲は1つの折畳を形成し、より高い
55 レベルを持った範囲はその中で入れ子の折畳となる。
57 折畳の入れ子は'foldnestmax'によって制限される。
59 ある行ではインデントを無視して直ぐ上か下の行のうち、低いほうの折畳レベルが使用
60 される。無視されるのは完全な空行か、空白文字だけからなる行、および'foldignore'
61 の文字で始まる行である。'foldignore'の文字の前に空白文字があっても無視される。
62 Cではプリプロセッサ行を無視するために"#"を使用する。
64 他の方法で無視する行を定義するには、'expr'の方法を使用する。'foldexpr'の中で、
65 ある行のインデントを取得するのに、関数|indent()|を使うことができる。
70 折畳は"indent"方式のように、折畳レベルによって自動的に定義される。'foldexpr'オ
71 プションの値は、各行についてこの折畳レベルを計算するためにスクリプトとして実行
73 タブで始まる一連の行範囲を1つの折畳にまとめる: >
74 :set foldexpr=getline(v:lnum)[0]==\"\\t\"
75 折畳レベルを計算するのにVimスクリプトの関数を呼び出す: >
76 :set foldexpr=MyFoldLevel(v:lnum)
78 :set foldexpr=getline(v:lnum)=~'^\\s*$'&&getline(v:lnum+1)=~'\\S'?'<1':1
79 同じ事(「段落」を折畳に)をする別の表現: >
80 :set foldexpr=getline(v:lnum-1)=~'^\\s*$'&&getline(v:lnum)=~'\\S'?'>1':1
82 バックスラッシュ(日本では \ 記号)が":set"の流儀で、通常とは異なるキャラクタ(空
83 白文字、バックスラッシュ、ダブルクオート、その他、詳細は|option-backslash|参
87 - その行について現在のバッファとウィンドウが常に存在している。
88 - 変数"v:lnum"には評価対象となる行番号が設定されている。
89 - 式の結果(戻り値)は以下の形式で折畳レベルを示す:
92 1, 2, .. 対象行はこのレベルの折畳に含まれる
93 -1 折畳レベルを未定義とし、対象行の直前か直後の行のうち低
96 "a1", "a2", .. 直前の行のレベルを+1, +2して設定する
97 "s1", "s2", .. 直前の行のレベルを-1, -2して設定する
98 "<1", "<2", .. 指定したレベルの折畳を対象行で終了する
99 ">1", ">2", .. 指定したレベルの折畳を対象行から開始する
101 折畳は直前の行の折畳レベルより高い(低い)行から開始(終了)されるので、折畳の開始
102 (終了)マーク">1" ("<1") は明示的に指定する必要は無い。
104 式に副作用があってはならない。バッファ内のテキストや、カーソルの位置や、検索パ
105 ターンん、オプションその他。どれひとつ変更してはならない。
106 ただし、注意深く行えば、変更してもそれを復元しておけばよい。
108 式にエラーがあるか、結果が認識できない時には、何のエラーメッセージも表示せずに
109 折畳レベルは0に設定される。'debug'オプションに"msg"を設定すれば、エラーメッ
110 セージが表示されるようになるので、デバッグに利用できる。
112 NOTE: 各行について式評価が実行されるので、この折畳方式は非常に動作が遅くなる可
115 "=", "a", そして"s"は極力避けるようにする。なぜならVimはそれらが使われると、折
116 畳レベルが定義された行が見つかるまで戻って、幾度も検索を行なわなければならない
119 フォールドレベルを調べるには|foldlevel()|を使うのが便利です。レベルがわからな
120 いときは-1を返すことに注意してください。フォールドがその行で終わっているときに
124 構文(SYNTAX) *fold-syntax*
126 折畳が"fold"引数を持つ構文要素によって定義される。 |:syn-fold|
128 折畳レベルは入れ子によって定義される。入れ子の深さは'foldnestmax'によって制限
131 シンタックスの同期の設定に注意してください。これが正しく設定されていないとフォ
132 ールドが間違ったハイライトで表示されます。これは特に複数行にマッチするシンタッ
133 クスで問題になります。そのようなときには次のような力技があります: >
139 テキストの変更された箇所とその近辺以外が自動的に折畳として定義される。
141 この方法は現在のウィンドウに対して'diff'オプションが設定されている時にだけ正し
142 く働き、変更点が表示される。そうでない場合バッファ全体が1つの大きな折畳となる。
144 コンテキスト(の行数)を指定するのに'diffopt'を使うことができる。これにより変更
145 点の近辺の折畳に含まない行数を指定できる。下の例では8行表示するように設定して
147 :set diffopt=filler,context:8
150 'scrollbind'が設定されているとき、Vimは他のウインドウと見た目が同じになるよう
151 にフォールドを開いた状態に保とうとします。
153 印(MARKER) *fold-marker*
155 テキスト中の印により折畳の開始と終了地点を指定する。これにより明確に折畳を設定
156 することができる。また誤った行を含むことなく、折畳を削除・設定できる。通常
157 'foldtext'オプションは折畳の行に表示されるテキストとして、印の直前のテキスト設
158 定する。これにより折畳に名前を設定することが可能になる。
160 印には折畳レベルを含むことができ、また開始と終了で対になる文字を使うこともでき
161 る。必ずしも終了の印を加える必要はなく、また対がない印が無い場合の問題も避けら
162 れるので、レベルを含んだほうがより簡単である。例: >
173 折畳は印"{{{"で開始する。印の後ろの番号は折畳レベルを示す。現在の折畳レベルと
174 異なるレベルが印によって与えられた時に何が起こるかは、そのレベルの差に依存す
176 1. 同じ折畳レベルの印が与えられた時には、前の折畳は終了し同じレベルの新たな折
178 2. 高い折畳レベルの印を見つけた時には、入れ子の折畳が開始する。
179 3. 低い折畳レベルの印を見つけた時には、指定されたレベル以上の全部の折畳を終了
180 し、指定されたレベルで新たな折畳が開始する。
182 番号は折畳レベルを示す。0を使うことはできない(レベル0の印は無視される)。特定の
183 レベルの折畳を終了させるため "}}}" 数字を付けて使うことができる。その印の直後
184 の行の折畳レベルは示されたレベルよりも1つだけ低くなる。Vimは指定されたレベルに
185 マッチする印を検索はしないことに注意(計算に時間がかかりすぎてしまうので)。
195 折畳を定義するのに対になる"{{{"と"}}}"を使用することもできる。折畳レベルは
196 "{{{"1つにつき1ずつ増加し、"}}}"1つにつき1ずつ減少する。印同士の対応関係を維持
206 番号付きの印と番号無しの印を混ぜて使用することもできる。大きな折畳には番号付き
207 の印を使用し、関数中の小さな折畳などには番号無しの印を使うと便利だろう。一例を
208 挙げれば、ファイルの "構造体定義" や "ローカル変数" それから "関数定義" のよう
209 な部分にはレベル1(番号付き)の折畳を使用する。そして一つ一つの定義や関数実装に
210 はレベル2の折畳を使用し、関数内部(例えばあるブロックなど)には番号無しの印を使
211 用する。こうしておけば関数の中で折畳を分割するような変更を行なう時に、印にレベ
214 印は'foldmarker'オプションにより変更できる。Vimユーザ間でファイルを交換できる
215 ようにするためには、このオプションのデフォルトである "{{{,}}}" は変更しないこ
216 とが推奨される。ファイルによってそれがどうしても必要な時(例えば別のエディタで
217 作成した折畳を示す異なる印を含んでいる時や、ファイル内容の制約によりデフォルト
218 の印が問題を起こすため、それを使うことができない場合)にだけ変えるように。
221 印による折畳を作成するのに "zf" コマンドを使用することができる。Vimがユーザに
222 代わって印を挿入する。Vimは'foldmarker'で指定された開始の印と終了の印を追加す
223 る。印は行末に追加される。'commentstring'が空でなければそれが使用される。
225 - 既に番号付き折畳が含まれている。Vimはそれをどのように扱えば良いか知らない。
226 - 番号付き折畳の近くで、それらの印が邪魔になる場合。
227 - 行がコメントの中で、'commentstring'が空ではなく、かつ入れ子コメントを使用で
228 きない場合。例えばC言語: /* {{{ */ を既に存在するコメントを消さずにその中に
229 追加するようなこと。コメントの直前か直後に印を設定するか、もしくは手動で印を
231 一般的に、既に番号付き折畳が存在する場合には、Vimに印を作成させるのは良いアイ
235 印による折畳を削除するのに "zd" コマンドを使用することができる。Vimがユーザに
236 代わって印を削除する。Vimは'foldmarker'で指定された開始の印と終了の印を検索す
237 る。印の周りにある'commentstring'に適合するテキストは可能な限り削除される。
239 - ある行に印が1つ以上含まれていて、そのうち少なくとも1つがレベルを指定している
240 場合。折畳を削除することで期待される効果どうりになるかどうかはチェックされる
241 ことなく、単に初めの折畳が1つ削除される。
242 - 番号付き印で、複数の折畳を同時に開始したり終了するために使用されている場合。
244 ==============================================================================
245 2. 折畳コマンド *fold-commands* *E490*
247 全ての折畳コマンドは "z" で始まっている。ヒント: "z" は紙片を折った様子を横から
254 {Visual}zf 折畳を作成する操作。
255 'foldmethod'が"manual" か "marker"の時だけ動作する。"manual"の
257 'foldenable'がセット(有効化)される。
258 |fold-create-marker|も参照。
261 zF N行を折畳として作成する。"zf"と同じように動作する。
263 :{range}fo[ld] *:fold* *:fo*
264 {range}で示された範囲を折畳にする。"zf"と同様に動作する。
267 zd カーソルの位置にある折畳を1つ削除する。カーソルが折畳になって
268 いる行にある場合には、その折畳が削除される。入れ子になった折畳
269 は1レベル分が削除される。ビジュアルモードでは選択された範囲の
270 全ての折畳(partially)が削除される。注意: これは期待したよりも
271 余計に折畳を削除し易く、またアンドゥもできないので注意が必要。
272 'foldmethod'が"manual" か "marker"の時だけ動作する。
273 |fold-delete-marker|も参照。
276 zD カーソルの位置の折畳を再帰的に削除する。ビジュアルモードでは、
277 選択された範囲内の入れ子も含め全ての折畳(partially)が削除され
279 'foldmethod'が"manual" か "marker"の時だけ動作する。
280 |fold-delete-marker|も参照。
283 zE ウィンドウにある全ての折畳を削除する。
284 'foldmethod'が"manual" か "marker"の時だけ動作する。
285 |fold-delete-marker|も参照。
290 'foldminlines'よりも少ない行数の折畳は常に開いたように表示される。従って以下の
291 コマンドは小さな折畳に関しては異なった働きを持つ。
294 zo カーソルの下の折畳を一段階開く。カウントが与えられた場合には、
295 複数の深さの折畳が開かれる。ビジュアルモードでは、選択された範
299 zO カーソルの下の折畳を再帰的に全て開く。カーソルのある行を含まな
301 ビジュアルモードでは、選択された範囲の全ての折畳が、部分的に選
305 zc カーソルの下の折畳を一段階開く。カウントが与えられた場合には、
306 複数の深さの折畳が閉じられる。ビジュアルモードでは、選択された
307 範囲にある全ての折畳が1レベル閉じられる。
308 'foldenable'がセット(有効化)される。
311 zC カーソルの下の折畳を再帰的に全て閉じる。カーソルのある行を含まな
313 ビジュアルモードでは、選択された範囲の全ての折畳が、部分的に選
314 択されていただけでも全て完全に閉じられる。'foldenable'がセット
318 za 折畳が閉じていた場合: それを開く。折畳が入れ子になっている時に
319 は、"za"を何度も使う必要がある。カウントが与えられた場合には、
321 折畳が開いていた場合: それを閉じ'foldenable'をセットする。繰り
322 返し使っても閉じた折畳が開くだけだから、これは1レベル開くだけ
323 である。カウントが与えられた場合には、複数の折畳が閉じられる
324 (これは"za"を複数回繰り返した場合の動作と同じではない)。
327 zA 折畳が閉じていた場合: 再帰的に開く。
328 折畳が開いていた場合: 再帰的に閉じ'foldenable'をセットする。
331 zv カーソル行を表示する: カーソルのある行がちょうど表示されるレベ
335 zx 折畳を更新する: 手動で行なった折畳の開閉操作をアンドゥする:
336 'foldlevel'を再適用し、"zv"を行なう: カーソル行を表示する。
339 zX 手動で行なった折畳の開閉操作をアンドゥする: 'foldlevel'を再適
343 zm 折畳をより閉じる: 'foldlevel'を1減少させる。'foldlevel'が既に0
345 'foldenable'がセット(有効化)される。
348 zM 全ての折畳を閉じる: 'foldlevel'に0を設定する。
349 'foldenable'がセット(有効化)される。
352 zr 折畳をより開く: 'foldlevel'を1増加させる。
355 zR 全ての折畳を開く: 'foldlevel'に最大の折畳レベルを設定する。
358 :{range}foldo[pen][!]
359 {range}の範囲の折畳を開く。[!]が付け加わると全ての折畳が開かれ
360 る。{range}範囲内の全てのテキストを見るのに役立つ。[!]が無い時
363 *:foldc* *:foldclose*
364 :{range}foldc[lose][!]
365 {range}の範囲の折畳を閉じる。[!]が付け加わると全ての折畳が閉じ
366 られる。{range}範囲内の全てのテキストを隠すのに役立つ。[!]が無
370 zn Fold none: reset 'foldenable'. All folds will be open.
371 折畳しない: 'foldenable'をリセットする。全ての折畳が開かれる。
374 zN 折畳する: 'foldenable'をセットする。全ての折畳が'foldenable'が
378 zi 'foldenable'を反転する。
383 [z 現在の開いている折畳の先頭へ移動する。既に先頭にいるのならば、
384 それを含む外側の折畳の先頭へ移動する。外側の折畳が無い場合は、
386 カウントが与えられた場合には、N回繰り返される。
389 ]z 現在の開いている折畳の末尾へ移動する。既に末尾にいるのならば、
390 それを含む外側の折畳の末尾へ移動する。外側の折畳が無い場合は、
392 カウントが与えられた場合には、N回繰り返される。
395 zj カーソルより下方の折畳へ移動する。閉じられた折畳が1つの折畳と
397 カウントが与えられた場合には、N回繰り返される。
398 このコマンドは|operator|のように使うことができる。
401 zk カーソルより上方の折畳へ移動する。閉じられた折畳が1つの折畳と
403 カウントが与えられた場合には、N回繰り返される。
404 このコマンドは|operator|のように使うことができる。
409 :[range]foldd[oopen] {cmd} *:foldd* *:folddoopen*
410 閉じた折畳の中以外の全ての行に対して{cmd}を実行する。[range]が
411 与えられた時は、その範囲だけが対象となる。
412 コマンドが各行に対して実行される時にはカーソルはその対象となる
414 これは":global"コマンドのように動作する: まず閉じられた折畳に
415 入っていない全ての行がマークされる。それからマークされた全ての
416 行に対して{cmd}が実行される。だから{cmd}が折畳に対して変更を加
417 えても、コマンドの実行には影響が無い(もちろん行が消された時は
420 :folddoopen s/end/loop_end/ge
421 < "e"フラグには"end"がマッチしなかった時にエラーメッセージが表示
424 :[range]folddoc[losed] {cmd} *:folddoc* *:folddoclosed*
425 Execute {cmd} on all lines that are in a closed fold.
426 閉じた折畳の中にある全ての行に対して{cmd}を実行する。
427 その他は":folddoopen"と同じ。
429 ==============================================================================
430 3. 折畳オプション *fold-options*
434 閉じられた折畳の色はFoldedグループによって設定される|hl-Folded|。折畳表示カラ
435 ムの色はFoldColumnグループによって設定される|hl-FoldColumn|。
438 :highlight Folded guibg=grey guifg=blue
439 :highlight FoldColumn guibg=darkgrey guifg=white
442 折畳レベル *fold-foldlevel*
444 'foldlevel'は数を設定するオプションである: 大きな数を設定するとより多くの折畳
446 'foldlevel'が0の時には、全ての折畳が閉じられる。
447 'foldlevel'が正の時には、幾つかの折畳が閉じられる。
448 'foldlevel'が非常に大きい時は、全ての折畳が閉じられる。
449 'foldlevel'は変更された時に適用される。その後に手動で折畳を開いたり閉じたりで
451 値を増やした時には、新しいレベルの値以上の折畳が開かれる。手動で開かれていた折
453 値を減らした時には、新しいレベルの値以上の折畳が閉じられる。手動で閉じられてい
457 折畳テキスト *fold-foldtext*
459 'foldtext'は式を指定する文字列オプションである。この式は閉じられた折畳を示すテ
460 キストを得るために評価実行される。例: >
462 :set foldtext=v:folddashes.substitute(getline(v:foldstart),'/\\*\\\|\\*/\\\|{{{\\d\\=','','g')
464 これは折畳の最初の1行を、"/*" と "*/" を追加し"{{{"を削除して表示する。多めの
465 バックスラッシュ(\ 記号)はある文字が":set"コマンドに解釈されてしまうのを避ける
466 ために使用されている。これは以下のように関数を定義するとより簡単になる: >
468 :set foldtext=MyFoldText()
469 :function MyFoldText()
470 : let line = getline(v:foldstart)
471 : let sub = substitute(line, '/\*\|\*/\|{{{\d\=', '', 'g')
472 : return v:folddashes . sub
475 'foldtext'は|sandbox|環境下で実行評価される。現在のウィンドウはそのラインの属
476 するウィンドウへ設定される。エラーは無視される。
478 省略値は|foldtext()|である。これはほとんどのタイプの折畳に対して妥当なテキスト
479 を返す。それが気に入らないのならば、独自の式を'foldtext'に設定することができ
480 る。その式中では以下の特別なVim変数を使用することができる:
481 v:foldstart 折畳の先頭の行番号
483 v:folddashes 折畳レベルを表現したダッシュ(-)記号を含む文字列。
486 結果の文字列中のタブ文字は1つの空白文字に置き換えられ、表示不可能な文字は表示
489 結果の文字列はウィンドウに合うように切り捨てられ、折り返されることはない。
490 テキストの後ろに余白があれば、'fillchars'で指定された文字で充たされる。
492 ":set"コマンドが解釈してしまう文字: 空白、バックスラッシュ(\ 記号)そしてダブル
493 クォート を使う場合にはバックスラッシュが必要である。 |option-backslash|
496 折畳表示カラム *fold-foldcolumn*
498 'foldcolumn'は、ウィンドウの端に確保される折畳を示すカラムの幅を指定する数。0
499 ならば、折畳表示カラムは確保されない。通常は4から5が一般的。使い物になる最小値
500 は2であるが、1にしてもいくらかの情報を提供する。最大値は12。
502 折畳表示カラムには、開いた折畳の先頭に'-' が続いて '|'が表示される。このカラム
503 は開いた折畳が終了した位置で終了する。入れ子になった折畳では、それを含む折畳の
508 全ての折畳を表示できないほど折畳表示カラムが狭いときには、入れ子のレベルが数字
511 折畳表示カラムをクリックすることで、マウスにより折畳を開閉することができる:
512 - 閉じた折畳を開くにはその行の'+'をクリックする。
513 - 開いた折畳を閉じるにはそれ以外の非空白文字をクリックする。
518 'foldenable' 'fen': 無効に設定すると全ての折畳が開く。
519 'foldexpr' 'fde': 式("expr')による折畳で使用される。
520 'foldignore' 'fdi': インデントによる折畳で使用される。
521 'foldmarker' 'fmr': 印による折畳で使用される印を定義する。
522 'foldmethod' 'fdm': 現在の折畳方法の名称。
523 'foldminlines' 'fml': 閉じた状態で表示されるべき折畳の、スクリーン上での最小
525 'foldnestmax' 'fdn': インデント及び構文折畳での最大入れ子数
526 'foldopen' 'fdo': 閉じている折畳を開くコマンドの種類
527 'foldclose' 'fcl': カーソルの下ではない折畳をいつ閉じるか。
529 ==============================================================================
530 4. 折畳の振舞 *fold-behavior*
532 カーソルを上下に移動させたりスクロールさせると、カーソルは一連の折畳行の先頭へ
533 移動する。カーソルが既に折畳の行にあれば、カーソルは次の折畳ではない行か、閉じ
536 折畳の行にカーソルがある時には、カーソルは常に先頭のカラムに表示される。ルー
537 ラーは実際のカーソルの位置を示すが、行が折畳の場合には、そこに実際に表示するこ
540 移動コマンドは一連の折畳を空行として扱う。例えば、"w"コマンドは一旦先頭のカラ
543 挿入モードでは、カーソルのある行は決して折畳にならない。このため何を入力してい
546 オペレータを使用したときには、閉じた折畳は全体が含まれる。だから"dl"はカーソル
549 Exコマンドでは、開始位置と終了位置が折畳のそれに常に合わせられてしまう。
552 カーソルを閉じた折畳に置いて実行すると、折畳内の全ての行にある"foo" が "bar"へ
554 これは|:folddoopen|と|:folddoclosed|に対してはあてはまらない。
556 (同一セッション中で)以前に編集したバッファに対しては、最後の折畳設定が再び使用
557 される。手動折畳では以前に定義された折畳が復元される。全ての折畳方法で、手動で
558 開閉した折畳は復元される。同じウィンドウで同じバッファが編集される時は、以前の
559 編集時の値が使用される。そうでなければそのウィンドウで最後に編集されていたバッ
562 ==============================================================================
563 vim:tw=78:ts=8:ft=help:norl: