コンテンツにスキップ

変更のレビュー

レビューは、変更を読み取り専用の 1 つの diff で表示します。編集、シェルコマンド、スクリプトのどれによる変更も同じように表示されます。比べる対象を選び、行やハンクにコメントを付け、C-c C-c でコメントを 1 つのプロンプトとしてセッションに送ります。同じレビューは ediff でも開けます。Claude もレビューを開き、コメントを付け、そこで返信できます。

C-c c D(ecc-review-menu)で、何と比べるかを選びます。各行にはそのレビューに出るファイルの数が表示されます。前回選んだ項目には (last) が付くので、RET で同じレビューをもう一度開けます。

セッションの上に開いたレビューメニュー。セッションの変更、未コミット・未ステージ・ステージ済みの変更がそれぞれのファイル数とともに並び、その下にブランチ、プルリクエスト、コミット、範囲が続く

キー 比べる対象
D セッション開始以降のすべての変更
w HEAD に対する未コミットの変更(ステージの有無を問わない)
u 未ステージの変更
s ステージ済みの変更
b このブランチと別のブランチ
p GitHub のプルリクエスト(gh CLI が PATH にあるときだけ)
c 1 つのコミット、または連続したコミット
r 手で入力した範囲
S メニューを別のセッションとそのプロジェクトに切り替える
-f 残すファイルを選ぶ
-e このレビューだけを ediff で開く(ecc-review-style が 'ediff なら diff で開く)

レビューするのはカレントバッファのプロジェクトで、コメントはそのセッションに送ります。セッションがなければ、起動するかを尋ねます。S では別のセッションか、+ new session を選べます。+ new session は名前だけを訊き、セッションはレビューを開いたときに起動し、それまでは D を選べません。Git リポジトリの外では D しか選べません。件数を数えられなかった行には ? が表示され、理由がエコーエリアに出ます。

大きなリポジトリでは、D の横のファイル数を数えるためにメニューが開くのが遅くなることがあります。件数を省くには ecc-review-menu-count-session-changes を nil にします。

D(C-c c D D)か M-x ecc-review は、作業ツリーをセッション開始時の内容と比べます。開始時の内容は、インデックスやファイルを変えずに記録します。セッション前から進めていた作業は入りません。途中でコミットした変更は表示されます。再開したセッションでも開始時点は変わりません。

同じディレクトリで動く別のセッションの変更もここに表示されます。セッションを分けるには worktree を使います。Git リポジトリの外では、セッションが最初に変更する前の内容として CLI が報告したものと比べます。

w(C-c c D w)か M-x ecc-review-range は、リポジトリ全体を HEAD と比べます。ステージ済みと未ステージの変更に加え、.gitignore で除外されていない未追跡のファイルも入ります。コミットのないリポジトリは空のツリーと比べます。

C-u M-x ecc-review-range は、比べる対象を尋ね、続けてファイルを尋ねます(空ならすべて)。

入力 比べる対象
HEAD~1 などのリビジョン そのリビジョンと作業ツリー(未追跡のファイルを含む)
main...HEAD や HEAD^! などの範囲 そのコミット(未追跡のファイルは含まない)
空 インデックスと作業ツリー(未ステージの変更)
--staged か --cached HEAD とインデックス(ステージ済みの変更)

ブランチ、コミット、プルリクエスト

Section titled “ブランチ、コミット、プルリクエスト”

b では、まず比べる元を尋ねます。デフォルトは今のブランチの分岐元として最も可能性が高いブランチで、各候補には develop (4 behind origin/develop) のように upstream との差が表示されます。次に変更後の側を尋ねます。デフォルトは今のブランチと作業ツリーで、未コミットの変更と未追跡のファイルも入り、名前は develop + working tree になります。別のブランチを選ぶと、プルリクエストと同じく BASE...BRANCH を表示します。

c では、コミットを選び、続けて含める最後のコミットを尋ねます。2 つ目で RET を押すとそのコミットだけを、2 つ目のコミットを選ぶと 2 つのコミットとその間のすべてをレビューします。一覧には直近の 2000 コミットが並びます。それ以外のコミットは、完全なハッシュ、タグ、HEAD~3000 のような git が解決できる名前を入力して指定できます。そのコミットはフェッチ済みである必要があります。

レビューメニューのコミットの問い。ブランチのコミットが新しい順に、短いハッシュと件名とともに並ぶ

p はオープンなプルリクエストを並べ、今のブランチのオープンなプルリクエストをデフォルトにします。番号を入力すると、マージ済みやクローズ済みも含めてどのプルリクエストでも開けます。先頭の Search pull requests… は、クローズ済みやマージ済みも含めてすべてのプルリクエストを検索します。is:merged author:someone や label:bug のような GitHub の検索構文が使えます。一覧で入力した語も、どの候補にも合わなければ検索語になります。先頭の候補を選んだ状態で始まる補完 UI では、入力した語をそのまま確定するキーを使います。vertico は M-RET、icomplete と fido は M-j、ivy は C-M-j です。入力する前に検索の項目を選んでもかまいません。結果には [closed] や [merged] が付きます。足りないコミットを fetch し、ブランチは作らず、HEAD とファイルには触れません。今のブランチのプルリクエストを選ぶと、作業ツリーを比べる b と同じレビューになります。

プルリクエストの問い。先頭に Search pull requests…、続いてオープンなプルリクエストが番号、タイトル、ブランチ、作成者とともに並び、ドラフトには印が付く

プルリクエストをコミットごとに読む

Section titled “プルリクエストをコミットごとに読む”

p でプルリクエストを選ぶと、続けてどのコミットをレビューするかを聞きます。コミットは古い順に並びます。RET でプルリクエスト全体を、コミットを選ぶとそのコミットだけをレビューします。マージコミットと、どのファイルも変えないコミットは候補に出ません。

p から開いたレビューでは、] で次のコミットを、[ で前のコミットを同じウィンドウに開きます。プルリクエスト全体のレビューで ] を押すと、最初のコミットが開きます。ヘッダー行(ediff では右のウィンドウのモード行)には、#12 commit 2/3 のように今のコミットと、ほかのコミットにある未送信のコメントの数が出ます。コミットを移っても、各コミットのコメントはそのまま残ります。C-c C-c は今のコミットのコメントを送ります。C-c C-a はすべてのコミットの未送信のコメントをコミットごとにまとめて 1 つのプロンプトで送ります。C-c C-c と同じくレビューは閉じず、送ったコメントには送信済みの印が付きます。

