• 作成:

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

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

私は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-.で似たようなことが起きたらどうするかは起きてから悩みます.