EmacsのeatでClaude Codeを使うとちらつく問題を直す設定
Emacsのeatは同期出力の検出プローブに応答しないため描画がちらつきます。CLAUDE_CODE_FORCE_SYNC_OUTPUTで直す設定とtmux併用時の注意点を扱います。
EmacsのeatターミナルでClaude Codeを使うと、出力のたびに画面がちらつくことがあります。原因は、Claude Codeが自動検出する同期出力(synchronized output)への応答をeatが返さないことです。CLAUDE_CODE_FORCE_SYNC_OUTPUT=1を設定すると、レンダラーは変えずにちらつきだけを止められます。
このTipsでできること
Emacsのeatパッケージ上でClaude Codeを動かしている人向けに、CLAUDE_CODE_FORCE_SYNC_OUTPUT環境変数でちらつきを止める設定を扱います。原因がなぜeat固有なのか、効果が及ばない範囲、フルスクリーンレンダリングへ切り替える代替策との違いまで確認できます。
なぜEmacsのeatだけ描画がちらつくのか
eatはEmacsの中でシェルやCLIツールをフル機能のターミナルとして動かすためのターミナルエミュレータパッケージです。Emacsのキーバインドを保ったままClaude Codeを使いたい人が候補にする選択肢の一つですが、ちらつきが起きると本来のメリットが薄れてしまいます。
Claude Codeは出力を1文字ずつ即座に描き直すのではありません。DEC Private Mode 2026という端末機能を使い、「これから描く内容をまとめて確定してから一括で反映する」同期出力(synchronized output)に対応しています。ツール出力のストリーミングや差分の再描画は、複数行にまたがることが多いです。同期出力なしでは行の一部だけが先に書き換わった瞬間が画面に見えてしまい、これがスクロール位置のずれを伴うちらつきとして体感されます。同期出力に対応した端末では、書き込み開始と終了を示すエスケープシーケンスの間にすべての描画をまとめ、端末側が一括で反映するため、途中経過が見えることはありません。
同期出力を使うかどうかは、Claude Codeが起動時に端末へ確認用のエスケープシーケンス(BSU/ESU)を送り、端末からの応答で対応状況を判定する自動検出に委ねられています。ほとんどの端末はこの確認に正しく応答するため、設定なしで同期出力が有効になります。eatはBSU/ESUの処理自体は実装しているものの、この確認への応答を返しません。そのためClaude Codeは対応状況を確認できず、同期出力を使わない従来の描画にフォールバックし、結果としてちらつきが残ります。
この種の検出の食い違いはeatに限った話ではありません。JetBrains系IDE(IntelliJ、PyCharm、WebStormなど)の統合ターミナルは、2026.1より前のバージョンでは同期出力に対応していませんでした。対応後もClaude Code側の検出ロジックが追いつくまでは、ちらつきが残っていました。逆にGNOME TerminalやKonsoleの一部バージョンでは、端末名から対応していると誤って判定してしまう逆方向のバグもありました。自動検出は端末の申告や名前に頼るヒューリスティックであり、eatのように機能は実装済みでも確認への応答だけ欠けている構成は、自動検出がすり抜けやすい典型パターンです。
同期出力を強制する(CLAUDE_CODE_FORCE_SYNC_OUTPUT)
自動検出に頼らず同期出力を強制的に有効化するには、CLAUDE_CODE_FORCE_SYNC_OUTPUTを1に設定してClaude Codeを起動します。
CLAUDE_CODE_FORCE_SYNC_OUTPUT=1 claude毎回指定するのが面倒であれば、シェルの起動ファイル(.bashrcや.zshrc。Emacsからeatを起動する場合はEmacs側でsetenvしても構いません)でexportしておくと、eatを開くたびに自動で反映されます。
export CLAUDE_CODE_FORCE_SYNC_OUTPUT=1GUIアプリとして起動したEmacsでは、ログインシェルを経由しないため.bashrcや.zshrcに書いたexportが反映されないことがあります。この場合はexec-path-from-shellのようなパッケージでシェルの環境変数をEmacsに同期するか、Emacsの初期化ファイル(init.el)で直接setenvを呼ぶ方法が確実です。
(setenv "CLAUDE_CODE_FORCE_SYNC_OUTPUT" "1")シェルではなくClaude Code側の設定として持たせたい場合は、settings.jsonのenvブロックに書く方法もあります。環境変数リファレンスに載っている変数はどれもこのenvブロックに書けます。
{
"env": {
"CLAUDE_CODE_FORCE_SYNC_OUTPUT": "1"
}
}このブロックはユーザー設定・プロジェクト設定・ローカル設定のどのファイルにも置けます。eatを使っているのが自分だけなら、~/.claude/settings.json(ユーザー設定)に置けば影響範囲を自分だけに絞れます。チーム全体でeatを標準の端末にしているなら、リポジトリの.claude/settings.json(プロジェクト設定)にコミットして全員に配ることもできます。複数のファイルが同じ変数を設定した場合は、優先順位の高いファイルの値が使われます。
効果の範囲 — 変わること・変わらないこと
CLAUDE_CODE_FORCE_SYNC_OUTPUTが変えるのは同期出力の有効・無効だけで、レンダラー自体は切り替わりません。通常の(代替スクリーンバッファを使わない)描画モードのまま出力の反映タイミングだけがまとまるので、ターミナルのネイティブなscrollbackやCmd+f検索といった挙動には影響しません。
tmuxを経由しない構成であれば、この変数だけでちらつきは解消します。tmuxを併用している場合は、後述の使い分け早見表にあるフルスクリーンレンダリングへの切り替えを検討する必要があります。フルスクリーンレンダリング自体もtmux 3.6系以前では同期出力に対応していないため、tmuxのバージョンが古いとどちらの手段でも改善しない点は共通の制約です。
スクリーンリーダーモードでは、アタッチされたバックグラウンドセッションを除き、Claude Codeは通常レンダラーによるプレーンなスクロール表示のまま動作します。この状態で/tui fullscreenを実行してもレンダラーは切り替わらず、説明が表示されるだけです。同期出力は通常レンダラーの描画タイミングを調整するだけでレンダラーの選択には関与しないため、CLAUDE_CODE_FORCE_SYNC_OUTPUTの効果とスクリーンリーダーモードは競合しません。
設定を反映したか確認する
変数を設定してもちらつきが消えない場合、まずClaude Codeのバージョンを確認してください。CLAUDE_CODE_FORCE_SYNC_OUTPUTが使えるのはv2.1.129以降です。
claude --versionバージョンが古ければアップデートしてから設定し直します。バージョンが新しいのに変化がない場合は、eatをtmux経由で開いていないか確認してください。次に、exportした場所(シェルの起動ファイルか、Claude Codeを起動するeatのバッファそのもの)で実際に変数が渡っているかを、echo $CLAUDE_CODE_FORCE_SYNC_OUTPUTで確かめます。空文字や未定義のまま表示される場合は、設定を書いたファイルをeatのシェルが読み込んでいないことが多く、起動ファイルのパスを見直す必要があります。
同期出力に関わる環境変数の使い分け
同期出力がらみの環境変数は3つあり、それぞれ効果の範囲が異なります。
| 変数 | 効果 | 向く場面 |
|---|---|---|
CLAUDE_CODE_FORCE_SYNC_OUTPUT=1 | 効果レンダラーは変えず、同期出力だけを強制的に有効化 | 向く場面eatのように機能は対応済みだが自動検出されない端末(tmux外) |
CLAUDE_CODE_NO_FLICKER=1 | 効果代替スクリーンバッファを使うフルスクリーンレンダリングに切り替え | 向く場面同期出力そのものに対応しない端末や、マウス操作・検索の挙動が変わってもちらつきを根本的に消したい場合 |
CLAUDE_CODE_DISABLE_ALTERNATE_SCREEN=1 | 効果フルスクリーンレンダリングを無効化し、常に通常レンダラー+ネイティブscrollbackに固定 | 向く場面scrollback保持を優先し、フルスクリーンのマウス捕捉やalternate-screen切替自体を避けたい場合。v2.1.132で追加され、CLAUDE_CODE_NO_FLICKERより優先される |
eatのちらつきだけが困りごとならCLAUDE_CODE_FORCE_SYNC_OUTPUTで足ります。tmux併用や、そもそも同期出力に頼らない描画へ切り替えたい場合はCLAUDE_CODE_NO_FLICKERでフルスクリーンレンダリングに移る選択肢があります。CLAUDE_CODE_DISABLE_ALTERNATE_SCREENは用途が異なり、フルスクリーンレンダリングが既定で有効なユーザーがscrollback保持を優先したいときの設定なので、eatのちらつき対策としては的外れです。環境変数がうまく反映されないときの優先順位や書く場所の切り分けは、Claude Code環境変数リファレンスにまとめています。
同期出力まわりの修正タイムライン
Claude Codeの公式changelogを追うと、同期出力の検出精度は複数のバージョンにわたって段階的に調整されてきたことが分かります。
| バージョン | 内容 |
|---|---|
| v2.1.89 | 内容CLAUDE_CODE_NO_FLICKER環境変数を追加。フルスクリーンレンダリングへのopt-inを可能に |
| v2.1.110 | 内容同期出力に対応しないmacOS Terminal.app等での起動時の描画崩れを修正 |
| v2.1.129 | 内容CLAUDE_CODE_FORCE_SYNC_OUTPUTを追加。Emacsのeatを名指しの例として挙げている |
| v2.1.166 | 内容JetBrains系IDEのターミナル(2026.1以降)で同期出力を有効化し、ちらつきを解消 |
| v2.1.212 | 内容tmuxは3.6系まで同期出力に非対応という訂正を反映(v2.1.200のリリースノートを修正) |
| v2.1.269 | 内容GNOME TerminalとKonsoleの一部バージョンで、端末名だけから同期出力対応と誤判定していた問題を修正 |
CLAUDE_CODE_FORCE_SYNC_OUTPUTはCLAUDE_CODE_NO_FLICKERの追加から見て約40バージョン後に加わった変数で、その後もGNOME TerminalやKonsoleの誤検出修正が続いています。自動検出だけでは拾いきれない端末が一定数残ることを前提に、個別の環境変数で手当てする運用になっていると見てよさそうです。新しい端末エミュレータが増え続ける以上、同じような検出漏れは今後も見つかるたびに個別対応が積み重なっていく可能性があります。
よくある質問
eat以外のEmacs内蔵ターミナルでも同じ現象は起きますか
公式ドキュメントが名指ししているのはeatだけで、vtermやansi-termなど他のEmacs内蔵ターミナルへの言及はありません。同じ現象が起きるかどうかは、それぞれの実装がBSU/ESUのエスケープシーケンスに対応しているか、対応していてもClaude Codeの確認プローブに応答するかどうかに左右されます。
この変数はEmacs以外のターミナルにも使えますか
はい。eatはドキュメントが挙げる代表例であり、変数自体はBSU/ESUを実装していながら自動検出のプローブに応答しない端末全般に有効です。同期出力そのものに対応していない端末では、この変数を設定しても変化はありません。
eatのバージョンを上げれば自動検出されるようになりますか
公式ドキュメントはeatがBSU/ESUを実装している前提で書かれているだけで、バージョンによる対応状況の違いには触れていません。ちらつきの有無はClaude Code側の確認プローブへの応答で決まるため、eatを更新しても直らない場合はCLAUDE_CODE_FORCE_SYNC_OUTPUTで直接指定してください。
まとめ
EmacsのeatでClaude Codeがちらつくのは、eat側の実装不足ではなく、同期出力への対応を確認する自動検出プローブにeatが応答しないことが原因です。CLAUDE_CODE_FORCE_SYNC_OUTPUT=1をシェルの起動ファイルかsettings.jsonのenvブロックに設定すれば、レンダラーを変えずにちらつきだけを止められます。ただしtmux配下では効果がないため、tmuxを併用するならCLAUDE_CODE_NO_FLICKERでのフルスクリーンレンダリングへの切り替えも選択肢に入れてください。