Space と worktree
Space は、Emacs のタブを 1 つ持つプロジェクトです。git の worktree も専用の Space になり、元のリポジトリの下に表示されます。
Space の仕組み
Section titled “Space の仕組み”
左にサイドバー、上にプロジェクトごとのタブがあり、トランスクリプトはソースの右に開きます。どれも普通のウィンドウなので、分割、移動、削除は自由です。Space を離れて戻ると、ウィンドウの配置も戻ります。
新しく始めたセッションやサイドバーで選んだセッションは、いちばん長く使っていないセッションのウィンドウに入ります。ウィンドウを譲ったセッションはそのまま動き続け、サイドバーか C-c c V で戻せます。
何も動いていない Space に移るとセッションが始まり、最後のセッションを kill すると Space も閉じます。以前の会話を続けるには、開いたセッションで /resume と入力します。ecc-space-always-session をオフにすると、Space はソースだけで開き、プロジェクトの最後のバッファを kill するまで残ります。
| キー | コマンド | 動作 |
|---|---|---|
C-c c j |
ecc-space-goto |
名前で Space へ移動。記録しかないプロジェクトも選べる |
C-c c z |
ecc-space-zoom |
このウィンドウをタブいっぱいに広げる。もう一度で戻す |
C-c c V |
ecc-space-cycle-layout |
Space をそのレイアウトで並べ直す。続けて押すと次のレイアウト |
C-c c ? → X |
ecc-space-close |
この Space を閉じ、worktree も含めて中で動くものをすべて止める。そのあと worktree を削除するか尋ねる |
| — | ecc-space-jump |
サイドバーの番号で N 番目の Space へ移動 |
C-c c V はタブを最後に使ったレイアウトで並べ直し、すぐにもう一度押すと次のレイアウトに移ります。repeat-mode がオンなら C-c c V V V でも同じです。C-u C-c c V で最初のレイアウトに戻ります。レイアウトはタブごとに覚えます。
| レイアウト | ウィンドウ |
|---|---|
| source + session | ソースと、その右にセッションを 1 つ。新しいタブはこのレイアウトで開く |
| two sessions | セッションを 2 つ横に並べる。ソースは出さない |
| source + two sessions | ソースとセッション 2 つを、幅を 3 等分して並べる |
| two sessions over the source | 上にセッションを 2 つ横に並べ、下にソース |
| source + two stacked | ソースと、その右にセッションを 2 つ上下に重ねる |
| 2x2 grid | セッションを 4 つ。3 つのときは 4 つ目の場所にソース |
最初の場所には選択中のウィンドウのセッションが入り、残りの場所には最近使ったセッションから順に入ります。セッションが足りないレイアウトや、フレームに収まらないレイアウトは飛ばします。サイドバーの幅は変わらず、場所のないセッションも動き続けます。
タブバーを描くかどうかは tab-bar-show が決めます。ecc が自分で tab-bar-mode をオンにすることはありません。(setq tab-bar-show nil) でも Space は同じように動き、サイドバーが一覧になります。

