emacs-mozc を動かすための設定(emacs 設定編)

■ Windows版 emacs 共通の設定 (一部の設定を除き、Linux版 emacs にも適用可能)


【お知らせ】


<2017/07/11 追記>
emacs で mozc を利用する際に Windows の IME の切換えキー(「半角/全角」(日本語キーボード用)や Alt-`(英語キーボード用))を mozc の切り替えキーとして機能させるための設定を見直しました。本設定の一番最後に説明があります。

<2017/05/04 追記>
本設定は Bash on Ubuntu on Windows でも利用可能です。お試しください。

<2016/12/01 追記>
以下で報告されている問題について対策しました。

<2016/09/13 追記>
5) で mozc_emacs_helper.exe に対し IME を ON にするために発行しているキーを「Hiragana」から「Hankaku/Zenkaku」に変更しました。この対応で、Google日本語入力のキー設定が「MS-IME」以外の「ことえり」などでも emacs-mozc を使えるようになりました。(ただし、「Hankaku/Zenkaku」キーは「Hiragana」キーと異なり、IME の ON/OFF をトグルするキーとなります。必要な場合に一度のみ発行するように注意して利用する必要があります。(本設定を利用すれば問題は発生しません。))

<2015/12/07 追記>
本設定とは直接関係ありませんが、isearch でキルリングを張り付けるには、C-s RET C-y とすればいいのですね。知りませんでした..。

【本題】



NTEmacs で emacs-mozc を動かすための emacs 設定編です。

以下は設定手順です。

1) (共通) melpa package から、mozc、mozc-im、mozc-popup をインストールする。

  ※ mozc-candidate-style を overlay に設定した場合、動作が遅く使用に耐えません。これを改善するのが mozc-popup です。tabbar との相性も良いとの情報もあります。
  ※ mozc-im を使うことで、isearch の中でも mozc による日本語入力が可能となります。

2) (共通) 以下から mozc-cursor-color.el をダウンロードし、~/.emacs.d/site-lisp 等の load 対象となるディレクトリ配下にサブディレクトリを作成し格納する。

3) (「サーバ準備編」利用の場合) サーバ準備編で git により作成された vagrant-emacs-mozc ディレクトリ以下に mozc-emacs-helper.sh というファイルがあるので、このファイルを ~/bin 等の PATH の通ったフォルダにコピーする。既存の Linux環境を利用する場合は、mozc-emacs-helper.sh の中身を確認し、Linuxマシンに自動ログインできるスクリプトに書き換える。置き換えるスクリプトは以下のようなもの。
ssh <user>@localhost -p <port> mozc_emacs_helper "$@"
 また、MinGW版 emacs を利用している場合は、「fakecygpty を使うための設定」を利用し、fakecygpty-program-list に "mozc-emacs-helper.sh" を追加する。

4) (共通) init.el 等に以下の elisp の設定を追加する。
(require 'mozc-im)
(require 'mozc-popup)
(require 'mozc-cursor-color)

(setq default-input-method "japanese-mozc-im")

;; popupスタイル を使用する
(setq mozc-candidate-style 'popup)

;; カーソルカラーを設定する
(setq mozc-cursor-color-alist '((direct        . "red")
                                (read-only     . "yellow")
                                (hiragana      . "green")
                                (full-katakana . "goldenrod")
                                (half-ascii    . "dark orchid")
                                (full-ascii    . "orchid")
                                (half-katakana . "dark goldenrod")))

;; カーソルの点滅を OFF にする
(blink-cursor-mode 0)

;; C-o で IME をトグルする
(global-set-key (kbd "C-o") 'toggle-input-method)
(define-key isearch-mode-map (kbd "C-o") 'isearch-toggle-input-method)

;; mozc-cursor-color を利用するための対策
(make-variable-buffer-local 'mozc-im-mode)
(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))))

;; isearch を利用する前後で IME の状態を維持するための対策
(add-hook 'isearch-mode-hook
          (lambda ()
            (setq im-state mozc-im-mode)))
(add-hook 'isearch-mode-end-hook
          (lambda ()
            (unless (eq im-state mozc-im-mode)
              (if im-state
                  (activate-input-method default-input-method)
                (deactivate-input-method)))))

;; wdired 終了時に IME を OFF にする
(require 'wdired)
(advice-add 'wdired-finish-edit
            :after (lambda (&rest args)
                     (deactivate-input-method)))

gnupack 等で W32-IME の設定がされている場合は、以下の箇所をコメント化してください。
  • gnupack-11系: 「@ime」セクション
  • gnupack-12,13系: 「@ language - input method」セクション、「@ screen - cursor」セクション、「@ search - isearch」セクションの後半


MinGW版 emacs を使っている場合は、以下の設定を追加してください。
;; IME が ON の時、カーソルの移動が遅くなるのを改善する
(setq w32-pipe-read-delay 10)

helm を使っている場合は、以下の設定を追加してください。
;; helm でミニバッファの入力時に IME の状態を継承しない
(setq helm-inherit-input-method nil)

;; helm の検索パターンを mozc を使って入力した場合にエラーが発生することがあるのを改善する
(advice-add 'mozc-helper-process-recv-response
            :around (lambda (orig-fun &rest args)
                      (cl-loop for return-value = (apply orig-fun args)
                               if return-value return it)))

;; helm の検索パターンを mozc を使って入力する場合、入力中は helm の候補の更新を停止する
(advice-add 'mozc-candidate-dispatch
            :before (lambda (&rest args)
                      (when (and (fboundp 'helm-alive-p)
                                 (helm-alive-p))
                        (cl-case (nth 0 args)
                          ('update
                           (unless helm-suspend-update-flag
                             (helm-kill-async-processes)
                             (setq helm-pattern "")
                             (setq helm-suspend-update-flag t)))
                          ('clean-up
                           (when helm-suspend-update-flag
                             (setq helm-suspend-update-flag nil)))))))

;; helm で候補のアクションを表示する際に IME を OFF にする
(advice-add 'helm-select-action
            :before (lambda (&rest args)
                      (deactivate-input-method)))

5) (「mozc_emacs_helper コンパイル編」利用の場合) init.el 等に以下の elisp の設定を追加する。
;; Windows の mozc では、セッション接続直後 directモード になるので hiraganaモード にする
(advice-add 'mozc-session-execute-command
            :after (lambda (&rest args)
                     (when (eq (nth 0 args) 'CreateSession)
                       ;; (mozc-session-sendkey '(hiragana)))))
                       (mozc-session-sendkey '(Hankaku/Zenkaku)))))

6) (「サーバ準備編」利用の場合) init.el 等に以下の elisp の設定を追加する。
;; https://github.com/igjit/vagrant-emacs-mozc
(setq mozc-helper-program-name "mozc_emacs_helper.sh")
(setq mozc-helper-process-timeout-sec 10)

7) (「mozc_emacs_helper コンパイル編」利用の場合) mozc のキーバインドを設定する。

「Google日本語入力」のプロパティで、「キー設定」を「ことえり」に選択してください。「ことえり」は emacsキーバインドをベースとしたキー設定となっており、更に以下のキーが近いキー位置で利用可能となっています。
C-i(文節を縮める)
C-o(文節を伸ばす)

C-j(ひらがなに表示切替)
C-k(全角カタカナに表示切替)
C-l(全角英数に表示切替)
C-;(半角に表示切替)
※ ターミナルソフトから emacs を利用する場合、C-; は利用できません。他のキーに置き換えてご利用ください。

8) (「サーバ準備編」利用の場合) mozc のキーバインドを設定する。

Linuxサーバ の mozc のキーバインドの設定は mozc_tool というコマンドで行いますが、Vargent で作成した Linuxサーバには mozc_tool はインストールされていません。このため、Windows PC に「Google日本語入力」をインストールして 7) の設定を行い、設定した結果が格納されている以下のファイルを Linux 側の ~/.mozc ディレクトリにコピーすることで対応してください。ファイルをコピーした後は Linuxサーバを再起動してください。
c:/Users/<user>/AppData/LocalLow/Google/Google Japanese Input/config1.db
コマンド実行手順は以下のとおりとなります。
$ ssh -p 2422 -i ~/.vagrant.d/insecure_private_key vagrant@127.0.0.1 'mkdir -p ~/.mozc'
$ cd 'c:/Users/<user>/AppData/LocalLow/Google/Google Japanese Input'
$ scp -P 2422 -i ~/.vagrant.d/insecure_private_key config1.db vagrant@127.0.0.1:~/.mozc
$ cd <gitした場所>/vagrant-emacs-mozc
$ vagrant reload
なお、Linuxサーバに mozc-utils-guiパッケージ をインストールすれば、mozc_tool コマンドの表示を Cygwin/X 等の Xサーバに表示させることができます。コマンドは以下のとおりです。
$ sudo apt install mozc-utils-gui
$ /usr/lib/mozc/mozc_tool --mode=config_dialog
ただし、「emacs-mozc を動かすための設定(サーバ準備編)」でインストールした Linuxサーバ では、LANG の設定をしただけでは日本語の表示はできないようです。

9) (共通) emacs で C-o を入力することにより、mozc-emacs-helper が起動し、漢字が入力できることを確認する。

※ 「emacs-mozc を動かすための設定(BUW 設定編)」から本ページに来た場合は、まだ漢字入力はできません。このまま進んでください。

10) (共通) Windows の IME の切換えキーで mozc を切り替えれるように調整する。

Windows の IME の切換えキー(「半角/全角」(日本語キーボード用)や Alt-`(英語キーボード用))で mozc を切り替えれるようにするには、「Windows の操作を emacs のキーバインドで行うための設定 (Keyhac版)」の併用を検討ください。(設定の最後の方にある ifブロックを「if 1:」としてご利用ください。)IME の切換えの対応のみ行いたい場合には、以下の設定が利用できます。設定の方法はコメントの URL を参照してください。

