[nvim] bufferlineでタブごとに表示するバッファを切り替える

[nvim] bufferlineでタブごとに表示するバッファを切り替える

neovimのプラグイン「bufferline」でタブごとに表示するバッファを切り替えられない問題の解決メモです。

実現したいこと

その1

・タブ1をフロントエンドのワークスペースにしたい
・タブ2をバックエンドのワークスペースにしたい
・タブを切り替えることでフロントエンド・バックエンドを簡単に行き来したい
・お互いのタブには各ワークスペースで開いたバッファだけ表示したい

その2

・タブ1をフロントエンドのワークスペースにしたい
・タブ2にターミナルを開いておきたい
・タブを切り替えることでフロントエンド・ターミナルを簡単に行き来したい
・タブ1にはターミナルのバッファは表示したくない

変更前のデフォルト

bufferlineは開いているバッファをタブラインに表示するプラグインです。
以下のGIF画像のようにタブを切り替えても、タブラインには常に同じ開いているバッファが表示されます。

変更後

その1

gtでタブを切り替えると、それぞれのタブのワークスペース(カレントディレクトリ)で開いたバッファが表示されます。

その2

ターミナルがタブ1に表示されません。

設定方法

bufferlineに専用の設定がある訳ではなく、custom_filterで実現します。
custom_filterでは、タブラインに表示する条件をセットすることができます。

カレントディレクトリのパスがバッファのファイルのパスに含まれている場合に表示するフィルターを追加します。

options = {
  custom_filter = function(buf_number)
    if not not vim.api.nvim_buf_get_name(buf_number):find(vim.fn.getcwd(), 0, true) then
      return true
    end
  end
},

使い方

tabnewで新しいタブを作成します。

tcdで新しいタブに別のカレントディレクトリをセットします。
fern等のファイルエクスプローラーにはツリー上でカーソルのある場所にtcdをセットするコマンドが用意されているので、それを使うと手軽にセットできます。

:tc[d][!] {path}    |:cd| と似ているが、カレントタブページのディレクトリを
            設定するだけである。カレントウィンドウもこのディレクト
            リを使用する。カレントディレクトリは、他のタブページ内
            のウィンドウやカレントタブページ内のウィンドウ固有の
            ウィンドウローカルディレクトリに対しては変更されない。

各タブごとに別々のカレントディレクトリがセットされることで、それぞれのタブにはセットされているカレントディレクトリ内のバッファだけ表示されるようになりました。

課題

同じワークスペース内(カレントディレクトリ)でタブごとに表示を分けたい場合は上手くいかない。

タブA: /projects/sample
タブB: /projects/sample/src/features

タブAではタブBで開いているバッファのパスがマッチするため、
タブAにはタブA+タブBのすべてのバッファが表示される。

参考

Only Show buffers in the active Tabs #288

プログラミングカテゴリの最新記事