theonehub.app

KEYBOARD — キーボードとターミナル入力

Ctrl・Alt・Cmd はどう働くか — 修飾キーの仕組みと Android での扱い

Ctrl・Alt・Cmd はどう働くか — 修飾キーの仕組みと Android での扱いのアイキャッチ

修飾キーは「押しながら」で意味を変えるキー。OSの中でどう伝わるのか、Androidのソフトウェアキーボードで再現が難しい理由まで解説します。

この記事の目次

スマホの SSH クライアントで tail -f を流しっぱなしにし、画面の隅にある Ctrl ボタンを押してから C を打つ。プロセスは止まり、プロンプトが戻ってきます。ところが同じスマホでリモートデスクトップアプリにつなぎ、同じ調子で Ctrl ボタンと C を打っても、接続先ではコピーが起きず、素の C が入力されるだけということがあります。さらに日本語キーボードに切り替えると、そもそも画面から Ctrl のボタンが消えている。ここで「アプリの相性」と片付けてしまうと、次に別のアプリを入れても同じ壁に当たります。

Ctrl+C でコピー、Cmd+Tab でアプリ切り替え、ターミナルの Ctrl+C で処理の中断。修飾キー(モディファイアキー)は PC 操作の骨格ですが、PC では仕組みを意識する場面がほとんどないため、スマホで初めて「効いたり効かなかったり」に出会うと原因が見えません。主な確認点は、修飾キーが OS の中を「文字」ではなく「状態」として運ばれていること、そしてその状態を作れる経路がアプリごとに違うことです。この構造が見えると、SSH アプリでは効いてリモートデスクトップでは効かない理由も、日本語入力に切り替えた瞬間に Ctrl が消える理由も、同じ地図の上で説明できます。

修飾キーは文字ではなく「状態」を運ぶ

キーボードのキーを押すと、OS には「どのキーが押されたか」「離されたか」というイベントが届きます。A のキーを押せば A のイベントが届き、アプリがそれを文字として画面に出す。ここまでは直感どおりです。

修飾キーが特殊なのは、それ自体では何も入力しない点です。Ctrl を押しても画面には何も出ません。代わりに OS は「いま Ctrl が押されている」という状態を覚えておき、その間に押された他のキーのイベントに「Ctrl が押された状態でした」という情報を添えます。これをメタ状態と呼びます。Android の公式リファレンスも、キーイベントにはキーコード・スキャンコード・メタ状態が添えられ、メタ状態は META_SHIFT_ON や META_ALT_ON のような修飾キーの押下状態を表す、と説明しています(KeyEvent | Android Developers)。アプリが受け取るのは「C が来た」ではなく「Ctrl 付きの C が来た」で、アプリはこの組み合わせをショートカット表と照合して、コピーや中断などの動作に変換します。つまり修飾キーの仕事は、文字を出すことではなく、他のキーの意味を変える状態を運ぶことです。

主な修飾キーの顔ぶれと役割を整理しておきます。

  • Shift(⇧): 最古の修飾キーで、タイプライターで活字の位置を物理的に「シフト」させて大文字を打った機構が名前の由来です。文字種の切り替えが本業です
  • Ctrl(⌃): テレタイプ端末の時代から続く「制御」のキーです。ターミナルでは今も主役で、Ctrl+C(中断)や Ctrl+D(入力終了)など端末制御の伝統を背負っています
  • Alt / Option(⌥): 代替(Alternate)の名のとおり、キーに別の意味を与えます。Mac では記号や特殊文字の入力に、Windows ではメニュー操作やショートカットの補助に使われます
  • Cmd(⌘)/ Win: OS レベルのショートカットの主役です。同じ位置のキーでも Mac と Windows で役割の割り当てが大きく違います

メタ状態はフラグの集まりなので、複数の修飾キーは自然に重ねられます。Ctrl+Shift+C は「Ctrl と Shift の両方が立った C」というひとつのイベントで、Linux のターミナルがコピーにこの組み合わせを使うのは、フラグを1枚足すだけで中断の Ctrl+C と別の意味を作れるからです。ショートカットの世界が Ctrl+Alt+何か、Cmd+Shift+何かと際限なく広がっていけるのは、修飾キーが「文字」ではなく「重ねられる状態」だからこそです。

