[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での変換候補の表示

変換候補もEmacsと一体化して表示できます。例えば変換候補をエコーエリアに表示できます。僕も普段はこの設定を使っていますが変換候補表示のウインドウに画面の文字が邪魔されないので好んでいます。視点移動は必要ですがEmacsユーザーはエコーエリアへの視点移動は慣れているかと思います。

EmacsMozc-ehoarea.gif

エコーエリアへの視点移動が遠ければ一般的なぶら下げ表示も可能です。この表示はどちらもelispで表示を制御しています。
EmacsMozc-popup.gif

Mac+Emacsでの通常IM変換候補表示

ちなみにMac上のEmacsでの日本語入力は通常こんな感じかと思います。もちろんこれでも大きく不便というわけではありませんが。

EmacsOSX-IM.gif

モードレス日本語入力が利用できます

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にフォーカスが移ったタイミングで英数キーを内部的に押しています。

そんなかんなで現在の設定はこんな感じです。

;; 英数キーをエミュレートする
(defun my/eisuu-key ()
  "英数キーのエミュレート"
  (interactive)
  (call-process "osascript" nil t nil "-e" "tell application \"System Events\" to key code 102")
  )

;; focus-in-hookを利用してフレームがアクティブになった時に実行させる。
(add-hook 'focus-in-hook 'my/eisuu-key)

英数/かなキーの利用

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側の設定

(defun my/activate-mozc ()
  "activate input method mozc."
  (interactive)
  (activate-input-method 'japanese-mozc))
(defun my/deactivate-mozc ()
  "deactivate input method."
  (interactive)
  (deactivate-input-method))

;; karabiner用
;; 普段使わなそうなキーにMozcのON/OFFを割当
(bind-keys* ("H-<f3>" . my/activate-mozc)
            ("H-<f4>" . my/deactivate-mozc))

karabinerの設定

~/Library/Application Support/Karabiner/private.xml

<?xml version="1.0"?>
<root>
  <item>
    <name>Command to activate/deactivate input method in Emacs</name>
    <appendix>(コマンドキーの空打ちで「Emacs-Mozcの英数/かな」)</appendix>
    <appendix>(コマンドキーを押している間に他のキーを打つとコマンドキーとして動作。</appendix>
    <appendix>ただし、他のキーを離す前にコマンドキーを離した場合は「Emacs-Mozcの英数/かな」として扱う。)</appendix>
    <appendix>左コマンドキーはOSXのIMEがONの場合、OSXのIMEをOFFにした後、Mozcを英数モードに切り替え</appendix>
    <identifier>Private.remap.japanese_command2eisuukana_prefer_command_v2</identifier>
    <only>EMACS</only>
    <autogen>
      __KeyOverlaidModifier__
      KeyCode::COMMAND_L,
      KeyCode::VK_CONFIG_SYNC_KEYDOWNUP_private_notsave_japanese_command2eisuukana_prefer_command_v2, ModifierFlag::COMMAND_L,
      KeyCode::F4, ModifierFlag::OPTION_R,
    </autogen>
    <autogen>
      __KeyOverlaidModifier__
      KeyCode::COMMAND_R,
      KeyCode::VK_CONFIG_SYNC_KEYDOWNUP_private_notsave_japanese_command2eisuukana_prefer_command_v2, ModifierFlag::COMMAND_R,
      KeyCode::F3, ModifierFlag::OPTION_R,
    </autogen>
  </item>
  <item hidden="true">
    <identifier vk_config="true">private_notsave.japanese_command2eisuukana_prefer_command_v2</identifier>
    <autogen>__BlockUntilKeyUp__ KeyCode::COMMAND_L</autogen>
    <autogen>__BlockUntilKeyUp__ KeyCode::COMMAND_R</autogen>
  </item>
</root>

上の設定をしてkarabinerの設定画面でprivate.xmlの再読み込みをすると追加したアクションが表示されるのでチェックをつけると動作するようになります。下記の画像の赤枠の部分が追加したアクションです。

EmacsMozcKarabiner.gif

追記: 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内を参照ください。

  1. こちらをクリックしてAdobe Unit Types.osax version 2.1.0 のファイルをダウンロードしてください。
  2. Finderなどで /Library/ScriptingAdditions フォルダを選択します
  3. 既存の Adobe Unit Types.osax ファイルをバックアップします。
  4. ダウンロードした新しい Adobe Unit Types.osax ファイルを /Library/ScriptingAdditions にコピーします。認証画面が表示された場合YESを押して続行します。
  5. Macを再起動します。

以上です。なおEl Capitan移行のOSXではSIPがデフォルトで有効になっておりシステム領域に変更ができなくなっています。その為上記手順が行えない場合はSIPを一時的に無効にして作業を行って終了後に再度有効にするといった手順も必要かも知れません。

スポンサーリンク
スポンサーリンク

コメント欄

  • Comments ( 7 )
  • Trackbacks ( 0 )
  1. by minoru

    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.

    • by Masaki Inaba

      コメントありがとうございます。
      そのエラーは対処法がありますので追って記事に追記したいと思います。
      更新をお待ちくださいませ。

      • by Masaki Inaba

        対応方法を追記しました。

  2. by minoru

    迅速な対応に感謝します。うまく動きました(^o^)
    僕の場合、基本的にはEmacs は起動しっぱなしでプラウザに浮気してまた戻る…というケースが多く、Mozc -mode起動時に強制的に英数になるような機能がほしいです。

    emacsは、山本氏のパッチ版を使っているのですが、(mac-auto-ascii-mode 1) の設定で、日本語ON状態でも、emacsのC-x 操作で強制的に英数になります。このあたりにヒントが有ると思ってpatchを眺めているんですがわかりません。

    • by Masaki Inaba

      意図を外しているかも知れませんが
      ブラウザ等からEmacsに戻った時に必ずMozcを英数にしたいという事であれば、
      (add-hook ‘focus-out-hook ‘my/deactivate-mozc)
      を評価するとうまくいくのでは無いかと思います。

      • by minoru

        ありがとうございます。完璧になりました(^o^)v
        ac-mozc も使っているんですがもたつくこともあり、ストレスでした。
        Mozc+AZIK が実に快適で、環境が整ってとても嬉しいです。

      • by minoru

        追加報告:以下を追加して、toggle-input-metod (mozc-mode) 時に英数になりました。

        (add-hook ‘mozc-mode-hook ‘my/eisuu-key)

        focus-in-hook と併せ使って幸せになりますた。感謝!