Vimのバッファ一覧(:ls)の読み方と絞り込み方
:lsを実行すると、開いているバッファが記号付きで一覧表示されます。この記号を読み解けるようになると、今どのバッファがどんな状態にあるかが一目で把握できるようになります。
目次(10項目)
バッファ一覧を表示する
:ls
:buffers
:files
いずれも同じ内容が表示されます。出力はこのような形式になります。
1 #h "config.lua" line 1
2u "asdf" line 0
3 %a + "main.py" line 12
:ls の出力。%a が今表示中、# が直前、+ が未保存の変更ありを表す記号の意味
| 記号 | 意味 |
|---|---|
u | リストされていないバッファ |
% | カレントウインドウにあるバッファ |
# | 代替バッファ(:e #やCtrl-^で使われる) |
a | アクティブバッファ(ロード済み・表示中) |
h | 隠れバッファ(ロード済みだが非表示) |
- | 変更不可('modifiable'オフ)のバッファ |
= | 読み取り専用のバッファ |
+ | 変更のあるバッファ |
x | 読み込みエラーのあるバッファ |
記号を組み合わせて読む
先頭の数字はバッファ番号で、Vim起動中は一意に保たれます。この番号を使えば:b14のように指定してバッファを切り替えられます。記号は複数同時に並ぶことがあり、組み合わせで状態を読み取ります。
%+:変更が未保存のカレントバッファ#h:隠れ状態の代替バッファ
同じ桁の記号(aとhなど)は互いに排他的で、同時には表示されません。
%(今いる場所)、#(さっきいた場所)、+(未保存の変更あり)の3つ。絞り込んで表示する
バッファ数が増えてくると一覧も見づらくなります。状態を指定して絞り込めます。
1 h "config.lua"
2 #h + "main.py"
3 %a "asdf"
:ls +2 #h + "main.py"
:ls + " 変更されたバッファのみ
:ls a " アクティブバッファのみ
:ls u " リストされていないバッファも含めて表示
複数の記号を組み合わせると「AND」条件になる点に注意が必要です(「OR」ではありません)。例えば:ls h+は「変更された隠れバッファ」だけに絞り込みます。逆に、通常表示されないリストされていないバッファまで含めて全部見たいときは、末尾に!を付けます。
:ls!
:buffers!
バッファ番号を使った切り替え
一覧の先頭に表示される番号は、Vimを起動している間ずっと一意に保たれます。この番号を使えば、ファイル名を思い出せなくても瞬時にバッファを切り替えられます。
:b 14
:buffer 14
番号を正確に覚えていなくても、コマンドライン補完で部分一致するバッファ名を絞り込めるので、番号よりファイル名の一部を使う方が実用的な場面も多いです。
:b config
ファイル名で絞り込む
状態ではなくファイル名(パス)で絞り込みたい場合は:filterと組み合わせます。
:filter /\.vim/ ls
:filter /config/ ls
正規表現の部分一致で判定されるので、拡張子やディレクトリ名の一部だけでも絞り込めます。:oldfilesの絞り込みと同じ:filterの使い方なので、あわせて覚えておくと応用が利きます。
複数の設定ファイルを同時に開いて作業しているとき、:ls +で「保存し忘れているバッファ」だけを毎回確認する癖をつけてから、うっかり閉じて変更を失うことがなくなりました。記号を全部覚える必要はなく、+と%と#の3つを押さえておけば実務では十分だと感じています。
バッファを消す2つの方法
一覧が長くなったら、使っていないバッファを閉じます。よく使うのは :bdelete ですが、実は完全には消えません。一覧から外れるだけで、:ls! を打つと残っているのが見えます。
:bdelete 3 " 一覧から外す(マークやジャンプ位置は残る)
:bwipeout 3 " 完全に消す
:ls! " 一覧から外れたバッファも表示する
普段は :bdelete で足ります。:bwipeout はマークや取り消し履歴まで捨てるので、同じファイルを開き直したときに以前の状態が復元されなくなります。
まとめて閉じる
1つずつ番号を指定するのは手間なので、範囲やパターンでまとめて指定できます。
:2,5bdelete " 2番から5番まで
:bdelete 3 5 7 " 番号を並べる
:%bdelete|edit# " 全部閉じて今のファイルだけ開き直す
最後の書き方は、作業の区切りで一覧をきれいにしたいときに使えます。変更が未保存のバッファがあると止まるので、先に :wa で保存しておくか、状態を確かめてから実行してください。
バッファを切り替える他の手
番号を覚えていなくても切り替えられます。:b のあとにファイル名の一部を打てば、部分一致で切り替わります。候補が複数あるときは Tab で選べます。
:b conf<Tab> " 名前の一部で切り替える
:bnext / :bprev " 順に送る
Ctrl-^ " 直前のバッファと往復する
2つのファイルを行き来するだけなら Ctrl-^ がいちばん速く、3つ以上を扱うなら名前で切り替えるのが確実です。バッファとウィンドウ・タブの関係はこちらの記事で整理しています。
まとめ
:lsの記号は一見複雑ですが、%・#・+の3つを押さえれば実用上は困りません。バッファが増えて見づらくなったら、状態指定や:filterで絞り込めば解決します。