修飾キー (Ctrlキー、Altキー、場合によっては Shift キー)と組み合わせることで特殊な操作を行う、 キーボードショートカットの役割分担についてちょっと考えてみる。 なお、入力できるキーは JIS キーボード基準で考察 (101キーボードだと少し違う)。
この時、キーボードから入力できるのは、
この時、キーボードから入力できるのは、
Shift キーを押す・押さないで、ASCII の 0x21 〜 0x7e までの全範囲を入力することが出来る。 (0x20 はスペースキー、0x7f は DELETE キーなので範囲外)
Ctrlキーを押すことで、0x00 〜 0x1f の範囲を入力することが出来る。 これは、Ctrlキーを 0x40 〜 0x5f ('@'、'A' 〜 'Z'、'['、'\\'、']'、'^'、'_') と合わせて押下し、 押されたキーから 0x40 引いた文字コードを入力したとみなすことで実現している (例:Ctrlキー + '@' → 0x00)。
ただし、通常 'A' 〜 'Z' を入力するには Shift キーを押さないといけない。 杓子定規に当てはめるとCtrlキーの時は必ず Shift キーを押さないといけないことになるが、 それは面倒なので、'A' 〜 'Z' の部分は 'a' 〜 'z' で代用する。
つまり、文字コードベースで考えると Ctrl キーと組み合わせてコードを生成できるのは、 '@'、'a' 〜 'z'、'['、'\\'、']'、'^'、'_' のキーのみ。 これ以外のキーは Ctrl キーと合わせて使用しても、対応する文字コードが無いため有効とはならない。
Altキーは、入力したキーに 0x80 を加えた文字コードを生成する。(例:Altキー + 'a' (0x61) → 0xe1)
ここで、ショートカットに割り振ることができる修飾キーの組み合わせについて考える。
まずはコンソールアプリケーション。
という前提条件がある場合、ショートカットキーに使用できるのは以下のキーのみ。
他にカーソルキーやファンクションキーなどがあるが、取り合えず今は割愛。 特殊キーには、コントロールキーを用いて入力可能なもの (例:TAB キー = Ctrlキー + 'i')があるため、 それらと Ctrl キーの同時押しは認識されない、などの制限が出てくる。
GUI アプリケーションの場合、文字コードによる組み合わせの制限がなくなるため、 コンソールアプリケーションの場合よりも多い、以下の組み合わせが使用可能となる。
GUI アプリケーションまでで Shift キー、Ctrl キー、Alt キーの全組合わせが使用可能であるため、 ウインドウシステムのように全体に影響を与えるような機能に対してショートカットを割り当てるには、 以下のような拡張が必要となる。
昨日に引き続き、特殊キーを含んだ場合のキーボードショートカットについて。
コンソールアプリケーションと GUI アプリケーションで使用可能なキーを分けるのは、 ncurses (termcap または terminfo) で対応しているキーの組み合わせかどうか、という点。 この対応表には Shift キーによる修飾があるかどうかの情報も含まれているため、 コンソールアプリケーションで特殊キー単体押下と、Shift キーなどの修飾キー + 特殊キー押下が区別できるか、 という境目も ncurses に依存する。
端末エミュレータと ncurses (termcap または terminfo) の呼び方、TERM 環境変数の値などで 動作は異なるが、ここでは GNOME 端末、ncurses-5.7、 TERM=gnome という環境で動作させている。
コンソールアプリケーションで扱える特殊キーを分類すると、以下のようになる。
コンソールアプリケーションで認識できない(端末エミュレータでブロックされるなどで通知されない)特殊キーは以下。
というと、以下の理由。