egg-980309.
[elisp/egg.git] / its-keydef.el
index d295424..e85ee3f 100644 (file)
@@ -6,57 +6,68 @@
 (defvar its-zhuyin nil)
 (make-variable-buffer-local 'its-zhuyin)
 
-(defmacro its-make-slect-func (key name file map &optional lang zhuyin)
+(eval-when (eval compile)
+(defun its-make-select-func (key1 key2 name file map &optional lang zhuyin)
   (setq name (intern (concat "its-select-" (symbol-name name)))
        file (intern (concat "its/" (symbol-name file)))
        map (intern (concat "its-" (symbol-name map) "-map"))
        lang (symbol-name lang))
-  `(progn
-     (defun ,name ()
-       (interactive)
-       (cond
-       ((its-in-fence-p)
-        (its-input-end)
-        (its-put-cursor t))
-       ((egg-get-bunsetsu-info (point))
-        (egg-exit-conversion)))
-       ,(if lang `(egg-check-language ,lang))
-       (require ',file)
-       (setq its-current-map ,map)
-       ,(if lang `(setq its-current-language ,lang))
-       ,(if zhuyin `(setq its-zhuyin ,(eq zhuyin 'T)))
-       (egg-set-mode-line-title (its-get-indicator its-current-map)))
-     (define-key mule-keymap ,key ',name)))
+  (cons
+   `(defun ,name (&optional mode-line-unchange)
+      (interactive)
+      (cond
+       ((its-in-fence-p)
+       (its-input-end)
+       (its-put-cursor t))
+       ((egg-get-bunsetsu-info (point))
+       (egg-exit-conversion)))
+      ,(if lang `(egg-check-language ,lang))
+      (require ',file)
+      (setq its-current-map ,map)
+      ,(if lang `(setq its-current-language ,lang))
+      ,(if zhuyin `(setq its-zhuyin ,(eq zhuyin 'T)))
+      (if (null mode-line-unchange)
+         (egg-set-mode-line-title)))
+   `(define-key map
+      (if fence
+         ,(concat "\e" (vector key2))
+       ,(concat "\C-x\C-m" (vector key1)))
+      ',name)))
+)
 
-(defmacro its-do-list-make-slect-func (list)
+(defmacro its-do-list-make-select-func (list)
   (eval-when (eval compile)
-    (let (e l)
+    (let (funcs keydefs pair)
       (while list
-       (setq e (car list))
-       (setq l (cons `(its-make-slect-func ,@(car list)) l))
+       (setq pair (apply 'its-make-select-func (car list)))
+       (setq funcs (cons (car pair) funcs)
+             keydefs (cons (cdr pair) keydefs))
        (setq list (cdr list)))
-      (cons 'progn l))))
+      `(progn
+        ,@funcs
+        (defun its-define-select-keys (map &optional fence)
+          ,@keydefs)))))
 
-(its-do-list-make-slect-func
- (("Q"    upcase               ascii    up)
-  ("q"    downcase             ascii    down)
-  ("h"    hiragana             hira     hira             Japanese)
-  ("K"    katakana             kata     kata             Japanese)
-  ("x"    hankaku-katakana     hankata  han-kata         Japanese)
-  ("Z"    zenkaku-upcase       zenkaku  zenkaku-up       Japanese)
-  ("z"    zenkaku-downcase     zenkaku  zenkaku-down     Japanese)
-  ("\C-e" erpin-cn             erpin    erpin-cn         Chinese-GB NIL)
-  ("\C-p" pinyin-cn            pinyin   pinyin-cn        Chinese-GB NIL)
-  ("\C-z" zhuyin-cn            zhuyin   zhuyin-cn        Chinese-GB T)
-  ("\C-u" quanjiao-upcase-cn   quanjiao quanjiao-up-cn   Chinese-GB)
-  ("\C-d" quanjiao-downcase-cn quanjiao quanjiao-down-cn Chinese-GB)
-  ("E"    erpin-tw             erpin    erpin-tw         Chinese-CNS NIL)
-  ("P"    pinyin-tw            pinyin   pinyin-tw        Chinese-CNS NIL)
-  ("Z"    zhuyin-tw            zhuyin   zhuyin-tw        Chinese-CNS T)
-  ("U"    quanjiao-upcase-tw   quanjiao quanjiao-up-tw   Chinese-CNS)
-  ("D"    quanjiao-downcase-tw quanjiao quanjiao-down-tw Chinese-CNS)
-  ("H"    hangul               hangul   hangul           Korean)
-  ("J"    jeonkak-upcase       jeonkak  jeonkak-up       Korean)
-  ("j"    jeonkak-downcase     jeonkak  jeonkak-down     Korean)))
+(its-do-list-make-select-func
+ ((?Q    ?Q    upcase               ascii    up)
+  (?q    ?q    downcase             ascii    down)
+  (?h    ?\C-h hiragana             hira     hira             Japanese)
+  (?k    ?\C-k katakana             kata     kata             Japanese)
+  (?x    ?\C-x hankaku-katakana     hankata  han-kata         Japanese)
+  (?Z    ?Z    zenkaku-upcase       zenkaku  zenkaku-up       Japanese)
+  (?z    ?z    zenkaku-downcase     zenkaku  zenkaku-down     Japanese)
+  (?\C-e ?\C-e erpin-cn             erpin    erpin-cn         Chinese-GB NIL)
+  (?\C-p ?\C-p pinyin-cn            pinyin   pinyin-cn        Chinese-GB NIL)
+  (?\C-z ?\C-z zhuyin-cn            zhuyin   zhuyin-cn        Chinese-GB T)
+  (?\C-u ?\C-u quanjiao-upcase-cn   quanjiao quanjiao-up-cn   Chinese-GB)
+  (?\C-d ?\C-d quanjiao-downcase-cn quanjiao quanjiao-down-cn Chinese-GB)
+  (?E    ?E    erpin-tw             erpin    erpin-tw         Chinese-CNS NIL)
+  (?P    ?P    pinyin-tw            pinyin   pinyin-tw        Chinese-CNS NIL)
+  (?Z    ?Z    zhuyin-tw            zhuyin   zhuyin-tw        Chinese-CNS T)
+  (?U    ?U    quanjiao-upcase-tw   quanjiao quanjiao-up-tw   Chinese-CNS)
+  (?C    ?C    quanjiao-downcase-tw quanjiao quanjiao-down-tw Chinese-CNS)
+  (?H    ?H    hangul               hangul   hangul           Korean)
+  (?J    ?J    jeonkak-upcase       jeonkak  jeonkak-up       Korean)
+  (?j    ?j    jeonkak-downcase     jeonkak  jeonkak-down     Korean)))
 
 (provide 'its-keydef)