C-c c b(ecc-sidebar-focus)でサイドバーを開き、ポイントをそこへ移します。もう一度押すとポイントが元に戻ります。
上半分は Space の一覧で、状態、番号、名前が並びます。リポジトリにはブランチと upstream との差が表示され、その下に worktree が並びます。下半分はセッションの一覧で、印はタブラインと同じです。
| キー | 動作 |
|---|---|
RET |
その行の Space かセッションへ移動 |
n、p |
次 / 前の行 |
TAB |
リポジトリの worktree を開閉 |
1〜9 |
その番号の Space へ移動 |
c |
この Space でセッションを開始 |
W |
この Space から worktree を作り、そこでセッションを開始 |
r |
このセッションを再開(C-u r で分岐)。実行中ならそこへ移動 |
R |
このセッションの名前を変更 |
k |
このセッションを停止 |
K |
この worktree のディレクトリを削除 |
X |
この Space を閉じる |
a、d |
このセッションが待っているものを許可 / 拒否(詳細) |
g |
git の状態を更新して再描画 |
q |
サイドバーを隠す |
幅は ecc-sidebar-width(28 桁)です。ecc-sidebar-sessions-sort はセッションの並び順を決めます。spaces(デフォルト)はそれぞれの Space の下に、priority は応答待ちのものを先に並べます。
worktree
Section titled “worktree”git の worktree は、リポジトリの別のブランチを持つもう 1 つの作業ツリーです。2 つのセッションが、互いの編集を見ずに 1 つのプロジェクトで作業できます。
| キー | コマンド | 動作 |
|---|---|---|
C-c c ? → W c |
ecc-start-worktree |
リポジトリの隣にブランチをチェックアウトし、セッションを開始 |
C-c c ? → W o |
ecc-start-in-worktree |
既存の worktree でセッションを開始 |
C-c c ? → W k |
ecc-remove-worktree |
worktree のセッションを止め、worktree を削除 |
ecc-start-worktree は既存のブランチを候補に出します。既存のブランチはそのままチェックアウトし、新しいブランチは HEAD から作ります。別の worktree がすでにそのブランチを持っていれば、そこでセッションを始めるかを尋ねます。
worktree は ecc-worktree-directory(デフォルトは .claude/worktrees)に置きます。相対パスならリポジトリの下(<repo>/.claude/worktrees/feat-x)に置きます。絶対パスならすべてのリポジトリで共有します(<directory>/<repository>/feat-x)。
worktree の最後のセッションが終わると、ecc はその worktree を削除するか尋ねます。ブランチは削除しません。worktree の削除で消えるのはディレクトリだけです。未コミットの変更や未追跡のファイルがあれば、ecc は worktree の名前を示してもう一度尋ねてから、削除を強制します。
作業を worktree のセッションに引き渡す
Section titled “作業を worktree のセッションに引き渡す”Emacs の MCP サーバーが有効(ecc-mcp-enabled)なら、セッションに worktree での作業を頼むと、モデルに start_worktree_session が示されます。モデルはブランチ名を決めて依頼文を書きます。Emacs は HEAD から worktree を作って Space として開き、そこでセッションを始めて依頼文を渡します。依頼文には、会話が触れたファイル、そのプラン、記録、未コミットの変更を書き足します。その作業は先にコミットするか、未コミットであることを依頼文に書いてください。
モデルが自分で worktree を作ろうとすると、Emacs はそのリクエストを拒否してツールを使うよう伝えます。worktree に触れた下書きには、ツールのことをモデルに思い出させる 1 行が添えられ、プロンプトの下に “1 line Emacs added” として折りたたんで表示されます。別の worktree でチェックアウト済みのブランチは拒否されるので、2 つのセッションが 1 つの worktree を共有することはありません。Lisp からは ecc-worktree-delegate で呼べます。
MCP サーバーがなければ、CLI が自分で git worktree add を実行し、同じ会話のまま続けます。
Space で 1 つの仕事を終えるまでで、この流れを追っています。
終わった worktree を削除する
Section titled “終わった worktree を削除する”MCP サーバーが有効なら、終わった worktree の削除をセッションに頼めます。モデルはまず list_worktrees で各 worktree の変更、ブランチ、セッション、Space を確かめます。そのうえで頼まれたパスを remove_worktree に渡します。削除するのは、次の条件をすべて満たす worktree だけです。
- コミットしていない変更も、追跡していないファイルもない
- その worktree のファイルを開いたバッファに未保存の変更がなく、セッションのプロンプトに送っていない下書きもない
- ブランチでコミットした作業がリモートの
develop・main・masterに取り込まれているか、それらへのプルリクエストがマージ済み(ghで確認) - 作業中のセッションがなく、ほかのセッションもその中に移っていない
待機中のセッションは止まり、Space は閉じます。ファイルを開いたバッファは開いたまま残ります。条件を満たさない worktree はそのまま残り、モデルがその理由を伝えます。ブランチは削除しません。
ecc-worktree-auto-allow-removal が有効な間(既定で有効)、remove_worktree は確認なしで動きます。ecc の外で起動した claude から Emacs の MCP サーバーを使う場合は、権限の許可リストに mcp__emacs__remove_worktree を加えてください。