このブログの更新は Twitterアカウント @m_hiyama で通知されます。
Follow @m_hiyama

メールでのご連絡は hiyama{at}chimaira{dot}org まで。

はじめてのメールはスパムと判定されることがあります。最初は、信頼されているドメインから差し障りのない文面を送っていただけると、スパムと判定されにくいと思います。

参照用 記事

Google日本語入力のコマンドと状態遷移を解明する

色々と事情がありまして*1Google日本語入力キーバインドを変更しようと思いました。付属ツール〈Google日本語入力のプロパティ〉のGUIからも変更できますが、テキストエディタを使ったほうが楽なので、タブ区切り形式のテキストファイルとしてキー設定をエクスポートして、それを編集しました。

この設定変更の過程で、Google日本語入力のコマンドと状態遷移について調査と実験をしたので、それについて記します。

内容:

キー設定ファイルとコマンド

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種類に分けました。

  1. 使うコマンド
  2. 使わないのでキー設定ファイルから削除するコマンド
  3. 削除するか残すか、しばらく様子を見るコマンド

以下のコマンドは今まで(キーボードからは)使ったことがないので削除しました。

使わないコマンド名 説明
ToogleAlphanumericMode 英数入力モードの切り替え
Revert 最後の学習をキャンセル
ConvertToFullAlphanumeric 文字列を全角英数文字に変換
ConvertToHalfWidth 文字列を半角文字に変換
ConvertWithoutHistory 履歴を無視して変換
LaunchConfigDialog 設定ツールを起動
LaunchWordRegisterDialog 単語登録ツールを起動

次のコマンドは、使った記憶がないのですが、今後使う機会があるかも知れないので、一応残してあります。いずれもConversion状態で使うコマンドです。

  1. SegmentFocusLeft
  2. SegmentFocusRight
  3. SegmentFocusFirst
  4. 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

*5

幾つかの注意点を以下に:

  1. Suggestion状態は、実際はComposition状態なので、点線で描いてあります。
  2. 変換語選択中はキー設定で使える状態ではありませんが、実質的には独立した状態と考えるべきです。点線で描いてあります。
  3. 菱形で描いてある状態はリストダイアログGUIが表示されるものです。
  4. (Del) と書いてあるのは、入力した文字が削除されることを示します。
  5. CancelAndIMEOffの矢印はいちいち描いていません。
  6. 状態遷移を引き起こさないコマンドは、まとめてアスタリスクで表しています。

檜山のキー設定の方針

全般的な方針
  1. 滅多に使わない機能で、マウス操作でも出来るものはキーにバインドしない。
  2. キーの機能が予測可能なように、出来る限り一貫した法則性を持たせる。
  3. 今まで使ったことのないコマンドは(今後も使わないだろうから)削除する。
  4. ホームポジションから遠いキーにはバインドしない。(幾つか例外があるが。)

キー設定中には、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で修飾することを'^'を前置して表すことにして、次の図のようです。

*7

文字の削除は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

一行目にあるヘッダと空白行が入り込みますが、それは最後に手で取りました。

詳しくは次の記事を参照してください。

*1:その事情は別なブログ記事に書くかも知れません。

*2:ここで決めた約束を記事内であまり使ってません。別な機会に参照できるからいいとします。

*3:内部的には整理されているのかも知れませんが、少なくともキー設定する上でのモデルとしての状態遷移は歪んでいます。

*4:Graphvizで描いているので、修正は楽です。

*5:SVGのソースは短縮URLに入りきれなかったようです。

*6:今までトグル方式で便利に使っていたのですが、とある事情(今日は割愛)でトグルがとても使いにくくなってしまいました。それが、今回キー設定をやり直すことになった事情です。

*7:SVGソース:https://bit.ly/3eHi5xi