Vimのタブ操作 開く・閉じる・切り替えとキーバインド
Vimのタブはブラウザのタブと似ているようで、閉じたときの挙動がだいぶ違います。慣れるまでは「閉じたつもりのファイルが裏で開いたまま」に何度か遭遇することになります。基本コマンドと、詰まりやすい点を整理します。
目次(12項目)
| コマンド | これだけ覚える |
|---|---|
:tabnew | 新しい空のタブを開く |
:tabclose | タブを閉じる(バッファは残る) |
:tabnext / :tabprevious | 次/前のタブへ切り替え |
| gt / gT | 次/前のタブへ(2gtで2番目へ) |
:tabs | タブとウィンドウの一覧を見る |
:tabdo | 開いている全タブに同じコマンドを実行 |
タブを開く
:tabnew
:tabedit
:tabe
この3つはほぼ同じ意味で、空のタブを新しく開きます。特定のファイルを指定して開きたい場合は:tabedit {file}のようにパスを続けます。
タブを閉じる
:tabclose
ここが最初にハマりやすいポイントです。:tabcloseでタブそのものは消えますが、そこに表示されていたバッファは隠れ状態として残り続けます。タブとバッファは別階層にあるので当然の挙動ですが、「ファイルを閉じたつもり」でいると:lsを見て驚くことになります(詳しくはバッファ・ウィンドウ・タブの違いを参照)。バッファごと消したいなら:bdeleteを別途実行する必要があります。
そのタブの最後のウィンドウであれば:qでも閉じられますが、これも見かけ上タブが消えるだけで、バッファが終了するわけではない点は変わりません。
タブを切り替える(タブ移動)
:tabnext " 次のタブへ(:tabn)
:tabprevious " 前のタブへ(:tabp)
大文字小文字の扱いが揃っていない点に注意が要ります。「次へ」は:tabnextと:tabNextのどちらでも通りますが、「前へ」は:tabpreviousで、:tabPreviousという綴りは存在しません。手元のVim 9.1.1752でexists(':tabPrevious')を実行すると0が返ります。略記の:tabn・:tabpを使えばこの非対称に悩まされません。
一覧を確認したいときは:tabsを実行します。
ブラウザ風のキーバインドにする
タブ操作をWebブラウザに近い感覚で行いたい場合は、vimrcに次のようなマッピングを追加します。
nnoremap <C-t> :tabnew<CR>
nnoremap <C-Tab> :tabnext<CR>
nnoremap <C-S-Tab> :tabprevious<CR>
nnoremap <C-F4> :bdelete<CR>
<C-w>をタブを閉じるキーに割り当てたくなりますが、ウィンドウ分割の操作プレフィックスとして頻繁に使うキーと衝突するため避けたほうが安全です。バッファを閉じる操作は<C-F4>のような別のキーに寄せておくと事故が少なくなります。空いているキーを探したいときは未割り当てキーの一覧が参考になります。
全タブへの一括操作
すべてのタブに同じ処理をしたい場合は:tabdoを使います。
一括置換
よく使うのは全タブでの一括置換です。
:tabdo %s/検索語/置換語/gi
ファイルの読み込み・再読み込み
タブをまたいでファイルを読み込みたい場合や再読み込みしたい場合も、同じ要領で書けます。
:tab read ファイルパス
:tab e!
タブ・ウィンドウ・バッファをまたいだ一括処理は他にも多くのパターンがあるので、まとめて使いたい場合はwindo/bufdo/tabdoの記事を参照してください。
開いているバッファを一括でタブに変換する
:bufdo tab split
開いている全バッファを、それぞれ独立したタブとして開き直せます。複数ファイルをバッファとして開いていたが、途中からタブ単位で見比べたくなった、という場面で使えます。ただし、この方法で開いたタブを閉じるときは:bdeleteでバッファ自体を削除する必要がある点は変わりません。実用場面はそれほど多くありませんが、「今どのファイルを開いているか」を一覧しやすくする一時的な整理術として覚えておくと便利です。
:tabcloseはタブを消すだけでバッファは残ります。ファイルごと閉じたいなら:bdeleteを使います。この区別さえ押さえておけば、タブ操作でつまずくことはほぼなくなります。
ブラウザ風のキーバインドを入れてから、複数ファイルを見比べる作業が明らかに速くなりました。ただし<C-w>をタブ閉じるキーに割り当てたときは、ウィンドウ分割の操作が全部潰れてしまい1日で元に戻しました。既存の機能と衝突しないキーを選ぶのは思ったより大事でした。
切り替えは gt と gT のほうが速い
コマンドを打たずに切り替えられます。ノーマルモードで gt が次のタブ、gT が前のタブです。:tabnext と同じ動きですが、2打で済むので普段はこちらを使います。
数字を前に付けると、その番号のタブへ直接飛べます。手元のVim 9.1.1752で4枚開いた状態から確かめると、2gt で2番目に移り、そこから gT で1番目、gt で2番目に戻りました。
gt " 次のタブへ
gT " 前のタブへ
2gt " 2番目のタブへ直接
:tabfirst / :tablast " 最初 / 最後のタブへ
番号は画面上部のタブバーに出ている並び順です。3枚以上開くなら、順に送るより番号で飛ぶほうが確実に速くなります。タブバーが出ていない場合はshowtablineの設定で表示できます。
Vimのタブはファイルではなくウィンドウの入れ物
ここが他のエディタと決定的に違うところで、:tabclose の挙動もこれで説明が付きます。ブラウザやVS Codeのタブが「開いているファイル」を指すのに対し、Vimのタブが指しているのは「ウィンドウの配置」です。
1つのタブの中に分割したウィンドウを何枚でも置けますし、同じファイルを別のタブで開くこともできます。つまりタブとファイルは1対1ではありません。:tabs を実行すると、この入れ子がそのまま見えます。
Tab page 1
> a.txt
Tab page 2
[No Name]
Tab page 3
b.txt
Tab page N の下にぶら下がっているのが、そのタブが持っているウィンドウです。> がいまカーソルのあるウィンドウを指します。ファイルの一覧を見たいときは :tabs ではなく :ls でバッファを見ることになります。
この構造が分かると、タブを閉じてもバッファが残るのは「入れ物を捨てただけで中身は別の場所にある」からだと納得できます。バッファ・ウィンドウ・タブの違いで3つの関係を整理しています。
タブの並び順を変える
開いた順に並ぶので、あとから見比べたい2枚が離れてしまうことがあります。:tabmove で位置を動かせます。
:tabmove 0 " 今のタブを先頭へ
:tabmove " 今のタブを末尾へ
:tabmove 2 " 2番目の後ろへ
:tabmove +1 " 1つ後ろへずらす
手元のVim 9.1.1752で4枚目にいる状態から :tabmove 0 を実行すると、そのタブが1番目に移動しました。よく使うタブを先頭に固定しておけば、1gt で常に同じ場所へ戻れます。
タブを使う場面・使わない場面
Vimに慣れた人ほどタブを使わない、という話をよく聞きます。ファイルを開くだけならバッファで足りるからです。ファイルを10個開いてもタブは0枚のまま、というのがVimでは普通の状態です。
タブが効くのは、ウィンドウの配置ごと切り替えたいときです。実装とテストを左右に並べた画面と、設定ファイルだけを開いた画面を行き来する、といった使い方なら、タブは配置を保ったまま切り替えられます。
逆に「開いているファイルの一覧」としてタブを使おうとすると、数が増えたときに破綻します。タブバーに名前が入りきらなくなりますし、目的のファイルを探すのに順に送ることになります。この用途ではバッファを名前で切り替えるほうが速く、:b conf のように一部を打つだけで届きます。
目安として、同時に開いておきたい「作業の面」が3つ以内ならタブ、ファイルを行き来したいだけならバッファと考えると迷いません。バッファ側の操作はバッファ一覧の読み方にまとめています。
まとめ
タブの基本操作自体はシンプルですが、「閉じる」の意味がバッファとは異なる点だけ最初に理解しておくとつまずきにくくなります。ブラウザ風のキーマッピングを足せば、タブを主体にした編集スタイルもかなり快適になります。