これらの設定は、NTEmacs(gnupack 含む)と Windows の Xサーバで動く emacs で機能するようにしています。Windows の Xサーバで emacs が動作しているかどうかは、ウィンドウのタイトルで判定しています。emacs の設定でタイトルの表示内容を変更している場合には、re.search 内の検索する正規表現を調整することで対応してください。
# -*- mode: python; coding: utf-8-with-signature-dos -*-
# http://qiita.com/hshimo/items/2f3f7e070ae75243eb8b

from keyhac import *

def configure(keymap):

    def is_real_emacs(window):
        if (window.getClassName() == "Emacs" or
            (window.getProcessName() in ("XWin.exe",       # Cygwin/X
                                         "XWin_MobaX.exe", # MobaXterm/X
                                         "Xming.exe",      # Xming
                                         "vcxsrv.exe") and # VcXsrv
             re.search(r"^emacs@", window.getText()))): # ウィンドウのタイトルを検索する正規表現を指定
            return True
        return False
   
    keymap_real_emacs = keymap.defineWindowKeymap(check_func=is_real_emacs)
   
    # IME 切り替え用のキーを C-\ に置き換える
    keymap_real_emacs["(28)"]   = keymap.InputKeyCommand("C-Yen") # [変換] キー
    keymap_real_emacs["(29)"]   = keymap.InputKeyCommand("C-Yen") # [無変換] キー
    keymap_real_emacs["(240)"]  = keymap.InputKeyCommand("C-Yen") # [英数] キー
    keymap_real_emacs["(242)"]  = keymap.InputKeyCommand("C-Yen") # [カタカナ・ひらがな] キー
    keymap_real_emacs["(243)"]  = keymap.InputKeyCommand("C-Yen") # [半角/全角] キー
    keymap_real_emacs["(244)"]  = keymap.InputKeyCommand("C-Yen") # [半角/全角] キー
    keymap_real_emacs["A-(25)"] = keymap.InputKeyCommand("C-Yen") # Alt-` キー


