🚪

【Neovim】不要なバッファを一括でクローズするカスタムコマンド

2025/02/26に公開

TL;DR

  • 現在のバッファと変更済みバッファを除く全てのバッファを一度に閉じるNeovimカスタムコマンドを紹介します

はじめに

Neovimを使っていると、作業中にたくさんのバッファを開きがちになります。プロジェクトのソースコードを探索し、あちこちのファイルを参照していると、いつの間にか大量のバッファが開かれている...そんな経験はありませんか?

今回は、必要なバッファだけを残して他を一掃するカスタムコマンドを作成してみました。このコマンドは「現在表示中のバッファ」と「変更が保存されていないバッファ」を保持しつつ、それ以外のバッファを全て閉じてくれます。

カスタムコマンドの実装

vim.api.nvim_create_user_command('CloseBuffers', function()
  local current_buf = vim.api.nvim_get_current_buf()
  local buffers_to_keep = {}
  local closed_count = 0
  
  -- 現在のバッファと変更のあるバッファをリストに追加
  for _, buf in ipairs(vim.api.nvim_list_bufs()) do
    if vim.api.nvim_buf_get_option(buf, 'modified') or buf == current_buf then
      table.insert(buffers_to_keep, buf)
    end
  end
  
  -- 保持するバッファ以外を閉じる
  for _, buf in ipairs(vim.api.nvim_list_bufs()) do
    if not vim.tbl_contains(buffers_to_keep, buf) then
      if pcall(vim.api.nvim_buf_delete, buf, { force = false }) then
        closed_count = closed_count + 1
      end
    end
  end
  
  vim.notify(closed_count .. " buffers closed", vim.log.levels.INFO)
end, {})

こちらが実装した内容です。大まかには以下のような感じです。

  • vim.api.nvim_get_current_buf()で現在のバッファを取得しておく
  • vim.api.nvim_buf_get_option(buf, 'modified')でmodifiedなものを取得しておく
  • vim.api.nvim_list_bufs()でバッファの一覧を取得
  • pcall(vim.api.nvim_buf_delete, buf, { force = false })でバッファを削除する

これにより、バッファが貯まりすぎたなーというタイミングで閉じれるので個人的には満足です。

標準コマンドとの比較

今回実装したカスタムコマンド以外でも、類似の標準コマンドがいくつかあります。

  • :only(:on):現在のウィンドウ以外のすべてのウィンドウを閉じる
  • :bdelete(:bd):指定したバッファを削除
  • :bwipeout(:bw):バッファを完全に削除(undo履歴など含む)

:onlyは名前的にこれか!?と思ったのですがちょっと違いました。。

まとめ

不要なバッファを一括でクローズするカスタムコマンドを簡単に実装してみました。探せば他のコマンドとかでもしかしたらできるのかもですが、書いたほうが早かったので。。

Discussion