
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 していきたい気持ちです。
以上、参考になれば幸いです。
参考













