Claude CodeをEmacsに統合する使い方 — claude-code-ide.elの導入と設定
claude-code-ide.elはMCP経由でClaude Code CLIとEmacsを繋ぐパッケージです。導入手順とtransientメニューの操作、ediffでの差分確認、ターミナルバックエンドの選び方をまとめます。
claude-code-ide.elは、Model Context Protocol(MCP)を使ってEmacsとClaude Code CLIを繋ぐEmacsパッケージです。開いているファイルや選択範囲をClaudeに伝え、変更案をEmacsのediffで確認できるようにします。インストール方法から基本コマンド、設定のカスタマイズまでを扱います。
claude-code-ide.elとは
claude-code-ide.elは、Model Context Protocol(MCP)を通じてClaude Code CLIとEmacsを繋ぐ、双方向のブリッジを作るパッケージです。単純にターミナルをEmacsのウィンドウに表示するだけのラッパーとは異なり、LSPやプロジェクト管理、独自のElisp関数までEmacsの機能をClaudeが理解し使えるようにします。
MCPは、AIモデルが外部のツールやデータソースに接続するための標準プロトコルです。Claude Codeはこの仕組みを使って、Jira・GitHub・Sentryのような外部サービスと連携できます。claude-code-ide.elはこの標準を使い、接続先を外部サービスではなくEmacs自身に置いた実装です。
パッケージが提供する主な機能は次のとおりです。
- プロジェクトの自動検出とセッション管理
vterm・eat・ghostelによるフルカラーのターミナル統合- IDE統合のためのMCPプロトコル実装
- ファイル操作・エディタの状態・ワークスペース情報を扱うツール群
- EmacsのコマンドをMCPツールとして公開する拡張可能なサーバー(xref・tree-sitter・project情報など)
- FlycheckとFlymakeによる診断結果の統合
- ediffを使った高度な差分ビュー(適用前に提案内容を修正できる)
- tab-bar対応のコンテキスト切り替え
- 選択範囲・バッファの追跡によるコンテキスト認識
導入前の前提条件
インストール前に、次の3点を満たしているか確認します。
- Emacs 28.1以降
- Claude Code CLIがインストールされ、PATH上で実行できる状態
vterm・eat・ghostelのいずれか(ターミナル表示に使う)
Claude Code CLI自体のインストール方法は公式ドキュメントに従います。Emacsから呼び出すだけなので、通常のターミナルでclaudeコマンドが動く状態になっていれば十分です。
claude-code-ide.elをインストールする
emacs-version 30以降であれば、use-packageの:vcバインディングでGitHubから直接取得できます。
(use-package claude-code-ide
:vc (:url "https://github.com/manzaltu/claude-code-ide.el" :rev :newest)
:bind ("C-c C-'" . claude-code-ide-menu)
:config
(claude-code-ide-emacs-tools-setup))straight.elを使っている場合は次のように書きます。
(use-package claude-code-ide
:straight (:type git :host github :repo "manzaltu/claude-code-ide.el")
:bind ("C-c C-'" . claude-code-ide-menu)
:config
(claude-code-ide-emacs-tools-setup))Doom Emacsではpackages.elとconfig.elの2ファイルに分けて書きます。
(package! claude-code-ide
:recipe (:host github :repo "manzaltu/claude-code-ide.el"))(use-package! claude-code-ide
:bind ("C-c C-'" . claude-code-ide-menu)
:config
(claude-code-ide-emacs-tools-setup))Doom Emacsの場合、config.elを保存したあとにターミナルでdoom syncを実行してパッケージを反映します。
doom syncいずれの設定例でも(claude-code-ide-emacs-tools-setup)はコメントで「Optionally」と示されている任意設定です。この関数を呼ぶと、後述するEmacs向けのMCPツール(xrefやtree-sitterなど)が有効になります。呼ばなければ、ファイル操作やエディタ状態の共有といった基本機能だけが動きます。
transientメニューと主要コマンド
claude-code-ide.elと対話する最も簡単な方法は、視覚的なtransientメニューです。M-x claude-code-ide-menu(上の設定例ではC-c C-')を実行すると、利用できるコマンドが一覧表示されます。
| コマンド | 説明 |
|---|---|
claude-code-ide-menu | 説明全コマンドを表示するtransientメニューを開く |
claude-code-ide | 説明プロジェクト用の新しいClaude Codeインスタンスを起動 |
claude-code-ide-send-prompt | 説明ミニバッファからClaudeにプロンプトを送信 |
claude-code-ide-continue | 説明直前の会話を新しいインスタンスで継続 |
claude-code-ide-resume | 説明過去の会話を新しいインスタンスで再開 |
claude-code-ide-stop / claude-code-ide-stop-all | 説明プロジェクトのインスタンスを停止/全停止 |
claude-code-ide-toggle | 説明プロジェクトのClaudeウィンドウを表示・非表示 |
claude-code-ide-list-sessions | 説明全プロジェクトのインスタンス一覧から切り替え |
claude-code-ide-show-debug | 説明WebSocketメッセージのデバッグバッファを表示 |
claude-code-ide-stopやclaude-code-ide-send-promptのように1つのインスタンスを対象にするコマンドは、今いるClaudeターミナル・プロジェクト内の唯一のインスタンス・唯一の可視インスタンスの順で対象を自動的に解決します。それでも決まらない場合、送信系のコマンドは直近に使ったインスタンスを使い(選んだ先を表示)、claude-code-ide-stopは選択を尋ねます。前置引数(C-u)を付ければ、常に明示的にインスタンスを選べます。
複数プロジェクトと複数インスタンスの管理
claude-code-ide.elはEmacs標準のproject.elでプロジェクトを自動検出し、同じプロジェクトで複数のClaude Codeインスタンスを同時に動かせます。片方でリファクタリングを進め、もう片方で質問に答えさせるといった使い方ができます。
最初のインスタンスはプレーンなバッファ名*claude-code[project-name]*になります。再度M-x claude-code-ideを実行すると追加のインスタンスが起動し、任意の名前を入力できます。refactorと入力すれば*claude-code[project-name:refactor]*に、空入力なら自動的に番号が振られます(*claude-code[project-name:2]*など)。この番号は位置依存で、インスタンスが終了すると再利用されます。
各インスタンスは自分専用のMCPサーバーを実行しますが、カーソル位置や選択範囲のコンテキストはプロジェクトの全インスタンスで共有されます。プロンプト送信・at-mention・diffのような明示的な操作だけが、指定した1つのインスタンスに向きます。
claude-code-ide-continueで新しい継続インスタンスを同じディレクトリで起動すると、同じ「直近の」会話をフォークします。これはClaude Code CLI自体の挙動です。
同じ作業ツリーを共有したくない場合(競合する変更が入る別ブランチでの並行作業など)は、git worktreeが向いています。
git worktree add ../myproject-worktree feature-branchproject.elはworktreeごとに別プロジェクトとして扱うため、*claude-code[myproject]*と*claude-code[myproject-worktree]*のように、それぞれ完全に独立したバッファとセッションになります。
エディタコンテキストの共有方法
プロジェクトの各インスタンスには、いま見ているファイルと選択中のテキストが常に伝わります。Claudeのプロンプト欄には⧉ In file.elや⧉ 3 lines selectedというラベルが表示され、次に送るプロンプトには「ユーザーがIDEで〜を開いた」という短い注記が添えられます。ファイルの内容そのものは送られません。
claude-code-ide-clear-selection(メニューのx、Claudeターミナル内ではC-c C-x)を実行すると、1つのインスタンスからこのコンテキストを外せます。VS Code拡張のファイル名の横にあるxと同じ発想です。他の対応するIDE統合の操作感が気になる場合は、VS Code拡張の基本的な使い方も参考になります。外した状態のままファイル内を移動しても、そのファイルはプロンプトに含まれません。範囲選択するか別のファイルを開けば、コンテキストの共有は再び始まります。
claude-code-ide-share-opened-fileをnilに設定すると(設定メニューのoでも切り替え可能)、選択範囲だけを報告するようになります。開いているファイル自体は一切言及されなくなり、範囲選択がアクティブな間だけ共有され、選択を解除すると報告も止まります。
ediffで差分を確認して適用する
claude-code-ide-use-ide-diffが有効(既定値)の場合、Claudeが提示するコードの変更案はEmacsのediffインターフェースで表示されます。左右または統合ビューで変更点を視覚的に比較できるうえ、Buffer B(Claudeの提案)側を自分で修正してから適用できます。
ediffでの操作は次の流れです。
- Claudeが変更を提案すると、ediffが自動的に開く
- ediffのコントロールバッファ(小さなコマンド用ウィンドウ)がアクティブになる
- Buffer Aに現在のコード、Buffer Bに提案内容が表示される
- 必要ならBuffer Bを直接編集して提案を調整する
- コントロールバッファで
qを押して終了する - 変更を受け入れるか(
y)、拒否するか(n)を選ぶ yを選んだ場合、Buffer Bの内容が元のファイルに適用される形でClaudeに送り返される
ターミナル表示のまま確認したい場合は(setq claude-code-ide-use-ide-diff nil)でediffを無効化できます。Claude Code自体のVS Code・JetBrains向け統合にも、差分をIDE内かターミナルかで切り替えるdiffTool設定がありますが、これはclaude-code-ide.elのuse-ide-diffとは別の設定です。EmacsはClaude Codeが公式にサポートするIDEには含まれておらず、claude-code-ide.elはediff連携を独自に実装しています。
ターミナルバックエンドの選び方
claude-code-ide.elはターミナル表示にvterm・eat・ghostelの3種類を使えます。既定はvtermです。
| バックエンド | 特徴 | 向く場面 |
|---|---|---|
vterm | 特徴既定のバックエンド。コンパイルが必要なネイティブモジュール | 向く場面標準的な構成で使いたい場合 |
eat | 特徴Pure Elispのターミナルエミュレータ | 向く場面vtermのコンパイルがうまくいかない環境 |
ghostel | 特徴ghostel-execを提供するバージョンが必要 | 向く場面フリッカーやスクロールの乱れを避けたい場合(公式が推奨) |
公式READMEは、利用できるバックエンドの中でghostelが最も滑らかだとし、vtermとeatにありがちなフリッカー・スクロールの乱れ・表示崩れがほとんど出ないため、使える環境ではこれを推奨するとしています。バックエンドの切り替えは1行の設定で済みます。
(setq claude-code-ide-terminal-backend 'eat)EmacsのeatパッケージでClaude Codeを使うと、eatが同期出力の検出プローブに応答しないことが原因でちらつきが起きる場合があります。この現象とCLAUDE_CODE_FORCE_SYNC_OUTPUTによる対処は本記事の範囲外なので、詳しくはEmacsのeatでClaude Codeを使うとちらつく問題を直す設定にまとめています。
インライン表示(通常のバッファ内にテキストとして残る)を使いたい場合は、~/.claude/settings.jsonでtuiをdefaultにします。
{
"tui": "default"
}フルスクリーンレンダリング(vimやhtopのように代替スクリーンバッファを使う方式)は、eatやvtermのフリッカー対策としてclaude-code-ide-no-flickerをtにすると有効になりますが、ghostelではフリッカー自体が問題にならないため既定のnilのままで構いません。
ghostelバックエンドはC-gを素通りでターミナルに転送するため、Claude Code側がCtrl+Gに割り当てている「外部エディタでプロンプトを編集」の操作がそのまま使えます。この操作自体の詳しい挙動はClaude CodeのCtrl+Gで外部エディタにプロンプトを開くで扱っています。キーを変更したい場合は~/.claude/keybindings.jsonでctrl+gを無効化し、別のキー(ghostelが転送するalt+eなど)にchat:externalEditorを割り当てます。
よく使う設定変数
設定変数は多数ありますが、最初に触ることが多いものを挙げます。
| 変数 | 内容 | 既定値 |
|---|---|---|
claude-code-ide-cli-path | 内容Claude Code CLIへのパス | 既定値"claude" |
claude-code-ide-cli-extra-flags | 内容CLIに渡す追加フラグ(--modelなど) | 既定値"" |
claude-code-ide-window-side | 内容Claudeウィンドウを出す側 | 既定値'right |
claude-code-ide-use-side-window | 内容サイドウィンドウを使うか | 既定値t |
claude-code-ide-diagnostics-backend | 内容診断バックエンド(auto/flycheck/flymake) | 既定値'auto |
claude-code-ide-enable-execute-code | 内容ElispをClaudeが評価できるようにするか | 既定値t |
claude-code-ide-system-prompt | 内容追加するカスタムシステムプロンプト | 既定値nil |
モデルを固定したいときはclaude-code-ide-cli-extra-flagsに--modelを渡します。
(setq claude-code-ide-cli-extra-flags "--model opus")プロジェクトごとに振る舞いを変えたい場合は、claude-code-ide-system-promptを.dir-locals.elで上書きします。
((nil . ((claude-code-ide-system-prompt . "Focus on functional programming patterns and avoid mutations."))))設定すると、Claude Codeのコマンドに--append-system-promptフラグが追加される形で反映されます。
Claude Code側で不具合を疑うときは、claude-code-ide-cli-debug(CLIの-dフラグ)とclaude-code-ide-debug(WebSocket通信のEmacs側ログ)をtにすると、M-x claude-code-ide-show-debugでJSON-RPCのやり取りを確認できます。
Emacsの機能をClaudeに渡すMCP Tools
claude-code-ide.elは、claude-code-ide-emacs-tools-setupを呼ぶことで、Emacsのコマンドを追加のMCPツールとして公開できます。組み込みで用意されているのは次の5つです。
xref-find-references— プロジェクト全体でシンボルの参照箇所を探すxref-find-apropos— パターンに一致するシンボルをプロジェクト全体から探すtreesit-info— tree-sitterによる構文木の情報を取得するimenu-list-symbols— imenuでファイル内のシンボル(関数・クラス・変数)を列挙するproject-info— 現在のプロジェクトの情報(ディレクトリ、ファイルなど)を取得する
有効化は設定に1行加えるだけです。
(claude-code-ide-emacs-tools-setup)有効にすると、Claudeが「foo関数の定義を見せて」「この変数が使われている箇所を全部見せて」「カーソル位置のASTノードの型は何?」のような依頼に対して、これらのツールを使ってEmacsから直接情報を取得できるようになります。任意のEmacsコマンドや関数をMCPツールとして公開する仕組みも用意されており、プロジェクト全体の検索・リファクタリングや、独自のElisp関数の実行にも拡張できます。
つまずきやすいポイント
window-sides-slotsの設定を忘れると複数インスタンスが並ばない: 各インスタンスは自分専用のサイドウィンドウスロットを持ちますが、片側に何枚並ぶかはEmacs標準のwindow-sides-slotsが決めます。複数インスタンスを並べて見たい場合は、あらかじめ枚数を増やしておく必要があります- tab-bar-modeでは新しいタブにClaudeウィンドウが引き継がれない:
tab-bar-modeを使っていると、新規タブは複製元のレイアウトからClaudeウィンドウを継承しません。新しいタブでClaudeを表示するにはclaude-code-ide-show-allや表示切り替えコマンドを使う必要があります ghostelはghostel-execを提供するバージョンが必要: 単にghostelパッケージを入れるだけでは動かず、ghostel-execを提供するバージョンであることを確認する必要があります- ターミナルのリフロー時にスクロールが乱れることがある: ウィンドウのリサイズ時にターミナルの再描画で制御できないスクロールが起きるClaude Code側の既知の不具合(#1422)向けに、
claude-code-ide-prevent-reflow-glitchという回避策が既定で有効になっています。upstreamの修正後は不要になる想定の一時対応です claude-code-ide-continueは「直近の」会話をフォークする: 同じディレクトリで継続インスタンスを複数回起動すると、それぞれが同じ直近の会話を分岐させます。これはEmacs側ではなくClaude Code CLI自体の挙動です
まとめ
claude-code-ide.elは、MCPを介してClaude Code CLIとEmacsを結び、ファイルコンテキストの共有・ediffでの差分確認・Emacsコマンドのツール化までを1つのパッケージでまとめて提供します。導入にはEmacs 28.1以降とClaude Code CLIさえあれば十分で、use-packageかstraight.el、Doom Emacsのいずれの環境でも数行の設定で組み込めます。ターミナルバックエンドは既定のvtermのほかeat・ghostelから選べ、公式はghostelを最も安定した選択肢として挙げています。eat固有のちらつきのように個別の環境要因で困ったときは、この記事とあわせて該当する設定を確認してください。