Karabiner-Elements と mozc.el で Mac の Emacs で最高の日本語入力環境を作る

シェアする

Karabiner-Elementsを利用したEmacsのIME切り替えキーバインドの設定を行いました.Macでは自分的に最も快適な環境ができたので共有します.US配列が前提となります.カーソルの色問題も解決しました.

スポンサーリンク
レクタングル(大)広告

問題点

Emacsを使う上で悩むのがIMEを切り替える際のキーバインドです.OSのIMEを利用していると,IMEがオンのときにM-x,C-x 何か及びモードラインにカーソルが移動する機能を使うと,全角のまま入力されたりして悲しい気持ちになります.mac-auto-ascii-modeを使えばASCII入力に戻りますが,コマンド実行後にIMEオン状態に戻ってくれません.今回をこの問題を解決したいと思います.

現状

この問題に関して一定の解決方法が提唱されています.しかし,そもそもOSのIMEではなくEmacsに組み込みのIMEを使えば全て解決します.ところが今度は,OSのIME切り替えとEmacsのIME切り替えが違うキーバインドになってしまい操作性に一貫性がなくなってしまいます.MacではOSの設定が一番強いのでEmacsのIME切り替えにMacのIME切り替えと同じキーバインドを登録すると,OSに持って行かれてしまいます.Mac用のキーバインドリマッパーであるKarabiner-Elementsが最近進化が著しく,この問題を解決できるようになっていたので,解決方法を共有します.

設定がEmacsとKarabiner-Elementsに分散してしまうのがつらいですが,現状これが限界かと思われます.解決方法をお持ちの方はぜひ教えてほしいです.

emacs-mozcの設定

まず,emacs-mozcを使えるようにします.そのためにGoogle IMEが必要となります.こちらからDL及びインストールしてください.更に,このGoogle IMEと通信可能なemacs_mozc_helperをビルドします.これに関してはこちらの記事を参照ください.

macOS Sierra で,emacsからgoogle日本語入力を利用するためのmozc_emacs_helperをビルドする方法をまとめ...

この記事を参考にして用意したmozc_emacs_helperがシステムPATHに置かれているものと仮定します.また,本記事のEmacsの設定は以下の最初にする設定の記事が前提となっています.

たまに全てを消し去りたくなって.emacs.d/を全削除することがあります(もちろんバックアップは取って).今回は何度消し去っても生き残る設...

mozc.elの設定

