Github Copilotというコード補完を利用している所を、しばしば目にするようになってきた。Github Copilotはエディタ向けの拡張として、Visual Studio、Visual Studio Code、JetBrains製のIDE、NeoVim向けのもの1が公式で提供されている。公式にEmacs向けの拡張は提供されていないが、サードパーティの拡張がGithub上にある2。これを利用する事で、Github Copilotを利用する事はできる。今回はEmacsにGithub Copilotを整備する。
NeoVim向けの拡張は、JavaScriptで実装されたエージェントを梱包している3。Emacsの拡張も同様にエージェントを使う4 。このエージェントはJSON-RPCでエディタと対話をし補完を提供する。
+-----------------+
| |
| Github Copilot |
| |
+------+----------+
|
----------------------
INTERNET
----------------------
|
+------|-------------------------------+
| | Emacs |
| | |
| | |
| +---+------+ |
| | | JSON-RPC |
| | Agent <-------------> |
| | | |
| +----------+ |
| |
+--------------------------------------+エージェントはNode 16を必要とするため、別途インストールする。インストールには今回はHomebrewを使う。
brew install node@16インストールしたNodeは /usr/local/opt/node@16 にインストールされた。copilot.elでそれを使用するために、Nodeの実行ファイルへのパスを copilot-node-executable に設定する。
(setq copilot-node-executable (expand-file-name "/usr/local/opt/node@16/bin/node"))copilot.elのインストール方法もいくつか考えられるが、今回はGithubのリポジトリからソースコードをcloneし、そのディレクトリをload-pathに含め、直接requireできるようにする。
ソースコードを取得する。
git clone https://github.com/zerolfx/copilot.el.gitload-pathを追加する。
(add-to-list 'load-path "/PATH/TO/YOUR/copilot.el")load-pathへの追加までできたら、copilot.elをrequireする。
(require 'copilot)copilot-login というコマンドが用意されており、これを実行するとGithubのアクセストークンの発行フローを開始する。
copilot-mode というマイナーモードを有効にすると、そのバッファでcopilotを使用できるようになり、バッファを変更した時にcopilotに対して問い合わせを行う。そして候補がある場合は、オーバレイで候補を表示する。 copilot-accept-completion で候補を確定できる。このコマンドはキーにバインドされていない。どこにバインドするか迷ったが、役割としては dabbrev-expand に近いように思えた。また、そこで M-/ に上書きで割り当てる事にした。 copilot-mode が有効な時は M-/ で dabbrev-expand を使用できなくなってしまうが、そこはもう割り切る事にした。
(define-key copilot-mode-map (kbd "M-/") #'copilot-accept-completion)もっとじっくり考えれば上手いやり方があると思う。