nvimで複数ファイルをbuffersに読み込む

最近、CopilotChatをnvimで使用することのできるCopilotC-Nvim/CopilotChat.nvimluaで動くようになりましたね。

github.com

前回書いたコードブロックを選択したりdiffを表示したりする処理も標準搭載されるようになり進化を実感しています。

今回は次に来るであろう、VSCodeでいう/workspaceを対象にした機能に備えてbuffersに対象のファイルを読み込む処理を書いたので共有したいと思います。

buffersを利用して実現するみたいなやり取りがあったのは覚えているのですが、実際にどうなるかは不明です。

もし来なかったとしてもThePrimeagen/harpoon等でも使用できるので良しとしています。

github.com

早速ですが以下がその処理です。

---------------------------------------------------------
-- create filepath list from current directory
---------------------------------------------------------
local create_file_path_list_from_current_dir = function()
  cmd = "find * -type f"
  -- write it down to the current buffer
  vim.cmd("normal! i" .. cmd)
  vim.cmd(".!sh")

  print("execute command: " .. cmd)
end
vim.keymap.set("n", "<leader>lb", create_file_path_list_from_current_dir, { desc = 'create file path list from current directory' })


---------------------------------------------------------
-- load buffers from filepath list
---------------------------------------------------------
-- example
-- write "find * -type f"
-- and execute this command ":.!sh"
-- then, execute this command ":lua load_buffers_from_file_list()"
local load_buffers_from_file_list = function()

  local buf = vim.api.nvim_get_current_buf()
  local lines = vim.api.nvim_buf_get_lines(buf, 0, -1, false)

  for _, line in ipairs(lines) do
    -- if a buffer is already open with the same name, don't open it again
    local tmp_bufnr = vim.fn.bufnr(line)
    local opened_buffer_list = vim.api.nvim_list_bufs()
    local is_opened = false

    for _, opened_bufnr in ipairs(opened_buffer_list) do
      if opened_bufnr == tmp_bufnr then
      is_opened = true
      break
      end
    end

    if is_opened then
      goto continue
    end

    local bufnr = vim.api.nvim_create_buf(true, false)
    vim.api.nvim_buf_set_name(bufnr, line)
    vim.api.nvim_buf_call(bufnr, vim.cmd.edit)

    ::continue::
  end
  print("load buffers - Processing completed successfully.")
end

vim.keymap.set("n", "<leader>bl", load_buffers_from_file_list, { desc = 'load buffers from file list' })

使用イメージは以下です

  1. harpoonを開く

  2. <leader> lb

  3. harpoon上にカレント以降に存在するファイル一覧が書き込まれる(findコマンド)

    -> 必要に応じて検索 & :v//dとかで絞ったりする

  4. <leader> bl

  5. buffersにリストのファイルを追加

  6. Telescopeでbuffersの検索をしたり、copilot chatの追加機能で使用する(予定)