(use-package mozc
  :ensure t
  :if (executable-find "mozc_emacs_helper")
  :hook
  ((after-init . turn-off-ime)
   (input-method-activate . set-cursor-color-to-ime-on)
   (input-method-inactivate . set-cursor-color-to-ime-off)
   ((minibuffer-setup helm-minibuffer-set-up) . turn-off-ime))
  :bind (("C-<f11>" . turn-on-ime)
         ("C-<f12>" . turn-off-ime)
         :map mozc-mode-map
         ("M-x" . nil))
  :custom
  (default-input-method "japanese-mozc")
  (mozc-candidate-style 'echo-area)
  (mozc-leim-title "あ")
  :config
  (defun set-cursor-color-to-ime-on ()
    (set-cursor-color "magenta"))
  (defun set-cursor-color-to-ime-off ()
    (set-cursor-color "Cyan"))
  (defun turn-on-ime ()
    (interactive)
    (activate-input-method default-input-method))
  (defun turn-off-ime ()
    (interactive)
    (deactivate-input-method))
  (use-package switch-buffer-functions
    :config
    (add-hook 'switch-buffer-functions
              (lambda(prev cur)
                (if (eval 'current-input-method)
                    (set-cursor-color-to-ime-on)
                  (set-cursor-color-to-ime-off)))))
  (when (eq system-type 'darwin)
    (defun my/eisuu-key ()
      "Turn off mac IME."
      (interactive)
      (call-process
       "osascript" nil t nil "-e"
       "tell application \"System Events\" to key code 102"))
    (add-hook 'focus-in-hook 'my/eisuu-key)))
  • C-\ : IME切り替え
  • C-f11 : IMEオン
  • C-f12 : IMEオフ

use-package.elでinitとconfigの使い分けが未だにおぼつかないので推奨される設定方法ではない可能性があります.

前半の設定はEmacsからmozc_emacs_helperコマンドを経由してGoogle IMEを利用するための設定となります.OSのIMEが起動していると正常に動かないので,OSのIMEは切った状態でEmacsのIMEをオンにしてください.ここで指定されているIME操作のためのキーバインドに対して後ほどKarabiner-Elementsを使って関連付けを行います.IMEがONのときカーソルがマゼンタ色,OFFのときはシアン色にしています.IMEがONのときにミニバッファに移動したときに自動的にIMEをオフにするようにしています,

後半の設定は,IMEがONのときにミニバッファに移動してカーソルの色がシアンに変わったのが,もとのIMEがON状態のバッファに戻ってもシアン色のままになってしまうのを解決するための設定です.バッファの移動をトリガーにしてIMEの状態を調べ,カーソルの色を設定し直します,

OSのIME無効化

(defun my/eisuu-key ()
  (interactive)
  (call-process "osascript" nil t nil "-e" "tell application \"System Events\" to key code 102"))
(add-hook 'focus-in-hook 'my/eisuu-key)

前述の通り,OSのIMEが起動しているとEmacsのIMEが正常に動かないので,Emacsを利用中はOSのIMEを無効化しています.この方法は「[Mac][Emacs] mozc-emacs-helperとOSXのIMを連動させる (toggle-input-method, 英数/かなキー)」の設定をそのまま使わせていただいています.

popup.elで変換候補を表示する

(use-package mozc-popup
  :ensure t
  :config
  (setq mozc-candidate-style 'popup))

変換候補を選択するとき,カーソルの下にぶら下がる形で選択できるようにします.mozc.elにも組み込みのoverlayスタイルがありますが,動作が重いのでこちらを使います.

Karabiner-Elementsの設定

Karabiner-Elementsを未インストールの方はこちらからDL・インストールしてください.

Macの設定

Karabiner-ElementsのComplex ModificationsからAdd rulesを選択します.Import more rules from the Internetを選択すると,WEBブラウザが機動するので,For Japaneseを選ぶとKarabiner-Elementsから開くかを聞かれるので許可すれば設定がインストールされます.「コマンドキーを単体で押したときに,英数・かなキーを送信する」をEnableにすれば有効化されます.これでMacのUS配列でも便利にIMEを切り替えることができるようになりました.また,私はコマンド+スペースでもIMEの切り替えを行いたいので,OSの環境設定のキーボードから設定をしておきます.これでOSにおいて以下のキーバインドでIMEを切り替えることができるようになりました.

  • コマンド+スペース : IME切り替え
  • 右コマンド単体 : IMEオン
  • 左コマンド単体 : IMEオフ

Emacsの設定

Emacsで設定したキーバインドを上記のOSのキーバインドに上書きする形で設定します.具体的にはEmacsにフォーカスがあるときだけ,以下のマッピングが有効であれば良いことになります.

  • IME切り替え : C-\ → コマンド+スペース
  • IMEオン : C-<f11> → 右コマンド単体
  • IMEオフ : C-<f12> → 左コマンド単体

LinuxのX11ならデフォルトの機能でできるのですが,MacではKarabiner-Elementsの力を借りる必要があります.以下の内容をleim.jsonという名前で,~/.config/karabiner/assets/complex_modifications直下に保存してください.

{
  "title": "IME in Emacs",
  "rules": [
    {
      "description": "コマンド+スペース でLEIMを切り替える",
      "manipulators": [
        {
          "type": "basic",
          "from": {
            "key_code": "spacebar",
            "modifiers": {
              "mandatory": [
                "left_command"
              ]
            }
          },
          "to": [
            {
              "key_code": "backslash",
              "modifiers": [
                "left_control"
              ]
            }
          ],
          "conditions": [
            {
              "type": "frontmost_application_if",
              "bundle_identifiers": [
                "Emacs"
              ]
            }
          ]
        }
      ]
    },
    {
      "description": "右のコマンドキーを単体で押したときにLEIMを活性化する",
      "manipulators": [
        {
          "type": "basic",
          "from": {
            "key_code": "right_command",
            "modifiers": {
              "optional": [
                "any"
              ]
            }
          },
         "to": [
            {
              "key_code": "right_command"
            }
          ],
          "to_if_alone": [
            {
              "key_code": "f11",
              "modifiers": [
                "left_control"
              ]
            }
          ],
          "conditions": [
            {
              "type": "frontmost_application_if",
              "bundle_identifiers": [
                "Emacs"
              ]
            }
          ]
        }
      ]
    },
    {
      "description": "左のコマンドキーを単体で押したときにLEIMを非活性化する",
      "manipulators": [
        {
          "type": "basic",
          "from": {
            "key_code": "left_command",
            "modifiers": {
              "optional": [
                "any"
              ]
            }
          },
         "to": [
            {
              "key_code": "left_command"
            }
          ],
          "to_if_alone": [
            {
              "key_code": "f12",
              "modifiers": [
                "left_control"
              ]
            }
          ],
          "conditions": [
            {
              "type": "frontmost_application_if",
              "bundle_identifiers": [
                "Emacs"
              ]
            }
          ]
        }
      ]
    }
  ]
}

後は,Karabiner-Elementsから有効化すれば,Emacs上でもOSと同じキーバインドでMozcの切り替えを行うことができます.コメントで補足頂きましたが,キーボードの設定によって,ファンクションキーのモディファイアを以下のようにする必要があるようです.

{
  "key_code": "f11",
  "modifiers": [
    "left_control", "fn"
  ]
}

まとめ


実は,まだ達成できていないことがあります.IMEがオンのときとオフのときでカーソルの色を変更する設定を行っているのですが,バッファでIMEがオンのときにMini Bufferにカーソルが移ったときに色が変わります.コマンドの実行が終了してバッファにカーソルが戻った際に,もとのIME状態を復元してはくれるのですが,カーソルの色はIMEオフのときの色のままで若干完璧さにかけていると思います.これはどうすれば解決できるのか検討がつかないのでとりあえず放置しますが,もしわかったら追記しておきます.

設定できました.バッファの移動をフックにしてIMEの状態を調べる発想が出てくれば特に難しいことはありませんでした.とりあえずこの設定で使っていき,不満点が出たらブラッシュアップしていこうと思います.現状では個人的に最強の日本語入力環境になったと思いますが,要望があったら教えてくださるとうれしいです.

参考文献

スポンサーリンク
レクタングル(大)広告

シェアする

フォローする

スポンサーリンク
レクタングル(大)広告

コメント

  1. DD より:

    こんにちは、EmacsでのIME切り替えの設定を参考にさせていただきました、ありがとうございます。設定の際に躓いた所があったのでお知らせします。

    まず、本文中のEmacsの設定の記述に間違い(タイポ)が有ります。Key-bindの設定のところで
    (“C-” . turn-on-input-method)
    (“C-” . turn-off-input-method))
    と書いていますが
    (“C-” . turn-on-input-method)
    (“C-” . turn-off-input-method))
    だと思います。

    もう一つは環境に依存することなので間違いではないのですが、私の環境ではF11ボタンはデフォルトでvolume_decrementがアサインされているので、Karabiner-Elementsの設定のmodifierの指定にfnボタンを追加する必要がありました。
    {
    “key_code”: “f11”,
    “modifiers”: [
    “left_control”, “fn”
    ]
    }

    参考にしていただければと思います。

    • tottoto より:

      DDさんこんにちは.コメントありがとうございます.
      一点目ですが,記事を何度か編集し直した際に<>をそれぞれ&lt;および&gt;と置き換える対応が漏れていたのが原因で無効なHTMLタグだと判断されて表示されなくなっていたようです(DDさんのコメントも同様の理由で表示が消えています).
      二点目ですが,キーボードの設定に関する部分ですので当記事のままで行こうと思います.記事中に注意点としてDDさんの対応点を付け加えるようにします(JSONではコメントが書けないので).ご指摘ありがとうございます.

      • DD より:

        素早い対応ありがとうございます。一点目に関しては自分のコメントを見て状況を理解しました・・・。二点目についても本文で触れていただき、ありがとうございます。