|
3 | 3 | helpname: 'fold' |
4 | 4 | --- |
5 | 5 | <div id='vimCodeElement'> |
6 | | -<a class="Constant" href="fold.html" name="fold.txt">fold.txt</a> For <span class="Identifier">Vim バージョン 9.1.</span> Last change: 2023 Mar 24<br> |
| 6 | +<a class="Constant" href="fold.html" name="fold.txt">fold.txt</a> For <span class="Identifier">Vim バージョン 9.1.</span> Last change: 2024 Dec 17<br> |
7 | 7 | <br> |
8 | 8 | <br> |
9 | 9 | <span class="Identifier">VIMリファレンスマニュアル by Bram Moolenaar</span><br> |
|
82 | 82 | 同じ事(「段落」を折り畳みに)をする別の表現:<br> |
83 | 83 | <div class="helpExample"> :set foldexpr=getline(v:lnum-1)=~'^\\s*$'&&getline(v:lnum)=~'\\S'?'>1':1</div> |
84 | 84 | <br> |
85 | | -バックスラッシュ(日本では \ 記号)が ":set" の流儀で、通常とは異なるキャラクタ<br> |
86 | | -(空白文字、バックスラッシュ、ダブルクォート、その他、詳細は<a class="Identifier" href="options.html#option-backslash">option-backslash</a><br> |
87 | | -参照)をエスケープしていることに注意。<br> |
| 85 | +<span class="Todo">Note</span> バックスラッシュ (日本では \ 記号) が ":set" の流儀で、通常とは異なるキャ<br> |
| 86 | +ラクタ (空白文字、バックスラッシュ、ダブルクォート、その他、詳細は<br> |
| 87 | +<a class="Identifier" href="options.html#option-backslash">option-backslash</a> 参照) をエスケープしていることに注意。<br> |
88 | 88 | <br> |
89 | 89 | 最も効果的なのはコンパイル済み関数を引数なしで呼ぶ:<br> |
90 | 90 | <div class="helpExample"> :set foldexpr=MyFoldLevel()</div> |
91 | 91 | 関数は v:lnum を使用しなくてはいけない。<a class="Identifier" href="vim9.html#expr-option-function">expr-option-function</a> を参照。<br> |
92 | 92 | <br> |
93 | 93 | 式が評価される際の前提条件は以下の通り:<br> |
| 94 | +<br> |
94 | 95 | - その行について現在のバッファとウィンドウが常に存在している。<br> |
95 | 96 | - 変数 "v:lnum" には評価対象となる行番号が設定されている。<br> |
96 | | -- 式の結果(戻り値)は以下の形式で折り畳みレベルを示す:<br> |
| 97 | +<br> |
| 98 | +foldexpr の結果によって、以下のように折り畳みレベルが決定される:<br> |
97 | 99 | <span class="PreProc">値 意味</span><br> |
98 | 100 | 0 対象行は折り畳みに含まれない<br> |
99 | 101 | 1, 2, .. 対象行はこのレベルの折り畳みに含まれる<br> |
|
107 | 109 | "<1", "<2", .. 指定したレベルの折り畳みを対象行で終了する<br> |
108 | 110 | ">1", ">2", .. 指定したレベルの折り畳みを対象行から開始する<br> |
109 | 111 | <br> |
| 112 | +結果の値 "="、"s" および "a" はより高価である。<a class="Identifier" href="fold.html#fold-expr-slow">fold-expr-slow</a> を参照。<br> |
| 113 | +<br> |
110 | 114 | 折り畳みは直前の行の折り畳みレベルより高い(低い)行から開始(終了)されるので、折<br> |
111 | 115 | り畳みの開始 (終了)マーク ">1" ("<1") は明示的に指定する必要は無い。<br> |
112 | 116 | <br> |
|
118 | 122 | 折り畳みレベルは0に設定される。<a class="Type" href="options.html#'debug'">'debug'</a> オプションに "msg" を設定すれば、エラー<br> |
119 | 123 | メッセージが表示されるようになるので、デバッグに利用できる。<br> |
120 | 124 | <br> |
121 | | -<span class="Todo">NOTE</span>: 各行について式評価が実行されるので、この折り畳み方式は非常に動作が遅くな<br> |
122 | | -る可能性がある!<br> |
123 | | -<br> |
124 | | -"=", "a", そして "s" は極力避けるようにする。なぜならVimはそれらが使われると、<br> |
125 | | -折り畳みレベルが定義された行が見つかるまで戻って、幾度も検索を行わなければなら<br> |
126 | | -ないからだ。これは動作が遅くなることがある。<br> |
127 | | -<br> |
128 | 125 | <a class="Type" href="options.html#'foldexpr'">'foldexpr'</a> の式が s: か <a class="Identifier" href="map.html#<SID>"><SID></a> で始まる場合、スクリプトID(<a class="Identifier" href="userfunc.html#local-function">local-function</a>)<br> |
129 | 126 | に置き換えられる。例:<br> |
130 | 127 | <div class="helpExample"> set foldexpr=s:MyFoldExpr()<br> |
|
149 | 146 | 折り畳みが適切に更新されない場合がある。その場合は <a class="Identifier" href="fold.html#zx">zx</a> か <a class="Identifier" href="fold.html#zX">zX</a> を使って強制的<br> |
150 | 147 | に更新すること。<br> |
151 | 148 | <br> |
| 149 | +<span class="Statement">計算コストの最小化</span> <a class="Constant" href="fold.html#fold-expr-slow" name="fold-expr-slow">fold-expr-slow</a><br> |
| 150 | +<br> |
| 151 | +この折り畳み方式は計算コストが高いため、特にすべての行の折り畳みレベルを最初に<br> |
| 152 | +計算する必要がある場合、Vim が応答しなくなる可能性がある。<br> |
| 153 | +その後、各変更の後に Vim は折り畳みレベルの計算を折り畳みレベルが影響を受けた<br> |
| 154 | +行に制限する (他のすべての行の既知の折り畳みレベルを再利用する)。<br> |
| 155 | +<br> |
| 156 | +したがって、折り畳み式は特定の行の計算に必要な依存行の数を最小限に抑えるように<br> |
| 157 | +努める必要がある。例えば、独立した折り畳みレベルが見つかるまで前の行の折り畳み<br> |
| 158 | +レベルの評価が必要になるため、"="、"a" および "s" の戻り値を避けるようにするこ<br> |
| 159 | +と。<br> |
| 160 | +<br> |
| 161 | +これが難しい場合は、次善策として <a class="Identifier" href="eval.html#b:changedtick">b:changedtick</a> でのみ更新されるバッファロー<br> |
| 162 | +カル変数 (b:foldlevels) にすべての折り畳みレベルをキャッシュすることが考えられ<br> |
| 163 | +る:<br> |
| 164 | +>vim<br> |
| 165 | + vim9script<br> |
| 166 | + def MyFoldFunc(): number<br> |
| 167 | + if b:lasttick == b:changedtick<br> |
| 168 | + return b:foldlevels[v:lnum - 1]<br> |
| 169 | + endif<br> |
| 170 | + b:lasttick = b:changedtick<br> |
| 171 | + b:foldlevels = []<br> |
| 172 | + # compute foldlevels ...<br> |
| 173 | + return b:foldlevels[v:lnum - 1]<br> |
| 174 | + enddef<br> |
| 175 | + set foldexpr=s:MyFoldFunc()<br> |
| 176 | +<<br> |
| 177 | +上記の例では、プリコンパイルされた引数なしの Vim9 script 関数を使用することで、<br> |
| 178 | +さらに高速化された (それでも v:lnum を使用する必要がある)。<br> |
| 179 | +<a class="Identifier" href="vim9.html#expr-option-function">expr-option-function</a> を参照。<br> |
152 | 180 | <br> |
153 | 181 | <span class="Statement">構文</span> <a class="Constant" href="fold.html#fold-syntax" name="fold-syntax">fold-syntax</a><br> |
154 | 182 | <br> |
|
451 | 479 | <br> |
452 | 480 | <span class="PreProc">折り畳みに対してコマンドを実行する</span><br> |
453 | 481 | <br> |
454 | | -:<span class="Special">[range]</span>foldd[oopen] <span class="Special">{cmd}</span> <a class="Constant" href="fold.html#:foldd" name=":foldd">:foldd</a> <a class="Constant" href="fold.html#:folddo" name=":folddo">:folddo</a> <a class="Constant" href="fold.html#:folddoopen" name=":folddoopen">:folddoopen</a><br> |
| 482 | +:<span class="Special">[range]</span>foldd[oopen] <span class="Special">{cmd}</span> <a class="Constant" href="fold.html#:foldd" name=":foldd">:foldd</a> <a class="Constant" href="fold.html#:folddo" name=":folddo">:folddo</a> <a class="Constant" href="fold.html#:folddoopen" name=":folddoopen">:folddoopen</a><br> |
455 | 483 | 閉じた折り畳みの中以外の全ての行に対して<span class="Special">{cmd}</span>を実行する。<br> |
456 | 484 | <span class="Special">[range]</span>が与えられた時は、その範囲だけが対象となる。<br> |
457 | 485 | コマンドが各行に対して実行される時にはカーソルはその対象となる<br> |
|
0 commit comments