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


【お知らせ】


<2021/12/16 追記>
相互リンク。こちらも参考になると思います。

<2020/04/23 追記>
ワンショットモディファイアの機能を利用し、左右の Alt キーに IME の切替えを割り当てられるようにしました。Keyhac の設定と連携することで動作します。US のキーボードを利用している場合にお試しください。
なお、次の設定も同じ操作性にできるように見直しました。

<2020/04/13 追記>
「IME を無効にするキー設定」と「IME を有効にするキー設定」を追加しました。初期設定では、「無変換」キーと「変換」キーを割り当てています。C-o の設定はトグル動作となっていますが、設定の中のコメントを見直すことで変更可能です。お勧めは、C-o のトグル設定は残して C-j に英数への切替えを設定するものです。日本語への切替えが C-o によるトグル操作による切替えの他、C-j C-o での一発切替えが可能となります。(helm 利用の際に C-j がバッティングしますが、C-o で逃げれます。)
なお、次の設定も同じ操作性にできるように見直しました。

<2019/05/17 追記>
wdired 利用時に C-o による日本語入力を可能とする設定を追加しました。

<2018/08/12 追記>
mozc-im-mode 変数をバッファローカル変数にする方法を make-variable-buffer-local 関数を使う方法から defvar-local で定義する方法に見直しました。Emacs-24.3 以降で有効な設定となります。

<2018/01/04 追記>
mozc-candidate-dispatch の advice が helm の仕様変更により動作しなくなっていましたので見直しました。この対応で、dired 利用時に + キーで動作する dired-create-directory でも日本語が正常に入力できるようになりました。

<2017/05/04 追記>
本設定は Windows Subsystem for Linux でも利用可能です。設定は次のページから始めてください。

<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 とすればいいのですね。知りませんでした..。

【本題】


$ sudo apt install emacs-mozc-bin
$ sudo apt install mozc-utils-gui

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)
(require 'wdired)

(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)

(defun enable-input-method (&optional arg interactive)
  (interactive "P\np")
  (if (not current-input-method)
      (toggle-input-method arg interactive)))

(defun disable-input-method (&optional arg interactive)
  (interactive "P\np")
  (if current-input-method
      (toggle-input-method arg interactive)))

(defun isearch-enable-input-method ()
  (interactive)
  (if (not current-input-method)
      (isearch-toggle-input-method)
    (cl-letf (((symbol-function 'toggle-input-method)
               (symbol-function 'ignore)))
      (isearch-toggle-input-method))))

(defun isearch-disable-input-method ()
  (interactive)
  (if current-input-method
      (isearch-toggle-input-method)
    (cl-letf (((symbol-function 'toggle-input-method)
               (symbol-function 'ignore)))
      (isearch-toggle-input-method))))

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

;; IME を無効にするキー設定
(global-set-key (kbd "C-<f1>") 'disable-input-method)
(define-key isearch-mode-map (kbd "C-<f1>") 'isearch-disable-input-method)
(define-key wdired-mode-map (kbd "C-<f1>") 'disable-input-method)

;; (global-set-key (kbd "C-j") 'disable-input-method)
;; (define-key isearch-mode-map (kbd "C-j") 'isearch-disable-input-method)
;; (define-key wdired-mode-map (kbd "C-j") 'disable-input-method)

;; IME を有効にするキー設定
(global-set-key (kbd "C-<f2>") 'enable-input-method)
(define-key isearch-mode-map (kbd "C-<f2>") 'isearch-enable-input-method)
(define-key wdired-mode-map (kbd "C-<f2>") 'enable-input-method)

;; (global-set-key (kbd "C-o") 'enable-input-method)
;; (define-key isearch-mode-map (kbd "C-o") 'isearch-enable-input-method)
;; (define-key wdired-mode-map (kbd "C-o") 'enable-input-method)

;; mozc-cursor-color を利用するための対策
(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))))

;; 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 にする
(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 を使っている場合は、以下の設定を追加してください。
(require 'cl-lib)

;; 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 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-;    (半角に表示切替)
C-:/C-'(半角英数に表示切替)
※ ターミナルソフトから Emacs を利用する場合、C-;、C-:、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 を動かすための設定(WSL 設定編)」から本ページに来た場合は、まだ漢字入力はできません。このまま進んでください。

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

※ Virtualbox の Linux で Emacs を動作させている場合は、本設定で利用している Keyhac は有効に機能しません。本設定は、Windows版 Emacs や Windows の Xサーバソフトを経由して Emacs を動作させている場合に有効な設定です。

Windows の IME の切換えキー(「半角/全角」(日本語キーボード用)や Alt-`(英語キーボード用))で mozc を切り替えられるようにするには、「Windows の操作を Emacs のキーバインドで行うための設定 (Keyhac版)」の併用を検討ください。(Fakeymacs extension の real-emacs を有効にしてください。)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

import re
from keyhac import *

def configure(keymap):

    def is_real_emacs(window):
        if (window.getClassName() == "Emacs" or
            (window.getProcessName() in ["mstsc.exe",              # WSLg
                                         "msrdc.exe",              # WSLg
                                         "XWin.exe",               # Cygwin/X
                                         "XWin_MobaX.exe",         # MobaXterm/X
                                         "XWin_MobaX_1.16.3.exe",  # MobaXterm/X
                                         "XWin_Cygwin_1.14.5.exe", # MobaXterm/X
                                         "XWin_Cygwin_1.16.3.exe", # MobaXterm/X
                                         "Xming.exe",              # Xming
                                         "vcxsrv.exe",             # VcXsrv
                                         "GWSL_vcxsrv.exe",        # GWSL
                                         "GWSL_vcxsrv_lowdpi.exe", # GWSL
                                         "X410.exe",               # X410
                                         "Xpra-Launcher.exe",      # Xpra
                                         ]
             and
             # ウィンドウのタイトルを検索する正規表現を指定する
             # Emacs を起動しているウィンドウを検索できるように、Emacs の frame-title-format 変数を
             # 次のように設定するなどして、識別できるようにする
             # (setq frame-title-format (format "emacs-%s - %%b " emacs-version))
             # (別途公開している sglstart コマンドを利用している場合、%%b の後のスペースは必要)
             re.search(r"^emacs-", window.getText()))):
            return True
        else:
            return False

    keymap_real_emacs = keymap.defineWindowKeymap(check_func=is_real_emacs)

    # IME 切り替え用のキーの置き換え
    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-` キー

    keymap_real_emacs["(29)"]   = keymap.InputKeyCommand("C-F1")  # <無変換> キー
    keymap_real_emacs["(28)"]   = keymap.InputKeyCommand("C-F2")  # <変換> キー
    # keymap_real_emacs["O-LAlt"] = keymap.InputKeyCommand("C-F1")  # 左 Alt キーの単押し
    # keymap_real_emacs["O-RAlt"] = keymap.InputKeyCommand("C-F2")  # 右 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/11 Emacs で mozc を利用する際に Windows の IME の切換えキーを mozc の切り替えキーとして機能させるための設定を見直した。
  • 2017/12/21 keyhac の設定で import re の行が不足していたので、追加した。
  • 2019/05/17 wdired 利用時に C-o による日本語入力を可能とする設定を追加した。
  • 2020/04/13 「IME を無効にするキー設定」と「IME を有効にするキー設定」を追加した。
  • 2020/04/19 ワンショットモディファイアの機能を利用し、左右の Alt キーに IME の切替えを割り当てられるようにした。


最終更新:2022年10月20日 12:22