Claude Codeのコピペで余分なインデントが付く問題と対処法
Claude Codeのターミナル出力をコピーすると行末に空白パディングが混入し、コードやコマンドの貼り付けが崩れます。原因の分析と/copy・/tui defaultなどの対処法をまとめます。
Claude Codeのターミナル出力をマウスでドラッグして選択し、別のエディタやシェルへ貼り付けると、各行の末尾に大量の空白が付いてくることがあります。行頭に余分な字下げが入って見えることもあります。複数行のコマンドでは行末の\の後ろに空白が入り込み、続きの行が別のコマンドとしてシェルに実行されてしまうこともあります。GitHub上で2026年1月から報告が続く既知の問題です。原因の分析と、今使える対処法を症状別にまとめます。
何が起きているのか
症状はシンプルです。ターミナル画面に表示されている行は、実際に書かれた文字数よりも長く、末尾がターミナル幅いっぱいまで半角スペースで埋められています。画面上は見た目に影響しませんが、ドラッグ選択でコピーするとこの空白が実体のある文字としてそのままクリップボードに乗ります。
Issue #18170は、症状を2種類に分けて報告しています。ひとつは各行冒頭に余分なタブやスペースが付く字下げの崩れ、もうひとつは行末に付く不可視のスペースです。行末の空白は、バックスラッシュで継続しているはずの複数行コマンドを途中で独立した行として解釈させ、シェルが1行ずつ別コマンドとして実行してしまう原因になります。次節の技術分析は行末パディングの発生原因を説明したもので、行頭側の字下げがなぜ付くのかは同じ分析では特定されていません。
このIssueは2026年1月14日に報告され、コメントは136件に達しています。2026年9月22日にも新しいコメントが付きました。macOSのTerminal.appとiTerm2、LinuxのGNOME Terminal・Kitty・Ghostty・JetBrains Terminal、Windows TerminalとPowerShellなど、OSやターミナルエミュレータを問わず再現報告が集まっており、特定の環境だけの不具合ではありません。
現れ方に波があることも、報告から読み取れます。macOSのTerminal.app・iTerm2・Kitty・Ghostty・WezTermを使う報告者は、v2.1.80で出力が全体に崩れる日もあれば、一部だけ、あるいはまったく崩れない日もあると書いています。関連するIssue #23014の報告者(v2.1.27・v2.1.29)も、一日中問題なく使えていた別のマシンで突然始まり、OSの更新やバージョンの巻き戻しでも直らなかったと書いています。#23014には、空白パディングに加えて反転表示用のANSIエスケープシーケンス(\x1b[7m/\x1b[27m)まで一緒にコピーされる様子を示すxxdのダンプも載っています。
もう1つ、同じIssueで報告されている症状に長い行の強制改行があります。本来は1行に収まるはずの長いコマンドが、ターミナル幅で折り返されてハードな改行文字として出力に埋め込まれるというものです。コピー後に貼り付けると、1本のコマンドだったはずの内容が複数行に分断されます。WindowsではPowerShell 7とWindows Terminalでも、地の文全体に同じ強制改行が入るとの報告がありました(v2.1.96)。空白パディングとは別の原因ですが、症状としては同時に発生することが多く、どちらも「見た目通りにコピーできない」という不満につながっています。
なぜ余分な空白が付くのか
Issue #23014に投稿された技術分析によると、Claude CodeはInkというTUIレンダラーを使っています。分析では、通常の描画パスが空のマス目を実際のスペース文字(0x20)で埋め、全列を端末へ出力しているとされます。
vimやhtopのようなcurses系のTUIは、行の末尾を\x1b[K(erase to end of line)というエスケープシーケンスでクリアし、そこから先が空であることを端末に伝えます。空のマス目を実際の文字で埋めるか、エスケープシーケンスで「ここから先は空」と伝えるかの違いが、コピー時に余分な文字が付くかどうかを分けている、というのがこの分析の要旨です。
この原因分析はコミュニティによるcli.jsの逆解析に基づくもので、Anthropicが公式に認めた説明ではありません。同じ投稿では、デバッグ用の描画パス(getRenderOpsDebug)にはすでに各行を.trimEnd()する処理が実装済みだが、通常利用時の描画パスには適用されていない、という指摘もされています。
v2.1.289のchangelogには、行末の空白パディングを直したと書かれた項目がありません。手元のバージョンは次のコマンドで確かめられます。
claude --version2.1.289 (Claude Code)貼り付けが崩れたときの回避策
原因の修正を待たずに使える回避策は、Claude Code側の機能、ターミナル側の設定、貼り付け後の掃除の3系統に分かれます。まず、描画モードによって選択のしくみそのものが変わる点を押さえておくと選びやすくなります。
/tuiの2つの描画モードとコピー
/tui fullscreen
ドラッグ選択はClaude Codeの内部で処理され、マウスボタンを離した時点で自動的にクリップボードへ入ります。自動コピーは/configの「Copy on select」で止められます。
Linuxのghosttyでは、選択が正しく扱われOSC 52でコピーされたという報告があります。一方で、ターミナル本来のコピー機能やtmuxのコピーモードは、この選択を認識しません。Ctrl+oのあと[を押して会話をネイティブスクロールバックへ書き出せば、tmuxのコピーモードなどで選べます。
/tui default
従来どおりターミナルのドラッグ選択に任せます。/tui defaultに切り替えて貼り付けが直ったという報告があります。
この場合、空白パディングは選択範囲に含まれることがあります。会話はターミナルのスクロールバックに残るので、Cmd+fやtmuxのコピーモードは通常どおり使えます。保存済みのtui設定にかかわらず従来のレンダラーに固定するには、CLAUDE_CODE_DISABLE_ALTERNATE_SCREEN=1を設定します。
切り替えはどちらも1行です。/tuiは引数なしで現在のレンダラーを表示します。
/tui fullscreenどちらが効くかは環境で分かれます。フルスクリーンレンダリングの仕組みと/tuiが切り替えを拒否する条件はClaude CodeのTUI(フルスクリーン)とはで扱っています。
フルスクリーンのままターミナル本来の選択を使いたい場合は、修飾キーを押しながらドラッグします。Terminal.appではFn、iTerm2ではOption、VS CodeではShift(macOSではterminal.integrated.macOptionClickForcesSelectionを有効にしたOption)、そのほかの多くのターミナルではShiftです。常にネイティブ選択を使うなら、環境変数でマウスの捕捉自体を切ります。
CLAUDE_CODE_NO_FLICKER=1 CLAUDE_CODE_DISABLE_MOUSE=1 claudeこの場合、フリッカーのない描画は保たれますが、クリックでのカーソル移動・クリックでの展開・URLのクリック・ホイールスクロールは使えなくなります。
/copyコマンドでクリップボードへ送る
マウス選択の代わりに/copyコマンドを使うと、空白を含まないクリーンなテキストがクリップボードに送られます。
/copy/copy 2のように数字を付けると、N番目に新しい応答をコピーします。コードブロックが含まれる応答では個別に選べるピッカーも開きます。ピッカーを毎回出したくなければ、~/.claude.jsonのcopyFullResponseをtrueにします(/configでは「Skip the /copy picker」)。コマンドの詳しい使い方はClaude Code copyコマンドでコードブロックだけを送るにまとめています。
注意点が2つあります。iTerm2では、OSC 52によるクリップボードへの書き込みが初期状態で許可されていません。/terminal-setupを実行すると、「Applications in terminal may access clipboard」が有効になります。また、Windows 11のPowerShell 7で/copyすると、アクセント付きの文字が化けたという報告があります。報告者はプロファイルに[Console]::OutputEncoding = [System.Text.Encoding]::UTF8を書いて直しています。
ターミナル側の設定で末尾空白を除去する
一部のターミナルエミュレータには、コピー時に末尾の空白を自動で取り除く設定があります。
- Kitty:
~/.config/kitty/kitty.confにstrip_trailing_spaces smartを追加します。Kittyの設定では、smartは通常の選択では末尾の空白を取り除き、矩形選択では取り除かない値です - Ghostty: コピー用のキーバインドを
copy_to_clipboard:plainで定義します。macOSでの報告例はkeybind = performable:super+c=copy_to_clipboard:plainで、設定後にGhosttyを再起動します
Ghosttyの設定は、長い行のハード改行による分断までは解消しません。どちらもターミナル側の機能で、Claude Codeの出力自体を変えるものではないため、他のアプリの出力には影響しません。
tmuxの中で使っている場合は、tmuxのマウスモードを有効にしてマウスで選択すると行頭の字下げが選択に入らず、tmuxのコピーモードでコピーすると字下げが入った、という報告があります。ただし1人の環境での報告で、再現条件は詰められていません。
貼り付け後にコマンドでクリーンアップする
すでに空白付きでクリップボードに入ってしまった内容は、パイプでクリーンアップできます。行末の空白を落とす例です。
pbpaste | sed 's/[[:space:]]*$//' | pbcopymacOSのpbpaste/pbcopyを使った例です。Linuxではxselの--outputと--inputを組み合わせれば同じ処理ができます。
xsel --clipboard --output | sed 's/[[:space:]]*$//' | xsel --clipboard --input行頭の字下げが崩れる症状にはsed 's/^[[:space:]]*//'で行頭の空白をまとめて削る方法もあります。ただし行頭の空白を区別せず全て落とすため、Pythonやyamlのようにインデント自体に意味を持つ内容には使えません。フラットなコマンドやログの貼り付けに限った方法です。
バージョンアップで直ったという報告と、直っていないという報告
Issueのコメントには、バージョンごとの改善報告が並んでいます。2026年5月14日にv2.1.141で「2行目以降に2スペースの字下げが付く」と報告された2日後、同じv2.1.141のmacOS・iTerm2で直ったという報告が投稿されました。別の参加者は、スクリーンショットにパディングが写っているのに選択範囲だけ避けられていると指摘しています。
6月3日には「v2.1.161で直ったようだ」という報告があり、6月5日に「Linuxでは直っていない」という反論が付きました。7月2日には、Terminal.app・iTerm2・Ghostty・Cmuxの4つで、貼り付けで一部の単語が抜ける同じ再現手順の報告も出ています。バージョン番号だけでは判断できないため、手元の環境で実際に貼り付けて確かめるのが確実です。
CLAUDE.mdに指示を書いて回避する運用
コマンド生成のたびに手作業でクリーンアップするのが面倒な場合、Claude Code自身に回避策を実行させる運用も報告されています。複数行のシェルコマンドを画面に出力させず、一時ファイルに書き出してからpbcopyでクリップボードに送るよう、CLAUDE.mdに指示を足します。3月26日のコメントに投稿された指示は、~/.claude/CLAUDE.mdに置く英語の次の文で、コメントには続けて「The terminal renderer breaks copy-paste on code blocks (adds indentation/trailing spaces).」とも書かれています。
For multi-line shell commands, write to /tmp/cmd.sh then `cat /tmp/cmd.sh | pbcopy` so the user gets clean clipboard content.Linuxでは同じコメントのスレッドで、pbcopyをxsel --clipboard --inputに置き換えた版が共有されています。生成したコマンドを画面の描画経路に通さず、クリップボードへ直接渡す仕組みです。3月13日のコメントには、/copyの名前でカスタムスラッシュコマンドを作り、allowed-toolsにBash(pbcopy:*)やBash(wl-copy:*)を指定した例もあります。
サンドボックス内ではpbcopyなどのクリップボードコマンドが失敗することがあります。changelogには、その場合にClaudeが/copyを案内するよう改善した項目があります。
SSH越しでは/copyのwキーでファイルに書き出す
この空白パディングはローカル接続に限った現象ではありません。#23014に添付されたxxdの実データは、SSH越しの接続でドラッグ選択して貼り付けた内容から採取されたもので、約160バイトの0x20が各行に並んでいます。
SSH越しでは/copyのクリップボード転送が効かないという報告もあります。ログインURLが複数行に折り返され、ターミナルが1本のURLとして認識しない例です。そのようなときは、/copyのピッカーでwキーを押してファイルへ直接書き出します。クリップボードへの転送経路をまるごと迂回してリモートのファイルシステムへ書き込むため、ローカル側の端末設定に左右されません。詳しい手順はClaude Code copyコマンドでコードブロックだけを送るにまとめています。SSH接続時の認証・設定全般はClaude Code SSH接続ガイドで扱っています。
フルスクリーンでのドラッグ選択は、ローカルではOSのクリップボードコマンドを使い、SSH越しではOSC 52というエスケープシーケンスで送ります。OSC 52を既定で止めているターミナルでは、受け側の許可が要ります。
症状別の切り分け
貼り付けが崩れたときの順番
- 1
複数行コマンドが途中で実行された
行末の空白が
\の後ろに入っています。応答を/copyで取り直し、コマンドだけが欲しければピッカーでコードブロックを選びます。 - 2
SSH先のエディタに貼ると崩れる
/copyのピッカーでwを押してリモートのファイルに書き出し、そのファイルを開きます。 - 3
マウスで一部だけ選びたい
/tui fullscreenと/tui defaultを両方試し、空白が付かないほうに固定します。tmuxを使うなら、マウスモードでの選択も試せます。 - 4
毎回の掃除が負担になっている
KittyやGhosttyなら設定を足します。それ以外の環境では、貼り付け後に
sedで整える方法か、CLAUDE.mdへの指示を使います。
まとめ
Claude Codeのコピペ崩れは、Issueがオープンのまま、TUIの描画方式に由来する問題として続いています。一部だけ欲しいならレンダラーとターミナル設定の組み合わせを自分の環境で固め、応答全体なら/copyに寄せると、手直しが減ります。