Claude Code を Zed と tmux に馴染ませる道具を土日で作った
この土日で claude-zed-tmux というツール集を作りました。Claude Code を Zed エディタ + tmux の環境で使っていて困っていたこと 2 つを解消するものです。
- Claude が作業を終えたことに気づけない
- Zed に IDE 連携(
/ide)が無い
タブが赤くなれば、返事が来たと分かる
私は tmux のタブ(ウィンドウ)ごとに Claude Code のセッションを開いています。Claude に作業を頼んで、待っている間は別のタブで自分の作業をする。すると、Claude がいつ終わったのか分からない。タブを戻ってみたら、とっくに終わって待っていた、となりがちです。
そこで cc-tmux。Claude が考え中・作業中のあいだだけ、その tmux タブを赤くしてスピナーを回します。終われば元の色に戻る。視界の隅で分かるので、通知音もポーリングも要りません。
仕組みは Claude Code の hooks だけです。Claude Code はプロンプト送信やツール実行、応答完了のタイミングでスクリプトを呼んでくれるので、そこで tmux のウィンドウオプションを書き換えています。常駐デーモンはいませんし、tmux の外で起動したときは何もしません。ついでにタブ名も Claude のセッション名に追従させました。/rename すればタブ名も即座に変わります。
Zed で /ide をつなぐ
Claude Code には IDE 連携があります。VS Code なら公式拡張を入れると、いま開いているファイル・カーソル位置・選択範囲が Claude に伝わる。「この関数を直して」の「この」が通じるようになる機能です。
ただ、私のエディタは Zed です。VS Code は重いうえに、最近は Copilot が前提のような作りになっていて、うっかり有効になってしまいそうな気配もある。その点 Zed はターミナルまで軽快で、レンダリングがとにかく速く、誤操作も少ない。気に入っているのですが、Claude Code の IDE 連携だけがありませんでした。
無いものは仕方ないので、zed-cc-ide という Zed 拡張を書きました。プロトコルは VS Code の公式拡張と同じで、~/.claude/ide/<ポート>.lock にロックファイルを置き、ローカルの WebSocket で MCP を話すと、Claude Code の /ide が見つけてくれます。Claude Code 側からは、IDE 連携がもう一つ増えたように見える寸法です。
面白かったのは Zed 側でした。Zed の拡張 API には、エディタのイベント(ファイル切替やカーソル移動)を受け取る仕組みがまだありません。代わりに、拡張は language server を登録できます。なので連携サーバに language server のふりをさせて起動することにしました。ファイルを開けば LSP の通知が来ますし、Zed は内部で codeAction などを頻繁にポーリングしてくるので、そのリクエストに乗っているカーソル位置や選択範囲を拾い、デバウンスして Claude へ送ります。
正直これはハックで、Zed の内部挙動が変われば壊れます。診断情報(diagnostics)も Zed が拡張に公開していないので送れません。それでも「開いているファイルと選択範囲が伝わる」だけで、Claude とのやりとりはだいぶ短くなります。
サーバ本体は Rust で 1300 行ほど。Zed 拡張(WASM)は、それを起動するだけの薄いランチャーです。
実装はほぼ Claude Code
作ったのは Claude Code のための道具ですが、書いたのもほぼ Claude Code です。私は仕様を決めて、動かして、文句を言う係でした。Claude Code 役のモック(mock_claude)も作らせて、実物の Zed と往復させながらテストしています。
コードは nekolas.dev/code/claude-zed-tmux に置いてあります。git clone もできて、MIT ライセンスです。インストール手順は README をどうぞ。