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.git
load-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)
もっとじっくり考えれば上手いやり方があると思う。