keymap.confの文法

概要

AquaSKK では全てのキー入力をイベントにマッピングして処理します。このマッピングを定義するのが keymap.conf です。もしカスタマイズが必要になった場合には

/Library/Input Methods/AquaSKK.app/Contents/Resources/keymap.conf

~/Library/Application Support/AquaSKK/

にコピーしてから該当箇所を編集して下さい。メニューから「設定ファイルの再読み込み」を選択するとこで、変更内容を反映することができます。

基本的な書式

keymap.conf では「行」が設定の単位となります。各行には「識別子」と「キー割り当て」のペアを定義します。先頭が "#" で始まる行と空行は無視されます。識別子とキー割り当ての間には、一個以上の空白が必要です。

識別子                  キー割り当て

実際の keymap.conf の一部は以下のようになっています。

# ======================================================================
# event section
# ======================================================================

SKK_JMODE               ctrl::j
SKK_ENTER               group::hex::0x03,0x0a,0x0d||ctrl::m
SKK_CANCEL              ctrl::g||hex::0x1b
SKK_BACKSPACE           hex::0x08||ctrl::h
SKK_DELETE              hex::0x7f||ctrl::d
SKK_TAB                 hex::0x09||ctrl::i
SKK_PASTE               ctrl::y
SKK_LEFT                hex::0x1c||ctrl::b
SKK_RIGHT               hex::0x1d||ctrl::f
SKK_UP                  hex::0x1e||ctrl::a
SKK_DOWN                hex::0x1f||ctrl::e
SKK_PING                ctrl::l

# ======================================================================
# attribute section(for SKK_CHAR)
# ======================================================================

ToggleKana              q
ToggleJisx0201Kana      ctrl::q
SwitchToAscii           l
SwitchToJisx0208Latin   L

識別子にはイベントと属性、ハンドリングオプションの三種類がありますが、詳しくは後程説明します。

キー割り当ては「0 個以上のキーラベル + キー」という形式になっています。キーラベルの一覧は以下の通り。

  • hex::
    入力キーを 16進数の ASCII とします。hex::0x1b で ESC です。
  • keycode::
    入力キーを 16進数のキーコードとします。keycode::0x66 で英数キーです。
  • ctrl::、shift::、alt::、meta::
    キー修飾を生成します。ctrl::j で Ctrl-J、shift::hex::0x20 で Shift-SPACE になります。
  • group::
    キー集合を表現します。"," による列挙と "-" による範囲コードの生成によって構成されます。 group::a-d,f といった具合です。

組み合わせルール

キーラベルは自由な順番で組み合わせることが可能です。例えば、Ctrl-a、Ctrl-b、Ctrl-c を表現するなら、以下の 2 行のどちらも使うことができます。

ctrl::hex::group::0x61-0x63
group::ctrl::a-c

組み合わせの例外として、hex:: と keycode:: を混在させることはできません。つまり、hex::keycode::0x88 は NG となります。

また、キー割り当ては間に "||" を挟むことで好きなだけ繋げることができます。例えば、hex::0x08||ctrl::i とすることで、TAB と Ctrl-I を表現することができます。

イベント識別子

イベントの種類とデフォルトのマッピングは以下のようになっています。

  • SKK_JMODE → ctrl::j
    現在の入力を確定し、ひらかなモードへ遷移します。
  • SKK_ENTER → group::hex::0x03,0x0a,0x0d||ctrl::m
    現在の入力を確定します。変換確定時に改行を挿入するかどうかは環境設定で変更できます。
  • SKK_CANCEL → ctrl::g||hex::0x1b
    現在の入力をキャンセルします。
  • SKK_UNDO → ctrl::/
    選択中の文字列に対して、逆引き変換をします。
  • SKK_BACKSPACE → hex::0x08||ctrl::h
    カーソル位置の左にある文字を削除して後退します。
  • SKK_DELETE → hex::0x7f||ctrl::d
    カーソル位置の右にある文字を削除します。
  • SKK_TAB → hex::0x09||ctrl::i
    見出し語を補完します。
  • SKK_PASTE → ctrl::y
    クリップボードから文字列をペーストします。
  • SKK_LEFT → hex::0x1c||ctrl::b
    カーソルを左移動します。
  • SKK_RIGHT → hex::0x1d||ctrl::f
    カーソルを右移動します。
  • SKK_UP → hex::0x1e||ctrl::a
    カーソルを行の先頭に移動します。
  • SKK_DOWN → hex::0x1f||ctrl::e
    カーソルを行の末尾に移動します。
  • SKK_PING → ctrl::l
    現在の入力モードを表示させます。
  • SKK_CHAR → 上記以外の全てのキー入力
    ローマ字かな変換等に利用されます。後述の「SKK_CHAR 属性」を参照して下さい。

なお、複数のイベントに同一のキーを割り当てることはできません。例えば、SKK_LEFT と SKK_RIGHT に同じキーが割り当てられた場合の挙動は未定義です。

SKK_CHAR 属性識別子

SKK_CHAR イベントのキーには、複数の SKK_CHAR 属性が割り当てられることもあります。これらの属性は、入力時の状況に応じて適切に評価されます。

  • ToggleKana → q
    ひらかなモードとカタカナモードをトグルします。見出し語入力時にはトグル変換になります。
  • ToggleJisx0201Kana → ctrl::q
    半角カナモードとトグルします。見出し語入力時にはトグル変換になります。
  • EnterAbbrev → /
    Abbrev モードに遷移します。
  • EnterJapanese → Q
    見出し語入力モードに遷移します。
  • NextCandidate → hex::0x20||ctrl::n
    次の変換候補に移動します。
  • PrevCandidate → x||ctrl::p||shift::hex::0x20
    前の変換候補に移動します。
  • UpperCases → group::A-K,M-P,R-Z
    見出し語入力のきっかけとなるキーを定義します。
  • Direct → group::keycode::0x41,0x43,0x45,0x4b,0x4e,0x51-0x59,0x5b,0x5c,0x5f
    ローマ字かな変換をバイパスするキーを定義します。
  • InputChars → group::hex::0x20-0x7e
    ローマ字かな変換を行うキーを定義します。
  • CompConversion → alt::hex::0x20||shift::hex::0x20
    見出し語入力時に補完して変換するキーを定義します。

ハンドリングオプション

極めて特殊な状況に対応するために用意されています。不適切な設定を行うと正しく動作しない可能性がありますので、十分に注意して下さい。

  • AlwaysHandled → group::keycode::0x66,0x68
    イベントや SKK_CHAR 属性の割り当てとは無関係に、常に「処理済み」とするキーを定義します。処理済みのキーはアプリケーションに渡されません。
  • PseudoHandled → ctrl::l
    AquaSKK で処理しても「未処理」とし、アプリケーション側に渡すキーを定義します。未確定文字列がない場合のみ有効です。

その他

何か思い出したら書きます。