Emacsでgithub-copilotを利用するためのcopilot.elについて解説します。
初期設定
インストール
githubにソースコードがあるので、各自インストールしてください。
leafであれば以下のように書けば、依存パッケージ含めてインストールされます。
ついでに、prog-modeでcopilot-modeがonになります。
(leaf copilot
:vc (:url "https://github.com/copilot-emacs/copilot.el")
:config
(leaf editorconfig
:ensure t
)
(leaf s
:ensure t
)
(leaf dash
:ensure t
)
:hook
(prog-mode-hook . copilot-mode)
)
githubにログイン
最初にgithubにログインする作業が必要になります。
M-x copilot-login
からブラウザでログインできます。
認証コードがmini bufferに表示されるので、コピーして貼り付けましょう。
一度ログインできれば、認証情報は以降も保存されているので、次回以降はemacsを再起動しても大丈夫です。
キーバインドの設定
私は以下のように設定しています。
この後の各コマンドの説明を呼んで各自好きにすればいいと思います。
:bind
(copilot-completion-map
("C-e" . copilot-accept-completion)
("M-f" . copilot-accept-completion-by-word)
("C-M-f" . copilot-accept-completion-by-paragraph)
("M-n" . copilot-accept-completion-by-line)
("C-M-n" . copilot-next-completion)
("C-M-p" . copilot-previous-completion)
)
(copilot-mode-map
("M-i" . copilot-complete)
)
キーマップについて
copilot.elに関連するキーマップにはcopilot-mode-map
とcopilot-completion-map
があります。
特に後者が重要で、copilotが補完を出している時のみ有効なキーマップになります。ですので、補完の決定や候補選択についてはcopilot-completion-map
にhookさせていくことになると思います。
各コマンドについて
copilot-mode
hookを設定していない場合にはM-x copilot-mode
で手動で起動できます。もちろんもう一回打てばOFFになります。
copilot-complete
copilotの補完候補を表示すると同時にcopilot-completion-map
が有効になります。
copilot-modeの時には自動的に補完候補が表示されるので、copilot-idle-delay
を設定していない場合はあまり出番がないです。
補完候補がない時には"No completion is available."
とmini bufferに表示されます。
copilot-accept-completion
表示されている補完候補を確定します。複数行あっても全て一発で確定されます。
copilot-accept-completion-by-word
表示されている補完候補の最初の単語まで確定します。単語の後ろについている記号までは確定してくれない点が微妙に使い勝手が悪いです。例えばif __name__ ==
から補完しようとすると、if __name__ == "__main
で止まります。
copilot-accept-completion-by-line
表示されている補完候補の最初の行を確定します。確定される部分が明確なので使いやすい印象です。
copilot-accept-completion-by-paragraph
表示されている補完候補の最初のparagraphまで確定されます。paragraphの単位がいまいち分かってないのですが、複数行確定されるので、あんまり出番はなさそう。
copilot-next/previous-completion
補完候補が複数ある場合に、表示する候補を切り替えます。
一覧的に見れないので一個ずつ切り替えて見ていくので、corfuとかのUIに慣れているとちょっと使い辛さを感じます。
設定できる変数
copilot-idle-delay
補完パッケージでよくある、補完まで少し待つかどうかの変数。
少し使ってみた感じデフォルトの0のままでよさそう。
copilot-enable/disable-predicates、copilot-enable/disable-display-predicates
copilotの補完が表示される条件を設定する変数っぽい。デフォルトだとevilのinsert-mode向けの制御が入ってるっぽい。copilotの補完が変なところで出過ぎて鬱陶しい、みたいになったら、ここを頑張って弄るんだと思う。
基本的には弄らなくてよさそう。
copilot-clear-overlay-ignore-commands
copilotの補完が表示中に他の動作をすると、補完がリジェクトされたと判断されて消えるのだけど、ここで指定されたコマンドの場合は残るようになる、多分。
これも基本的には弄らなくてよさそう。
copilot-network-proxy
よくあるプロクシ設定のための変数。
参考にしたページとか
基本的な導入方法についてはこのページを参考にしました。
下記のキーバインドの設定がskkの補完のTabキーを奪うので色々調べ始めたのがこの記事を書くきっかけです。
(defun my/copilot-tab ()
(interactive)
(or (copilot-accept-completion)
(indent-for-tab-command)))
(with-eval-after-load 'copilot
(define-key copilot-mode-map (kbd "<tab>") #'my/copilot-tab))
キーバインド周りの設定はこのページを参考にしています。