
gptel: Emacs上で動作するシンプルなLLMクライアントがとても便利
世の中は色々なAIエディタであふれていますが、私はEmacsから抜け出せずにいます[1]。
とはいえ時代が時代なので、そろそろ Emacs にもAI機能を入れて、パワーアップさせていきたいなと感じていました。
そんなときに見つけたのが gptel というツール。 Emacs上で様々なLLMをシンプルに扱える拡張機能みたいです。
今回はこのツールを実際に入れてみて色々試してみました。
実行環境
今回は以下環境で gptel を導入、検証しています。
- macOS Sequoia 15.5
- GNU Emacs 30.1
- Org mode version 9.7.11
- gptel version 20250424.42
また、LLM は OpenAI のものを使います。 事前に OpenAI API キーを取得し、環境変数を設定済みです。
export OPENAI_API_KEY="sk-proj-example"
karthink/gptel とは
karthink/gptel は Emacs上で複数のLLMバックエンドをサポートする、 シンプルなチャットクライアントです。 ChatGPT や Claude, Gemini、Ollama など多様なLLMをサポートしています。
実際に動きを見たほうがイメージしやすいと思うので、 後ろの方で貼っている Gif を載せておきます。
gptel(chat)
gptel-send
gptel-rewrite
EmacsのどこからでもLLMと実行/対話できます。
その他にもマルチモーダルやTool Use、MCP などの拡張にも対応しています。 応答の Markdown/Org-mode 形式選択、といった 柔軟なカスタマイズも可能です。
gptelを導入する
本体を入れる前に、オプションとして markdown-mode をインストールすることが案内されています。 これは gptel チャットバッファのデフォルト表示形式が Markdown だからです。 ※ markdown-mode が無い場合は自動で text-mode になります。
gptel本体の設定として、以下を入れます。
(use-package gptel
:ensure t
:config
(setq gptel-api-key (getenv "OPENAI_API_KEY"))
)
今回は ChatGPT を利用するので gptel-api-key に OPENAI_API_KEY
環境変数を設定しています。 他のLLMを利用する場合の設定ガイドは Setup > Other LLM backends に記載されているので、 そちらを参照ください。
インストール後に、 M-x gptel
でチャットバッファを開けます。 バッファ作成時にモデル選択画面が表示されるので、使いたいモデルを選択します。 プロンプトを入力後、 C-c RET
(gptel-send) で LLMへ送信できます。
gptel-send 深堀り
gptel-sendは LLMにテキストを送信するコマンドです。 通常のバッファ内でも実行可能です。 高頻度で実行しそうなコマンドなので、 以下のようにショートカットを設定するのがいいでしょう。
(use-package gptel
:ensure t
:pin melpa
+ :bind (
+ ("C-c g" . gptel-send)
+ )
:config
(setq gptel-api-key (getenv "OPENAI_API_KEY"))
)
主な使い方は以下3パターンあります。
1. 基本(全文送信)
バッファ内で実行すると 「カーソル位置までの全テキスト」が LLMに送信されて、 応答がカーソル位置の下に挿入されます。
2. 選択範囲送信
リージョンを選択して実行すると、 選択範囲のみがLLMに送信されます。
3. 設定付き送信
C-u M-x gptel-send
でより詳細にパラメータ指定できる 設定メニューが表示されます。
システムプロンプトの設定やコンテキストの追加、 LLMへ送信するリクエストパラメータなどを指定できます。
gptel-rewrite 深堀り
gptel-rewrite は選択した領域を書き換えできるコマンドです。 文言の校正やコードのリファクタリングあたりで役に立ちます。 こちらも高頻度で実行しそうなので、ショートカットを設定しました。
(use-package gptel
:ensure t
:pin melpa
:bind (
("C-c g" . gptel-send)
+ ("C-c r" . gptel-rewrite)
)
:config
(setq gptel-api-key (getenv "OPENAI_API_KEY"))
)
gptel-rewrite を実行すると以下のような画面が出てきます。
※後述する「システムプロンプトのカスタマイズ」を適用しています
r Rewrite
を実行すると、そのまま書き換えが開始されます。
Rewrite前に s: Set full directive
を押下すると以下のような設定がでてきます。 いわゆるシステムプロンプトを指定します。
同じように Rewrite前に d: Rewrite instruction
を押下して、 指示を指定できます。
その後、更新した領域で RET
を実行すると アクションを求められます。
a(accept)
: 適用するk(reject)
: リジェクトするr(iterate)
: 追加で書き換え指示を出すm(merge)
: 手動で修正d(diff)/e(ediff)
: 差分を表示
問題なければ a
を押下して、書き換えが完了します。
これまでの流れのGifを載せます。
ほかカスタマイズ
モデルの指定
デフォルトで使用するモデルを gptel-model にて指定できます。 以下は GPT-4.1 mini を指定する例です。
(setq gptel-model "gpt-4.1-mini")
org-mode周りのカスタマイズ
gptel-default-mode で チャットバッファーのモードを指定します。 org-mode を愛用している場合は 以下設定を入れると良いでしょう。
(setq gptel-default-mode 'org-mode)
これにより、チャットバッファでもorg-modeの機能 (見出し、リスト、コードブロックなど) が使えるようになります。
左: markdown-mode, 右: org-mode
また gptel-org-set-topic コマンドで LLMへ送信されるコンテキストの範囲を見出しレベルで制御できます。実行すると GPTEL_TOPIC
プロパティが見出しに登録されます。
gptel-org-set-topic 活用サンプル。もし GPTEL_TOPIC が無かったら上見出しにあるアプデの内容も拾ってしまう
システムプロンプトのカスタマイズ
gptel-directives 変数にてシステムプロンプトをカスタマイズできます。 オリジナルはこんな感じの設定です。
((default . "You are a large language model living in Emacs and a helpful assistant. Respond concisely.")
(programming . "You are a large language model and a careful programmer. Provide code and only code as output without any additional text, prompt or note.")
(writing . "You are a large language model and a writing assistant. Respond concisely.")
(chat . "You are a large language model and a conversation partner. Respond concisely."))
私は以下のようにカスタマイズしてみました。
;; カスタム指示
(setq gptel-directives
'(
(default . "あなたはEmacs上で動作するアシスタントです。日本語で簡潔に応答してください。")
(programming . "コードのみを出力し、追加のテキスト、プロンプト、説明は一切行わないでください。コードブロックは必要ありません。")
(writing . "与えられたテキストを読みやすく、誤りのない文章に校正してください。必要に応じて適切に改行を入れてください。")
))
;; システムメッセージを手動設定
;; NOTE: ver 20250424.42 時点では gptel-directives の default が反映されない
(setq gptel--system-message "あなたはEmacs上で動作するアシスタントです。日本語で簡潔に応答してください。")
以下、文章校正( writing
) のデモです。
おわりに
Emacs上でLLMをシンプルに扱える拡張機能、 gptel を導入して試してみました。
(参考)最終的なEmacs設定
(use-package gptel
:ensure t
:pin melpa
:bind (
("C-c g" . gptel-send)
("C-c G" . gptel-menu) ; C-u M-x gptel-send と同じ
("C-c r" . gptel-rewrite)
)
:config
(setq gptel-api-key (getenv "OPENAI_API_KEY"))
(setq gptel-model 'gpt-4.1-mini)
(setq gptel-default-mode 'org-mode)
;; カスタム指示
(setq gptel-directives
'(
(default . "あなたはEmacs上で動作するアシスタントです。日本語で簡潔に応答してください。")
(programming . "コードのみを出力し、追加のテキスト、プロンプト、説明は一切行わないでください。コードブロックは必要ありません。")
(writing . "与えられたテキストを読みやすく、誤りのない文章に校正してください。必要に応じて適切に改行を入れてください。")
))
;; システムメッセージを手動設定
;; NOTE: ver 20250424.42 時点では gptel-directives の default が反映されない
(setq gptel--system-message "あなたはEmacs上で動作するアシスタントです。日本語で簡潔に応答してください。")
)
なんといってもシンプルに使えて良いです。 文章の校正やサマリ、コードのちょっとした書き換えなど、 単発での実行には必要十分な機能が揃っています。
今回紹介したもの以外にも、 MCPやツール連携といった拡張機能もあります。 気になった方はぜひ公式ドキュメントを参照ください。
個人的には、より複雑なタスクや エージェント的な利用については Claude Code あたりを使っていきたいなと感じています。 今後はそうしたツールと Emacs との統合についても Deep Dive していきたい気持ちです。
以上、参考になれば幸いです。
参考