isearchで日本語入力をやりやすくするパッチ
GNU Emacs 23.2.1 (i386-mingw-nt6.0.6002)
Windows Vista SP2
以下の設定を行うと isearch-mode でIMEを起動できて日本語検索ができるようのだけれど
(defun w32-isearch-update () (interactive) (isearch-update)) (define-key isearch-mode-map [compend] 'w32-isearch-update) (define-key isearch-mode-map [kanji] 'isearch-toggle-input-method)
このままでは、IMEの変換ウィンドウがミニバッファではなく対象のバッファウィンドウに出てしまい
ちょっとかっこわるい。
ので、meadowを参考にして isearch-mode に入ったときにIMEの変換ウィンドウがミニバッファに出るようにパッチ。
本体はこんな感じ。
diff -ur emacs-23.2.orig/src/w32fns.c emacs-23.2/src/w32fns.c
--- emacs-23.2.orig/src/w32fns.c Thu Oct 14 01:38:02 2010
+++ emacs-23.2/src/w32fns.c Mon Oct 25 02:24:14 2010
@@ -203,6 +203,9 @@
Lisp_Object Qundefined_color;
#ifdef USE_W32_IME
+/* */
+Lisp_Object Vw32_ime_composition_window;
+
static int IME_event_off_count;
const char * const ImmGetOpenStatus_Name = "ImmGetOpenStatus";
@@ -6507,6 +6510,13 @@
COMPOSITIONFORM compform;
struct window *w = XWINDOW (FRAME_SELECTED_WINDOW (f));
+ /* If Vw32_ime_composition_window is set, try it. */
+ if (!NILP (Vw32_ime_composition_window)
+ && WINDOWP (Vw32_ime_composition_window)
+ && WINDOW_FRAME (XWINDOW (Vw32_ime_composition_window))
+ == WINDOW_FRAME (w))
+ w = XWINDOW (Vw32_ime_composition_window);
+
himc = (ImmGetContextProc) (hwnd);
compform.dwStyle = CFS_RECT;
@@ -8210,6 +8220,12 @@
#ifdef USE_W32_IME
DEFVAR_LISP ("ime-control", &Vime_control, "IME control flag");
Vime_control = Qnil;
+
+ DEFVAR_LISP ("w32-ime-composition-window",
+ &Vw32_ime_composition_window,
+ doc: /* If this is a window of current frame, IME composition window appears on the
+window instead of current window. */);
+ Vw32_ime_composition_window = Qnil;
#endif
#if 0 /* TODO: Port to W32 */
.emacs.elのほうには以下を追加。
(add-hook 'isearch-mode-hook
(lambda () (setq w32-ime-composition-window (minibuffer-window))))
(add-hook 'isearch-mode-end-hook
(lambda () (setq w32-ime-composition-window nil)))
ちなみに、ビルドした結果、w32-ime-composition-window という変数が
elispから見えるようになるのだが、
ビルド時に一緒にできた etc/DOC、etc/DOC-X もインストールすることを忘れると
w32-ime-composition-window を describe したときにおかしなことになる。
おかしなことになった結果、
Variable binding depth exceeds max-specpdl-size
とかエラーが出たりする。
Cレベルで書いたdocstringってここに入ってるのね。知らんかった。
