Claude Media
Claude Codeでリンクが2回開く問題 — Windows Terminal/WSL2の対処法

Claude Codeでリンクが2回開く問題 — Windows Terminal/WSL2の対処法

Windows TerminalでClaude CodeのリンクをCtrl+クリックすると2回開く不具合の原因と、Ctrl+Shift+クリックや環境変数による回避策をまとめます。

このTipsでできること

Windows TerminalでClaude CodeのTUIに表示されたリンクをCtrl+クリックすると、同じURLを開くブラウザタブが2つ立ち上がります。原因は、Windows TerminalとClaude Codeが同じクリックにそれぞれ反応し、リンクを別々に開いてしまうことです。WSL2上のWindows Terminalでも、cmd.exeでも同じ現象が起きます。

この記事では、自分の環境が同じ原因かを3手順で切り分け、3つの回避策から選べるようにします。

症状 — Ctrl+クリックでブラウザが2回開く

GitHub Issue #82582の計測では、1回のCtrl+クリックで同じURLへのGETリクエストが2回届きます。

数字

Ctrl+クリックの計測結果

  • Claude Code上でCtrl+クリック

    2回

    マークダウンリンクも裸のURLも同じ

  • 2回のリクエストの間隔

    約650ms

    646ms・647ms・654msの3回計測

  • Ctrlなしの通常クリック

    0回

    何も開かない

  • Ctrl+Shift+クリック

    1回

    Windows Terminalだけが開く

Issue #82582の本文とコメントに投稿された計測。Windows Terminal 1.24.11911.0、Windows 11

PowerShellのStart-Process <url>や、Claude Codeを使わないWindows Terminal単体でのOSC 8ハイパーリンクのCtrl+クリックは1回だけ開きます。OSやブラウザ、Windows Terminal単体の挙動は正常です。

再現が報告されているClaude Codeは2.1.220から2.1.241までで、Windows Terminalは1.24.11911.0(Store版)です。シェルはPowerShell 7でもcmd.exeでも変わらず、cmd.exeでの再現は#82582のコメントで確かめられています。

原因 — 押下と解放で別々のプログラムがリンクを開く

#82582のコメントは、Windows Terminalのソース(ControlInteractivity.cppのrelease-1.24ブランチ)を引いて、クリックの押下と解放で処理が非対称になっていると指摘しています。

くらべる

1回のCtrl+クリックで起きること

Windows Terminal

マウスを押した瞬間

PointerPressedはCtrl+クリックでカーソル下にOSC 8ハイパーリンクがあると、そのリンクを開きます。このときマウスレポートはClaude Codeへ転送されないので、押下はClaude Codeに届きません。

Claude Code

マウスを離した瞬間

PointerReleasedにはハイパーリンクのガードがなく、Ctrl付きのマウスアップがそのままClaude Codeへ転送されます。Claude Codeは自前のクリックハンドラーで同じリンクをもう一度開きます。

この仕組みが働くのは、Claude Codeがフルスクリーンレンダリングでマウストラッキング(?1000h ?1002h ?1003h ?1006h)を有効にしているときだけです。クラシックレンダラーでは同じウィンドウ・同じリンクで再現しません。複数の報告者が/tui defaultへの切り替えで1回に戻ることを確かめています。

公式ドキュメントでは、リンクを開く操作はmacOSがCmd+クリック、LinuxとWindowsがCtrl+クリックで、修飾キーなしの通常クリックでは開きません。Ctrlなしで何も開かないのはこの仕様どおりで、二重オープンは常にCtrlを押したときだけ起きます。

クリックの扱いはターミナルごとに調整されています。macOSのGhosttyとWarpは、Cmd+クリックをターミナルがアプリへ転送してしまうため、Claude Codeがそれを検出して通常クリックでもリンクを開きます。Windows Terminalは、フルスクリーンレンダリングのページにこうした個別の扱いとして載っていません。

自分の環境が同じ原因か切り分ける

二重に開く原因は、ブラウザの設定やマウスの不具合とも見分けがつきません。同じWindows Terminalで同僚が何人も困り、まずマウスを疑ったという報告もあります。次の3手順で、Claude Codeとの組み合わせが原因かどうかを確かめられます。

手順

