コンテンツにスキップ

Space と worktree

Space は、Emacs のタブを 1 つ持つプロジェクトです。git の worktree も専用の Space になり、元のリポジトリの下に表示されます。

すべての Space とセッションを並べたサイドバー、プロジェクトごとのタブ、ソースと 2 つのトランスクリプトが横に並んだ 1 つの 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 は同じように動き、サイドバーが一覧になります。

サイドバー: 2 つのプロジェクトと、その一方のリポジトリの下に並ぶ 2 つの worktree、下半分に各セッションの状態

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 は応答待ちのものを先に並べます。

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 つの仕事を終えるまでで、この流れを追っています。

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 を加えてください。