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

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

2025.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-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 プロパティが見出しに登録されます。

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が便利すぎるため ↩︎


生成AI活用はクラスメソッドにお任せ

過去に支援してきた生成AIの支援実績100+を元にホワイトペーパーを作成しました。御社が抱えている課題のうち、どれが解決できて、どのようなサービスが受けられるのか?4つのフェーズに分けてまとめています。どうぞお気軽にご覧ください。

生成AI資料イメージ

無料でダウンロードする

この記事をシェアする

FacebookHatena blogX

関連記事

word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word

mmMwWLliI0fiflO&1
mmMwWLliI0fiflO&1
mmMwWLliI0fiflO&1
mmMwWLliI0fiflO&1
mmMwWLliI0fiflO&1
mmMwWLliI0fiflO&1
mmMwWLliI0fiflO&1