Vimで折りたたみを作る・消す(zf/zd/zD/zE)
長い関数の中身を一時的に隠して全体像を見たいことがあります。テキストを消すわけではなく、見えなくするだけの機能がVimの折りたたみ(fold)です。作成と解除のコマンドを知っておくと、長いファイルの見通しがぐっと良くなります。
目次(9項目)
| キー | これだけ覚える |
|---|---|
| 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段階ずつ解除するほうが安全だと学びました。
foldmethod を変えると手で作った折りたたみが消える
zf で作れるのは foldmethod=manual のときだけです。作ったあとに foldmethod を indent や syntax に変えると、手で作った折りたたみは失われます。
プラグインやファイルタイプの設定が foldmethod を書き換えることがあるので、ファイルを開き直したら折りたたみが消えていた、という場合はこれを疑ってください。
:set foldmethod? " いまの方式を確認する
:verbose set foldmethod? " どこで設定されたかも見る
:verbose を付けると、その値を最後に設定した場所(設定ファイルの行やプラグイン名)まで表示されます。覚えのない設定が入っているときの犯人探しに使えます。
marker 方式ならファイルに残せる
手で作った折りたたみをファイルを閉じても残したいなら、foldmethod=marker が確実です。折りたたみの範囲を示す印をファイルの中にコメントとして書き込むので、誰が開いても同じ位置で畳まれます。
set foldmethod=marker
" 既定の印は {{{ と }}}(3つ重ねる)
set foldmarker=<<<,>>> " 印を変えることもできる
この方式では zf を押すと印が自動で挿入されます。ファイルの中身が変わるので、共有しているリポジトリで勝手に入れると差分に出ます。自分の設定ファイルのように、自分だけが触るファイルで使うのが向いています。
zE は取り返しがつく
zE はファイル内の折りたたみを全部消します。何時間もかけて作った構造が一度に消えるので驚きますが、テキスト自体は変わっていないので慌てる必要はありません。
ただし u では戻りません。折りたたみの状態はテキストの変更ではないためです。作り直すのが面倒な構造を持っているなら、:mkview で保存しておけば :loadview で戻せます。開閉の記事で自動保存の設定を紹介しています。
まとめ
折りたたみはzfで作り、zd/zD/zEで解除します。開閉の操作は別記事、折りたたみ間の移動はこちらの記事にまとめています。