<変更履歴>
  • 2014/10/30 このページを作成した。
  • 2014/11/02 minibuffer-setup-hook の設定を追加した。
  • 2014/11/04 wdired を使う際の設定を追加した。
  • 2014/11/18 「emacs-mozc を動かすための設定(mozc_emacs_helper コンパイル編)」に対応した。
  • 2014/11/20 IME が ON の時、カーソルの移動が遅くなる対策を追加した。(w32-pipe-read-delay の値を デフォルトの 50 から 10 に変更した。)
  • 2014/11/24 minibuffer-setup-hook 内の unless の判定を emacs-24.3 以前のバージョンでも有効なものに変更した。
  • 2014/11/27 helm の検索パターンを mozc を使って入力した場合にエラーが発生することがある対策を追加した。
  • 2014/11/29 helm の検索パターンを mozc を使って入力する場合、入力中は helm の候補の更新を停止するようにした。
  • 2014/12/12 helm で候補のアクションを表示する際に IME を OFF にするようにした。
  • 2015/01/17 mozc-popup を最新と思われるサイトのものの利用に変更した。
  • 2015/03/11 mozc-helper-process-recv-response のアドバイスの内容を簡略化した。
  • 2015/07/22 emacs-24.3 以上の対応の記載とした。
  • 2015/09/10 advice を emacs-24.4 以降の書式に見直した。
  • 2015/10/30 mozc-im を利用するように設定を全面的に見直した。
  • 2015/11/12 mozc-candidate-dispatch の advice を一度削除していたが、やはりあるべき設定のようなので復活させた。
  • 2015/12/28 keyhac の設定の内容を、Keyhac for Windows ver 1.70 用に見直しをした。
  • 2016/12/01 https://github.com/d5884/mozc-im/pull/1 で報告されている問題について対策した。
  • 2017/07/08 emacs で mozc を利用する際に Windows の IME の切換えキーを mozc の切り替えキーとして機能させるための設定を見直した。