🦬

chatgpt-shell.el の使い方

2024/09/04に公開

https://github.com/xenodium/chatgpt-shell

簡単な使い方

(require 'chatgpt-shell)
(setq chatgpt-shell-openai-key "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX")

として M-x chatgpt-shell から、

ChatGPT(4o/General)> 1 + 2 は?
1 + 2 は 3 です。

対話するだけ。

便利コマンド

たくさんあるけどこれらだけ知っていればいい。

コマンド 内容
chatgpt-shell-send-region-with-header 「次の○○を○○して」の命令を添えて選択範囲を ChatGPT に送る
chatgpt-shell 対話型シェルに入る
chatgpt-shell-prompt 対話型シェルに入らずミニバッファで入力する
chatgpt-shell-send-to-buffer 引数の文字列を ChatGPT に送る

お好みで調整

(setq chatgpt-shell-welcome-function nil)                ; 最初のメッセージを表示しない
(setq chatgpt-shell-request-timeout 10)                  ; 10秒でタイムアウトとする
(setq chatgpt-shell-prompt-query-response-style 'shell)  ; 結果表示先 (inline other-buffer shell)
(setq chatgpt-shell-streaming t)                         ; t:少しずつ表示する nil:一気に表示する
(setq shell-maker-prompt-before-killing-buffer nil)      ; シェルを閉じるとき transcript.txt に保存しない

既存のプロンプト

一般的な用途に向けた次のコマンドたちが用意されている。

コマンド 内容
chatgpt-shell-describe-code コード解説
chatgpt-shell-write-git-commit コミットメッセージ作成
chatgpt-shell-refactor-code リファクタリング
chatgpt-shell-proofread-region 文章校正
chatgpt-shell-generate-unit-test ユニットテスト生成
chatgpt-shell-eshell-whats-wrong-with-last-command eshell で失敗した外部コマンドの理由
chatgpt-shell-eshell-summarize-last-command-output eshell の実行結果要約

chatgpt-shell-proofread-region であれば選択範囲の文章校正を手伝ってくれたりする。しかし全部英語で返ってきてしまうため、これらを活用するならまとめて日本語化しておく。

(setq chatgpt-shell-prompt-header-describe-code "次のコードは何をするのでしょう?")                                 ; for chatgpt-shell-describe-code
(setq chatgpt-shell-prompt-header-write-git-commit "次のコミットに対する Git コミットメッセージの作成してください") ; for chatgpt-shell-write-git-commit
(setq chatgpt-shell-prompt-header-refactor-code "次のコードをリファクタリングしてください")                         ; for chatgpt-shell-refactor-code
(setq chatgpt-shell-prompt-header-proofread-region "次の文章を校正してください")                                    ; for chatgpt-shell-proofread-region
(setq chatgpt-shell-prompt-header-generate-unit-test "次のコードのユニットテストを作成するのを手伝ってください")    ; for chatgpt-shell-generate-unit-test
(setq chatgpt-shell-prompt-header-whats-wrong-with-last-command "このコマンド実行の何が問題なのでしょうか?")       ; for chatgpt-shell-eshell-whats-wrong-with-last-command
(setq chatgpt-shell-prompt-header-eshell-summarize-last-command-output "次のコマンドの出力を要約してください")      ; for chatgpt-shell-eshell-summarize-last-command-output

もっと使いやすくする

用途に応じてなんのコマンドを実行すればいいのか覚えられるわけもないので、Magit で使われている transient.el でメニュー化する。

(require 'transient)
(transient-define-prefix my-chatgpt-shell-menu ()
  "ChatGPT"
  [
   ["基本"
    ("RET" "シェル起動"       chatgpt-shell)
    ("h" "シェル起動"         chatgpt-shell)
    ("i" "ミニバッファで入力" chatgpt-shell-prompt)
    ("k" "文章校正"           chatgpt-shell-proofread-region)
    ("b" "ビジネス文書化"     (lambda () (interactive) (chatgpt-shell-send-region-with-header "次の文章をビジネス文章として校正してください")))
    ("x" "言い換え(類語)"     (lambda () (interactive) (chatgpt-shell-send-region-with-header "次の文章をさまざまな表現に置き換えてください")))
    ("g" "GitHub Issue"       (lambda () (interactive) (chatgpt-shell-send-region-with-header "次の内容を GitHub の Issue に上げたいので丁寧な英語にしてください。題名も考えてください。")))
    ("r" "Ruby"               (lambda () (interactive) (chatgpt-shell-send-region-with-header "次のコードを Ruby に変換してください")))
    ("j" "JavaScript"         (lambda () (interactive) (chatgpt-shell-send-region-with-header "次のコードを JavaScript に変換してください")))
    ("&" "選択範囲を送信"     chatgpt-shell-send-region)
    ]
   ["その他"
    ("1" "リファクタリング"   chatgpt-shell-refactor-code)
    ("2" "コード解説"         chatgpt-shell-describe-code)
    ("3" "テスト雛形生成"     chatgpt-shell-generate-unit-test)
    ("4" "コミットメッセージ" chatgpt-shell-write-git-commit)
    ("5" "実行失敗原因"       chatgpt-shell-eshell-whats-wrong-with-last-command)
    ("6" "実行結果要約"       chatgpt-shell-eshell-summarize-last-command-output)
    ("7" "こんにちは"         (lambda () (interactive) (chatgpt-shell-send-to-buffer "こんにちは")))
    ]
   ]
  )

人によって必要なプロンプトはさまざまだろうから chatgpt-shell-send-region-with-header を活用して上のように用途に応じた自分専用のプロンプトをどんどん追加するのがおすすめである。

関連

https://zenn.dev/megeton/articles/b5bff41f35af9a

Discussion