修飾キーは、組み合わせと操作するアプリの両方で意味が決まる
修飾キーは、組み合わせと操作するアプリの両方で意味が決まる
画像を選ぶと拡大できます。
  1. 修飾キーが押されている状態と、ほかのキーの入力を組み合わせます。
  2. GUIアプリでは、そのアプリのショートカットとして扱われます。
  3. ターミナルでは、制御文字や実行中の状態も関係します。

ターミナルの Ctrl は特別 — 制御文字という正体

GUI の修飾キーとターミナルの修飾キーは、実は動作原理が違います。ここがこの記事でいちばん面白いところなので、少し掘り下げます。

コンピュータの文字コードの土台である ASCII は7ビットで設計されていて、0 から 127 のうち、0 から 31 は画面に表示される文字ではなく「制御文字」に割り当てられています。改行やタブもこの仲間です。ASCII の符号表を収めた文書(RFC 20: ASCII format for Network Interchange)を見ると、7ビットのうち上位3ビットで決まる8つの列のうち、列 0 と列 1 が制御文字、大文字の C は列 4 の行 3、制御文字 ETX は列 0 の行 3 に置かれています。そして端末で Ctrl+英字を押したとき、送られるのは「Ctrl と C が押された」というイベントではなく、たった1バイトの制御文字です。仕組みは単純で、Ctrl はその文字のコードの最上位ビット(RFC 20 の表記では b7)を落とす働きをします。大文字 C のコードは 0x43 で、そこから 0x40 を引いた 0x03 という制御文字(ETX)が Ctrl+C の正体です。

つまりターミナルの世界では、Ctrl+C は「組み合わせ」ですらなく、C や Z と同格の1文字として通信路を流れています。受け取った側の端末ドライバが、0x03 なら実行中のプロセスへ割り込みシグナル(SIGINT)を送る、0x1A(Ctrl+Z)なら一時停止のシグナルを送る、という約束で動いています。この約束は端末ドライバの仕様書に書かれていて、Linux の termios(3) マニュアルは INTR 文字の既定値を 003(ETX、Ctrl-C)として SIGINT を送る、SUSP 文字の既定値を 032(SUB、Ctrl-Z)として SIGTSTP を送る、と定めています(termios(3) — Linux manual page。マニュアルの数値は8進数で、003 が 0x03、032 が 0x1A に当たります)。Ctrl+D の 0x04 は同じマニュアルで EOF 文字の既定値とされ、「入力の終わり」を意味します。シェルが空の行でこれを受け取ると「もう入力はない」と解釈してログアウトします。

この対応表を眺めると、見慣れたキーの意外な正体も見えてきます。Ctrl+H は 0x08 でバックスペースと同じ、Ctrl+I は 0x09 でタブと同じ、Ctrl+M は 0x0D で Enter が送る復帰文字と同じです。RFC 20 の符号表で H・I・M が列 4 の行 8・9・13、BS・HT・CR が列 0 の同じ行に並んでいるのを確かめると、この対応が「最上位ビットを落とす」の一言で説明できることが分かります。つまり Backspace や Tab という独立したキーは、制御文字を打ちやすくした専用ボタンにすぎません。古いターミナル使いが Ctrl+H で文字を消せるのは裏技ではなく、同じ文字を別の指使いで打っているだけなのです。

