インデントをつけるだけでできる! たのしいアウトラインプロセッサ Vim

Vim には、テキストを折りたたむ機能(folding)がある。これをうまく使えば、Vim を簡易アウトラインプロセッサにすることができる(図1)。


図1: folding機能によるアウトライン表示


折り畳む方法は6種類存在するが、簡易アウトラインプロセッサとして使うには、「インデントによる折り畳み」がいいと考える。今回は、インデントによる折り畳みに必要となる folding のキホンを書く。

インデントによるアウトラインプロセッサ利用の手順

仕組みの話を無視して、やり方だけ説明すると、こうである。

  1. アウトライン表示したいテキストファイルの末尾に # vim:set foldmethod=indent shiftwidth=2: と書く。
    • 「モードライン設定」の節を参照。
  2. 行先頭に半角スペースを2つ増やすごとに、テキストの内容が入れ子になって折り畳まれる。
    • 「indent による折り畳み」の節を参照
  3. 各種コマンドにより、折り畳みの開閉を行う。
    • 「折畳を開く・閉じる」の節を参照。

以下のサンプルファイルをダウンロードして Vim で開き、次節から説明する折り畳みコマンドで動作を確認してみるとよい。

サンプルファイル
http://dl.dropbox.com/u/442902/texts/folding-sample.txt


それでは次節から、折り畳みの仕組みの説明を行う。
なお、以降における引用部は Vim の日本語ヘルプファイル*1を元に改変したものである。

折り畳みの種類の指定

オプション 'foldmethod' によって、折り畳みの作成方法を指定できる。

'foldmethod' 'fdm' 
    値は文字列 (既定では "manual")
    ウィンドウについてローカル

カレントウィンドウに適用される折り畳みの
種類を設定する。指定可能な値は以下の通り。

manual      折り畳みは手動で設定する。
indent      等しいインデントの行で
            折り畳みを作る。

他に、expr, marker, syntax, diff の
四種類がある(説明は略)
(参考) manual による折り畳み

mamual では、折り畳みを手動で定義する。次のようなコマンドを利用できる。

zf{motion}  or
{Visual}zf      

折り畳みを作成する操作。
'foldmethod' が "manual""marker" の
時だけ動作する。
例えば Vjzf としたとき、現在行から数えて
2行分が折り畳まれる。
zd

カーソルの位置にある折畳を1つ削除する。
入れ子になった折畳は1レベル分だけ削除される。
'foldmethod' が  "manual""marker"の
時だけ動作する。
indent による折り畳み

indent では、各行のインデントにより自動的に折り畳みが定義される。

折り畳みのレベル (後述) は、各行のインデント量を、'shiftwidth' の値で割る(端数切捨て)ことで計算される。

例えば 'shiftwidth' が 2 の場合、 半角スペース2つ以上が先頭にある連続した行が折り畳まれる。さらにその折り畳みの中で、半角スペース4つ以上が先頭にある連続した行が折り畳まれ、入れ子の折り畳みができる。

折り畳みの視覚表示

オプション 'foldcolumn' に数値を指定することで、折り畳みの位置が視覚的にわかる。

 'foldcolumn' 'fdc' 
    値は数値 (既定では 0)
    ウィンドウについてローカル

値を n (> 0) に設定すると、
バッファに存在する折り畳みを
左端の n カラムに表示してくれる。
最大値は 12

折り畳みのレベル

折り畳みには、開き具合のレベルが存在する。このレベルは、折畳の入れ子の深さに対応する。

レベル0は「全ての折り畳みが閉じられた」状態である。

入れ子になっている折り畳みがある場合、外側の折り畳みはレベル1、内側の折り畳みはレベル2、さらに内側はレベル3、となる。

オプション 'foldlevel' を設定することで、折り畳みの開き具合を設定できる。

 'foldlevel' 'fdl' 
    値は数値 (既定では 0)
    ウィンドウについてローカル

設定した値のレベルまで折り畳みを開く。
要するに、「開かれた折り畳みのレベル」を表す。
ゆえに 0 だと全ての折り畳みが閉じられる。
値を増やすと入れ子の折り畳みが開いてゆく。
コマンド zm (1減らす) や zr (1増やす) 
によって値を変更することもできる。

折畳を開く・閉じる

以下は、「カーソル下の折り畳み」を開閉するコマンドである。

zo  カーソルの下にある折畳を
    一段階開く
zO  カーソルの下にある折畳を
    再帰的に全て開く

zc  カーソルの下にある折畳を
    一段階閉じる
zC  カーソルの下にある折畳を
    再帰的に全て閉じる

o は 折り畳みを開く (open) こと、c は折り畳みを閉じる (close) ことを表す。

一方、カーソルの現在位置に関係なく、バッファに存在する「全ての折り畳み」に対して開閉を行うのが以下のコマンドである。

zm  折畳をより閉じる。
    正確には 'foldlevel'1減少させている。
zM  全ての折畳を閉じる。
    正確には 'foldlevel'0を設定している。

zr  折畳をより開く。
    正確には 'foldlevel'1増加させている。
zR  全ての折畳を開く。
    正確には 'foldlevel' に折畳レベルの最大値を
    設定している。

m は折り畳みを増やす (more) = 閉じること、r は折り畳みを減らす (reduce) = 開くことを表している。

モードライン設定

あるテキストファイルにのみピンポイントでアウトライン表示がしたいなら、各オプションの設定をモードラインで行うとよい。

例えば、ファイルAに「半角スペース2つごとに入れ子になって折り畳む」アウトライン表示をしたいなら、次の行をファイルAの末尾に書き込む。

# vim:set foldmethod=indent shiftwidth=2:

*1:バージョン 7.2 のヘルプファイル(和訳)。http://www.kaoriya.net/vimdoc_j/ より。