Vimで折りたたみの間をジャンプ移動する(zj/zk)
折りたたみを多用したファイルで、1つずつスクロールして次の折りたたみを探すのは非効率です。折りたたみ単位でジャンプするコマンドを使えば、閉じた折りたたみを1ブロックとして数えて移動できます。
目次(9項目)
| キー | これだけ覚える |
|---|---|
| zj / zk | 次 / 前の折りたたみへ移動 |
| [z / ]z | 折りたたみ範囲の先頭 / 末尾へ移動 |
次/前の折りたたみへ移動する
zj/zkは、通常の上下移動j/kの頭にzを付けると覚えると忘れにくくなります。閉じた折りたたみを1つの単位として数えて移動します。
+-- 4 lines: function a() {----
+-- 4 lines: function b() {----
console.log('end');
+-- 4 lines: function a() {----
+-- 4 lines: function b() {----
console.log('end');
折りたたみが連続しているファイルでは、通常のカーソル移動より圧倒的に速く目的の位置へたどり着けます。
ネストした折りたたみでの挙動
zj/zkは「閉じられた折りたたみ」を1単位として数えます。折りたたみが開いている状態だと、その中の行も通常のテキストと同じ扱いになるため、ジャンプの対象としては数えられません。折りたたみをまたいで素早く移動したいなら、あらかじめzMで全体を閉じておくとzj/zkの効果を最大限に活かせます。
折りたたみ範囲内の端に移動する
[z " 折りたたみ範囲の一番上の行へ
]z " 折りたたみ範囲の一番下の行へ
これはzj/zkとは違い、今いる折りたたみの内部での移動になります。範囲が広い折りたたみや、入れ子になった折りたたみの境界を確認したいときに使います。使用頻度はそれほど高くないものの、大きな折りたたみの全体の長さを把握したいときには役立ちます。
入れ子の折りたたみで]zを使うと、今いる階層の折りたたみの終端までしか移動しません。さらに外側の折りたたみの終端までは移動しない点を覚えておくと、想定外の位置に飛んで戸惑うことを防げます。
関数ごとに折りたたんだ長いファイルを読んでいるとき、jを連打してスクロールするよりzjで折りたたみ単位で飛んだほうが圧倒的に速いと気づいてから、折りたたみを多用したファイルではこの2つのコマンドを最初に思い出すようになりました。開いた状態のままだとジャンプが効かないと気づかず、最初は「なぜ移動しないんだ」としばらく悩んだこともあります。今では作業を始める前にまずzMで畳んでから移動する、という順番が習慣になっています。
開閉操作との組み合わせ
これらの移動系コマンドは、開閉系のコマンドと組み合わせて初めて実用的になります。よくある流れはこうです。
- zMで全体を折りたたむ
- zj/zkで目的の折りたたみまで移動する
- zaで中身を開く
移動だけを覚えても、開閉のコマンドを知らなければ結局中身を確認できません。両方セットで身につけておくと、折りたたみを使ったナビゲーションが一通り完結します。
zj と zk はモーションとして使える
zj zk は移動のキーなので、オペレータの後ろに置けます。dzj と打つと、カーソル行から次の折りたたみの始まりまでが消えます。閉じた折りたたみをまとめて扱いたいときに、行数を数えずに範囲を指定できます。
ただし範囲が画面から見えないぶん、消しすぎに気づきにくくなります。vzj でいったん選択して反転表示を確かめてから d を押すほうが安全です。折りたたみが閉じている状態でも、選択範囲は折りたたみの行に色が付くので確認できます。
閉じた折りたたみの上での操作は行全体に効く
閉じた折りたたみの上にカーソルがあるとき、行を対象にする操作はその折りたたみ全体に効きます。dd を押せば折りたたまれていた行がまとめて消え、yy なら全部がコピーされます。
1行だけ消したつもりが数十行消えていた、というのはこれが原因です。逆に、まとまりごと動かしたいときは畳んでから dd と p を使うのがいちばん短く済みます。開閉のコマンドと組み合わせると、関数の並べ替えが数キーで終わります。
飛んだ先が畳まれているとき
検索やジャンプで移動した先が閉じた折りたたみの中だと、カーソルは中にいるのに画面には折りたたみの1行しか見えません。zv を押せば、カーソル行が見える最小限の範囲だけが開きます。
いちいち押すのが面倒なら、foldopen にどの操作で自動的に開くかを指定できます。既定でも検索やジャンプでは開くようになっているので、開かないと感じるときはこの設定が空になっていないかを確かめてください。
まとめ
折りたたみ単位で移動したいならzj/zk、範囲の端を確認したいなら[z/]zを使います。折りたたみの作成、開閉操作で扱っています。なおzjとzkはオペレータのあとにも置けるので、dzjのように「次の折りたたみの手前まで削除」といった使い方もできます(:help zj)。