Vimで折畳
こんにちは。
Vimについて書きます。
概要
Vimでは文章を折りたたむことができるようです(Vi には折畳は無い)。htmlを編集している時など、ファイルが長くてちょっと読みづらいといった時にとても便利です。
Vimユーザマニュアルはとても素晴らしいので、ここにあれこれ解説を書く意味もないかと思います。なのでここでは、コマンドとその動きとかを軽く書こうと思います。Vimを起動した状態で:help fold
や:help usr_28.txt
を実行すると関連するドキュメントを読むことが出来ます。またwebの翻訳も利用可能です。
コマンド
折りたたみ関連のコマンドの多くはz
で始まります。基本的なものは以下です。
コマンド | 内容 |
---|---|
zf |
折り畳む (Fold) |
zo |
折り畳みを開く (Open) |
zc |
折り畳みを閉じる (Close) |
za |
折り畳みの開く閉じるを切り替える (Alter?) |
zd |
折り畳みを削除する(Delete) |
zf
はオペレータなので、)
や2j
などのモーションか、it
やip
などのテキストオブジェクトを後ろにくっつけて使用します。
他にもファイル全体の操作もあります。
コマンド | 内容 |
---|---|
zr |
すべての折り畳みを開く(減らす) (Reduce) |
zm |
すべての折り畳みを閉じる(増やす) (More) |
zr
,zm
はすべての折り畳みに対する操作ですが、あくまで現在表示されているものが対象になります。つまり入れ子になっている折り畳みを開いたり閉じたりは出来ません。この時に使用するのがzR
,zM
です。これらは再帰的に折り畳みに作用します。同様に、o
,c
,a
,d
も大文字にすることで再帰的に操作を行います。例えばzR
は再帰的にすべての折り畳みを開くので、結果すべての折り畳みを開きます。zM
と交互に使うのが楽かもしれないです。
あと、折り畳み間を移動するのに便利なコマンドです。
コマンド | 内容 |
---|---|
zj |
画面下方向の次の折り畳みへ移動。 |
zk |
画面上方向の次の折り畳みへ移動。 |
[z |
現在開いている折り畳みの先頭へ移動、すでに先頭の場合はその外側の先頭へ移動、すでに一番外側の折り畳みなら何も起きない。 |
]z |
現在開いている折り畳みの末尾へ移動、動作は[z と同様。 |
疑問
折りたたまれている情報はどこにある?
マニュアルによると、ファイルを破棄すると折り畳みの情報は失われてしまうそうです。折り畳みの情報を保存するコマンドはmkview
、呼び出すコマンドはloadview
です。
保存されたファイルはset viewdir
コマンドで表示されるディレクトリ内で確認できます。ファイルを開いてみるとローカル変数の定義の後に以下のような記述が見つかりました。数字を変えたら折り畳み位置が変わりましたのでこれが保存された設定値だと思います。
... 3,6fold 8,21fold ...
感想
保存について書きましたが、折り畳みを保存して呼び出して使うのは現実的ではないと思います。めんどくさいです。htmlやコードは構造がはっきりしているため、自動的に折り畳みを定義できるはずで、実際そういう設定がVimにはあるようです。
set foldmethod
で現在の設定が確認できます。現在はmanual
になっているので、これは手動で折り畳みを定義するデフォルトの設定なようです。
この他指定可能な値は以下になるようです。
値 | 内容 |
---|---|
manual | 折り畳みは手動で設定する。 |
indent | 等しいインデントの行で折り畳みを作る。 |
expr | オプションfoldexpr で深さを設定する。 |
marker | マーカーで折り畳みを指定する。 |
syntax | 構文強調表示のキーワードを使って指定する。 |
diff | 変更されていないテキストを折り畳む。 |
とりあえずset foldmethod=indent
をvimrc
に設定して様子を見ます。ただしこれを設定すると開くファイルがことごとくデフォルトで折り畳まれてしまっています。これは結構面倒臭いのでset foldlevel=100
とか書いておくと初期表示時に折り畳まれなくなります(なんか乱暴ですね...)。
以上です!