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