■ Windows版 Emacs 共通の設定


【お知らせ】


<2020/04/15 追記>
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 による日本語入力を可能とする設定を追加しました。

<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」セクションの後半

(require 'wdired)

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

;; 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))
            (when ime-state
              (w32-ime-state-switch nil))
            (setq w32-ime-composition-window (minibuffer-window))))

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

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

(define-key isearch-mode-map (kbd "<compend>") 'w32-isearch-update)
(define-key isearch-mode-map (kbd "<kanji>") '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 "<non-convert>") 'disable-input-method) ; 無変換キー
(define-key isearch-mode-map (kbd "<non-convert>") 'isearch-disable-input-method)
(define-key wdired-mode-map (kbd "<non-convert>") '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 "<convert>") 'enable-input-method) ; 変換キー
(define-key isearch-mode-map (kbd "<convert>") 'isearch-enable-input-method)
(define-key wdired-mode-map (kbd "<convert>") '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)

;; wdired 終了時に IME が ON になっていたら OFF にする
(advice-add 'wdired-finish-edit
            :after (lambda (&rest args)
                     (deactivate-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))))


<変更履歴>
  • 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 の設定を追加した。
  • 2019/05/17 wdired 利用時に C-o による日本語入力を可能とする設定を追加した。


最終更新:2020年04月18日 08:38