« ^ »

Github Copilot

所要時間: 約 3分

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)

もっとじっくり考えれば上手いやり方があると思う。