[Mac][Emacs] mozc-emacs-helperとOSXのIMを連動させる (toggle-input-method, 英数/かなキー)
MacのEmacsでIMにMozcを使った場合、Emacs側とMac側のIM切り替えが連動しません。正確にはMacでMozcを選んだ場合ではなくEmacsでmozc-emacs-helperを使った場合です。Mac側のIMの状態によってはEmacsで打った文字が入力できない状況になり「IMの切り替え、再度文字の打ち直し」の作業が必要になってしまい結構不便な状態になります。
目次
MacのEmacsでMozcを使うメリット
最初にMac上のEmacsでMozcを使うメリットに触れておきます。大きなメリットとしてはインターフェースや操作感、設定をEmacs上で統一できることとelispで諸々制御できる事です。Mac以外にもLinuxなどでも環境でMozcを使っている場合は環境をまたがっても操作感を統一できるのは結構メリットかと思います。
なおMacでMozcを使う場合、設定ツールは動きませんがGoogle日本語入力の辞書や設定が流用できます。なのでGoogle日本語入力の辞書や設定にシンボリックリンクを貼って対応しています。
Mozcの変換候補キーバインドもGoogle日本語入力で設定できます。僕はisearch系の動作と統一してC-s、C-rで変換候補が選択できるようにしています。
Emacs+Mozcでの変換候補の表示
モードレス日本語入力が利用できます
elispからIMをコントロールできますので、モードレス日本語入力を実現する「ac-mozc」や「mozc-temp」といったパッケージも使えるようになります。
日本語と英語が混在している文章を打つのは都度IMを切り替えないといけないため面倒です。それを解決するひとつの方法がモードレス日本語入力でIMを日本語モードにすることなくローマ字を打てば日本語/英語に都度変換できます。僕はmozc-tempをよく使いますが、例えばローマ字で「kyou」と打ち変換キーを押せば「今日」と変換できます。英語であれば変換せずにそのまま打てばいいわけです。
Macのライブ変換が同様の機能になるかと思います。違いはac-mozcやmozc-tempは英語ベースの文章に特に使いやすいかと思います。Macのライブ変換は英単語を打つのにやや難があるように感じました。
ac-mozcによるモードレス日本語入力の実際の動作は動画を見るとわかりやすいです。
問題の状況
話が逸れてしまいましたが本題に戻りたいと思います。
問題の状況がどういう感じになるかというとMac側でIMをONしていた状況でEmacsに移って文字を入力しようとすると "wrong response server..." といった感じのメッセージが出て入力した文字が反映されず弾かれてしまいます。要は入力できません。Mac側でIMを切り替えて再入力する必要がありかなりストレスが溜まります。
M-x toggle-input-method (C-\) で切り替えてもemacs-mozc-helperを通しEmacs環境でのIMは切り替わるけれどMac側のシステムのIMを切り替えることはできません。
入力するにはMac側でIMをOFFにする必要があってメニューバーのアイコンをクリックするとか、ブラウザなど他のアプリでIMを切り替えるなどしないといけないので相当に不便です。
原因
emacs-mozc-helperは直接Mozc serverと通信する様でMac側のIMは利用しない模様です。また当然ながらMac側のIMはmozc-emacs-helperは利用しません。わかりやすく言えばMacのIMの他に、Emacs内部に別のIMがある様な状態です。
なのでメリットと呼べるかわかりませんがMacではことえりやライブ変換、ATOK、Google日本語入力、かわせみといった別のIMを使いながら、EmacsではMozcを使うといったことが可能。ブラウザやMacの他のアプリではライブ変換を使いながら、EmacsだけMozcを使うといったことができます。
ただしこの場合、ある意味当然ながらブラウザ側からEmacsのMozcを制御できませんし、Emacs側でMacのIMを制御することができません。基本的にはこれでも問題ないのですが、肝心なEmacsの場合だけ先ほど書いた入力できない問題が発生してしまいます。
対策
toggle-input-methodの利用
最初考えたのはEmacsでtoggle-input-methodする際に、Mac側のIMの状態を取得して日本語入力モードであればOFFにする方法。
ただやってみてわかった問題はMacのIMの状態取得や日本語入力モードをOFFにするコマンドがわからなかったこと。何か方法があるのかもしれませんがわかりませんでした。
なので日本語入力をOFFにする方法としては英数キーをエミュレートすることに。状態取得は不明だったのでtoggle-input-method時に毎回英数キーを内部的に押すアドバイスを書いて一応は動きました。
ただこの方法だと毎回英数キーが内部的に押されるので気持ち悪いですし動きも重くなるかなと考えていたところ、focus系のhookがEmacs24.4から実装されているとのことでそちらを使うことに。他のアプリからEmacsにフォーカスが移ったタイミングで英数キーを内部的に押しています。
そんなかんなで現在の設定はこんな感じです。
<span style="color: #6d6d6d;">;; </span><span style="color: #6d6d6d; font-style: italic;">英数キーをエミュレートする </span><span style="color: #216b9e;">(</span><span style="color: #f63249;">defun</span> <span style="color: #2e98e2;">my/eisuu-key</span> <span style="color: #2476ae;">()</span> <span style="color: #4c406d; font-style: italic;">"英数キーのエミュレート"</span> <span style="color: #2476ae;">(</span><span style="color: #f63249;">interactive</span><span style="color: #2476ae;">)</span> <span style="color: #2476ae;">(</span>call-process <span style="color: #97d8ea;">"osascript"</span> nil t nil <span style="color: #97d8ea;">"-e"</span> <span style="color: #97d8ea;">"tell application \"System Events\" to key code 102"</span><span style="color: #2476ae;">)</span> <span style="color: #216b9e;">)</span> <span style="color: #6d6d6d;">;; </span><span style="color: #6d6d6d; font-style: italic;">focus-in-hookを利用してフレームがアクティブになった時に実行させる。 </span><span style="color: #216b9e;">(</span>add-hook 'focus-in-hook 'my/eisuu-key<span style="color: #216b9e;">)</span>
英数/かなキーの利用
Macでは英数/かなキーで英語と日本語入力モードを一発で切り替えることができます。これは便利なので使っている人が多いかと思います。僕は英語キーボードを利用していますがこれは非常に便利な機能なのでkarabinerを利用して同じ機能を実現しています。
英語キーボードでもkarabinerを使うことで、Commandキーが単独で押された場合に英数/かなキーの動作をさせることができます。
今回はこれにひと工夫で、EmacsでMozcを使っている場合にも英数/かなキーが使えるようにしています。デフォルトのkarabinerの設定ではMac側のIMは切り替えられますがmozc-emacs-helperの制御ができないため、Emacsでは切り替えできません。
その辺りの設定が以下の内容です。Emacs側ではMozcのON/OFFコマンドを用意してキーを割り当てています。karabinerでは次のような独自アクションを追加しています。Emacsの時のみCommandキー空打ちでMozcのON/OFF、Commandキーが他のキーと押された場合通常のCommandキーとして動作。
なお僕の環境では右OptキーをHyperキーに設定しています。
Emacs側の設定
<span style="color: #216b9e;">(</span><span style="color: #f63249;">defun</span> <span style="color: #2e98e2;">my/activate-mozc</span> <span style="color: #2476ae;">()</span> <span style="color: #4c406d; font-style: italic;">"activate input method mozc."</span> <span style="color: #2476ae;">(</span><span style="color: #f63249;">interactive</span><span style="color: #2476ae;">)</span> <span style="color: #2476ae;">(</span>activate-input-method 'japanese-mozc<span style="color: #2476ae;">)</span><span style="color: #216b9e;">)</span> <span style="color: #216b9e;">(</span><span style="color: #f63249;">defun</span> <span style="color: #2e98e2;">my/deactivate-mozc</span> <span style="color: #2476ae;">()</span> <span style="color: #4c406d; font-style: italic;">"deactivate input method."</span> <span style="color: #2476ae;">(</span><span style="color: #f63249;">interactive</span><span style="color: #2476ae;">)</span> <span style="color: #2476ae;">(</span>deactivate-input-method<span style="color: #2476ae;">)</span><span style="color: #216b9e;">)</span> <span style="color: #6d6d6d;">;; </span><span style="color: #6d6d6d; font-style: italic;">karabiner用 </span><span style="color: #6d6d6d;">;; </span><span style="color: #6d6d6d; font-style: italic;">普段使わなそうなキーにMozcのON/OFFを割当 </span><span style="color: #216b9e; text-decoration: underline;">(</span><span style="color: #f63249; text-decoration: underline;">bind-keys*</span> <span style="color: #2476ae;">(</span><span style="color: #97d8ea;">"H-<f3>"</span> . my/activate-mozc<span style="color: #2476ae;">)</span> <span style="color: #2476ae;">(</span><span style="color: #97d8ea;">"H-<f4>"</span> . my/deactivate-mozc<span style="color: #2476ae;">)</span><span style="color: #216b9e;">)</span>
karabinerの設定
~/Library/Application Support/Karabiner/private.xml
<?<span style="color: #f63249;">xml</span> <span style="color: #8584ae;">version</span>=<span style="color: #97d8ea;">"</span><span style="color: #97d8ea;">1.0</span><span style="color: #97d8ea;">"</span>?> <<span style="color: #2e98e2;">root</span>> <<span style="color: #2e98e2;">item</span>> <<span style="color: #2e98e2;">name</span>>Command to activate/deactivate in<span style="color: #00ff00; font-weight: bold;">put</span> method in Emacs</<span style="color: #2e98e2;">name</span>> <<span style="color: #2e98e2;">appendix</span>>(コマンドキーの空打ちで「Emacs-Mozcの英数/かな」)</<span style="color: #2e98e2;">appendix</span>> <<span style="color: #2e98e2;">appendix</span>>(コマンドキーを押している間に他のキーを打つとコマンドキーとして動作。</<span style="color: #2e98e2;">appendix</span>> <<span style="color: #2e98e2;">appendix</span>>ただし、他のキーを離す前にコマンドキーを離した場合は「Emacs-Mozcの英数/かな」として扱う。)</<span style="color: #2e98e2;">appendix</span>> <<span style="color: #2e98e2;">appendix</span>>左コマンドキーはOSXのIMEがONの場合、OSXのIMEをOFFにした後、Mozcを英数モードに切り替え</<span style="color: #2e98e2;">appendix</span>> <<span style="color: #2e98e2;">identifier</span>>Private.remap.japanese_command2eisuukana_prefer_command_v2</<span style="color: #2e98e2;">identifier</span>> <<span style="color: #2e98e2;">only</span>>EMACS</<span style="color: #2e98e2;">only</span>> <<span style="color: #2e98e2;">autogen</span>> __KeyOverlaidModifier__ KeyCode::COMMAND_L, KeyCode::VK_CONFIG_SYNC_KEYDOWNUP_private_notsave_japanese_command2eisuukana_prefer_command_v2, ModifierFlag::COMMAND_L, KeyCode::F4, ModifierFlag::OPTION_R, </<span style="color: #2e98e2;">autogen</span>> <<span style="color: #2e98e2;">autogen</span>> __KeyOverlaidModifier__ KeyCode::COMMAND_R, KeyCode::VK_CONFIG_SYNC_KEYDOWNUP_private_notsave_japanese_command2eisuukana_prefer_command_v2, ModifierFlag::COMMAND_R, KeyCode::F3, ModifierFlag::OPTION_R, </<span style="color: #2e98e2;">autogen</span>> </<span style="color: #2e98e2;">item</span>> <<span style="color: #2e98e2;">item</span> <span style="color: #8584ae;">hidden</span>=<span style="color: #97d8ea;">"</span><span style="color: #97d8ea;">true</span><span style="color: #97d8ea;">"</span>> <<span style="color: #2e98e2;">identifier</span> <span style="color: #8584ae;">vk_config</span>=<span style="color: #97d8ea;">"</span><span style="color: #97d8ea;">true</span><span style="color: #97d8ea;">"</span>>private_notsave.japanese_command2eisuukana_prefer_command_v2</<span style="color: #2e98e2;">identifier</span>> <<span style="color: #2e98e2;">autogen</span>>__BlockUntilKeyUp__ KeyCode::COMMAND_L</<span style="color: #2e98e2;">autogen</span>> <<span style="color: #2e98e2;">autogen</span>>__BlockUntilKeyUp__ KeyCode::COMMAND_R</<span style="color: #2e98e2;">autogen</span>> </<span style="color: #2e98e2;">item</span>> </<span style="color: #2e98e2;">root</span>>
上の設定をしてkarabinerの設定画面でprivate.xmlの再読み込みをすると追加したアクションが表示されるのでチェックをつけると動作するようになります。下記の画像の赤枠の部分が追加したアクションです。
追記: osascriptのエラーが発生する場合
コメントを頂きましたので補足です。動作実行中にosascriptのエラーメッセージが表示される場合があります。これは新しい64bitのOSX環境で32bitのAdobe Unit Types.osaxのライブラリが入っている場合に発生する模様です。
解決方法についてはAdobeからPDFファイルが提供されていますのでその手順に従います。PDFには3通りの解決方法が書かれていますがその内のひとつ目 "Solution 1: Update the Adobe Unit Types.osax to version 2.1.0." を実行します。残りの2つの手順は「32bitモードで実行する」、「別のコマンドを使う」というものですので抜本的な解決にはなりません。
Adobe Photoshop CS4 Troubleshooting.pdf
PDF内の手順を簡単に和訳しておきます。なおダウンロードリンクはPDF内を参照ください。
- こちらをクリックしてAdobe Unit Types.osax version 2.1.0 のファイルをダウンロードしてください。
- Finderなどで /Library/ScriptingAdditions フォルダを選択します
- 既存の Adobe Unit Types.osax ファイルをバックアップします。
- ダウンロードした新しい Adobe Unit Types.osax ファイルを /Library/ScriptingAdditions にコピーします。認証画面が表示された場合YESを押して続行します。
- Macを再起動します。
以上です。なおEl Capitan移行のOSXではSIPがデフォルトで有効になっておりシステム領域に変更ができなくなっています。その為上記手順が行えない場合はSIPを一時的に無効にして作業を行って終了後に再度有効にするといった手順も必要かも知れません。
コメント欄
- Comments ( 7 )
- Trackbacks ( 0 )
emacs25.2でmpzcを使っています。全く同じようなニーズですので試してみましたが、macOS Sierra では起動時に以下のメッセージが表示されて英数キーのエミュレートが駄目でした。
osascript: OpenScripting.framework – scripting addition “/Library/ScriptingAdditions/Adobe Unit Types.osax” cannot be used with the current OS because it has no OSAXHandlers entry in its Info.plist.
コメントありがとうございます。
そのエラーは対処法がありますので追って記事に追記したいと思います。
更新をお待ちくださいませ。
対応方法を追記しました。
迅速な対応に感謝します。うまく動きました(^o^)
僕の場合、基本的にはEmacs は起動しっぱなしでプラウザに浮気してまた戻る…というケースが多く、Mozc -mode起動時に強制的に英数になるような機能がほしいです。
emacsは、山本氏のパッチ版を使っているのですが、(mac-auto-ascii-mode 1) の設定で、日本語ON状態でも、emacsのC-x 操作で強制的に英数になります。このあたりにヒントが有ると思ってpatchを眺めているんですがわかりません。
意図を外しているかも知れませんが
ブラウザ等からEmacsに戻った時に必ずMozcを英数にしたいという事であれば、
(add-hook ‘focus-out-hook ‘my/deactivate-mozc)
を評価するとうまくいくのでは無いかと思います。
ありがとうございます。完璧になりました(^o^)v
ac-mozc も使っているんですがもたつくこともあり、ストレスでした。
Mozc+AZIK が実に快適で、環境が整ってとても嬉しいです。
追加報告:以下を追加して、toggle-input-metod (mozc-mode) 時に英数になりました。
(add-hook ‘mozc-mode-hook ‘my/eisuu-key)
focus-in-hook と併せ使って幸せになりますた。感謝!