copilot.luaのような仮想テキスト系補完プラグインのキーマップ
neovimにおいてLLMで仮想テキストを表示し補完するプラグインはいくつか存在する
copilot.luaなど
これらのプラグインで他のエディタのように<TAB>キーでの補完を有効化すると提案の受け入れとインデントがバッティングするケースがある
試した限りではバッティングするものとそうでないものが存在
バッティングする
copilot.lua
neocodeium.nvim
minuet-ai.nvim
しない
copilot.vim
supermaven-nvim
<TAB>キーでの受け入れとインデントを両立するには以下のように設定
code:lua
require("copilot").setup{
suggestion = {
-- ビルトインのキーマップをオフ
accept = false,
},
}
-- キーマップを設定
vim.keymap.set("i", '<Tab>', function()
-- copilotがサジェストしていれば真
if require("copilot.suggestion").is_visible() then
require("copilot.suggestion").accept()
else
-- キーコードをneovimが解釈可能な形式に変換
vim.api.nvim_feedkeys(vim.api.nvim_replace_termcodes("<Tab>", true, false, true), "n", false)
end
end, {
-- コマンドラインへ表示しない
silent = true,
}
)
acceptでは提案の全てを一括で受け入れる
単語単位で受け入れたい場合は以下のように書き換え
accept → accept_word
require("copilot.suggestion").accept() → require("copilot.suggestion").accept_word()
自分は別途キーマップを設定している
サジェストが表示された状態でもタブを入力するために提案をキャンセルするキーマップを別途設定することを勧める
サジェストをキャンセル → タブを入力と二度手間になってしまうが…
このテクニックはneocodeiumやminuet-ai.nvimでも利用可能
ただし前者では衝突などの恐れがあるため非推奨となっている
一応現在では特に問題は発生していない
設定例
https://github.com/tekkamelon/dotfiles/blob/main/.config/nvim/lua/plugins/minuet.lua
https://github.com/tekkamelon/dotfiles/blob/main/.config/nvim/lua/plugins/neocodeium.lua
参考
https://github.com/zbirenbaum/copilot.lua/issues/91
https://github.com/zbirenbaum/copilot.lua
https://github.com/monkoose/neocodeium
#備忘録