ターミナルでマウスが反応するとき、何が起きているのか
ターミナル(黒い画面)は本来、キーボードで文字を打ち込むためのものです。マウスという概念は、もともと想定されていませんでした。それでも、ターミナル上で動くエディタやツールの中には、クリックでカーソルが動いたり、ホイールでスクロールできたりするものがあります。これを可能にしているのがマウスレポーティングという仕組みです。
名前のとおり「マウスの動きをレポート(報告)する」機能です。ターミナルアプリ(iTerm2やWindows Terminal、VS Codeの統合ターミナルなど)が、クリックやスクロールといったマウス操作を検知して、「いま座標(12, 34)で左ボタンが押されました」という情報を、中で動いているプログラムに文字列として送り届けます。
電話越しに場所を伝えるようなもの
イメージとしては、電話で道案内をしている状況に近いです。相手(ターミナル内で動くプログラム)はこちらの画面を直接見られません。だから「いま指でここを指しました」では伝わらない。そこで「上から12行目、左から34文字目をクリックしました」と、座標を言葉にして伝えるわけです。マウスレポーティングがやっているのは、まさにこの翻訳作業です。
伝える手段は、画面には表示されない特殊な文字列(エスケープシーケンスと呼ばれる制御用の信号)です。普段は目に見えませんが、仕組みがうまく噛み合っていないと、クリックしただけで画面に [<0;34;12M のような謎の文字が出てくることがあります。あれは翻訳された座標情報が、受け取り手に解釈されないまま素通りして表示されてしまった状態です。
オンとオフがある
マウスレポーティングは常に有効なわけではなく、ターミナルの中で動いているプログラムが「これから自分がマウスを扱うので、報告を送ってください」と宣言したときに有効になります。プログラムが終了すれば、宣言も解除されて元に戻ります。
オフのとき
マウス操作はターミナルアプリ自身が処理します。ドラッグで文字を選択してコピー、ホイールでスクロールバックを遡る、といった「いつもの」挙動です。
オンのとき
マウス操作が中のプログラムに渡ります。クリックでカーソル移動、ホイールでプログラム内のスクロール、といったアプリ固有の挙動になります。
「コピーできない!」というつまずき
初めて遭遇して戸惑いやすいのが、マウスレポーティングが有効なプログラムを使っているときに、いつものようにドラッグで文字を選択しようとしても選択できない、という現象です。これはバグではなく、ドラッグ操作が「ターミナルの文字選択」ではなく「中のプログラムへの報告」として扱われているためです。
多くのターミナルアプリでは、こういうときのために修飾キーを押しながらドラッグすると通常の選択に戻せる、という回避策が用意されています。どのキーを使うかはターミナルアプリによって違うので、使っているアプリの設定やドキュメントを確認するのが確実です。
座標の伝え方にはバリエーションがある
細かい話ですが、座標を伝える形式は一種類ではありません。古い形式は、画面の端のほうをクリックしたときに座標を正しく表現できないという制約がありました。そこで後から、大きな座標も扱える新しい形式が考え出され、現在のターミナルアプリやツールはそちらに対応しているものが多くなっています。
普段使う分にはこの違いを意識する必要はほとんどありません。ただ、古いツールと新しいターミナルを組み合わせたときに「画面の右下だけクリックが効かない」といった妙な症状が出ることがあり、その背景にはこうした形式の違いが潜んでいることがあります。
覚えておくと得をする場面
マウスレポーティングという言葉を知っていると、ターミナルで起きる不可解な挙動のいくつかに説明がつきます。クリックで変な文字が出る、ドラッグで選択できない、スクロールしたのに画面が思ったように動かない。これらはどれも「いまマウスの操作権がターミナル側にあるのか、中のプログラム側にあるのか」という一点に帰着します。
ターミナルは文字しか送れない世界です。その制約の中で、座標という本来は文字でない情報を無理やり文字に乗せて運んでいる。そう考えると、たまに表示が崩れるのも少し許せる気がしてきます。
このページは役に立ちましたか?