色々と事情がありまして*1、Google日本語入力のキーバインドを変更しようと思いました。付属ツール〈Google日本語入力のプロパティ〉のGUIからも変更できますが、テキストエディタを使ったほうが楽なので、タブ区切り形式のテキストファイルとしてキー設定をエクスポートして、それを編集しました。
この設定変更の過程で、Google日本語入力のコマンドと状態遷移について調査と実験をしたので、それについて記します。
内容:
- キー設定ファイルとコマンド
- 役割としてのキーと実物としてのキー
- 使わないコマンド
- Conversion状態とConvertコマンド
- Suggestion状態とPrediction状態
- 状態遷移図
- 檜山のキー設定の方針
- キー設定ファイル
- オマケ 1:コマンド名とその日本語表示名
- オマケ 2:コマンド一覧の作り方
キー設定ファイルとコマンド
Google日本語入力の設定ツール〈Google日本語入力のプロパティ〉を起動して、「一般タブ → キー設定の選択 → 編集 → 編集 → エクスポート」と操作して現在のキー設定をファイルに書き出すことができます。
キー設定ファイルはタブ区切りファイルです。1行は、タブで区切られた3つの欄〈フィールド〉から構成されます。例えば次のようです。
Composition Space Convert
- 左の欄: 状態〈status〉
- 真ん中の欄: キー〈key〉
- 右の欄: コマンド〈command〉
Google日本語入力(以下、IMEとも呼ぶ)の状態は次の6つがあります。
番号 | 状態名 | 日本語名 |
---|---|---|
1 | DirectInput | 直接入力 |
2 | Precomposition | 入力文字なし |
3 | Composition | 変換前入力中 |
4 | Suggestion | サジェスト表示中 |
5 | Prediction | サジェスト選択中 |
6 | Coversion | 変換中 |
これらの状態がどのように移り変わるかは、後で詳しく述べます。
IMEのコマンドはどんなものがあるのでしょう。いったんデフォルトに近い設定にしてキー設定をファイルに書き出して、コマンドを列挙してみました(このリストの作り方はオマケに書いてあります)。左の欄にある数値は、コマンドがキー設定ファイルに何回出現したかです。
2 Backspace 7 Cancel 11 CancelAndIMEOff 6 Commit 2 CommitFirstSuggestion 2 CommitOnlyFirstSegment 5 Convert 5 ConvertNext 1 ConvertNextPage 4 ConvertPrev 1 ConvertPrevPage 4 ConvertToFullAlphanumeric 4 ConvertToFullKatakana 4 ConvertToHalfAlphanumeric 4 ConvertToHalfWidth 4 ConvertToHiragana 1 ConvertWithoutHistory 2 Delete 1 DeleteSelectedCandidate 8 IMEOn 1 InsertAlternateSpace 1 InsertSpace 1 LaunchConfigDialog 1 LaunchWordRegisterDialog 2 MoveCursorLeft 2 MoveCursorRight 1 MoveCursorToBeginning 1 MoveCursorToEnd 4 PredictAndConvert 2 Reconvert 1 Revert 1 SegmentFocusFirst 1 SegmentFocusLast 1 SegmentFocusLeft 1 SegmentFocusRight 3 SegmentWidthExpand 3 SegmentWidthShrink 11 ToggleAlphanumericMode 1 Undo
キー設定ファイルにおいては、「どの状態で、どのキーを押したら、どのコマンドが動くか」を1行ずつ記述します。状態とコマンドに関する正確な仕様が見つからなかったので、実験(試行錯誤)で探りました。
役割としてのキーと実物としてのキー
キーの呼び名に関して混乱が生じないように約束を決めておきましょう*2。ブラケットで囲んだ [Space], [Shift] などは、実際のキーボード上に配置されている物理的キーを指すとします。それに対して、変換キー、確定キーなどの呼び名は、キーの抽象的な機能・役割による呼び名です。キーの抽象的な機能・役割は、IMEのコマンドにより実現されます。そして、物理的キーとコマンドとの対応を、キー設定ファイルでカスタマイズできます。
物理的キーを、[Shift] または [Ctrl] との同時押しで修飾できますが、[Shift]+[Ctrl]+[Alt]+[A] のように複数の修飾キーは使えません(使えたらいいのだけど)。
文脈から明らかに物理キーまたは物理キーのコンビネーションだと分かる場合は、ブラケットを省略することがあります。
使わないコマンド
まず僕は、コマンドを次の3種類に分けました。
- 使うコマンド
- 使わないのでキー設定ファイルから削除するコマンド
- 削除するか残すか、しばらく様子を見るコマンド
以下のコマンドは今まで(キーボードからは)使ったことがないので削除しました。
使わないコマンド名 | 説明 |
---|---|
ToogleAlphanumericMode | 英数入力モードの切り替え |
Revert | 最後の学習をキャンセル |
ConvertToFullAlphanumeric | 文字列を全角英数文字に変換 |
ConvertToHalfWidth | 文字列を半角文字に変換 |
ConvertWithoutHistory | 履歴を無視して変換 |
LaunchConfigDialog | 設定ツールを起動 |
LaunchWordRegisterDialog | 単語登録ツールを起動 |
次のコマンドは、使った記憶がないのですが、今後使う機会があるかも知れないので、一応残してあります。いずれもConversion状態で使うコマンドです。
- SegmentFocusLeft
- SegmentFocusRight
- SegmentFocusFirst
- SegmentFocusLast
Conversion状態とConvertコマンド
状態とコマンドについて説明していきます。
Conversion状態は、変換キー(僕は[Space]にしています)を押してから、確定またはキャンセルまでの状態です。変換候補の選択肢(リストダイアログ)による選択もConversion状態に含まれます(最初、僕はこの点を誤解してました)。
動詞"convert"が含まれる名前のコマンドが幾つかありますが、意味がバラバラで分かりにくいですね。
コマンド名 | 日本語名 | 説明 |
---|---|---|
Convert | 変換 | Conversion状態に状態遷移する |
PredictAndConvert | 予測変換 | Prediction状態に状態遷移する。 |
Reconvert | 再変換 | DirectInput状態からConversion状態に状態遷移する |
ConvertNext | 次候補を選択 | Conversion状態のなかで選択肢リストのフォーカスを動かす |
ConvertPrev | 前候補を選択 | Conversion状態のなかで選択肢リストのフォーカスを動かす |
ConvertNextPage | 次候補ページを選択 | Conversion状態のなかで選択肢リストの表示ページを変える |
ConvertPrevPage | 前候補ページを選択 | Conversion状態のなかで選択肢リストの表示ページを変える |
CovertTo* | *に変換 | Conversion状態のなかで文字種変換をする |
状態遷移を伴うかどうか? テキスト編集操作か選択リストのGUI(リストダイアログ)操作か? などの違いがありますが、名前だけでは判断できません(実験して調べた)。
Suggestion状態とPrediction状態
非常に分かりにくかったのはSuggestion状態〈サジェスト表示中〉とPrediction状態〈サジェスト選択中〉の違いです。
Suggestion状態は、独立した状態というよりはComposition状態〈変換前入力中〉と一体化していると思ったほうがいいでしょう。IMEを使って文字入力しているときは、特に状態遷移するキーを押さなくてもサジェッション(予測変換の候補)は出ています。この予測変換の候補に対する操作を、“Suggestion状態での操作”と(便宜上)呼んでいるのです。
Prediction状態は、やはりサジェッションを選択する状態ですが、リストダイアログGUIが出て選択肢リストからの選択をしている状態です。
ややこしいのは、Prediction状態は一人前の状態として扱われますが、辞書からの変換候補をリストダイアログGUIの選択肢リストから選択する状態は状態として独立しておらず、Conversion状態のなかに混ぜ込まれていることです。
この状態設計は、整合性と直交性に欠けていて嫌な感じです*3が、おそらく、歴史的経緯とかでこうなってしまったのでしょう。
状態遷移図
以下は、僕が試行錯誤により作成したIMEの状態遷移図です。公式の情報とかではないので、誤認があるかも知れません。印刷して、それをパソコンのそばの壁に貼って確認するつもりです。何か間違いが発見されれば修正します*4。
幾つかの注意点を以下に:
- Suggestion状態は、実際はComposition状態なので、点線で描いてあります。
- 変換語選択中はキー設定で使える状態ではありませんが、実質的には独立した状態と考えるべきです。点線で描いてあります。
- 菱形で描いてある状態はリストダイアログGUIが表示されるものです。
- (Del) と書いてあるのは、入力した文字が削除されることを示します。
- CancelAndIMEOffの矢印はいちいち描いていません。
- 状態遷移を引き起こさないコマンドは、まとめてアスタリスクで表しています。
檜山のキー設定の方針
全般的な方針
- 滅多に使わない機能で、マウス操作でも出来るものはキーにバインドしない。
- キーの機能が予測可能なように、出来る限り一貫した法則性を持たせる。
- 今まで使ったことのないコマンドは(今後も使わないだろうから)削除する。
- ホームポジションから遠いキーにはバインドしない。(幾つか例外があるが。)
キー設定中には、LaunchConfigDialog〈Google日本語入力のプロパティを起動〉を多用したのでキーバインドしてましたが、設定終了後は削除しました。
状態遷移
IMEのOnOffには、トグルを使わずに、OnするキーとOffするキーを分離します*6。
キー | コマンド |
---|---|
Henkan | IMEOn |
Muhenkan, Hiragana | CancelAndIMEOff |
ただし、Hankaku/Zenkakuはトグルで使用します。
状態遷移を引き起こす典型的なコマンドには標準的なキーを割り当てます。
キー | コマンド |
---|---|
Enter | Commit〈確定〉 |
Esc | Cancel〈キャンセル〉 |
Space | Convert〈変換〉 |
Tab | PredictAndConvert〈予測変換〉 |
可能な限り Enter = Ctrl+m、Esc = Ctrl+[ と設定します。
上記の状態遷移コマンド以外で、先の状態遷移図に出てきたコマンドとキー設定は、次のようです。
コマンド | 状態遷移 | キー |
---|---|---|
Reconvert | DirectInput → Conversion | Shift Henkan |
Undo | Precomposition → Composition | Ctrl z |
CommitFirstSuggestion | Suggestion → Precomposition | Ctrl Enter |
CommitOnlyFirstSegment | (変換語選択中) → Conversion | Ctrl j |
ConvertNext | Conversion → (変換語選択中) | Space |
カーソル/フォーカスの移動と文字削除
カーソル/フォーカスの移動はEmacs風のキーバインドを採用します。Ctrlで修飾することを'^'を前置して表すことにして、次の図のようです。
文字の削除はDeleteとBackspaceですが、可能な限り Delete = Ctrl+d、Backspace = Ctrl+h と設定します。
キー設定ファイル
色々な試行錯誤の結果として、現在のキー設定ファイルは次のようです。当面はこれを使ってみます。使っていて何かあればまた修正するかも知れません。
status key command ; 直接入力(DirectInput) ;; 状態遷移 DirectInput Hankaku/Zenkaku IMEOn DirectInput Henkan IMEOn DirectInput Shift Henkan Reconvert ; 入力文字なし(Precomposition) ;; 状態遷移 Precomposition Hankaku/Zenkaku CancelAndIMEOff Precomposition Muhenkan CancelAndIMEOff Precomposition Hiragana CancelAndIMEOff Precomposition Ctrl z Undo ;; 文字入力 Precomposition Space InsertSpace Precomposition Shift Space InsertAlternateSpace ; 変換前入力中(Composition) ;; 状態遷移 Composition Hankaku/Zenkaku CancelAndIMEOff Composition Muhenkan CancelAndIMEOff Composition Hiragana CancelAndIMEOff Composition ESC Cancel Composition Ctrl [ Cancel Composition Enter Commit Composition Ctrl m Commit Composition Space Convert Composition Tab PredictAndConvert ;; 文字削除/カーソル移動 Composition Delete Delete Composition Backspace Backspace Composition Ctrl h Backspace Composition Ctrl d Delete Composition Ctrl b MoveCursorLeft Composition Ctrl f MoveCursorRight Composition Ctrl e MoveCursorToEnd Composition Ctrl a MoveCursorToBeginning ;; 文字種変換 Composition Ctrl o ConvertToHalfAlphanumeric Composition Ctrl i ConvertToFullKatakana Composition Ctrl u ConvertToHiragana ; サジェスト表示中(Suggestion) ;; 状態遷移 ;;; Composition-Tab があれば、Suggestion-Tab は不要 Suggestion Ctrl Enter CommitFirstSuggestion ; サジェスト選択中(Prediction) ;; Predictionダイアログが出ている Prediction Ctrl n ConvertNext Prediction Ctrl p ConvertPrev Prediction Ctrl Delete DeleteSelectedCandidate ;;; Commit と Cancel はデフォルトで有効 ;;; Space と Shift Space は自動的に効く ;;; Shift Tab も Conversion から引き継ぐようだ ;;; Ctrl+Enterは、Prediction では効かないようだ、効いてほしいが Prediction Ctrl Enter CommitFirstSuggestion ; 変換中(Conversion) ;; 状態遷移 Conversion Hankaku/Zenkaku CancelAndIMEOff Conversion Muhenkan CancelAndIMEOff Conversion Hiragana CancelAndIMEOff Conversion ESC Cancel Conversion Ctrl [ Cancel Conversion Backspace Cancel Conversion Ctrl h Cancel Conversion Enter Commit Conversion Ctrl m Commit Conversion Ctrl j CommitOnlyFirstSegment ;;; 次の設定は必要 Conversion Tab PredictAndConvert ;; セグメント〈文節〉操作 Conversion Ctrl b SegmentWidthShrink Conversion Ctrl f SegmentWidthExpand ;; 文字種変換 Conversion Ctrl o ConvertToHalfAlphanumeric Conversion Ctrl i ConvertToFullKatakana Conversion Ctrl u ConvertToHiragana ;; Conversionダイアログが出る Conversion Space ConvertNext ;; Conversionダイアログの操作 Conversion Shift Space ConvertPrev ;;; Tabは自動的に ConvertNext ;;; 以下のConversion-Shift-Tab は、なぜかPredictionにも効くようだ Conversion Ctrl p ConvertPrev Conversion Ctrl n ConvertNext Conversion Shift Tab ConvertPrev Conversion Henkan ConvertNextPage Conversion Shift Henkan ConvertPrevPage ; セグメント操作 削除するか? 保留 Conversion Left SegmentFocusLeft Conversion Right SegmentFocusRight Conversion Ctrl Left SegmentFocusFirst Conversion Ctrl Right SegmentFocusLast ; END
お疲れさまでした>自分
オマケ 1:コマンド名とその日本語表示名
僕が気になった(よく分からなかった)コマンドだけです。
設定ファイル内の名前 | GUIツールでの表示 |
---|---|
ConvertNext | 次候補を選択 |
ConvertPrev | 前候補を選択 |
Reconvert | 再変換 |
Revert | 最後の学習をキャンセル |
Undo | 確定取り消し |
PredictAndConvert | 予測変換 |
CommitFirstSuggestion | 最初の予測変換候補を確定 |
ConvertNextPage | 次候補ページを選択 |
ConvertPrevPage | 前候補ページを選択 |
DeleteSelectedCandidate | 選択候補を履歴から削除 |
LaunchConfigDialog | プロパティを起動 |
オマケ 2:コマンド一覧の作り方
コマンドの一覧を作るには、次のコマンドラインをbashで実行します。
$ cut -d$'\t' -f3 keymap.txt | sort | uniq -c
僕は、コメントとしてセミコロンで始まる行を入れたので、コメント行を除去するために次のようにします。
$ grep -v "^;" keymap.HIYAMA.txt | cut -d$'\t' -f3 | sort | uniq -c
一行目にあるヘッダと空白行が入り込みますが、それは最後に手で取りました。
詳しくは次の記事を参照してください。