ushumpei’s blog

生活で気になったことを随時調べて書いていきます。

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などのモーションか、itipなどのテキストオブジェクトを後ろにくっつけて使用します。

f:id:ushumpei:20160730161923g:plain

他にもファイル全体の操作もあります。

コマンド 内容
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=indentvimrcに設定して様子を見ます。ただしこれを設定すると開くファイルがことごとくデフォルトで折り畳まれてしまっています。これは結構面倒臭いのでset foldlevel=100とか書いておくと初期表示時に折り畳まれなくなります(なんか乱暴ですね...)。

以上です!