• 作成:

日本語入力の切り替えをトグルからステートレスに切り替えました

日本語入力の切り替え方式を変えることにしました

私はUSキーボード使いでなおかつDvorak使いなので, Ctrlキーに近いC-;で日本語入力をトグルしていました.

しかし, 日本語入力をトグルする形式は, 既に日本語なのに日本語状態に入ろうとして解除してしまうなどの切り替えミスがよく発生してしまいます.

一応トグルであることのメリットも存在して, 使うキーが少なくキーバインドを圧迫しないことがメリットなのですが. 最もキーを使うFirefoxやEmacsでC-.を使ってなかったり, C-,があまり使われないコマンドに割り当てられてたり, メリットを享受出来ていませんでした.

前からトグルじゃないほうが良いなとは思っていたのですが, 最近これが強迫的に気になるようになってきてしまったので, 日本語入力をトグルではなくステートレスに切り替えようと思いました.

どのキーを切り替えに使うか

JISキーボードだと無変換変換キーを使う人が多いのですが, まずUSキーボードなのでそれはダメです.

USキーボード使いの他の人は右のAltキーやWindowsキーを割り当てる人が結構居るみたいですが, 私は右のAltやWindowsキーも使うのでダメです.

よってあまりアプリケーションのショートカットに使われておらず, Dvorakで比較的押しやすく, DvorakでもQwertyでも隣り合っている,.を切り替えに使うことにしました.

設定した後にSlackがショートカットに使っていることに気が付きましたがまあ良いか.

どうやって設定するか

私はGNU/LinuxでもWindowsでもMozc/Google日本語入力を使っているのでMozcのキーマップとして定義してやれば問題ないです.

後はEmacsの設定をちょっと変えれば問題ないですね.

Mozc

これまでC-;に以下のようにMozcでトグルでIME切り替えを割り当てていたのを変更します.

DirectInput	Ctrl ;	IMEOn
Precomposition	Ctrl ;	IMEOff
Composition	Ctrl ;	IMEOff
Conversion	Ctrl ;	IMEOff
Suggestion	Ctrl ;	IMEOff
Prediction	Ctrl ;	IMEOff

ここで詰まったのは, 何故かこれをそのまま

DirectInput	Ctrl .	IMEOn

のように変えてもC-.で日本語入力モードにならないことで悩んでいたのですが, Mozcをタスクバーから再起動したら治りました. 切り替え関係のはコアなので再起動しないと変更されないんですかね?

後はDvorakなので',.pyが上に順に並んでいるので, カンマは変換中にもIMEOffを入れるので抜かして, 順番に英数, ひらがな, カタカナ, 半角カタカナ変換を入れて終わり.

当初はC-.がIMEOnになった分これまで変換に使ってたキーが足りなくなると思いましたが, IMEOnにする機能は変換中には要らないのでひらがな変換に割り当てて問題ないですね.

Composition	Ctrl '	ConvertToHalfAlphanumeric
Conversion	Ctrl '	ConvertToHalfAlphanumeric

DirectInput	Ctrl ,	IMEOff
Precomposition	Ctrl ,	IMEOff
Composition	Ctrl ,	IMEOff
Conversion	Ctrl ,	IMEOff
Suggestion	Ctrl ,	IMEOff
Prediction	Ctrl ,	IMEOff

DirectInput	Ctrl .	IMEOn
Precomposition	Ctrl .	IMEOn
Prediction	Ctrl .	IMEOn
Composition	Ctrl .	ConvertToHiragana
Conversion	Ctrl .	ConvertToHiragana

Composition	Ctrl p	ConvertToFullKatakana
Conversion	Ctrl p	ConvertToFullKatakana

Composition	Ctrl y	ConvertToHalfKatakana
Conversion	Ctrl y	ConvertToHalfKatakana

Emacs

toggle-input-methodはあるのに何故か直接のオンオフの関数がないので定義してあげます.

(defun off-input-method ()
  (interactive)
  (deactivate-input-method))
(defun on-input-method ()
  (interactive)
  (activate-input-method default-input-method))

後はC-,, C-.に定義されてたコマンドを避難させて終わり.

と思ったらこのデスクトップマシンだとIBusのMozcで入力が可能になっていて, EmacsのMozcを介さずに入力が可能なのですよね.

再現条件は不明でラップトップだとEmacs上でIBusは有効にならないので, この状態を無効化する方法が分からない. 再現条件を確定させれば設定例として役に立つと思うのですが.

まあIBusを利用する方法はEmacsが表示をコントロールする方法に比べて, Mozcの変化予測の表示が高速でそれはそれで良いのですが. 問題点はIBus上でMozcを有効にしていても, IMEの有効化キーを押すとEmacs上でも有効になって多重に有効になってしまうことですね.

Precomposition	Ctrl .	IMEOn
Prediction	Ctrl .	IMEOn

を追加することでIME有効時にもEmacsにキー入力を渡さないことで解決しました.

Slack

SlackがC-,に設定画面を開くキーショートカットを割り当てています.

テキストボックスにフォーカスしていない時なら分かるのですが, テキストボックスにフォーカスして入力状態になっている時も開いてしまいます.

せっかく気兼ねなく日本語オフキーを押せる設定にしたのに気楽に押せなくなってしまいました.

DirectInput	Muhenkan	IMEOff
Precomposition	Muhenkan	IMEOff
Composition	Muhenkan	IMEOff
Conversion	Muhenkan	IMEOff
Suggestion	Muhenkan	IMEOff
Prediction	Muhenkan	IMEOff
DirectInput	Henkan	IMEOn
Precomposition	Henkan	IMEOn
Composition	Henkan	IMEOn
Conversion	Henkan	IMEOn
Suggestion	Henkan	IMEOn
Prediction	Henkan	IMEOn

で無変換変換でIME切り替えできるようにして, xkeysnailでC-,をSlackでは無変換に割り当てるようにして解決です.

define_keymap(re.compile("Slack"), {
    K("C-w"): K("MUHENKAN"),
}, "C-,のショートカットを無効化しつつIMEオフを維持する")

IMEオフにするだけのC-,だから無変換に単純に割り当てられました. C-.で似たようなことが起きたらどうするかは起きてから悩みます.