トップ 最新 追記

Catra's Diary

2005|01|02|03|05|06|07|10|
2006|05|07|09|10|11|
2007|06|07|08|
2008|01|02|07|09|11|12|
2009|06|
2010|03|07|
2011|01|
2013|05|

2010-03-01 [Monday]

_ キーボードショートカット

修飾キー (Ctrlキー、Altキー、場合によっては Shift キー)と組み合わせることで特殊な操作を行う、 キーボードショートカットの役割分担についてちょっと考えてみる。 なお、入力できるキーは JIS キーボード基準で考察 (101キーボードだと少し違う)。

何も修飾キーを押さない場合

この時、キーボードから入力できるのは、

  • 0x2c 〜 0x2f (','、'-'、'.'、'/')
  • 0x30 〜 0x3b ('0' 〜 '9'、':'、';')
  • 0x40 ('@')
  • 0x5b 〜 0x5e ('['、'\\'、']'、'^')
  • 0x61 〜 0x7a ('a' 〜 'z')

Shiftキーを押した場合

この時、キーボードから入力できるのは、

  • 0x21 〜 0x2b ('!'、'"'、'#'、'$'、'%'、'&'、'\''、'('、')'、'*'、'+')
  • 0x3c 〜 0x3f ('<'、'='、'>'、'?')
  • 0x41 〜 0x5a ('A' 〜 'Z')
  • 0x5f ('_')
  • 0x60 ('`')
  • 0x7b 〜 0x7e ('{'、'|'、'}'、'~')

Shift キーを押す・押さないで、ASCII の 0x21 〜 0x7e までの全範囲を入力することが出来る。 (0x20 はスペースキー、0x7f は DELETE キーなので範囲外)

Ctrlキーを押した場合

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キーを押した場合

Altキーは、入力したキーに 0x80 を加えた文字コードを生成する。(例:Altキー + 'a' (0x61) → 0xe1)

_ アプリケーションに割り当てるキーボードショートカット

ここで、ショートカットに割り振ることができる修飾キーの組み合わせについて考える。

コンソールアプリケーション

まずはコンソールアプリケーション。

  • SSH などの端末エミュレータ越しに文字コードベースの操作を行うことがある (キーボードの操作はアプリケーションに文字コードで通知される)

という前提条件がある場合、ショートカットキーに使用できるのは以下のキーのみ。

  • 何も修飾キーを押さない場合
  • Shift キーを押した場合
  • Ctrl キーと '@'、'a' 〜 'z'、'['、'\\'、']'、'^'、'_' を合わせて押下した場合
  • (確実ではないが) Alt キーと、上記3形式の組み合わせの場合

他にカーソルキーやファンクションキーなどがあるが、取り合えず今は割愛。 特殊キーには、コントロールキーを用いて入力可能なもの (例:TAB キー = Ctrlキー + 'i')があるため、 それらと Ctrl キーの同時押しは認識されない、などの制限が出てくる。

GUI アプリケーション

GUI アプリケーションの場合、文字コードによる組み合わせの制限がなくなるため、 コンソールアプリケーションの場合よりも多い、以下の組み合わせが使用可能となる。

  • 何も修飾キーを押さない場合
  • Shift キーを押した場合
  • Ctrl キーを押した場合
  • Shift キーと Ctrl キーを押した場合
  • Alt キーを押した場合
  • Alt キーと Shift キーを押した場合
  • Alt キーと Ctrl キーを押した場合
  • Alt キーと Shift キーと Ctrl キーを押した場合

ウインドウシステム用

GUI アプリケーションまでで Shift キー、Ctrl キー、Alt キーの全組合わせが使用可能であるため、 ウインドウシステムのように全体に影響を与えるような機能に対してショートカットを割り当てるには、 以下のような拡張が必要となる。

  • 新しい修飾キーを追加する (例:Windows の場合、Windows キーのこと)
  • 制御コード(0x00〜0x1F)を生成しないキーと、修飾キーの組み合わせ (例:Alt + カーソルキー など)
  • 通常使用しない特殊キー同士の同時押し (例:Windows の場合、 Ctrl + Alt + Delete や、Alt + Tab など)

2010-03-02 [Tuesday]

_ キーボードショートカット(特殊キーを含んだ場合)

昨日に引き続き、特殊キーを含んだ場合のキーボードショートカットについて。

