gptel: Emacs上で動作するシンプルなLLMクライアントがとても便利

gptel: Emacs上で動作するシンプルなLLMクライアントがとても便利

Clock Icon2025.06.06

世の中は色々なAIエディタであふれていますが、私はEmacsから抜け出せずにいます[1]
とはいえ時代が時代なので、そろそろ Emacs にもAI機能を入れて、パワーアップさせていきたいなと感じていました。

そんなときに見つけたのが gptel というツール。 Emacs上で様々なLLMをシンプルに扱える拡張機能みたいです。

https://github.com/karthink/gptel

今回はこのツールを実際に入れてみて色々試してみました。

実行環境

今回は以下環境で 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(chat)

gptel-send-select
gptel-send

gptel-rewrite-text
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-chat

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に送信されて、 応答がカーソル位置の下に挿入されます。

gptel-send-cursor

2. 選択範囲送信

リージョンを選択して実行すると、 選択範囲のみがLLMに送信されます。

gptel-send-select

3. 設定付き送信

C-u M-x gptel-send でより詳細にパラメータ指定できる 設定メニューが表示されます。

sc-2025-06-03_21-20894

システムプロンプトの設定やコンテキストの追加、 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 を実行すると以下のような画面が出てきます。

sc-2025-06-06_13-3447
※後述する「システムプロンプトのカスタマイズ」を適用しています

r Rewrite を実行すると、そのまま書き換えが開始されます。

Rewrite前に s: Set full directive を押下すると以下のような設定がでてきます。 いわゆるシステムプロンプトを指定します。

sc-2025-06-06_13-3713

同じように Rewrite前に d: Rewrite instruction を押下して、 指示を指定できます。

sc-2025-06-06_13-13193

その後、更新した領域で RET を実行すると アクションを求められます。

sc-2025-06-06_13-21911

  • a(accept) : 適用する
  • k(reject) : リジェクトする
  • r(iterate) : 追加で書き換え指示を出す
  • m(merge) : 手動で修正
  • d(diff)/e(ediff) : 差分を表示

問題なければ a を押下して、書き換えが完了します。

これまでの流れのGifを載せます。

gptel-rewrite-python

ほかカスタマイズ

モデルの指定

デフォルトで使用するモデルを 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の機能 (見出し、リスト、コードブロックなど) が使えるようになります。

sc-2025-06-06_13-32746
左: markdown-mode, 右: org-mode

また gptel-org-set-topic コマンドで LLMへ送信されるコンテキストの範囲を見出しレベルで制御できます。実行すると GPTEL_TOPIC プロパティが見出しに登録されます。

sc-2025-06-06_13-1505
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 ) のデモです。

gptel-rewrite-text

おわりに

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 していきたい気持ちです。

以上、参考になれば幸いです。

参考

https://github.com/karthink/gptel

脚注
  1. org-modeが便利すぎるため ↩︎

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.