vim-users.jp

Hack #182: テキストを折り畳む – marker 編

Posted at 2010/11/12
このエントリーをはてなブックマークに追加

Vim での折り畳み機能の折り畳み方法の 1 つに “marker” があります。これはテキスト中にマーカーと呼ばれる文字列を埋め込むことで折り畳みの位置やレベルを指定する折り畳み方法です。'foldmethod' オプションに “marker” を指定することで使えます。

マーカーの書き方

折り畳みを開始したい行に {{{ を、終了したい行に }}} を書きます。行のどこかに入っていればいいので、コメントのなかに書くといいでしょう。

{{{
// この行と開始/終了行を合わせた 3 行が折り畳まれる
}}}

入れ子にすることが可能で、深くなるごとに折り畳みレベルが増えます。また、1 行に複数のマーカーを置くとその分だけ折り畳みレベルが深くなります。

// レベル 0 (折り畳みなし)
{{{
// レベル 1
{{{ {{{
// レベル 3
}}}
// レベル 2
}}}
// レベル 1

マーカーの後ろに数字を付けることで、レベルを直接指定できます。この場合、途中のレベルを飛ばして折り畳みレベルを設定したり、同じレベルの折り畳みを連続で置くことができます。また、閉じるための }}} は省略できます。

{{{1
// レベル 1
{{{3
// レベル 3
{{{3
// レベル 3 だが、上の折り畳みとは別の折り畳み
}}}1
// レベル 1 を閉じたのでここはレベル 0

レベル付きのマーカーの利点は、確実にレベルが設定されるので直前の折り畳みを閉じる必要がないため、閉じ忘れの心配がない点です。また、同一レベルを連続させたい場合にも有効です。

逆に欠点は、入れ子を簡単には増やせないことです。外側にもっと大きな折り畳みを作りたい場合、内側の折り畳みレベルを全て修正しなくてはいけません。

zf zd などによるマーカーの作成と削除

テキストを折り畳む – 操作編 で紹介した zfzd などの折り畳みを作成/削除をするコマンドを使うと、実際にマーカー文字列が挿入されます。

挿入される際は、開始行/終了行の末尾にマーカー文字列が追加されます。'commentstring' オプションが設定されていれば、これを利用してコメントの中にマーカー文字列が入るように挿入されます。

例えば C のソースを編集中に、

int main(int argc, char const* argv[]) {
  return 0;
}

この関数の中で zfa{ とすると、

int main(int argc, char const* argv[]) {/*{{{*/
  return 0;
}/*}}}*/

このようになります。

zd を使うとこれと逆の操作になります。'commentstring' にパターンが一致する場合はコメント部分も取り除かれるので、この例の場合は完全に元通りになります。

この操作で作成されるマーカーはレベルなしのものです。すでにレベル付きのマーカーがある場合、意図しない結果になる可能性があるので注意してください。

'foldmarker' オプション

マーカー文字列は 'foldmarker' オプションによって変更できます。開始マーカーと終了マーカーをカンマ区切りで指定します。デフォルトでは “{{{,}}}” になっています。

このオプションを変更するときは注意してください。マーカー文字列はファイルに直接書かれるものなので、独自の設定を使うと他の人が折り畳みを行えなくなります。どうしても変更が必要な場合は、modeline に書いておくと良いでしょう。

注意

“marker” による折り畳みの指定は、手軽で確実ではありますが、Vim 以外のエディタを使っている人には謎の記号になります。特に共有するファイルで使用する場合には注意してください。

thinca

もどる
blog comments powered by Disqus