コンソールアプリケーションと GUI アプリケーションで使用可能なキーを分けるのは、 ncurses (termcap または terminfo) で対応しているキーの組み合わせかどうか、という点。 この対応表には Shift キーによる修飾があるかどうかの情報も含まれているため、 コンソールアプリケーションで特殊キー単体押下と、Shift キーなどの修飾キー + 特殊キー押下が区別できるか、 という境目も ncurses に依存する。

端末エミュレータと ncurses (termcap または terminfo) の呼び方、TERM 環境変数の値などで 動作は異なるが、ここでは GNOME 端末、ncurses-5.7、 TERM=gnome という環境で動作させている。

コンソールアプリケーションで扱える特殊キーを分類すると、以下のようになる。

  • 制御コードを出力するキー (修飾なし、Shiftキー修飾、Ctrlキー修飾、Altキー修飾)
    • TAB (0x09, BTAB, 0x09, ウインドウ切り替えのため横取り(Alt + Tab))
    • Return (0x0d, 0x0d, 0x0d, 0x1b + 0x0d)
    • ESC (0x1b, 0x1b, 0x1b, ウインドウ切り替えのため横取り(Alt + ESC))
    • Space (0x20, 0x20, InputMethod呼び出しで横取り, GNOME端末のメニュー表示で横取り)
  • 特殊キーとして認識するキー(ncurses.h で KEY_〜 の形で宣言されている場合はその名前、 それ以外は識別するための定数)
    • キー修飾かどうかが識別できるキー (修飾なし、Shiftキー修飾、Ctrlキー修飾、Altキー修飾)
      • カーソルキー右 (RIGHT, SRIGHT, 0x022b, 0x0229)
      • カーソルキー左 (LEFT, SLEFT, 0x021c, 0x021a)
      • カーソルキー上 (UP, SR, 0x0231, 0x022f)
      • カーソルキー下 (DOWN, SF, 0x0208, 0x0206)
      • Deleteキー (DC, SDC, 0x0202, 0x0200)
      • ファンクションキー(F1〜F12)
    • Ctrlキー、Altキー修飾が識別できるキー (修飾なし、Ctrlキー、Altキー修飾。Shiftキー修飾ではキーイベント自体を検出できない)
      • Page Upキー (PPAGE, 0x0226, 0x0224)
      • Page Downキー (NPAGE, 0x221, 0x021f)
    • Altキーのみ修飾が識別できるキー (修飾なし、Altキー修飾。Shiftキー、Ctrlキー修飾ではキーイベント自体を検出できない)
      • Insertキー (IC, 0x0215)
    • キー修飾が識別できない組み合わせがある場合
      • Homeキー (Shiftキー修飾でキーイベント自体を検出できない他は、すべて KEY_HOME を検出)
      • Endキー (Shiftキー修飾でキーイベント自体を検出できない他は、すべて KEY_END を検出)
      • BackSpaceキー (Alt+キーで ESC + BACKSPACE を表示する以外は、すべて KEY_BACKSPACE を検出)

コンソールアプリケーションで認識できない(端末エミュレータでブロックされるなどで通知されない)特殊キーは以下。

  • Window Manager などが横取りする特殊キー
    • F1キー (ヘルプ表示)
    • 半角/全角キー (InputMethod 呼び出しに使用)
    • PrintScreenキー (画面のスクリーンショット取得)
    • コンテキストメニューキー (コンテキストメニュー表示)
  • 一部の Shiftキーによる修飾(上記参照)
  • 一部の Ctrlキーによる修飾(上記参照)
  • Altキーによる修飾 (一部不可。しかし Gnome端末では ESC + 押下したキーという形で無理やり送信している場合もある)
  • Windowsキー
  • ScrollLockキー
  • Pauseキー
  • 変換キー
  • 無変換キー
  • カタカナひらがなキー
  • テンキーからの入力(キーボードからの入力と区別できない)

_ そもそもなぜこんなことを考えたか

というと、以下の理由。

  • xmonad のショートカットについて考えてみたときに、アプリと Window Manager で使い分けるキーの線引きを どこですればいいか迷った。
  • Emacs のキーバインドで C-; および C-: に機能を割り当てて、端末エミュレータ越しの利用ができないということがあった。

トップ 最新 追記