NeovimへのGitHub Copilot Chatの導入と設定

Vim/Neovim から GitHub Copilot を使いたい場合は、github/copilot.vimを通常は用いますがChat機能には現状では対応していません。

そのため、Chat機能に対応したCopilotC-Nvim/CopilotChat.nvimを追加導入しました。 github.com

READMEに従って導入します。dein.vim だと次のようになります。 dotfiles/nvim/dein.toml at d6a792b8eedddeb614a5f118301cb65da0e546c1 · tomato3713/dotfiles · GitHub

# dein.toml
[[plugins]]
repo = 'https://github.com/CopilotC-Nvim/CopilotChat.nvim'
depends = ['copilot.vim', 'plenary.nvim']
rev = 'canary'

これだけでも :CopilotChatExplain のようにコマンドを実行するとChatを利用できます。 ただ、英語で答えられてしまうので日本語になるようにプロンプトを調整したり、気軽に呼び出せるようにキーマッピングを追加したりしました。

こだわりポイントはGitHub Copilot に生成させる説明を猫になりきって行うようにしているところです。 語尾が猫っぽく「にゃ」になるので癒されます。

dotfiles/nvim/lua/rc/copilot.lua at 7f3b516509bc11e2c4aeaf9abef7da9caaa07a3b · tomato3713/dotfiles · GitHub

-- copilot.lua
require("CopilotChat").setup({
    show_help = "yes",
    prompts = {
        Explain = {
            prompt = "/COPILOT_EXPLAIN 上記のコードを猫になりきって日本語で説明してください",
            mapping = '<leader>ce',
            description = "バディにコードの説明をお願いする",
        },
        Review = {
            prompt = '/COPILOT_REVIEW 選択したコードをレビューしてください。レビューコメントは猫になりきって日本語でお願いします。',
            mapping = '<leader>cr',
            description = "バディにコードのレビューをお願いする",
        },
        Fix = {
            prompt = "/COPILOT_FIX このコードには問題があります。バグを修正したコードを表示してください。説明は猫になりきって日本語でお願いします。",
            mapping = '<leader>cf',
            description = "バディにコードの修正をお願いする",
        },
        Optimize = {
            prompt = "/COPILOT_REFACTOR 選択したコードを最適化し、パフォーマンスと可読性を向上させてください。説明は猫になりきって日本語でお願いします。",
            mapping = '<leader>co',
            description = "バディにコードの最適化をお願いする",
        },
        Docs = {
            prompt = "/COPILOT_GENERATE 選択したコードに関するドキュメントコメントを日本語で生成してください。",
            mapping = '<leader>cd',
            description = "バディにコードのドキュメント作りをお願いする",
        },
        Tests = {
            prompt = "/COPILOT_TESTS 選択したコードの詳細なユニットテストを書いてください。説明は猫になりきって日本語でお願いします。",
            mapping = '<leader>ct',
            description = "バディにコードのテストコード作成をお願いする",
        },
        FixDiagnostic = {
            prompt = 'コードの診断結果に従って問題を修正してください。修正内容の説明は猫になりきって日本語でお願いします。',
            mapping = '<leader>cd',
            description = "バディにコードの静的解析結果に基づいた修正をお願いする",
            selection = require('CopilotChat.select').diagnostics,
        },
        Commit = {
            prompt =
            'commitize の規則に従って、変更に対するコミットメッセージを記述してください。 タイトルは最大50文字で、メッセージは72文字で折り返されるようにしてください。 メッセージ全体を gitcommit 言語のコード ブロックでラップしてください。メッセージは日本語でお願いします。',
            mapping = '<leader>cc',
            description = "バディにコミットメッセージの作成をお願いする",
            selection = require('CopilotChat.select').gitdiff,
        },
        CommitStaged = {
            prompt =
            'commitize の規則に従って、ステージ済みの変更に対するコミットメッセージを記述してください。 タイトルは最大50文字で、メッセージは72文字で折り返されるようにしてください。 メッセージ全体を gitcommit 言語のコード ブロックでラップしてください。メッセージは日本語でお願いします。',
            mapping = '<leader>cs',
            description = "バディにステージ済みのコミットメッセージの作成をお願いする",
            selection = function(source)
                return require('CopilotChat.select').gitdiff(source, true)
            end,
        },
    },
})

軽く使ってみたところでは結構正確な回答をしてきます。 上記のCopilotC-Nvim/CopilotChat.nvimの設定を書いている時にもレビューをさせてみたら、キーマッピングが衝突していることを指摘されて修正するということができました。

次のスクリーンショットは、実際に上記のCopilotChat.vimの設定について:CopilotChatExplain で説明させてみた様子です。

copilotchat.nvim の設定をGitHub Copilot Chatで説明させた時のスクリーンショット
copilotchat.nvim の設定をGitHub Copilot Chatで説明させた時のスクリーンショット

現在は、とりあえず設定して使い初めてみた段階です。 これから使用頻度を上げて使い心地を試しつつ公式で書かれているTipsを参考にして自分に合わせて呼び出せるように調整していく予定です。