LoginSignup
10
4

Neovim から Copilot Chat を使う

Posted at

Vim から Copilot を使いたい場合、 copilot.vim を使われていると思います。

ただ残念なことに copilot.vim は現状 Copilot Chat 機能に対応していません。

この問題を解決できるのが CopilotChat.nvim になります。Neovim stable (0.9.5) か nightly で動作するようです。スターの数も順調に増えているようです。

ということで私も CopilotChat.nvim を導入してみました。備忘録として設定した内容をこの記事に書いておきます。

導入手順

基本的には公式の内容に従って設定すればあっけなく使えます。
ただLazy.nvimを使っている前提の記述となっている箇所も多いので改めて自分の環境の場合の設定方法を載せておきます。

私の環境

OS: Windows 11 Pro 23H2
Neovim: v0.9.5
プラグインマネージャー: dein.vim

プラグインマネージャーを使って CopilotChat.nvim をインストールする

Lazy.nvim, Vim-Plug を使ったインストールの場合は公式の Installationを参照ください。
私は dein.vim を使っています。公式の Installationの内容を参考にして dein.toml ファイルに下記内容を追加しました。

[[plugins]] # GitHub Copilot(すでに入っている場合は不要。zbirenbaum/copilot.lua でも良いそうです。)
repo = 'github/copilot.vim'

[[plugins]] # CopilotChat (for curl, log wrapper) に必要
repo = 'nvim-lua/plenary.nvim'

[[plugins]] # CopilotChat
repo = 'CopilotC-Nvim/CopilotChat.nvim'
depends = ['github/copilot.vim', 'nvim-lua/plenary.nvim']
branch = 'canary'

続いて init ファイルの設定を行います。
私は init ファイルを一部 lua 化していて、init.vim から各プラグインの設定ファイルを読み込むようにしています。フォルダ構成はこんな感じです。

C:.
│  coc-settings.json
│  init.vim
│
└─lua
    ├─copilot_chat_config <-- 今回新しく作成
    │      init.lua       <-- 今回新しく作成
    │
    ├─mason_nvim_config
    │      init.lua
    │
    └─telescope_config
            init.lua

今回は CopilotChat.nvim の設定ファイル init.lua を用意します。

init.lua
require("CopilotChat").setup {
  debug = true, -- Enable debugging
}

次に今回追加した init.lua ファイルを読み込むように init.vim 側に設定を書きます。

init.vim
" --------------------------------
" lua ファイルから設定を読み込み
" --------------------------------
:lua require('copilot_chat_config.init')

ここまでの設定で Copilot Chat が使えるはずです。
:CopilotChat コマンドを実行して Copilot と Neovim 上でやり取りできることを確認できました。
image.png

日本語でも大丈夫です。
image (1).png

欲を言えばチャット文を送信のタイミングで IME が OFF になると嬉しいんですが…設定できるかな?と思って調べてみましたが良い方法は見つからず。

カスタマイズ

とりあえず動くようにはなりました。公式には Tips が用意されています。その中で下記の2つを自分の環境でも設定してみました。

  • バッファの内容全部を考慮して Copilot とチャットする
  • Telescope と連携してプロンプトアクションの一覧を表示して実行する

バッファの内容全部を考慮して Copilot とチャットする

Tips の内容は lazy.nvim での記載方法が書かれていました。私は CopilotChat.nvim の設定ファイル init.lua に下記の内容を追記して設定しました。

init.lua
-- バッファの内容全体を使って Copilot とチャットする
function CopilotChatBuffer()
  local input = vim.fn.input("Quick Chat: ")
  if input ~= "" then
    require("CopilotChat").ask(input, { selection = require("CopilotChat.select").buffer })
  end
end

-- <leader>ccq (Copilot Chat Quick) で Copilot とチャットする
vim.api.nvim_set_keymap("n", "<leader>ccq", "<cmd>lua CopilotChatBuffer()<cr>", { noremap = true, silent = true })

ためしに CopilotChat.nvim の設定ファイル init.lua を開いて、「このファイルは何のファイルですか?」と聞いたところ、ファイル内容を網羅した回答がちゃんと返ってきました。
image.png

Telescope と連携してプロンプトアクションの一覧を表示して実行する

こちらもlazy.nvim での記載方法が書かれていましたので CopilotChat.nvim の設定ファイル init.lua に下記の内容を追記して設定しました。

init.lua
-- telescope を使ってアクションプロンプトを表示する
function ShowCopilotChatActionPrompt()
  local actions = require("CopilotChat.actions")
  require("CopilotChat.integrations.telescope").pick(actions.prompt_actions())
end

-- キーマッピング
-- <leader>ccp (Copilot Chat Prompt の略) でアクションプロンプトを表示する
vim.api.nvim_set_keymap("n", "<leader>ccp", "<cmd>lua ShowCopilotChatActionPrompt()<cr>", { noremap = true, silent = true })

<leader>ccp を実行すると telescope に Copilot Chat Prompt Actions が一覧で表示されました。
image.png

試しに Explain を実行してみました。カーソルが載っている箇所についてのコードの説明をしてくれました。
image.png

Prompt Actions の質問文を日本語化する

さて Prompt Actions は便利なんですが英語で質問しているので回答も英語で返ってきます。日本語のほうが嬉しいので日本語化します。

正しいやり方なのか謎なのですが、prompt の内容をオーバーライドする手段で対応しました。ちなみに私は Commit 関連のコマンドは使わないつもりなので必要なものだけ日本語化しました。
CopilotChat.nvim の設定ファイル init.lua の内容を修正します。ちなみに日本語は元の英語を DeepL で翻訳したものを、ちょろっと自分でいじったものです。

init.lua
local select = require('CopilotChat.select')

require("CopilotChat").setup {
  debug = true, -- Enable debugging

  -- プロンプトの設定
  -- デフォルトは英語なので日本語でオーバーライドしています
  prompts = {
    Explain = {
      prompt = '/COPILOT_EXPLAIN カーソル上のコードの説明を段落をつけて書いてください。',
    },
    Tests = {
      prompt = '/COPILOT_TESTS カーソル上のコードの詳細な単体テスト関数を書いてください。',
    },
    Fix = {
      prompt = '/COPILOT_FIX このコードには問題があります。バグを修正したコードに書き換えてください。',
    },
    Optimize = {
      prompt = '/COPILOT_REFACTOR 選択したコードを最適化し、パフォーマンスと可読性を向上させてください。',
    },
    Docs = {
      prompt = '/COPILOT_REFACTOR 選択したコードのドキュメントを書いてください。ドキュメントをコメントとして追加した元のコードを含むコードブロックで回答してください。使用するプログラミング言語に最も適したドキュメントスタイルを使用してください(例:JavaScriptのJSDoc、Pythonのdocstringsなど)',
    },
    FixDiagnostic = {
      prompt = 'ファイル内の次のような診断上の問題を解決してください:',
      selection = select.diagnostics,
    }
  }
}

この設定で、質問が日本語になって回答も日本語で返ってくるようになりました。

image.png

回答はこんな感じになりました。
image.png

最後に

私は Visual Studio をデバッグモードで動作確認するときにしか使っていませんでした…。なので今までは Copilot Chat は全く使っていませんでした。今回の設定で Neovim から Copilot Chat を使えるようになったので Copilot Chat を活用していきたいと思います。活用していくうちに今後設定の見直しをしたくなるかもしれません。その際はまた記事にしますのでまた読んであげて下さい。

10
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
4