■ Windows版 emacs 共通の設定


【お知らせ】


<2015/12/07 追記>
本設定とは直接関係ありませんが、isearch でキルリングを張り付けるには、C-s RET C-y とすればいいのですね。知りませんでした..。
http://kouritool.com/itdiary/emacs%E3%81%A7%E5%BC%B5%E3%82%8A%E4%BB%98%E3%81%91%E6%96%87%E5%AD%97%E5%88%97%E3%82%92%E6%A4%9C%E7%B4%A2/

<2015/10/30 追記>
helm を起動したときに IME が OFF にならなくなったので、helm-minibuffer-set-up-hook の設定を追加しました。

<2015/09/17 追記>
wrap-function-to-control-ime を利用した際にもカーソルカラーが変更となるように、IME ON/OFF時のカーソルカラーの設定方法を変更しました。

<2015/09/16 追記>
全面的に設定の見直しを行いました。これでかなり、「emacs-mozc を動かすための設定(emacs 設定編)」の使用感に近づいたと思います。

【本題】


W32-IME を快適に使うための設定です。

gnupack を利用している場合は、init.el の以下のセクションにある設定を置き換えて(コメント化して)ご利用ください。
  • gnupack-11系: 「@ime」セクション
  • gnupack-12,13系: 「@ language - input method」セクション、「@ screen - cursor」セクション、「@ search - isearch」セクションの後半

;; IMEの初期化
(w32-ime-initialize)

;; 標準IMEの設定
(setq default-input-method "W32-IME")

;; IME状態のモードライン表示の設定
(setq-default w32-ime-mode-line-state-indicator "[Aa]")
(setq w32-ime-mode-line-state-indicator-list '("[Aa]" "[あ]" "[Aa]"))

;; IME OFF時の初期カーソルカラーの設定
(set-cursor-color "red")

;; IME ON/OFF時のカーソルカラーの設定
;; (wrap-function-to-control-ime コマンド内等で、ime-force-on や ime-force-off が単独で
;;  呼ばれた際もカーソルカラーの変更が機能するように hook ではなく advice に変更した)
(advice-add 'ime-force-on
            :before (lambda (&rest args)
                      (set-cursor-color "green")))
(advice-add 'ime-force-off
            :before (lambda (&rest args)
                      (set-cursor-color "red")))

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

;; バッファ切り替え時に IME の状態を引き継がない
(setq w32-ime-buffer-switch-p t)

;; C-o で IME をトグルする
;; デフォルトで C-\ または 漢字キー(<kanji>) でもトグルできる
(global-set-key (kbd "C-o") 'toggle-input-method)

;; minibuffer に入った時、IME を OFF にする
(add-hook 'minibuffer-setup-hook
          (lambda ()
            (deactivate-input-method)))
(add-hook 'helm-minibuffer-set-up-hook
          (lambda ()
            (deactivate-input-method)))

;; IMEの制御付きにラップする
;;(上記の minibuffer の設定が機能しない関数について設定する)
;; http://sanrinsha.lolipop.jp/blog/2010/07/emacs-1.html#i-4
(wrap-function-to-control-ime 'y-or-n-p nil nil)
(wrap-function-to-control-ime 'map-y-or-n-p nil nil)
(wrap-function-to-control-ime 'read-char nil nil)

;; isearch の設定
;; http://d.hatena.ne.jp/ksugita0510/20110103/p1
;; http://highmt.wordpress.com/2010/10/25/isearch%E3%81%A7%E6%97%A5%E6%9C%AC%E8%AA%9E%E5%85%A5%E5%8A%9B%E3%82%92%E3%82%84%E3%82%8A%E3%82%84%E3%81%99%E3%81%8F%E3%81%99%E3%82%8B%E3%83%91%E3%83%83%E3%83%81/
(defun w32-isearch-update ()
  (interactive)
  (isearch-update))

(add-hook 'isearch-mode-hook
          (lambda ()
            (setq ime-state (ime-get-mode))
            (w32-ime-state-switch nil)
            (setq w32-ime-composition-window (minibuffer-window))))

(add-hook 'isearch-mode-end-hook
          (lambda ()
            (if ime-state
                (w32-ime-state-switch t)
              (w32-ime-state-switch nil))
            (setq w32-ime-composition-window nil)))

(define-key isearch-mode-map (kbd "<compend>") 'w32-isearch-update)
(define-key isearch-mode-map (kbd "<kanji>")   'isearch-toggle-input-method)
(define-key isearch-mode-map (kbd "C-o")       'isearch-toggle-input-method)

以下は、helm を利用する場合に設定してください。「helm を使うための設定」でも紹介しています。
;; w32-ime-buffer-switch-p を t にして helm を利用する場合に、ミニバッファで漢字を正常に
;; 使えるようにする対策(この設定がないと、ime が勝手に切り替わったりする)
(advice-add 'helm
            :around (lambda (orig-fun &rest args)
                      (let ((select-window-functions nil))
                        (apply orig-fun args))))

以下は、wdired を使っている場合にご利用ください。
(require 'wdired)

;; wdired 終了時に IME が ON になっていたら OFF にする
(advice-add 'wdired-finish-edit
            :after (lambda (&rest args)
                     (deactivate-input-method)))


<変更履歴>
  • 2014/10/27 このページを作成した。
  • 2014/11/04 wdired を使う場合の設定を追記した。
  • 2014/11/11 「helm を使うための設定」でも紹介している helm で W32-IME を使う場合に推奨する設定を追記した。
  • 2015/09/07 ミニバッファに漢字を出す設定(MS-IME を使っている場合)の設定が不要となったようなので削除した。
  • 2015/09/13 advice を emacs-24.4 以降の書式に見直した。
  • 2015/09/15 全面的に設定の見直しを行った。
  • 2015/09/17 wrap-function-to-control-ime を利用した際にもカーソルカラーが変更となるように、IME ON/OFF時のカーソルカラーの設定方法を変更した。
  • 2015/09/20 helm の advice の設定で、w32-ime-composition-window を (minibuffer-window) に設定(let)するのは不要になっていたようなので削除した。
  • 2015/10/30 helm を起動したときに IME が OFF にならなくなったので、helm-minibuffer-set-up-hook の設定を追加した。