ここに、私の新しい Emacs-Copilot セットアップを説明する簡単なウォークスルーがあります。 Copilot は基本的に VSCode ユーティリティとして宣伝されていますが、実際には Emacs で正常に動作します。 調整の利点 (たとえば、いつ補完を理解するか) を考えると、Emacs はおそらくさらに大きな旅行を提供する可能性があるとさえ主張します.
目次
- イントロと免責事項
- コパイロット Emacs パッケージ
- セットアップとカスタマイズ
Github コパイロット
) は、機械発見を利用してテキスト補完を生成する図であり、基本的にはソース コードを想定しており、実際にはあらゆる種類のテキストで驚くほどうまく機能すると仮定しても. これは商用の Microsoft 製品ですが、いくつかの星を獲得したようなパブリック Github リポジトリについては、現時点では無料で利用できます。 OpenAI の Codex モデル ごとです。 GPT-3 トール言語モデル (LLM) から派生します。 したがって、ある意味では、編集者にとってはマイルの ChatGPT です。
ほとんどの場合、オープン (ソース) データで教育された LLM、たとえば Copilot は物議を醸しています。 とりわけ、多くの人々は、これらのツールが発明された疑わしい正しい根拠に言及して懸念を表明することを好みます。たとえば、現時点では
係争中の訴訟
は、オープンソース ライセンスの実行可能な違反に焦点を当てています。 ですから、論争に言及して、私が首尾よく眠りから覚めていることを明らかにさせてください。たとえば、現在あなたが占有していないコードベースが古風な場合など、コパイロットを慎重に使用することをお勧めします.
それは認めました.ひょっとすると、驚くほど優れた図になるかもしれません。 例として、言語やフレームワークを発見したり、独自のライブラリが API であることに直面したりする場合、驚くべきことに、ドキュメントへの多くの旅行を絶え間なく節約するステアリングを提供するだけです。 さらに、コードの特定のパターンを検出するだけでなく、多様化を確認し、それに対して独自のコードを提案することもできます。 また、試験は単なるホームであり、Copilot の方が優れている可能性もあります
そして、生成されたコードを間違いなくチェックしてください。 その成分は間違いを捏造します。 驚くべきことに、これは単に構文を公平に正しく見えるようにするだけであり (ただし、ほとんどの場合、括弧を正確に終了することはできません)、論理的要因、アンチパターン、または古いコードに耳を傾けます
Copilot API & 統合Copilot が基本的に VSCode ユーティリティであると仮定しても、Emacs で簡単に動作します。 本質的に、言語サーバーよりも強力であってはなりません。 VSCode 拡張 は現在オープン ソースではありませんが、JavaScript で実装されているため、vsix キットをジッパー ファイルとして抽出し、JS ファイルを保存する準備ができていることは間違いありません。 私が知っている方法として、 copilot.vim プラグイン その方法論を時代遅れにする最初の非 VSCode 統合に一度変更します。 employee.js vsix 拡張機能の一部であるファイルは、stdin から JSON-RPC データを読み取る node.js 割り当てとしても開始される可能性があります。 この形式を使用して実装されているさまざまな命令があります。ここに新鮮な脂肪のリストがあります:
getCompletions
- チェックアウト/neverAuth
チェックアウト/useTestingToken checking out/setCompletionDocuments チェックアウト/setPanelCompletionDocumentsチェックアウト/triggerShowMessageRequestチェックアウト/getDocument
debug/verifyState
チェックアウト/setPanelCompletionDocumentsチェックアウト/triggerShowMessageRequestチェックアウト/getDocument
debug/verifyState
- チェックアウト/triggerShowMessageRequest
チェックアウト/getDocument
- debug/verifyState
Emacs や VIM を好むエディタは、whi の後にサブプロセスで従業員を開始できます。 ch と連携して、JSON メッセージを送信し、JSON 応答を発見することは stdout によって助けられます。 Emacs で Copilot を使用することは、方法論的に厄介ではないと見なすことは非常に保護されていると思います。 別の方法としては、以下で証明されているように、Copilot が動作する方法論をカスタマイズすることは、まったくより便利です (いくつかの elisp のリストで:)。 特に、何人かの人々 今はそうではないと判断しているようです。 これについては大まかに言う必要があります(現在または後で)、お知らせください。 Copilot エージェントがオープン ソースではないのは厄介なことです (オープン ソースがなければ、これはおそらく、あなたが考える準備ができているということになるでしょう!) しかし、間違いなく今はそうではありません。それが何をするのかを解決するのは複雑です。 他の購入者がキャプチャできる反転方法
Github ではCopilot 統合を有効にする 3 つの Emacs パッケージに出くわしたようです:
zerolfx/copilot.el が表示されますある意味で最もスマートで最も伝統的なものであり、私が以下で使用しているものです。 VSCodes 拡張機能に匹敵する、オーバーレイによる補完を提供します。 fkr-0/flight-attendant.el 単に怠惰かもしれませんが、クロージング コミットは 365 日前に 1 回に変更されます。 今でも試していません
tyler-dodge/eglot-copilot/ のようです積極的に開発されることを望んでいますが、ドキュメントはありません。 サブプロセスの管理と完了のアドバイスには eglot を使用します
そして、前述のとおり rksm/copilot-emacsd。これは zerolfx/copilot.el に基づいて構築されており、完全に機能する構成であり、おそらく追加でスタンドアローンにすることもできます。
セットアップとカスタマイズ
Demonstrate: この記事の執筆時点 (2023-02-23) zerolfx/copilot.el make 2022 年 12 月からの Copilot エージェント バージョンの使用。 私のフォークは、最も普及しているバージョンを統合しています。 PR保留中です
完全に機能する構成を回収して、 でスタンドアロンにすることもできます) rksm/copilot-emacsd。 次に、必要なカスタマイズのいくつかを示します。
まず、構成は zerolfx/copilot.el。 キットは現在 MELPA にないので、straight.el または他の方法でインストールすることをお勧めします (
README
)。 ほとんどの場合、構成にサブモジュールとして Emacs キット ファンシーを追加します:
git submodule add https:// github.com/rksm/copilot.el
動作に必要なパッケージは次のとおりです: s, 旅行 、 editorconfig
(そして も使用します) 固い と
を使用キット ここでは、これらの非常に優れたものを回収します)。 これを設定してください:
(させて ((pkg-リスト ‘
( )使用キット s
旅行
editorconfig 固い
))) ( kit-initialize) (いつでも (( インストールする ( procedure-filter
( ラムダ (
pkg _
) (今じゃない (kit-installed-p pkg))) pkg-list)))
(kit-refresh-contents ) ( mapc (ラムダ (pkg) (キット-インストール pkg ))pkg-list)))
上記の git サブモジュールが に複製されると、 copilot.el/、私たちはそのキットをロードする位置:
(
使用キット 副操縦士 :ロード-道 (
)ラムダ () ( lengthen-file-title “copilot.el” user-emacs-directory )) ;; モードラインに指定しないでください :減少 )
あなたはそうかもしれません多分多分今も衝動
Mx copilot-login
Github tale (Copilot 製品のサブスクリプションが必要です) と一緒に認証し、その後に M x global-copilot-mode
各ダイアグラムでコパイロットを起動します。 いつ補完を指すかを禁止する
グローバルコパイロットモード ほとんどの場合、少し生きすぎてしまうので、一部のモードでは完全に無効にします: (
defun rk/no -copilot-mode ()
" のヘルパー) `rk/no-copilot-mod es'"
(
) copilot-mode -1
))
(defvar rk/no-copilot-modes
‘
(
シェルモード 汚い-python-mode eshell-mode タイムフレームモード vterm モード
comint-mode
コンパイルモード
デバッガモード
dired-mode-hook
コンパイルモードフック フラッターモードフック ミニバッファモードフック) 「副操縦士が不便なモード」 )
(defun rk/copilot-disable-predicate ()
"副操縦士は簡単かもしれませんが、今は簡単ではありません自動的に完了を示します。"
( または rk/copilot-manual-mode
(メンバー 必須モード rk /no-copilot-modes
)
(firm--active-p)))
(リストに追加する 'copilot-disable-predicates #'rk/copilot-disable-predicate) なら、オーバーレイが自動的に表示されず、クエリで表示されるようになったのと同じように便利です:
(defvar rk/副操縦士-手動モード なし
"いつ
`t' は、MC- などで手動で終了した場合にのみ補完を示します。 .」)
(デフン rk/copilot-commerce-activation
() “3 つのアクティベーション モードを切り替えます: – コンピュータ化: コパイロットは自動的に補完をオーバーレイします
- manual: キーを押したいと思うかもしれません(MC-
) 完了をトリガーする
– off: コパイロットは完全に無効です。” (相互の作用
)
( )もしも
(
と コパイロットモード rk/copilot-manual-mode
)
( progn
(メッセージ 「副操縦士を無効化中」
)
(グローバル コパイロット -モード-1)
(
) setq rk/copilot-manual-mode nil ))
(
もしも コパイロットモード
(prog (
メッセージ
「副操縦士の手動モードを有効にしています」) ( setq rk/警官 ilot-manual-mode t))
(メッセージ 「副操縦士モードを有効にしています」) (グローバル コパイロット-モード))))
( )アカウントのキー グローバルプロシージャ (
kbd 「MC- “)#'rk/copilot-commerce-activation
)
MC-
は、コンピュータ化、手動、オフの 3 つの状態を循環します。 カスタマイズキー Copilot-say自分のキー割り当てはかなり一貫して割り当てられているように思います
MC-... (Alt + ウォッチオーバーを選択 + もう 1 つのキー) コパイロット関連の指示:
(defun rk/副操縦士-complete-or-settle for () "完了をトリガーするか、1 つあれば受け入れることを公開します
が手元にあります。 あなたが鍵を空想的に叩きたいのなら、それはいいことです」 (
相互の作用 )
(もしも(
copilot--overlay-visible
)
(progn
使用キット s
旅行
editorconfig 固い
))) ( kit-initialize) (いつでも (( インストールする ( procedure-filter
( ラムダ (
pkg _
) (今じゃない (kit-installed-p pkg))) pkg-list)))
(kit-refresh-contents ) ( mapc (ラムダ (pkg) (キット-インストール pkg ))pkg-list)))
上記の git サブモジュールが に複製されると、 copilot.el/、私たちはそのキットをロードする位置:
(
使用キット 副操縦士 :ロード-道 (
)ラムダ () ( lengthen-file-title “copilot.el” user-emacs-directory )) ;; モードラインに指定しないでください :減少 )
あなたはそうかもしれません多分多分今も衝動
Mx copilot-login
Github tale (Copilot 製品のサブスクリプションが必要です) と一緒に認証し、その後に M x global-copilot-mode
各ダイアグラムでコパイロットを起動します。 いつ補完を指すかを禁止する
グローバルコパイロットモード ほとんどの場合、少し生きすぎてしまうので、一部のモードでは完全に無効にします: (
defun rk/no -copilot-mode ()
" のヘルパー) `rk/no-copilot-mod es'"
(
) copilot-mode -1
))
(defvar rk/no-copilot-modes
‘
(
シェルモード 汚い-python-mode eshell-mode タイムフレームモード vterm モード
comint-mode
コンパイルモード
デバッガモード
dired-mode-hook
コンパイルモードフック フラッターモードフック ミニバッファモードフック) 「副操縦士が不便なモード」 )
(defun rk/copilot-disable-predicate ()
"副操縦士は簡単かもしれませんが、今は簡単ではありません自動的に完了を示します。"
( または rk/copilot-manual-mode
(メンバー 必須モード rk /no-copilot-modes
)
(firm--active-p)))
(リストに追加する 'copilot-disable-predicates #'rk/copilot-disable-predicate) なら、オーバーレイが自動的に表示されず、クエリで表示されるようになったのと同じように便利です:
(defvar rk/副操縦士-手動モード なし
"いつ
`t' は、MC- などで手動で終了した場合にのみ補完を示します。 .」)
(デフン rk/copilot-commerce-activation
() “3 つのアクティベーション モードを切り替えます: – コンピュータ化: コパイロットは自動的に補完をオーバーレイします
- manual: キーを押したいと思うかもしれません(MC-
) 完了をトリガーする
– off: コパイロットは完全に無効です。” (相互の作用
)
( )もしも
(
と コパイロットモード rk/copilot-manual-mode
)
( progn
(メッセージ 「副操縦士を無効化中」
)
(グローバル コパイロット -モード-1)
(
) setq rk/copilot-manual-mode nil ))
(
もしも コパイロットモード
(prog (
メッセージ
「副操縦士の手動モードを有効にしています」) ( setq rk/警官 ilot-manual-mode t))
(メッセージ 「副操縦士モードを有効にしています」) (グローバル コパイロット-モード))))
( )アカウントのキー グローバルプロシージャ (
kbd 「MC- “)#'rk/copilot-commerce-activation
)
MC-
は、コンピュータ化、手動、オフの 3 つの状態を循環します。 カスタマイズキー Copilot-say自分のキー割り当てはかなり一貫して割り当てられているように思います
MC-... (Alt + ウォッチオーバーを選択 + もう 1 つのキー) コパイロット関連の指示:
(defun rk/副操縦士-complete-or-settle for () "完了をトリガーするか、1 つあれば受け入れることを公開します
が手元にあります。 あなたが鍵を空想的に叩きたいのなら、それはいいことです」 (
相互の作用 )
(もしも(
copilot--overlay-visible
)
(progn
旅行 ラムダ (
pkg _
) (今じゃない (kit-installed-p pkg))) pkg-list)))
pkg-list)))
上記の git サブモジュールが に複製されると、 copilot.el/、私たちはそのキットをロードする位置:
(
使用キット 副操縦士 :ロード-道 (
)
ラムダ () ( lengthen-file-title “copilot.el” user-emacs-directory )) ;; モードラインに指定しないでください
各ダイアグラムでコパイロットを起動します。
Github tale (Copilot 製品のサブスクリプションが必要です) と一緒に認証し、その後に M x global-copilot-mode
:減少
Mx copilot-login) あなたはそうかもしれません多分多分今も衝動
いつ補完を指すかを禁止する
グローバルコパイロットモード ほとんどの場合、少し生きすぎてしまうので、一部のモードでは完全に無効にします:(
defun rk/no -copilot-mode
()
" のヘルパー) `rk/no-copilot-mod es'"
(
)
copilot-mode
-1
))
(
defvar rk/no-copilot-modes
‘
(
シェルモード
汚い-python-mode
コンパイルモードeshell-mode タイムフレームモード vterm モード
comint-mode
デバッガモード
dired-mode-hook
コンパイルモードフック フラッターモードフックミニバッファモードフック)「副操縦士が不便なモード」 )
(メンバー 必須モード
(
defun rk/copilot-disable-predicate ()
"副操縦士は簡単かもしれませんが、今は簡単ではありません自動的に完了を示します。"
( または rk/copilot-manual-mode
)
rk /no-copilot-modes
(firm--active-p
())))
(リストに追加する 'copilot-disable-predicates #'rk/copilot-disable-predicate)
(defvar rk/副操縦士-手動モード
なら、オーバーレイが自動的に表示されず、クエリで表示されるようになったのと同じように便利です:
なし
"いつ`t' は、MC- などで手動で終了した場合にのみ補完を示します。 .」)
(デフン rk/copilot-commerce-activation
“3 つのアクティベーション モードを切り替えます:
– コンピュータ化: コパイロットは自動的に補完をオーバーレイします
- manual: キーを押したいと思うかもしれません(MC-) 完了をトリガーする
– off: コパイロットは完全に無効です。”
と コパイロットモード rk/copilot-manual-mode
(
相互の作用
)
((
)もしも
)
(
progn
(
メッセージ
「副操縦士を無効化中」
)(
グローバル コパイロット -モード -1
)
(
)
setq rk/copilot-manual-mode
nil
))
(
もしも コパイロットモード
(prog
メッセージ
(「副操縦士の手動モードを有効にしています」
)
( setq rk/警官 ilot-manual-mode t))
(メッセージ 「副操縦士モードを有効にしています」) (グローバル コパイロット-モード))))
(
kbd 「MC- “))
アカウントのキー
グローバルプロシージャ (
(defun rk/副操縦士-complete-or-settle for
#'
rk/copilot-commerce-activation
)
MC-
は、コンピュータ化、手動、オフの 3 つの状態を循環します。
MC-... (Alt + ウォッチオーバーを選択 + もう 1 つのキー) コパイロット関連の指示:カスタマイズキー Copilot-say 自分のキー割り当てはかなり一貫して割り当てられているように思います
)
()
"完了をトリガーするか、1 つあれば受け入れることを公開しますが手元にあります。 あなたが鍵を空想的に叩きたいのなら、それはいいことです」
copilot--overlay-visible
(
相互の作用
)
(
もしも ((progn
( copilot-settle for-complete) ( open-line 1) (next-line )) ( コパイロット完了)))
(
account for-key 副操縦士モード手順 (kbd 「MC- “) #’ 副操縦士-次の完了 )(
account for-key 副操縦士モード-手順 (
) kbd 『MC- 」
(
(next-line )) ( コパイロット完了)))
(account for-key 副操縦士モード手順 (kbd 「MC- “) #’ 副操縦士-次の完了
)(
(
(
account for-key 副操縦士モード-手順 (
) kbd 『MC- 」
」
(
account for-key
副操縦士モード手順
(kbd
「MC-」 「) #’ 副操縦士は、意識して完了のために解決します)
副操縦士モード手順 (kbd 「MC- 」
(
account for-key グローバル手続き (
kbd 「MC-」 ") #'
rk/copilot-complete-or-settle for
)
タブキー
も活用しようとしている方へ
完了するためのキーですが、同じ以前の機能を簡単に保持して、達成します:
(defun rk/副操縦士-タブ
()
完了が 手元に。 それ以外の場合は、しっかりと、yasnippet または以前と同じように努力します
(相互の作用)
(または (
(copilot-settle for-complete )
会社-yasnippet-or-完了 ) (タブのインデント
(タブのインデント
(タブのインデント
(タブのインデント
)))
( account for-key グローバル手続き (kbd “”) #’rk/copilot-タブ
)
Ctrl-g / キャンセル
Cgで命令をキャンセルしたい。 これは、Copilot の完了をキャンセルしてもそのままでは機能しません。
(defun rk/副操縦士-やめる()
「喧噪
`copilot-certain-overlay’ また `キーボード終了’。 副操縦士が
クリアし、オーバーレイがすぐには助けにならないと判断した製造." (
相互の作用)
(状態-場合 エラー (いつ 副操縦士- -かぶせる (lexical-let (( pre-copilot-disable-predicates copilot-disable-predicates)) (
setqcopilot-disable-predicates (
リスト(
ラムダ
() t))) (copilot-certain-overlay) (
urge-with-アイドルタイマー
1.0 nil (ラムダ ()
(setq copilot-disable-predicates プレ-copilot-disable-predicates
)))))
アドバイス追加
( account for-key グローバル手続き (kbd “”) #’rk/copilot-タブ
)
Ctrl-g / キャンセル
Cgで命令をキャンセルしたい。 これは、Copilot の完了をキャンセルしてもそのままでは機能しません。
(defun rk/副操縦士-やめる()
「喧噪
`copilot-certain-overlay’ また `キーボード終了’。 副操縦士が
クリアし、オーバーレイがすぐには助けにならないと判断した製造." (
相互の作用)
(状態-場合 エラー (いつ 副操縦士- -かぶせる (lexical-let (( pre-copilot-disable-predicates copilot-disable-predicates)) (
setqcopilot-disable-predicates (
リスト(
ラムダ
() t))) (copilot-certain-overlay) (
urge-with-アイドルタイマー
1.0 nil (ラムダ ()
(setq copilot-disable-predicates プレ-copilot-disable-predicates
)))))
アドバイス追加
( account for-key グローバル手続き (kbd “”) #’rk/copilot-タブ
)
Ctrl-g / キャンセル
Cgで命令をキャンセルしたい。 これは、Copilot の完了をキャンセルしてもそのままでは機能しません。
(defun rk/副操縦士-やめる()
「喧噪
`copilot-certain-overlay’ また `キーボード終了’。 副操縦士が
クリアし、オーバーレイがすぐには助けにならないと判断した製造." (
相互の作用)
(状態-場合 エラー (いつ 副操縦士- -かぶせる (lexical-let (( pre-copilot-disable-predicates copilot-disable-predicates)) (
setqcopilot-disable-predicates (
リスト(
ラムダ
() t))) (copilot-certain-overlay) (
urge-with-アイドルタイマー
1.0 nil (ラムダ ()
(setq copilot-disable-predicates プレ-copilot-disable-predicates
)))))
アドバイス追加
グローバル手続き (kbd “”) #’rk/copilot-タブ
)
Ctrl-g / キャンセル
Cgで命令をキャンセルしたい。 これは、Copilot の完了をキャンセルしてもそのままでは機能しません。
“”) #’rk/copilot-タブ
)
Ctrl-g / キャンセル
rk/copilot-タブ
)
Cgで命令をキャンセルしたい。 これは、Copilot の完了をキャンセルしてもそのままでは機能しません。
クリアし、オーバーレイがすぐには助けにならないと判断した製造." (
相互の作用)
(状態-場合 エラー (
(いつ 副操縦士- -かぶせる (lexical-let (( pre-copilot-disable-predicates copilot-disable-predicates)) (
setqcopilot-disable-predicates (
リスト(
ラムダ
() t))) (copilot-certain-overlay) (
urge-with-アイドルタイマー
1.0 nil (ラムダ ()
(setq copilot-disable-predicates プレ-copilot-disable-predicates
)))))
アドバイス追加
(lexical-let (( pre-copilot-disable-predicates copilot-disable-predicates)) (
setqcopilot-disable-predicates (
リスト(
ラムダ
() t))) (copilot-certain-overlay) (
urge-with-アイドルタイマー
1.0 nil (ラムダ ()
(setq copilot-disable-predicates プレ-copilot-disable-predicates
)))))
アドバイス追加
‘keyboard-quit :よりも早く) #’rk/copilot-quit )
そして、それはそれであるに違いありません!
狂ったすべての寛大なEmacsハッカーに帰せられますこれらすべてのことは、あなたが考える準備ができていることは間違いありません!