Arantium Maestum

プログラミング、囲碁、読書の話題

本日のvim道 2018.3.24

今日はBufferについて。

bufferという単語はよく聞くしなんとなく理解していたつもりだったのだけど、全然うまく使えていないので調べてみた。

Bufferとは

そもそもBufferとはvimにおける「メモリ上のファイル」のことである。

  • ハードディスク上のファイルに対応している
  • 新規ファイルなのでまだディスクには対応するファイルがない

などのケースはあるが、基本的に1ファイル1バッファ。

他のエディタでは、タブなどのグラフィカルな表示でなんのファイルが現在開いているかを表示している。メモ帳などは各ファイルごとに別インスタンスが開く。

それに対して、vimではbufferはメモリ上の概念で、コマンドで調べないと何のbufferが現在開いているかは見た目からはわからない。

すでにあるファイルを開いているvim上で:e some-file.txtとコマンドを入れると、現在のファイルにセーブされていない変更がある場合はセーブするようにいってくるし、ない場合は画面がsome-file.txtの中身に入れ替わる。まるでvim上ではひとつのファイルしか扱えないかのようだ。

実際には:eで別のファイルを開いたとしても、今まで同じセッションで開いたファイルはすべてメモリ上にbufferとして残っていて、コマンド1つで簡単に呼び出せるし一覧を確認することもできる。何十、何百とファイルをインメモリで開いて、ビジュアルを邪魔することなくマウスに頼ることなく、キー操作で入れ替えたりできる、というのが強み。buffer移動する時にファイルのセーブを促すのは、セーブをうっかり忘れてvimを閉じるのを避ける為、らしい。:set hiddenでセーブ無しにbufferを移動できるように設定が可能だが、果たしてそれはいいことかどうか・・

window機能で一つの画面を分割できると知ると、それが複数のファイルのエディットの仕方だと思ってしまいがち、というか私は長らく思っていた。告白するとbufferの概念を知ってからもずっとwindowを多用している。これから精進します。

windowというのは特定のbufferに対するviewで、同じbufferに対して別のwindowを開くことも可能。同じファイルの中の別の箇所を参照しながらエディットしたい時には非常に便利。

:buffers/:ls

現在開いているbufferの一覧を表示。

  1 #    "xyz.py"                       line 9
  2 %a   "my_file_abc.txt"              line 22

のように、開いているファイル名と一緒に、bufferに割り当てられた番号、どのファイルが現在開いているか(%a)、そしてファイル内のカーサの位置が表示される。

buffer番号は同一セッション中は不変。bufferを閉じて、新しいbufferを開いたとしても使い回されることなく新しい番号が振られる。

:bn:bp

次のbufferに移動する時は:bn、前のbufferに移動する時は:bp(nextとprevious) :sbn:sbpコマンドは、現在のwindowを上下にsplitした形で新しいwindowを作り、そこに次・前のbufferを表示する。

:b {buffer number}/:b {buffer-name}

特定のbufferに移動する場合は:lsでわかったbuffer番号を使うか、ファイル名で指定する。 :sb ...で新しいwindowに表示。

:bd

bufferを閉じる場合は:bd(delete)。