窓使いの憂鬱 / のどか / yamy のキーマップの概念

窓使いの憂鬱 / のどか / yamy のキーマップの概念と、キーマップを定義する文の仕様がいまひとつよく分からなかったので調べてみました。
たぶんこんなかんじだと思います。

キーマップの概念

  • キーマップは、1つのキーマップ名と、1つのウィンドウと、1つのデフォルトキーと、1つの親キーマップと、0個以上のキー割り当てと、0個以上のモディファイヤキー割り当てを持つ。JSONぽく書くとこんなかんじ(厳密ではない):
{
    'name': 'Global',
    'window': '( // || // )',
    'defaultKeySeq': '&OtherWindowClass',
    'parentKeymap': '',
    'keyAssignments': {'C-N':'Down', 'C-P':'Up', ... },
    'modAssignments': {'shift':'E0RShift', ... }
}
  • キーマップ名とは、キーマップを識別する名前である。
  • ウィンドウとは、キーマップを適用するウィンドウの、ウィンドウクラス名か、( ウィンドウクラス名 && ウィンドウタイトル名 )か、( ウィンドウクラス名 || ウィンドウタイトル名 )である。
  • デフォルトキーとは、キー割り当てにないキーが押されたときに評価されるキーまたは関数である。
  • 親キーマップとは、&KeymapParent関数が評価されたときに見に行くキーマップである。親キーマップがない場合、&Default扱いになる。
  • キー割り当てとは、キー割り当てである。
  • モディファイヤキー割り当てとは、モディファイヤキー割り当てである。

キーマップを定義する文の仕様

文法([...]はオプション)
keymap キーマップ名 [: 親キーマップ名] [= デフォルトキー]
keymap2 キーマップ名 [: 親キーマップ名] [= デフォルトキー]
window キーマップ名 [ウィンドウクラス名] [: 親キーマップ名] [= デフォルトキー]
window キーマップ名 [( ウィンドウクラス名 && ウィンドウタイトル名 )] [: 親キーマップ名] [= デフォルトキー]
window キーマップ名 [( ウィンドウクラス名 || ウィンドウタイトル名 )] [: 親キーマップ名] [= デフォルトキー]
keymapとkeymap2とwindowの違い
ウィンドウ デフォルトのウィンドウ デフォルトのデフォルトキー デフォルトの親キーマップ名
keymap 指定できない なし &KeymapParent なし
keymap2 指定できない なし &Undefined なし
window 指定できる なし &KeymapParent なし
keymap文、keymap2文、window文の仕様

keymap文、keymap2文、window文には、キーマップを作成する機能と、キーマップを選択する機能の2つの機能がある。処理は以下の順に行われる。

  1. 引数で与えられた名前のキーマップが存在しなければ、引数で与えられた名前、ウィンドウ、デフォルトキー、親キーマップ名を使って新しいキーマップを作る。
  2. 引数で与えられた名前のキーマップを選択する。

メモ

  • キーマップの概念より、1つのキーマップを複数のウィンドウに関連付けることはできない。
  • キーマップ'Global'のデフォルトキーは&OtherWindowClass*1なので、キー捜しが終端するとは限らない。