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固有なのか、効かないケース(tmux、別のレンダラー)、フルスクリーンレンダリングへ切り替える代替策との違いまでを順に追えます。
なぜEmacsのeatだけ描画がちらつくのか
eatはEmacsの中でシェルやCLIツールを動かすためのターミナルエミュレータパッケージです。Emacsの中でClaude Codeを使いたい人が候補にする選択肢の一つです。MCP経由でEmacsと統合するパッケージにはclaude-code-ide.elもあります。
Claude Codeは出力を1文字ずつ即座に描き直すのではなく、DEC Private Mode 2026の同期出力に対応しています。描画を開始と終了の合図(BSU/ESU)で挟み、端末が一括で反映する仕組みです。同期出力が使えないと、再描画の途中経過が画面に見えることがあります。
同期出力があるときとないとき
同期出力あり
BSUとESUの間に描画をまとめて送り、端末が一括で反映します。ツール出力のストリーミング中も、書き換えの途中が見えません。
同期出力なし
描画の途中経過が画面に見え、ちらつきとして現れます。
同期出力を使うかどうかは、Claude Codeが起動時に端末へ送る対応確認(プローブ)への返答で決まります。端末が応答すれば、設定なしで同期出力が有効になります。eatはBSU/ESU自体は実装していますが、この確認には返答しません。環境変数リファレンスにも、eatのようにBSU/ESUを実装しつつプローブに返答しないエミュレータ向けの変数だと書かれています。
端末側の対応状況とClaude Code側の検出が食い違う例は、eatだけではありません。JetBrains系IDE(IntelliJ、PyCharm、WebStormなど)の統合ターミナルは、2026.1以降で同期出力を有効にするよう直されました(v2.1.166)。GNOME TerminalとKonsoleの一部バージョンでは、端末名だけで対応済みと誤判定する逆向きの問題がありました(v2.1.269で修正)。名前や申告に頼る自動検出は、機能は実装済みなのに返答だけが欠ける構成をすり抜けやすい作りです。
同期出力を強制する(CLAUDE_CODE_FORCE_SYNC_OUTPUT)
自動検出に頼らず同期出力を有効にするには、CLAUDE_CODE_FORCE_SYNC_OUTPUTを1に設定してClaude Codeを起動します。
CLAUDE_CODE_FORCE_SYNC_OUTPUT=1 claude毎回指定するのが面倒であれば、シェルの起動ファイル(.bashrcや.zshrc)でexportしておくと、eatを開くたびに反映されます。
export CLAUDE_CODE_FORCE_SYNC_OUTPUT=1GUIアプリとして起動したEmacsでは、ログインシェルを経由しないため、起動ファイルのexportが反映されないことがあります。この場合はexec-path-from-shellのようなパッケージでシェルの環境変数をEmacsに同期するか、init.elで直接setenvを呼びます。
(setenv "CLAUDE_CODE_FORCE_SYNC_OUTPUT" "1")シェルではなくClaude Code側の設定として持たせたい場合は、settings.jsonのenvブロックに書く方法もあります。
{
"env": {
"CLAUDE_CODE_FORCE_SYNC_OUTPUT": "1"
}
}envブロックはユーザー設定・プロジェクト設定・ローカル設定のどのファイルにも置けます。ここに書いた値は、シェルでexportした同名の変数を上書きします。ただしClaude Desktopアプリやセルフホストのランナーからセッションを起動した場合、起動環境がすでに設定している変数はenvの値で上書きされません。複数のファイルが同じ変数を設定したときは、優先順位の高いファイルの値が使われます。
置き場所は影響範囲で選びます。eatを使っているのが自分だけなら、~/.claude/settings.json(ユーザー設定)に置けば自分の環境だけに絞れます。チーム全員がeatなら、リポジトリの.claude/settings.json(プロジェクト設定)にコミットして配れます。ただしプロジェクト設定のenvの値は、各メンバーがそのフォルダーを信頼した後で有効になります。
効果の範囲と、効かないケース
CLAUDE_CODE_FORCE_SYNC_OUTPUTが変えるのは同期出力の有効・無効だけで、レンダラー自体は切り替わりません。通常の(代替スクリーンバッファを使わない)描画モードのまま、出力の反映タイミングだけがまとまります。ターミナルのネイティブなscrollbackやCmd+f検索の挙動は変わりません。
tmuxを併用している場合の手段は、後述のフルスクリーンレンダリングへの切り替えです。ただしtmux 3.6系までのtmuxは同期出力そのものを実装していません。フルスクリーンレンダリングのページにも、この範囲のtmuxでは直接ターミナルで動かすよりちらつきが増えうると書かれています。新しいtmuxに上げるか、tmuxの外のタブで動かすのが公式の案内です。
設定したのにちらつきが消えないとき
変数を設定してもちらつきが残る場合は、次の順に切り分けます。
ちらつきが残るときの切り分け
- 1
Claude Codeのバージョンを見る
CLAUDE_CODE_FORCE_SYNC_OUTPUTが加わったのはv2.1.129です。それより古ければ、アップデートしてから設定し直します。 - 2
tmuxを経由していないか見る
eatのバッファの中でtmuxを起動していると、この変数は効きません。 - 3
変数がClaude Codeまで渡っているか見る
Claude Codeを起動する
eatのバッファでecho $CLAUDE_CODE_FORCE_SYNC_OUTPUTを実行します。空なら、変数がそのシェルに渡っていません。 - 4
どちらのレンダラーで起動しているか見る
設定や環境によっては、フルスクリーンレンダリングで起動します。判定の順序は次の節の表のとおりです。
バージョンは次のコマンドで確認できます。v2.1.289で実行すると、出力は次の1行です。
claude --version2.1.289 (Claude Code)claude --helpのオプション一覧には、レンダラーや同期出力を切り替えるフラグがありません。描画に関わるのはスクリーンリーダー向けの--ax-screen-readerくらいです。指定は環境変数か、/tuiコマンド(settings.jsonのtuiキー)で行います。
起動時のレンダラーは何で決まるのか
フルスクリーンレンダリングは、2026年5月6日以降の利用者を中心に既定で有効になっています。どちらのレンダラーで起動するかは、次の表の上から最初に当てはまる行で決まります。
| 状況 | 起動するレンダラー |
|---|---|
CLAUDE_CODE_DISABLE_ALTERNATE_SCREEN=1またはCLAUDE_CODE_NO_FLICKER=0 | 起動するレンダラー通常 |
CLAUDE_CODE_NO_FLICKER=1 | 起動するレンダラーフルスクリーン |
| 直近のフルスクリーン起動が失敗してオフになった | 起動するレンダラー通常 |
iTerm2のtmux -CC統合モード、またはWindows上のClaude CodeへSSH接続 | 起動するレンダラー通常 |
tui設定を保存済み | 起動するレンダラー設定が指す方 |
| フィーチャーフラグを取得するセッションで、初回利用が2026年5月6日以降 | 起動するレンダラーフルスクリーン |
| 上のどれにも当てはまらない | 起動するレンダラー通常 |
フィーチャーフラグを取得しないセッション(Bedrock・Vertex・Foundry経由、テレメトリ無効)には、初回起動のバージョンとスタートアップダイアログに応じた別の行があります。スクリーンリーダーモードでは、アタッチしたバックグラウンドセッションを除き、常に通常レンダラーです。この場合に/tui fullscreenを実行しても、切り替わらず説明が表示されるだけです。
通常レンダラーで起動していてtui設定が未保存なら、起動時にフルスクリーンへの切り替えを勧めるダイアログが出ることがあります。受け入れると、/tui fullscreenと同じ手順で再起動します。
同期出力に関わる環境変数の使い分け
同期出力がらみの環境変数は3つあり、それぞれ効果の範囲が異なります。
| 変数 | 効果 | 向く場面 |
|---|---|---|
CLAUDE_CODE_FORCE_SYNC_OUTPUT=1 | 効果レンダラーは変えず、同期出力だけを強制的に有効化 | 向く場面eatのように機能は対応済みだが自動検出されない端末(tmux外) |
CLAUDE_CODE_NO_FLICKER=1 | 効果代替スクリーンバッファを使うフルスクリーンレンダリングに切り替え | 向く場面同期出力に頼らずちらつきを減らしたい場合や、tmux併用の場合 |
CLAUDE_CODE_DISABLE_ALTERNATE_SCREEN=1 | 効果フルスクリーンレンダリングを無効化し、通常レンダラー+ネイティブscrollbackに固定 | 向く場面scrollback保持を優先し、フルスクリーンのマウス捕捉を避けたい場合。v2.1.132で追加され、CLAUDE_CODE_NO_FLICKERより優先される |
eatのちらつきだけが困りごとならCLAUDE_CODE_FORCE_SYNC_OUTPUTで足ります。CLAUDE_CODE_DISABLE_ALTERNATE_SCREENは用途が異なり、フルスクリーンが既定で有効になっている環境でscrollback保持を優先したいときの設定なので、eatのちらつき対策とは別の話です。優先順位や書く場所の切り分けは、Claude Code環境変数リファレンスにまとめています。
同期出力まわりの変更履歴
同期出力の検出や関連する変数は、公式changelogの複数のバージョンで調整されています。
同期出力・レンダラー関連の変更
- 2026-04-01v2.1.89
CLAUDE_CODE_NO_FLICKERを追加。フルスクリーンレンダリングへのオプトインが可能になりました。 - 2026-04-15v2.1.110
同期出力に対応しないmacOSのTerminal.appなどで、起動時の描画が崩れる問題を修正しました。
- 2026-05-06v2.1.129
CLAUDE_CODE_FORCE_SYNC_OUTPUTを追加。自動検出から漏れる端末の例としてeatが挙がっています。 - 2026-06-06v2.1.166
JetBrains系IDEのターミナル(2026.1以降)で同期出力を有効にし、ちらつきを解消しました。
- 2026-07-17v2.1.212
「tmuxは3.6系まで同期出力に非対応」という訂正を反映しました。v2.1.200で「tmux 3.4以降で同期出力を有効化」としていた記述の訂正です。
- 2026-09-11v2.1.269
GNOME TerminalとKonsoleの一部バージョンで、端末名だけから同期出力対応と誤判定していた問題を修正しました。
CLAUDE_CODE_FORCE_SYNC_OUTPUTは、v2.1.89のCLAUDE_CODE_NO_FLICKERから約40バージョン後に加わりました。同じ5月6日のv2.1.132では、CLAUDE_CODE_DISABLE_ALTERNATE_SCREENも追加されています。
よくある質問
eat以外のEmacs内蔵ターミナルでも同じ現象は起きますか
環境変数リファレンスが名前を挙げているEmacsのターミナルはeatだけで、vtermやansi-termには言及がありません。同じ現象が起きるかどうかは、それぞれの実装がBSU/ESUに対応しているか、対応していてもプローブに返答するかで決まります。
まとめ
EmacsのeatでClaude Codeがちらつくのは、eatがBSU/ESUを実装していても、同期出力の対応確認に返答しないためです。CLAUDE_CODE_FORCE_SYNC_OUTPUT=1を起動ファイルかsettings.jsonのenvブロックに置けば、レンダラーを変えずに止められます。tmuxの中では効かないので、その場合はCLAUDE_CODE_NO_FLICKERによるフルスクリーンレンダリングか、tmuxの外での実行が候補になります。
参照した一次ソース
この記事の記述は、次の一次ソースと照合しています。更新時に参照先が変わった場合は一覧も更新します。