プルリクエスト #12 の 3 つのコミットのうち 2 つ目のレビュー。ヘッダー行には #12 commit 2/3 と、別のコミットに未送信のコメントが 1 つあることが出ている。新しいテストファイルの行の下にコメントが付いている

右側が作業ツリーではなくコミットのときは、ヘッダー行(ediff では右のウィンドウのモードライン)に the right side is a1b2c3d, not checked out here のように表示されます。他人のプルリクエスト、別のブランチ、古いコミットなどがこれに当たります。コメントを送るプロンプトにも、変更が作業ツリーにないこと、何かを編集する前に確認することを Claude に伝える一文が加わります。

レビューは読み取り専用の diff-mode のバッファです。n と p でハンク、N と P でファイルを移動し、RET でソースへジャンプします。c でポイントのある行にコメントします。

削除行(-)へのコメントは変更前の側、追加行や文脈行へのコメントは変更後の側、@@ 行へのコメントはハンク全体についてのものです。コメントは行の下に ▎ #3 text と表示され、ヘッダー行にコメントの数が出ます。Claude のコメントも同じように、名前付きで表示されます。その扱いと返信のしかたは レビューの中の Claudeを参照してください。

コメントにはハンク全体が付くので、ハンクは変更と同じ大きさにしています。(setq ecc-review-context-lines 3) で広げられます。提案のレビューは、どちらの場合も 3 行の文脈を保ちます(ecc-review-proposal-context-lines)。ecc-review-max-bytes(200,000)を超えるファイルは名前だけを表示します。

