vim-users.jp

Hack #178: テキストを折り畳む – 操作編

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

折り畳みに対する操作と言えば基本は畳む/開くですが、それら以外にも様々な操作があります。

折り畳みを開く/閉じる

折り畳みの基本である開閉の操作には、折り畳みレベルを 1 段階変更するものと、全ての深さの折り畳みを変更する、つまり完全に開いたり折り畳んだりするものがあります。

折り畳みの開閉に関するキーマッピングは以下のようなものがあります。

  開く 閉じる トグルする 全体を開く 全体を閉じる
1 段階 zo zc za zr zm
全て zO zC zA zR zM

zo/zc/za は現在のカーソル位置に対して働くのに対し、zr/zm はウィンドウ全体が対象になります。zr/zm は実際には 'foldlevel' を変更することで折り畳みを変更しています。

また、折り畳まれている行ではカーソルは常に行頭に表示されます。ただし、実際にはカーソル位置は記憶されています。ここで、カーソルを左右に動かすことで折り畳みは展開されます。

これら以外にも以下のような操作があります。

zv
カーソル行が表示されるレベルまで折り畳みを開きます。
zX
折り畳みを更新します。 'foldlevel' が再適用され、全ての折り畳みが 'foldlevel' まで折り畳まれた状態になります。 また、'foldexpr' を使っている場合は各行の折り畳みレベルが再計算されます。
zx
zX を実行してから zv を行います。
:[range]foldopen[!]
:[range]foldclose[!]
範囲にある折り畳みを開く、もしくは閉じます。! が与えられた場合は全ての深さの折り畳みが開閉されます。範囲が省略された場合は現在行が対象になります。

折り畳みを作成/削除する

'foldmethod' のが “manual” か “marker” の場合、以下の操作で折り畳みの作成と削除ができます。

zf{motion}
{Visual}zf
[count]zF
:{range}fold
対象の範囲に新しく折り畳みを作成します。
zd
カーソル位置にある折り畳みを 1 つ削除します。
zD
カーソル位置の折り畳みを再帰的に全て削除します。
zE
ウィンドウ内の折り畳みを全て削除します。

特に “manual” の場合は、これらの方法で手動で折り畳みを生成する必要があります。 また、”marker” の場合は直接マーカー文字列が挿入、削除されるため、バッファが変更されます。

折り畳みを有効化/無効化する

これらは 'foldenable' オプションの値を切り替えます。

zn : 折り畳みを無効にします。

zN : 折り畳みを有効にします。

zi
折り畳みの有効化/無効化を切り替えます。

折り畳み間を移動する

折り畳みは単に折り畳む以外にも、折り畳みの範囲を目印にジャンプするのにも使えます。以下のジャンプが使えます。

[z
現在いる折り畳みの先頭へ移動します。
]z
現在いる折り畳みの末尾へ移動します。
zj
次にある折り畳みへ移動します。
zk
前にある折り畳みへ移動します。

折り畳み範囲に対してコマンドを実行する

折り畳まれている、もしくは開かれている各行に対してコマンドを実行することができます。

:[range]folddoopen {cmd}
:[range]folddoclose {cmd}
バッファ全体、もしくは指定した範囲にある、折り畳まれていない、もしくは折り畳まれている行に対して {cmd} を実行します。これは :global に似ていて、実行する行を正規表現ではなく折り畳みの状態で指定しているのとほぼ同じです。 折り畳まれていない行には、折り畳み自体が存在しない行も含みます。
thinca

もどる
blog comments powered by Disqus