Vimの「バッファ」「ウィンドウ」「タブ」の違いを整理する
「バッファを閉じたつもりがウィンドウが残っている」「タブを閉じたのにファイルはまだ開いていた」。この3つの用語を混同していると、こういう挙動に何度も驚かされます。似た場面で使う言葉ですが、指しているものはそれぞれ別物です。
目次(6項目)
結論:タブ ⊇ ウィンドウ、ウィンドウとバッファは別物
3つの関係を一言でまとめると、タブの中にウィンドウがあり、ウィンドウの中にバッファが表示されている、という入れ子構造です。ただしウィンドウとバッファは1対1ではない点が重要で、同じバッファを複数のウィンドウに表示することも、逆に1つのウィンドウで表示するバッファを切り替えることもできます。公式ヘルプもこの3つを次のように簡潔に定義しています。
A buffer is the in-memory text of a file. A window is a viewport on a buffer. A tab page is a collection of windows.
| 用語 | 指すもの | 閉じる代表コマンド |
|---|---|---|
| バッファ | メモリ上のファイルの中身 | :bdelete |
| ウィンドウ | バッファを表示する枠 | Ctrl-w c / :close |
| タブ | ウィンドウの配置をまとめた単位 | :tabclose |
バッファとは、メモリに展開したファイルの中身
バッファは、開いてメモリに読み込んだファイルの内容そのものを指します。ここで重要なのは、バッファは「表示されているかどうか」とは無関係に存在できるという点です。バッファには3つの状態があります。
| 状態 | 意味 |
|---|---|
| アクティブ | 内容がウィンドウに表示されている |
| 隠れ(hidden) | 表示はされていませんが、内容はメモリに読み込まれたまま |
| 非アクティブ | 表示されておらず、内容もメモリに読み込まれていない |
ウィンドウを閉じてもバッファは隠れ状態で残ることが多く、これが冒頭の「閉じたつもりが残っている」の正体にあたります。今開いているバッファの一覧は:lsで確認できます。
ウィンドウとは、バッファを表示する枠
ウィンドウは、バッファの内容を表示するための領域にすぎません。1つのバッファを複数のウィンドウで同時に表示する(同じファイルを分割編集する)こともできますし、1つのウィンドウの中で表示するバッファを次々に切り替えることもできます。ウィンドウを閉じることと、そこに表示されていたバッファが消えることとは切り分けて考えたほうが安全です。ウィンドウの作り方は分割の記事、閉じ方は閉じ方の記事、間の移動は移動の記事にまとめています。
タブとは、ウィンドウの集合
タブは、ウィンドウをレイアウトして配置する領域を指します。1つのタブの中に複数のウィンドウを分割配置できます。ブラウザのタブのように「1タブ1ファイル」で使う人も多いですが、Vimのタブはあくまでウィンドウ配置の切り替えであって、ファイルそのものを閉じる機能ではありません。タブとウィンドウの一覧は:tabsで確認できます。
最初はタブを「ファイルを閉じる単位」だと思い込んでいて、:tabcloseしたのに:lsを見たら対象のファイルがバッファとして残っていて戸惑ったことがあります。それ以来、本当にバッファごと閉じたいときは:bdeleteを使う癖をつけています。
まとめ
3つの言葉が指している階層を区別できれば、Vimでファイルを閉じたつもりが残っていた、という混乱はほぼなくなります。実際のタブ操作の詳しいコマンドはタブ操作の記事、複数ファイルへの一括処理はwindo/bufdo/tabdoの記事にまとめています。