AlacrittyとNeovimでGitHub Copilotの補完候補切り替えを動作するようにした

2023-08-31

追記(2023-09-03)

Alacrittyの設定ファイルを追記したらAltキーでも動きました。

alacritty.yml
window:
    option_as_alt: OnlyLeft

追記の参考サイト

はじめに

最近 GitHub Copilot を Neovim(nvim) で使っています。自分は最初知らなかったのですが Copilot が提案するコードは最初に表示しているコード以外にも、複数の補完候補(suggestions)を表示してくれます。この補完の切り替えはnvim の Copilot プラグインでは、Alt + ]Alt + [などのAlt + なにかに割り当てらています。しかし、自分の環境で試したところ、このキーを入力すると補完が選択できずに文字列()に化けてしまいうまく動きませんでした。

この問題を解決するためにキーバインドを切り替えた時の話です。自分の環境は以下のとおりです。

ツールバージョン
mac(M1 MAX)Ventura 13.4.1
nvim0.9.1
Alacritty0.12.1(1)

キーバインド方法

どうやらそもそもこの現象が起こる理由が Alt キーが META キーとして上手に認識していないのが原因で使用しているターミナルアプリの問題のようでした(もしかしたら違うかも)。iTerm2 などでは設定について説明があったりしたのですが Alacritty で解決方法がうまく見つけることが出来ませんでした(見つけて実際に試しても問題は解決しませんでした…)。

で色々調べると Alt キーを入力したときに出てくる文字列を直接キーマップに設定している例があって試したら動きました。

文字列直接を設定する方法
vim.keymap.set('i', '‘', '<Plug>(copilot-next)', { noremap = true, silent = true })
vim.keymap.set('i', '“', '<Plug>(copilot-previous)', { noremap = true, silent = true })

自分は上記のキーマップは使いづらかったので、Control に割り当てるようにしました。

自分の補完切り替えの設定
vim.keymap.set("i", "<C-j>", "copilot#Next()", { expr = true, silent = true })
vim.keymap.set("i", "<C-k>", "copilot#Previous()", { expr = true, silent = true })

あと、タイトルとは直接関係ないのですが、補完候補を決めて Accept すると変な文字列も一緒に入力される問題があったので以下のように設定しています。replace_keycodes = falseが大事みたいです。

Acceptしたときに一緒に変な文字が入力される対策
vim.keymap.set("i", "<C-l>", 'copilot#Accept("<CR>")', { expr = true, silent = true, replace_keycodes = false })

最後に

根本原因の解決にはなっていませんが nvim 上で Copilot の補完の切り替え(cycle suggestions)が動作するようになりました。

業務で全くやったことのない Rails をやっているのですが Copilot に非常に助けられています!本当に便利〜

参考サイト

Tatsumi0000

Written by Tatsumi0000 モバイル開発が好きなエンジニアのブログです. GitHub

Copyright © 2023, Tatsumi0000 All Rights Reserved.