二重オープンの切り分け

  1. 1

    Claude Codeを使わずにOSC 8リンクを試す

    Claude Codeを起動せず、素のPowerShellで次を実行し、出力された文字をCtrl+クリックします。1回だけ開けば、Windows Terminalとブラウザは正常です。

  2. 2

    Claude Code上で通常クリックとCtrl+クリックを比べる

    通常クリックで何も開かず、Ctrl+クリックで2回開くなら、この記事の現象です。

  3. 3

    Ctrl+Shift+クリックを試す

    1回だけ開けば、2つ目のオープナーはClaude Code側にあります。Shiftを押すとWindows Terminalがマウスレポートを転送しなくなるためです。

手順1のコマンドは#82582の報告にあるものです。

$ESC = [char]0x1B
$osc8 = "{0}]8;;https://example.com{0}\OSC8 test link{0}]8;;{0}\" -f $ESC
Write-Host $osc8

「重複クリックイベント」系の不具合とは別物

同じ「リンクが2回開く」症状でも、原因が別のクラスの不具合があります。JetBrainsの新しいターミナル(#68568)やWarp(warpdotdev/warp#13512)の報告は、1回の物理クリックがターミナルから2つのクリックイベントとして配送されるケースです。こちらの対策は、イベントを時間と座標でまとめて重複排除することです。

Windows Terminalではクリックイベントが1回しか届いていません。届いたマウスアップに、Windows Terminal自身のOSC 8処理とClaude Codeのクリックハンドラーが別々に反応します。ツール結果のクリック展開が二重にならないことも、この違いを裏づけています。イベントの重複排除では直りません。

WSL2では、別のissue(#81905)にも同じ現象が報告されています。そこでは「Claude Codeが押下で開き、Windows Terminalがクリック完了で開く」と、#82582とは逆の順序が推定されていました。#82582のコメントはWindows Terminalのソースの該当行を引いており、押下側がWindows Terminal、解放側がClaude Codeです。#81905には、素のPowerShellプロファイルでも再現するというコメントがあり、WSL2固有の問題ではありません。

追跡先も分かれていて、#76022と#88148、#82582はいずれもopenのままです。#81905は2026年8月15日に別のissue(#76022)の重複としてクローズされましたが、#82582のコメントでは#81905が#82582の重複とされています。

#81905にはほかに、CLAUDE_CODE_DISABLE_MOUSE=1で止まるという報告があります。KDEのKonsoleでも、ターミナルが自分でリンクを開くため同種の二重オープンが起きるというコメントが#81905にあります。同じWindows TerminalのAltGr文字が入力できない問題は、キー入力側の別の不具合です。

今すぐ試せる回避策

回避策は次の4つです。いずれも副作用があるため、失うものを見て選びます。

Ctrl+Shift+クリックに変える

設定不要で、その場で使えます。リンクを開くのは押下時のWindows Terminalだけになります。

公式ドキュメントでは、多くのターミナルでShiftを押しながらドラッグすると、ターミナル側が選択を処理してClaude Codeには渡らないと説明されています。ここで使うShiftも、同じ「マウス操作をターミナルに任せる」ためのキーです。

Ctrlを押したままリンク外へ動かして離す

#81905には、Ctrlを押したままマウスをリンクの外へ動かしてから離すと1回で済むという回避策が報告されています。設定を変えずに済みますが、クリックのたびに手を動かす必要があります。

CLAUDE_CODE_DISABLE_MOUSE_CLICKSを設定する

フルスクリーンレンダリング内のクリック・ドラッグ・ホバーを止め、マウスホイールのスクロールだけ残します。公式の説明では、カーソル位置の指定やツール出力の展開とあわせて、リンクを開く操作も止まります。この説明どおりなら、Claude Code側の2回目が止まり、Windows Terminalの1回だけが残るはずです。ただし、この変数で1回に戻ったという実測は、#82582と#81905には載っていません。v2.1.195以降で使えるため、まずバージョンを確かめます。

claude --version
$env:CLAUDE_CODE_DISABLE_MOUSE_CLICKS = "1"
claude

claude --versionは2.1.289 (Claude Code)のような形で表示されます。毎回のセッションで有効にしたいときは、settings.jsonのenvキーに書いておくと、設定し直す手間が省けます。

{
  "env": {
    "CLAUDE_CODE_DISABLE_MOUSE_CLICKS": "1"
  }
}

/tui defaultでクラシックレンダラーに切り替える

フルスクリーンレンダリングをやめ、旧来の表示に戻します。マウストラッキングが有効にならないため、リンクを開くのはWindows Terminalだけです。公式ドキュメントによると、フルスクリーンはちらつきをなくし、長い会話でもメモリ使用量を一定に保ち、マウス操作に対応する表示方式です。切り替えるとこれらを手放します。

/tui default

回避策の使い分け早見表

回避策持続失うもの設定の手間
Ctrl+Shift+クリック持続その場だけ失うものなし(クリックのたびに意識する)設定の手間不要
Ctrlを押したままリンク外で離す持続その場だけ失うものなし(クリックのたびに手を動かす)設定の手間不要
CLAUDE_CODE_DISABLE_MOUSE_CLICKS=1持続恒久失うものツール結果のクリック展開・ドラッグ選択・リンクのクリック設定の手間環境変数1つ
/tui default持続恒久失うものちらつき防止・一定のメモリ使用量・マウス操作設定の手間コマンド1つ
CLAUDE_CODE_DISABLE_MOUSE=1持続恒久失うものマウスホイールでのスクロールも設定の手間環境変数1つ

CLAUDE_CODE_DISABLE_MOUSEはフルスクリーンレンダリングのマウストラッキング全体を止めます。両方を設定した場合はCLAUDE_CODE_DISABLE_MOUSEが優先され、PgUpとPgDnでのキーボードスクロールは使えます。公式の説明では、CLAUDE_CODE_DISABLE_MOUSEはターミナル本来のコピー選択(copy-on-select)を残したいときに使う設定です。マウストラッキングを止めるので、ドラッグ選択はClaude Codeの内部選択ではなくターミナルの標準動作に戻ります。ホイールを残したいならCLAUDE_CODE_DISABLE_MOUSE_CLICKS、マウスを使わないならCLAUDE_CODE_DISABLE_MOUSEです。

効かない回避策

#81905のコメントでは、Windows Terminalの"experimental.detectURLs": falseを試しても直らないと報告されています。この設定はURLの自動検出を止める設定で、Claude Codeが明示的なOSC 8ハイパーリンクとして出すリンクには作用しません。#82582の報告者も、"experimental.detectHyperlinks": falseを設定しても2回開くことを確かめています。Windows Terminalには、OSC 8ハイパーリンクの処理そのものを無効にする設定がありません。

FORCE_HYPERLINKは、Claude Codeが出すOSC 8リンクの有効と無効を切り替える環境変数で、値は数値として読まれ、0だけが無効にします。クリックの扱いを変える変数ではないため、二重オープンの回避策としては別物です。

VS Codeなど他のターミナルでは修正済み

同種の二重オープンは、VS Codeなどxterm.jsベースのターミナルでも起きていました。changelogでは次の2件が修正済みです。v2.1.77の「VS Code、Cursor、その他xterm.js系ターミナルでのCmd+クリック時の二重オープン」と、v2.1.94の「xterm.js系ターミナル上のtmux内での二重オープン」です。

公式ドキュメントによると、VS Codeの統合ターミナルなどxterm.jsベースのターミナルでは、Claude Codeはターミナル側のリンクハンドラーに任せ、同じ操作で開きます。Windows Terminalはこの対象に挙がっておらず、v2.1.289までのchangelogにもWindows Terminalのリンク二重オープンの修正は載っていません。

Windows Terminal向けの修正としてchangelogに載っているのは、別の症状です。v2.1.97ではNO_FLICKERモードのマウスホイールが遅い問題が直りました。v2.1.179ではWSL2のWindows Terminalでマウスホイールが効かない問題(v2.1.172で入った退行)が直り、v2.1.183ではサブエージェントが大量に走るときのフルスクリーン表示の崩れが直っています。フルスクリーンレンダリングはWindows Terminalで継続的に調整されている機能で、リンクのクリックは、その中でまだ直っていない症状です。

まとめ

押下側でWindows Terminalが、解放側でClaude Codeがリンクを開きます。フルスクリーンレンダリングをやめるかClaude Code側のクリックを止めない限り、二重オープンは続きます。リンクを開く頻度が低ければCtrl+Shift+クリック、頻繁ならCLAUDE_CODE_DISABLE_MOUSE_CLICKS=1と/tui defaultのどちらを手放すかで選べます。関連するWindowsのstdout取得不良や非ブロッキングstdoutの設定も、同じくWindows環境のトラブルシューティングです。

この記事を共有:XはてブLinkedIn