Esc キーも実は制御文字 0x1B の1文字で、Ctrl+ とまったく同じものを送ります(符号表では [ が列 5 の行 11、ESC が列 1 の行 11 です)。vim の使い手が Esc の代わりに Ctrl+[ を使うのはこの等価性のおかげです。さらに矢印キーは1文字ではなく、Esc から始まる数文字の並び(エスケープシーケンス)として送られます。ターミナルの入力は最後までただの文字列ストリームで、その文字列の中に制御の語彙が織り込まれている。この設計は1960〜70年代のテレタイプから現在の SSH 接続まで一貫していて、[スマホでターミナルを使うどの構成でも基本的な考え方を共有しています。以下は伝統的な端末入力の説明で、拡張キーボードプロトコルや設定によって表現が異なる場合があります。

もうひとつ押さえておきたいのは、0x03 を SIGINT に変換しているのは誰か、という点です。この変換はキーボードでも SSH クライアントでもなく、コマンドが実行されているマシン側の端末ドライバが行います。スマホから SSH で母艦につないで Ctrl+C を打つ場合、スマホの仕事は 0x03 という1バイトを暗号化された通信路に流すことだけで、それを受け取った母艦の端末ドライバが実行中のプロセスへ割り込みを送ります。だからこそ、手元の道具が「正しい1バイトを送れるか」だけが問題になり、送れさえすればあとの仕組みは何十年も揉まれてきた既存のレールに乗る。ただし、接続先の端末設定や実行中のアプリがその入力をどう扱うかも結果に影響します。入力側だけで原因が決まるわけではありません。

GUI の修飾キーはイベントで届く

一方、GUI アプリケーションへの入力は文字列ストリームではなくイベントです。アプリは「キーコード + メタ状態」の形でキー入力を受け取り、Ctrl+C ならコピー、Ctrl+S なら保存、と自分のショートカット表に照らして処理します。同じ Ctrl+C という指使いが、テキストエディタではコピーで、ターミナルでは中断なのは、この2つがまったく別の経路と歴史を持つ機能に、たまたま同じ組み合わせが割り当てられているからです。

Mac はこの衝突を設計で回避した例です。GUI のショートカットを Cmd に寄せたため、ターミナルアプリの中でも Cmd+C はコピー、Ctrl+C は中断と、両方が同居できます。Windows や Linux のターミナルでは、コピーに Ctrl+Shift+C を割り当てるなどの工夫で衝突を避けるのが一般的です。修飾キーの割り当てはただの慣習ですが、慣習だからこそ歴史の地層がそのまま残っています。

Android の入力はどう流れているか

ここからが本題です。Android で物理キーボードをつなぐと、入力は PC と同じ形で流れます。キーを押すとキーイベントが発生し、メタ状態のフラグが添えられ、アプリに届く。ターミナルアプリはこれを解釈して制御文字に変換します。物理キーボードを接続した Android でターミナル操作がまともに成立するのはこのためです。

問題はソフトウェアキーボードです。Android のキーボードアプリ(IME)からアプリへ入力を渡す窓口は InputConnection というインターフェースで、公式リファレンスはその用途として「テキストボックスへのテキストの確定」と「生のキーイベントの送信」の両方を挙げています(InputConnection | Android Developers)。前者が commitText、後者が sendKeyEvent で、sendKeyEvent の説明には「オンスクリーンキーボードがハードウェアキーボードを模擬するために使える」と書かれています。ただし同じ説明が、通常の入力では commitText 系のメソッドを使うよう求めてもいて、キーイベント送信は例外的な経路という位置づけです。実際、KeyEvent のリファレンスは、ソフトウェアキーボードのキーがキーイベントを生成する保証はなく、Android 標準のソフトウェアキーボードは現在のアプリに対してキーイベントを一切送らない、とはっきり書いています。世の中のほとんどのキーボードアプリがテキスト方式で動いているのは、この公式の方針に沿った結果でもあります。

テキスト方式が主流なのには理由があります。日本語入力は「かな漢字変換」を挟むため、キーを押した瞬間に文字が決まりません。「きょう」と打って変換候補から「今日」を選び、確定した文字列をまとめてアプリに渡す。この流れには、入力途中の文字列と確定を扱うテキスト方式が適しています。IME の内部でなにが起きているかはIME の仕組みで詳しく解説していますが、要するに日本語のキーボードアプリはテキストを組み立てて送る機械として設計されているのです。

ここに修飾キー問題の根があります。テキストにはメタ状態を添える場所がありません。「Ctrl が押された状態の C」をテキストとして表現する方法は存在しないので、通常の確定テキストだけでは、GUI の Ctrl 付きキーイベントを表現できません。ただし、IME が別途キーイベントを送る実装や、端末アプリが制御文字を受け取る実装はあり、テキストを使う IME 全体が非対応という意味ではありません。ターミナルアプリが画面の隅に独自の Ctrl ボタンを置いているのは、この欠落をアプリ側で穴埋めする苦肉の策です。アプリ内のボタンなので、そのアプリの中では効きますが、リモートデスクトップのようにキー入力をそのまま接続先へ転送したいアプリでは通用しません。「効いたり効かなかったり」の正体はこれです。

Ctrl+C の旅を通しで見る

ここまでの話を1本につなげて、スマホのキーイベント対応キーボードで Ctrl+C を打ち、SSH 先の母艦で実行中のプロセスが止まるまでを追ってみます。

まずキーボードアプリが、画面上の ⌃ のタップで「Ctrl が有効」という内部状態を立てます。続いて C のタップで、キーボードは文字 C をテキストとして流し込む代わりに、「C のキーコード + Ctrl のメタ状態」を持つキーイベントを発行します。これは物理キーボードと同様のキーコードと修飾状態を持ちますが、受け手の実装によって扱いが異なる場合があります。次に、それを受け取った SSH クライアントの端末エミュレータ部分が、イベントを解釈して制御文字 0x03 に変換し、暗号化された接続に書き込みます。母艦に届いた 0x03 は端末ドライバによって SIGINT に変換され、フォアグラウンドのプロセスグループに届きます。ただしシグナルの扱いはアプリと端末設定に依存し、必ず終了するわけではありません。画面に返ってくるのは、その結果の文字列だけです。

この旅の前半(タップからキーイベントまで)がキーボードアプリの責任範囲、中盤(イベントから制御文字へ)がターミナルアプリの責任範囲、後半(制御文字からシグナルへ)が接続先の責任範囲です。どこかで Ctrl が効かないとき、この区分が分かっていれば「どの区間で落ちているか」を切り分けられます。テキスト方式のキーボードは前半の時点で経路がなく、アプリ内蔵の Ctrl バーは中盤に直接割り込む実装なので他アプリでは使えない。前節までの結論が、この地図の上に素直に載るはずです。

スマホで修飾キーを打つ4つの方法

原理が分かったところで、現実的な選択肢を利用場面ごとに整理します。

  1. ターミナルアプリ内蔵のキーバーを使う。多くの SSH クライアントや Termux は、画面の上部や下部に Ctrl・Esc・Tab・矢印のボタン列を持っています。追加の道具なしで使える半面、画面を圧迫し、操作方法がアプリごとに違い、そのアプリの外では使えません
  2. Termux の音量キー割り当てを使う。Termux は音量下キーを Ctrl として扱う機能を持っていて、音量下+C で Ctrl+C が打てます。公式 Wiki も、タッチキーボードには Ctrl がないため音量下ボタンで Ctrl を代用し、音量下+L は物理キーボードの Ctrl+L と同じ入力になる、と説明しています(Touch Keyboard - Termux Wiki)。Termux 限定ですが、ボタンの割り当てと利用環境での動作を確認してください。緊急用に覚えておく価値があります
  3. キーイベントを送るキーボードアプリを使う。キーボード側が Android 標準のキーイベントにメタ状態を載せて送る方式で、これならターミナルアプリにもリモートデスクトップにも「外付け物理キーボードと同じ形」で Ctrl+C が届きます。受け手が対応していれば操作系を揃えられ、The KeyBoard はこの方式で ⌃⌥⌘ を実装しています
  4. 物理キーボードをつなぐ。Bluetooth や USB の物理キーボードなら、キーイベントを送る経路を確保しやすくなりますが、OS やアプリの割り当ては確認が必要です。持ち運びと設置場所という別の制約はありますが、長時間の作業では最も確実です

ソフトウェアキーボードで運用するなら3、腰を据えた作業には4、そのどちらも使えない非常時のために1と2を知っておく、という組み合わせが実用的です。

Termux は音量キーだけで Ctrl・Esc・Tab・矢印まで揃う

方法2は Ctrl だけの話ではありません。Termux Wiki によると、音量上キーも特殊キーの代用になっていて、音量上+E が Esc、音量上+T が Tab、音量上+W・A・S・D がそれぞれ上・左・下・右の矢印キー、音量上+1 から音量上+0 が F1 から F10 に対応します。音量上+B と音量上+F は Alt+B と Alt+F を送るので、readline の単語移動もできます。ターミナルで最低限必要な Ctrl・Esc・Tab・矢印の4種類が、画面のボタンを一切使わずに物理ボタンだけで打てるわけです。

同じ Wiki には、画面上の拡張キー列(Extra Keys Row)を ~/.termux/termux.properties で定義する方法も載っています。ファイルがなければ作り、次のような1行を書きます。

# ~/.termux/termux.properties(なければ作成する)
extra-keys = [['ESC','/','-','HOME','UP','END','PGUP'],['TAB','CTRL','ALT','LEFT','DOWN','RIGHT','PGDN']]

書き換えたあとは、Termux の中で設定を読み直します。

termux-reload-settings

この例は Wiki に載っている2段構成で、上段に Esc と矢印の上、下段に Tab・Ctrl・Alt と残りの矢印を置いています。CTRL・ALT・FN・SHIFT の4つは「特殊キー」扱いで、定義の中に同じものを2回以上置くと正しく動かない、と Wiki は注意しています。使えるキー名の一覧も同じページにあるので、自分の使うキーだけを残して1段にすると画面の圧迫を減らせます。

どの経路を選んだ場合でも、導入したらまず無害なコマンドを実行して、Ctrl+C で止められるかを試してください。

sleep 10

これを実行して Ctrl+C を打ち、10秒待たずにプロンプトが戻ってくれば、キーボードからターミナル、端末ドライバまでの経路は通っています。動くと分かっている脱出路があるのとないのとでは、その後の操作の思い切りが違います。

「押しながら」をタップでどう再現するか

キーイベント方式のキーボードにはもうひとつ設計課題があります。物理キーボードの「押しながら別のキー」という動作は、指1本のタップが基本のソフトウェアキーボードでは素直に再現できません。画面上の Ctrl に指を置いたまま C をタップするのは、片手持ちでは曲芸になります。

定石は、修飾キーを「押しながら」ではなく「状態の切り替え」として扱うことです。タップすると次の1打にだけ修飾が適用され、打ち終わると自動で解除される。連続して使いたいときはダブルタップでロックし、もう一度タップで解除する。物理キーボードのように押しっぱなしにしたいときはホールドする。この操作系は、もともと片手でのキー操作を支援するアクセシビリティ機能「固定キー(スティッキーキー)」として PC の世界で確立されてきた発想です。Windows の固定キーの仕様では、修飾キーを1回押すと次に非修飾キーを押すまでその修飾キーが押された状態に「ラッチ」され、2回押すと3回目に押すまで「ロック」される、と定義されています(STICKYKEYS 構造体 (winuser.h) | Microsoft Learn)。「1打だけ有効」と「ロック」の2段構えはこの定義そのもので、タップ操作のスマホとは相性が良いのです。The KeyBoard の ⌃⌥⌘ もこの設計を採用しています。

この方式で大切なのが、いまどの修飾キーが有効かを目で確認できることです。物理キーボードなら指の感触で「押している」ことが分かりますが、状態切り替え方式では、Ctrl が有効なまま気づかず次の文字を打つと意図しない制御文字が飛びます。修飾キーの表示が「無効・次の1打だけ有効・ロック中」で見た目に区別されているか、キーボード選びのときに確認してください。地味な違いですが、誤操作の頻度に直結します。

よくある失敗と対処

  • SSH アプリの Ctrl ボタンがリモートデスクトップで効かない: そのボタンはアプリ内限定の実装だからです。接続先までキーを届けたいなら、キーイベントを送るキーボードか物理キーボードに切り替えてください
  • vim に入ったが抜けられない: Esc がなくて詰まる典型例です。Esc は Ctrl+[ と同じなので、対応する端末なら Ctrl+[ で挿入モードを抜けられます。エディター自体の終了や保存は別の操作です。キーバーに Esc があるアプリならそれでも構いません
  • Ctrl+S を押したら画面が固まった: 端末のソフトウェアフロー制御が有効な場合は、出力が一時停止した可能性があります。termios(3) マニュアルでは STOP 文字の既定値が 023(Ctrl-S)、START 文字の既定値が 021(Ctrl-Q)で、STOP で止めた出力は START で再開する、とされています。Ctrl+Q を打ってください。慌てて連打する前に、まずこの2つを思い出してください
  • Ctrl+D を打ちすぎて接続ごと切れた: 空の行での Ctrl+D は「入力の終わり」なので、シェル自体が終了します。行の途中では文字削除など別の動作になる場合があるため、受け取るアプリの仕様を確認します。中断のつもりなら Ctrl+C を使ってください
  • 物理キーボードで A の隣を押して誤爆する: CapsLock の位置問題です。ターミナル使いの伝統的な解決策は CapsLock を Ctrl に置き換えることで、CapsLock を Control にするで方法を解説しています
  • 日本語 IME に切り替えた途端に修飾キーが使えなくなった: 多くの日本語キーボードはテキスト方式なので、切り替えた時点で修飾キーの経路が消えます。日本語とターミナルキーの両方に対応したキーボードを使うか、切り替え操作を最短にしておくかの二択です
  • 画面に ^[[A のような文字が出る: 矢印キーが送ったエスケープシーケンスを、いまの画面(プログラム)が解釈しなかっただけです。端末設定と受け手の対応を確認してください。矢印を受け付けない場面で押した、と理解して消してください。逆に言えば、この表示は「矢印キーがちゃんと送れている」証拠でもあります

応用: 修飾キーが打てるようになったら

修飾キーの経路が確保できると、ターミナルの生産性を支える語彙が一気に解禁されます。行頭へ移動する Ctrl+A、行末への Ctrl+E、直前の単語を消す Ctrl+W、履歴を検索する Ctrl+R。この語彙はターミナルのショートカットにまとめてあり、スマホの小さな画面ではカーソル移動の連打が省ける分、PC 以上に効果を実感できます。

tmux を使っているなら、プレフィックスキー(既定では Ctrl+B)が打てることはウィンドウ切り替えの前提条件です。逆に言えば、修飾キーの経路がないと tmux は事実上操作できません。スマホからの tmux 運用が CLI エージェントを外出先から動かす構成の土台になっていることを考えると、修飾キーはスマホ開発環境の土台の土台です。

習得の順序としては、一度に全部を覚えようとせず、まず Ctrl+C(中断)と Ctrl+[(Esc 代替)の2つだけを指に入れることをすすめます。この2つは「困った状態から抜ける」ためのキーで、いつでも脱出できるという安心感が、スマホでターミナルを触る心理的なハードルを大きく下げてくれます。脱出手段が身についてから、Ctrl+R の履歴検索のような「速くなる」ためのキーを足していく。守りから攻めへ、の順番です。

もうひとつの収穫は、道具の説明書きが読めるようになることです。キーボードアプリの紹介文にある「キーイベント送信対応」「メタ状態対応」という一見地味な言葉が、実は「対応する受け手へ Ctrl のキーイベントを送れる」という決定的な性質の宣言だと分かるようになります。派手な機能の一覧より、この一行の有無を見てください。

よくある質問

Alt と Option は同じキーですか

物理的には同じ位置のキーで、Mac のキーボードには Alt と Option が併記されています。ただし OS 上の役割は異なり、Windows の Alt はメニューやショートカットの補助が中心、Mac の Option は記号入力や動作の変化(オプション)に使われます。ターミナルでは Alt は Esc を前置した入力として扱われる伝統があり、単語単位の移動などに使われます。Termux の音量上+B・F が Alt+B・Alt+F として単語移動に使えるのも、この伝統に乗ったものです。

Esc は修飾キーですか

修飾キーではありません。Esc は押した瞬間に制御文字 0x1B を送る「文字が出るキー」で、他のキーと押し合わせて意味を変えるものではないからです。ただし「画面に表示されない特殊なキー」という点で修飾キーと一緒に語られがちで、ソフトウェアキーボードに欠けている点も共通しています。ターミナル用途では Ctrl・Esc・Tab・矢印を1セットで考えるのが実用的です。

なぜコピーも中断も同じ Ctrl+C なのですか

別々の世界で独立に決まった割り当てが、後から同じ机の上に載ったからです。端末の Ctrl+C(割り込み)は1970年代の UNIX 端末の約束事で、GUI の Ctrl+C(コピー)は1980年代以降のパーソナルコンピュータの慣習です。どちらも定着しきった後で「GUI の中にターミナルがある」時代が来たため、衝突だけが残りました。Mac が GUI 側を Cmd に寄せて回避しているのは本文で述べたとおりです。

物理キーボードをつなげば全部解決しますか

修飾キーを送る経路は確保しやすくなりますが、すべての問題が解決するわけではありません。キーイベントとメタ状態が OS の想定どおりに流れるからです。残る課題は日本語入力の切り替えとキー配列の設定、そして何より「いつでも取り出せるわけではない」という物理的な制約です。机がある場所では物理キーボード、片手で立っているときはキーイベント対応のソフトウェアキーボード、と使い分けるのが現実解です。

右と左の Ctrl や Alt は同じものですか

OS の中では左右は別のキーとして届いていて、メタ状態のフラグも左右を区別できるようになっています。Android の KeyEvent には左右それぞれのキーコード(KEYCODE_CTRL_LEFT と KEYCODE_CTRL_RIGHT)があり、メタ状態も「どちらかの Ctrl」を表す META_CTRL_ON とは別に、左右を個別に表す META_CTRL_LEFT_ON と META_CTRL_RIGHT_ON が定義されています。ただしほとんどのアプリは左右を区別せず「Ctrl が押されている」とだけ見るので、実用上は同じと考えて構いません。例外は一部の配列で、右 Alt を AltGr と呼ばれる別の修飾キーとして扱い、追加の記号や文字を入力させるものがあります。ヨーロッパ系の配列で顕著な仕組みですが、「同じ見た目のキーが別の状態を運ぶことがある」という例として知っておくと、配列のトラブルで慌てずに済みます。

Fn キーはどういう仕組みですか

Fn は多くのキーボードで OS にすら届かない特殊なキーです。キーボード内部の回路が Fn の押下を見て「F1 を送るか、音量ダウンを送るか」を切り替えてから OS に送信するため、OS やアプリから Fn 自体は見えません。修飾キーがメタ状態として OS の中を流れるのと対照的で、「キーボードというハードウェアの中で完結する修飾」と考えると整理しやすいはずです。なお Android の KeyEvent には Function 修飾キーのキーコード(KEYCODE_FUNCTION)も定義されているので、Fn を OS に送る設計のキーボードであれば、他の修飾キーと同じくメタ状態として扱われます。

確認手順: Ctrl・Esc・Tab・矢印の4種類を通す

今日できる確認はひとつです。自分のスマホのターミナル環境で、Ctrl+C・Esc・Tab・矢印の4種類が打てるかを実際に試してください。SSH クライアントでも Termux でも構いません。

  1. sleep 10 を実行し、Ctrl+C で10秒待たずにプロンプトへ戻れるか確かめる
  2. コマンド名を途中まで打って Tab を押し、補完が働くか確かめる
  3. 上矢印で直前のコマンドが呼び出せるか確かめる。^[[A と表示されるだけなら、矢印は送れているが受け側が解釈していない状態なので、シェルのプロンプト上で試し直す
  4. Esc は vim など Esc を使うプログラムの中で確かめる。Esc キーがなければ Ctrl+[ で代用できるかも一緒に見る

打てないものがあれば、この記事の「4つの方法」から自分の使い方に合う経路を選んで埋める。それだけで、スマホのターミナル構成の操作できる範囲を確かめられます。修飾キーは地味ですが、ここが通れば次はショートカットの語彙、その次は tmux と、積み上げの道がまっすぐ伸びています。

押した状態だけでなく、解除された状態も確認する

修飾キーの確認は、目的のショートカットが一度成功したところで終わりにしません。次に通常の文字が入力できるかまで試します。タップで有効にするキーと、押している間だけ有効なキーでは、解除する操作やタイミングが異なるためです。

たとえば Ctrl を有効にして操作した後、練習用の入力欄で普通の文字を入れます。文字が出ず別の動作が起きたら、修飾キーの表示とロック状態を確認します。画面を切り替えた後や、物理キーボードを接続し直した後も、状態がどう見えるかを調べます。「一度送れた」と「続けて誤らず使える」を分けると、選ぶ基準が具体的になります。

確認する場面見るポイント
一回だけ使う次のキーの後で解除されるか
連続で使う有効な状態が表示でわかるか
操作を取り消す文字を送る前に解除できるか
別の画面に移る戻ったときの状態を判断できるか

アプリによって操作が違うため、すべてを同じタップ数に揃える必要はありません。使う道具で、有効化と解除の両方を説明できることを目指します。

コピーしたい場面と、中断したい場面を分ける

同じ Ctrl+C でも、何をしたいかを先に言葉にすると誤操作に気づきやすくなります。「表示されたログをコピーしたい」のなら、端末アプリの選択・コピー操作を確認します。「実行中の処理へ中断を求めたい」のなら、そのアプリが受け取る割り込み操作を確認します。

画面の文字を選択した状態では、選択していないときとキーの扱いが変わる端末アプリもあります。いつもと違う結果が出たら、接続先だけでなく、手元に選択範囲やメニューが残っていないかを見ます。コピーのつもりで処理を止める、または中断のつもりでコピーだけが行われる、という違いを切り分けます。

問題を記録するときは、端末アプリ名、接続方法、文字を選択していたか、実行中のアプリ、期待した操作を添えます。修飾キーが届く仕組みの理解を、実際に再現できる確認へつなげるための記録です。

参考リンク