Linuxでmozcを使った日本語入力の設定(2022年版)

目次

説明

全体の設定

Mozcに関連する設定の全体です。個別の説明はこちらから。

(leaf mozc
  :straight t
  :config
  (cond ((eq system-type 'windows-nt)
      (setq mozc-helper-program-name "~/Dropbox/bin/mozc_emacs_helper.exe"))
      (t (setq mozc-helper-program-name "mozc_emacs_helper")))
  ;; (if (getenv "WSLENV")
  ;;     ;; (setq mozc-helper-program-name "mozc_emacs_helper_win.sh")
  ;;     (setq mozc-helper-program-name "mozc_emacs_helper")
  ;;   (setq mozc-helper-program-name "mozc_emacs_helper"))
  (leaf mozc-im
    :straight t
    :require t
    :custom ((default-input-method . "japanese-mozc-im"))
    :bind* (("C-o" . toggle-input-method))
    :config
    (setq mozc-candidate-style 'echo-area))
  (leaf mozc-cursor-color
    :straight (mozc-cursor-color :type git :host github
                                 :repo "iRi-E/mozc-el-extensions")
    :require t
    :config
    (setq mozc-cursor-color-alist
          '((direct        . "gray")
            (read-only     . "yellow")
            (hiragana      . "green")
            (full-katakana . "goldenrod")
            (half-ascii    . "dark orchid")
            (full-ascii    . "orchid")
            (half-katakana . "dark goldenrod")))
    ;; mozc-cursor-color を利用するための対策(NTEmacs@ウィキより)
    (defvar-local mozc-im-mode nil)
    (add-hook 'mozc-im-activate-hook (lambda () (setq mozc-im-mode t)))
    (add-hook 'mozc-im-deactivate-hook (lambda () (setq mozc-im-mode nil)))
    (advice-add 'mozc-cursor-color-update
                :around (lambda (orig-fun &rest args)
                          (let ((mozc-mode mozc-im-mode))
                            (apply orig-fun args)))))
  (leaf *mozc-win
    :if (eq system-type 'windows-nt)
    :config
    (advice-add 'mozc-session-execute-command
          :after (lambda (&rest args)
                   (when (eq (nth 0 args) 'CreateSession)
                     (mozc-session-sendkey '(Hankaku/Zenkaku)))))))

Mozcサーバと通信するためのヘルパーコマンドの設定

Mozcとのやり取りをするためのヘルパーを設定します。 WSL環境では、mozc_emacs_helper.exeに置き換えると、Windows側のGoogle IMEが使えます(後述のWindows用設定が必要)。

(cond ((eq system-type 'windows-nt)
    (setq mozc-helper-program-name "~/Dropbox/bin/mozc_emacs_helper.exe"))
    (t (setq mozc-helper-program-name "mozc_emacs_helper")))
;; (if (getenv "WSLENV")
;;     ;; (setq mozc-helper-program-name "mozc_emacs_helper_win.sh")
;;     (setq mozc-helper-program-name "mozc_emacs_helper")
;;   (setq mozc-helper-program-name "mozc_emacs_helper"))

Mozcによる変換操作の設定[C-o]

C-oで変換・無変換をトグルするようにしました。また、以前は postframeで変換候補を出していましたが、X11をSSHでフォワードすると遅いので、エコーエリアに表示するようにしました。

(leaf mozc-im
  :straight t
  :require t
  :custom ((default-input-method . "japanese-mozc-im"))
  :bind* (("C-o" . toggle-input-method))
  :config
  (setq mozc-candidate-style 'echo-area))

カーソルカラーを設定する

現在の状態に合わせて、カーソルの色を設定します。この設定では、直接入力の時はグレイ、変換モードのときは緑にしています。リードオンリーでは黄色になります。それ以外の状態は、私は使いませんが念の為。

なお、Emacsで使えるカラーの一覧は、M-x list-colors-displayで確認できます。

(leaf mozc-cursor-color
  :straight (mozc-cursor-color :type git :host github
                               :repo "iRi-E/mozc-el-extensions")
  :require t
  :config
  (setq mozc-cursor-color-alist
        '((direct        . "gray")
          (read-only     . "yellow")
          (hiragana      . "green")
          (full-katakana . "goldenrod")
          (half-ascii    . "dark orchid")
          (full-ascii    . "orchid")
          (half-katakana . "dark goldenrod")))
  ;; mozc-cursor-color を利用するための対策(NTEmacs@ウィキより)
  (defvar-local mozc-im-mode nil)
  (add-hook 'mozc-im-activate-hook (lambda () (setq mozc-im-mode t)))
  (add-hook 'mozc-im-deactivate-hook (lambda () (setq mozc-im-mode nil)))
  (advice-add 'mozc-cursor-color-update
              :around (lambda (orig-fun &rest args)
                        (let ((mozc-mode mozc-im-mode))
                          (apply orig-fun args)))))

Windows用adviceの設定

(leaf *mozc-win
  :if (eq system-type 'windows-nt)
  :config
  (advice-add 'mozc-session-execute-command
          :after (lambda (&rest args)
                   (when (eq (nth 0 args) 'CreateSession)
                     (mozc-session-sendkey '(Hankaku/Zenkaku))))))