Vimで折りたたみを作る・消す(zf/zd/zD/zE)
長い関数の中身を一時的に隠して全体像を見たいことがあります。テキストを消すわけではなく、見えなくするだけの機能がVimの折りたたみ(fold)です。作成と解除のコマンドを知っておくと、長いファイルの見通しがぐっと良くなります。
| キー | これだけ覚える |
|---|---|
| zf{モーション} | 指定した範囲を折りたたむ |
| zd | カーソル下の折りたたみを1段階削除 |
| zD | 入れ子ごと再帰的に削除 |
| zE | ウィンドウ内すべての折りたたみを削除 |
折りたたみを作る
zfにモーションを続けると、その範囲を折りたたみます。5行分をまとめて畳むならzf4jのように書きます。
function foo() {
console.log('a');
console.log('b');
console.log('c');
}
+-- 5 lines: function foo() {---
ビジュアルモードで範囲を選択してからzfを押しても同じことができます。行数を直接指定する{行数}zFや、コマンドラインからの:fold(ビジュアル選択と組み合わせて:'<,'>fold)でも同様に折りたためます。
この機能が有効になるのは、foldmethodがmanualまたはmarkerのときだけです。foldmethod=syntaxやfoldmethod=indentのように自動判定の方式を使っている場合、zfで手動作成しようとしても効かないことがあります。
折りたたみを解除する
| キー | 動作 |
|---|---|
| zd | カーソル位置の折りたたみを1レベル分削除 |
| zD | 入れ子も含めて再帰的に削除 |
| zE | ウィンドウ内のすべての折りたたみを削除 |
zdの「1レベル分」は、入れ子になった折りたたみを外側から1段ずつ剥がしていくイメージです。
+-- 6 lines: function outer() {
}
console.log('done');
function outer() {
+-- 3 lines: function inner() {
}
inner();
}
console.log('done');
外側の折りたたみが消えても、内側のfunction inner() {はまだ畳まれたままです。ネストがないシンプルな折りたたみならzdだけで丸ごと消えます。
foldmethodによる自動折りたたみとの違い
ここまで紹介したのはmanual方式での手動作成ですが、Vimには他にも折りたたみ方式があります。foldmethod=indentはインデントの深さで自動的に折りたたみを作り、foldmethod=syntaxは構文(関数やブロックなど)の単位で自動作成します。ファイルタイプに応じて事前に折りたたみが用意されている状態で始めたいなら、こちらの自動方式のほうが向いています。zfによる手動作成は、自動方式ではうまく区切れない独自の範囲を一時的に隠したいときに使う、と役割を分けて考えると分かりやすくなります。
折りたたみが役立つ場面
テキスト自体を削除・変更しない点が折りたたみの利点です。特定の関数だけに集中したいとき、コード全体の構造を俯瞰したいとき、アウトラインエディターのような感覚でファイルの見通しを整理したいときに向いています。手動での作成に加えて、インデントの深さや構文(関数・ブロック単位)で自動的に折りたたみを作るプラグインも多くあります。
長い設定ファイルを読むとき、興味のないセクションをzfで畳んでおくと、スクロールする範囲が減って目的の場所にたどり着きやすくなりました。ただしzDで入れ子ごと消してしまい、作り直す羽目になったことも一度あります。範囲が複雑なときはzdで1段階ずつ解除するほうが安全だと学びました。
まとめ
折りたたみはzfで作り、zd/zD/zEで解除します。開閉の操作は別記事、折りたたみ間の移動はこちらの記事にまとめています。