最終更新日: 2018-12-24 月 15:10
ホーム | 文書トップ | 目次

w32-ime.el

Table of Contents

概要

いわゆる IMEパッチ に含まれる、lisp/international/w32-ime.el の処理の内容を調べてみる。

古くは meadow-ntemacs.el というファイル名だったものが現在では w32-ime.el という名前になっている。

関数名、変数名もこれに伴い以前は mw32-ime-* だったものが w32-ime-* となっている。

設定例

先に設定例から見てみる。

(when (locate-library "w32-ime")
    (progn
      (w32-ime-initialize)
      (setq default-input-method "W32-IME")
      (setq-default w32-ime-mode-line-state-indicator "[--]")
      (setq w32-ime-mode-line-state-indicator-list '("[--]" "[あ]" "[--]"))
))

提供されているライブラリは "w32-ime" であり、(w32-ime-initialize) にて初期化する。

input-method

(setq default-input-method "W32-IME") としているが、"W32-IME" という input-method は w32-ime.el の最後のところで register-input-method されている。

(register-input-method "W32-IME" "Japanese" 'w32-ime-state-switch ""
               "W32 System IME")

試しに、w32-ime.el を未使用の状態で (list-input-methods) を評価(eval) すると下記が表示される。

LANGUAGE
  NAME (‘TITLE’ in mode line)
    SHORT-DESCRIPTION
------------------------------
・
・
(中略)
・
・
Japanese
  japanese-katakana (‘ア’ in mode line)
    Japanese katakana input method by Roman transliteration.
  japanese-hiragana (‘あ’ in mode line)
    Japanese hiragana input method by Roman transliteration.
  japanese-hankaku-kana (‘ア’ in mode line)
    Japanese hankaku katakana input method by Roman transliteration.
  japanese-zenkaku (‘A’ in mode line)
    Japanese zenkaku alpha numeric character input method.
  japanese-ascii (‘Aa’ in mode line)
    Temporary ASCII input mode used within the input method ‘japanese’.
  japanese (‘Aあ’ in mode line)
    Japanese input method by Roman transliteration and Kana-Kanji conversion.
・
・
(中略)
・
・

さらに、default-input-method を評価してみると "japanese" となっている。

w32-ime-state-switch

input-method "W32-IME" を使っているとき、IME ON/OFF時にこの関数が実行されると思われる。

(defun w32-ime-state-switch (&optional arg)
  (if arg
      (progn
    (setq deactivate-current-input-method-function
          'w32-ime-state-switch)
    (run-hooks 'input-method-activate-hook)
    (run-hooks 'w32-ime-on-hook)
    (setq describe-current-input-method-function nil)
    (when (eq (selected-window) (minibuffer-window))
      (add-hook 'minibuffer-exit-hook 'w32-ime-exit-from-minibuffer))
    (ime-force-on))
    (setq current-input-method nil)
    (run-hooks 'input-method-deactivate-hook)
    (run-hooks 'w32-ime-off-hook)
    (setq describe-current-input-method-function nil)
    (ime-force-off))
  (w32-ime-mode-line-update))

w32-ime-initialize

ソース

(defun w32-ime-initialize ()
   (when (and (or (eq system-type 'windows-nt) (eq system-type 'cygwin))
          (eq window-system 'w32)
          (featurep 'w32-ime))
     (w32-ime-init-mode-line-display)
     (w32-ime-mode-line-update)
     (add-hook 'select-window-functions
           'w32-ime-select-window-hook)
     (add-hook 'set-selected-window-buffer-functions
           'w32-ime-set-selected-window-buffer-hook)
     (define-key global-map [kanji] 'toggle-input-method)))

functionの実行

  • (w32-ime-init-mode-line-display)
  • (w32-ime-mode-line-update)

add-hook

  • (add-hook 'select-window-functions 'w32-ime-select-window-hook)
  • (add-hook 'set-selected-window-buffer-functions 'w32-ime-set-selected-window-buffer-hook)

w32-ime-init-mode-line-display

(defun w32-ime-init-mode-line-display ()
  (unless (member 'w32-ime-mode-line-state-indicator mode-line-format)
    (setq w32-ime-mode-line-format-original
      (default-value 'mode-line-format))
    (if (and (stringp (car mode-line-format))
         (string= (car mode-line-format) "-"))
    (setq-default mode-line-format
              (cons ""
                (cons 'w32-ime-mode-line-state-indicator
                  (cdr mode-line-format))))
      (setq-default mode-line-format
            (cons ""
              (cons 'w32-ime-mode-line-state-indicator
                mode-line-format))))
    (force-mode-line-update t)))

w32-ime-mode-line-update

モードラインにインジケータ([–]とか[あ]とか)を表示する処理。

この中で ime-get-mode で現在の状態を取得している。ime-get-mode は Cで実装された関数。

(defun w32-ime-mode-line-update ()
  (cond
   (w32-ime-show-mode-line
    (unless (window-minibuffer-p (selected-window))
      (setq w32-ime-mode-line-state-indicator
        (nth (if (ime-get-mode) 1 2)
         w32-ime-mode-line-state-indicator-list))))
   (t
    (setq w32-ime-mode-line-state-indicator
      (nth 0 w32-ime-mode-line-state-indicator-list))))
  (force-mode-line-update))

w32-ime-select-window-hook

(defun w32-ime-select-window-hook (old new)
  (w32-ime-sync-state new))

w32-ime-set-selected-window-buffer-hook

(defun w32-ime-set-selected-window-buffer-hook (oldbuf newwin newbuf)
  (w32-ime-sync-state newwin))

w32-ime-sync-state

(defun w32-ime-sync-state (window)
  (when w32-ime-buffer-switch-p
    (with-current-buffer (window-buffer window)
      (let* ((frame (window-frame window))
         (ime-state (ime-get-mode)))
    (cond
     ((and (not ime-state)
           (equal current-input-method "W32-IME"))
      (ime-force-on nil)
      (run-hooks 'w32-ime-on-hook))
     ((and ime-state
           (not (equal current-input-method "W32-IME")))
;;;   (when (= (w32-ime-undetermined-string-length) 0)
      (ime-force-off nil)
      (run-hooks 'w32-ime-off-hook)))))))
ホーム | 文書トップ | 目次
Created by Emacs 27.1 (Org mode 9.3)