キー 動作
c ポイントのある行にコメント。@@ 行ではハンク全体にコメント(もう一度押すと編集)
{ / } 前 / 次のコメント
l コメントへジャンプ
d この行のコメントを削除(C-u d ですべてのコメントから選ぶ)
a Claude のコメントの表示・非表示
s ファイルの一覧の表示・非表示
/ フィルタに合うファイルだけを残す
T / t / M Claude と話す: 案内、その次の箇所、メッセージ
e 提案内容を編集(1 つの提案のレビューのとき)
g diff を読み直す
] / [ プルリクエストの次 / 前のコミット
C-c C-c まだ送っていないコメントをプロンプトとして送信(C-u C-c C-c で送信前に編集)
C-c C-a プルリクエストのすべてのコミットのコメントを送信
C-c C-k レビューとコメントを破棄
q バッファを隠す
? レビューのすべてのキーを表示

s で、レビューのファイルを diff の左に一覧します。

Files (3 of 5) /review
▸ M ecc-review.el +12 −4 2·1
M ecc-review-ediff.el +6 −2
A ecc-review-files.el +80 0·1!

各行には、ファイルに起きたこと(M 変更、A 追加、D 削除、R 名前の変更)、追加と削除の行数、コメントの数(自分·Claude)が並びます。! は古くなったコメントのあるファイル、▸ は今読んでいるファイルです。

一覧でのキー 動作
RET、クリック レビューのそのファイルへ移動
o ファイルを ediff で最初の変更の位置に開く(別のフレーム)
n / p 次 / 前のファイルを表示し、一覧にとどまる
/ 絞り込む
g 一覧を書き直す
s、q 一覧を隠す

一度表示すると、隠すか Emacs を終了するまで、どのレビューでも一覧が開きます。幅は ecc-review-files-width(32)です。

/ は、パスか Claude のコメントに入力した文字列を含むファイルだけを残します。空のまま RET を押すと、すべてのファイルに戻ります。隠したファイルのコメントは残り、C-c C-c で送信されます。ハンクやコメントの移動では隠したファイルを飛ばします。隠したファイルの数はヘッダー行に表示されます。ediff では右のウィンドウのモードラインに表示されます。

C-c C-c で自分のコメントを 1 つのプロンプトとして送ります。送信してもレビューは開いたままです。C-u C-c C-c では先にプロンプトをバッファに開きます。そこでは C-c C-c で送信し、C-c C-k で送信せずに戻ります。どちらの場合も diff に戻ります。

C-u C-c C-c で開いた 2 つのコメントのプロンプト。summary.py のハンクへのコメントにはハンクの行が、行へのコメントには行とその側が見出しに付き、どちらもハンクの diff ブロックの下にコメントが続く

コメントにはハンク全体が付きます。行へのコメントは ## summary.py L27 (new) のように行を示し、ハンクへのコメントは ## summary.py L27-L31 のようにハンクの行を示します。古くなったコメントは末尾に (outdated) が付きます。

送ったコメントはレビューに残り、ecc-review-sent-comment-face で薄く表示されます。Claude はレビューの中でそのコメントに返信できます。ヘッダー行には comments: 3 yours (2 sent) のように送った数も出ます。

C-c C-c で送った直後のレビュー。summary.py の行の下のコメントが薄く表示され、ヘッダー行に送信済みの自分のコメントが 1 つと出ている

次の C-c C-c では、そのあとに付けたコメントだけを送ります。未送信のコメントがなければ、送るものがないと表示します。送ったコメントを編集すると未送信に戻り、次の送信で新しい内容が送られます。C-c C-k でレビューを破棄し、q で隠します。

開いているレビューは、セッションのツールが終わったとき、ターンが終わったとき、リポジトリのファイルを保存したときに diff を読み直します。g と同じく、コメントと今の位置は保たれます。見えていないレビューは、もう一度表示したときに読み直します。コミットなどで変更がすべてなくなっても、レビューは開いたままで、そのことを表示します。

コメントは行に付いて移動します。行がなくなったコメントには [outdated] が付き、そのファイルの最初のハンクの上に表示されます。このコメントも送信されます。

diff を g でだけ読み直すには:

(setq ecc-review-auto-refresh nil)
変数 既定値 値
ecc-window-hide-on-review nil 'project はこのプロジェクトのセッションを、'all はすべてのセッションを隠す。nil は隠さない
ecc-window-review-focus 'review 'review はレビューを選択、'session はポイントをトランスクリプトに残す、nil はそのまま

隠したウィンドウは自動では戻りません。C-c c V で Space を並べ直し、C-c c v でセッションを 1 つずつ戻します。