changeset 19404:8901359ae445

(quail-inactivate): Turn Quail mode off by itself. (quail-translation-keymap): Don't bind thee key "C-\". (quail-conversion-keymap): Likewise. (quail-define-package): Indentation fixed. (quail-setup-overlays): New arg conversion-mode. Pay attention to input-method-highlight-flag. (quail-mode-line-format): Deleted. (quail-generate-mode-line-format): Deleted. (quail-mode): Don't handle input-method-inactivate-hook and input-method-activate-hook here. Delete code setting quail-mode-line-format. (quail-saved-current-map): Name changed from quail-saved-overriding-local-map. (quail-toggle-mode-temporarily): Completely re-written. (quail-execute-non-quail-command): Use quail-toggle-mode-temporarily. (quail-conv-overlay-modification-hook): Deleted. (quail-suppress-conversion): Deleted. (quail-start-translation): Completely re-written. (quail-start-translation-in-conversion-mode): Likewise. (quail-delete-region): Check if quail-overlay is active. (quail-get-current-str): Don't call throw. Set overriding-terminal-local-map correctly. (quail-update-translation): Run hooks in input-method-after-insert-chunk-hook. (quail-self-insert-command): Catch 'quail-tag here. (quail-conversion-delete-char): Don't call throw. Set overriding-terminal-local-map to nil. (quail-conversion-backward-delete-char): Likewise. (quail-no-conversion): Likewise. (quail-help-insert-keymap-description): Bind overriding-terminal-local-map instead of overriding-local-map.
author Kenichi Handa <handa@m17n.org>
date Mon, 18 Aug 1997 10:51:45 +0000
parents 11d21b4613cd
children 7ef4af7505f2
files lisp/international/quail.el
diffstat 1 files changed, 93 insertions(+), 163 deletions(-) [+]
line wrap: on
line diff
--- a/lisp/international/quail.el	Mon Aug 18 02:32:18 1997 +0000
+++ b/lisp/international/quail.el	Mon Aug 18 10:51:45 1997 +0000
@@ -234,7 +234,8 @@
 (defun quail-inactivate ()
   "Turn off Quail input method."
   (interactive)
-  (throw 'quail-tag t))
+  (setq overriding-terminal-local-map nil)
+  (quail-mode -1))
 
 (or (assq 'quail-mode minor-mode-alist)
     (setq minor-mode-alist
@@ -271,7 +272,6 @@
       (define-key map (char-to-string i) 'quail-self-insert-command)
       (setq i (1+ i)))
     (define-key map "\177" 'quail-delete-last-char)
-    (define-key map "\C-\\" 'quail-inactivate)
     (define-key map "\C-f" 'quail-next-translation)
     (define-key map "\C-b" 'quail-prev-translation)
     (define-key map "\C-n" 'quail-next-translation-block)
@@ -305,7 +305,6 @@
     (define-key map "\C-e" 'quail-conversion-end-of-region)
     (define-key map "\C-d" 'quail-conversion-delete-char)
     (define-key map "\C-h" 'quail-conversion-help)
-    (define-key map "\C-\\" 'quail-inactivate)
     (define-key map "\e" '(keymap (t . quail-execute-non-quail-command)))
     (define-key map "\177" 'quail-conversion-backward-delete-char)
     (define-key map [delete] 'quail-conversion-backward-delete-char)
@@ -395,20 +394,19 @@
   (let (translation-keymap conversion-keymap)
     (if deterministic (setq forget-last-selection t))
     (if translation-keys
-      (progn
-	(setq translation-keymap (copy-keymap quail-translation-keymap))
-	(while translation-keys
-	  (define-key translation-keymap
-	    (car (car translation-keys)) (cdr (car translation-keys)))
-	  (setq translation-keys (cdr translation-keys))))
+	(progn
+	  (setq translation-keymap (copy-keymap quail-translation-keymap))
+	  (while translation-keys
+	    (define-key translation-keymap
+	      (car (car translation-keys)) (cdr (car translation-keys)))
+	    (setq translation-keys (cdr translation-keys))))
       (setq translation-keymap quail-translation-keymap))
-    (if conversion-keys
-      (progn
-	(setq conversion-keymap (copy-keymap quail-conversion-keymap))
-	(while conversion-keys
-	  (define-key conversion-keymap
-	    (car (car conversion-keys)) (cdr (car conversion-keys)))
-	  (setq conversion-keys (cdr conversion-keys)))))
+    (when conversion-keys
+      (setq conversion-keymap (copy-keymap quail-conversion-keymap))
+      (while conversion-keys
+	(define-key conversion-keymap
+	  (car (car conversion-keys)) (cdr (car conversion-keys)))
+	(setq conversion-keys (cdr conversion-keys))))
     (quail-add-package
      (list name title (list nil) guidance (or docstring "")
 	   translation-keymap
@@ -428,24 +426,24 @@
 ;; Quail minor mode handlers.
 
 ;; Setup overlays used in Quail mode.
-(defun quail-setup-overlays ()
+(defun quail-setup-overlays (conversion-mode)
   (let ((pos (point)))
     (if (overlayp quail-overlay)
 	(move-overlay quail-overlay pos pos)
       (setq quail-overlay (make-overlay pos pos nil nil t))
-      (overlay-put quail-overlay 'face 'underline)
+      (if input-method-highlight-flag
+	  (overlay-put quail-overlay 'face 'underline))
       (let ((l (quail-overlay-plist)))
 	(while l
 	  (overlay-put quail-overlay (car l) (car (cdr l)))
 	  (setq l (cdr (cdr l))))))
-    (if (overlayp quail-conv-overlay)
-	(move-overlay quail-conv-overlay pos pos)
-      (setq quail-conv-overlay (make-overlay pos pos nil nil t))
-      (if input-method-highlight-flag
-	(overlay-put quail-conv-overlay 'face 'underline))
-      ;;(overlay-put quail-conv-overlay 'modification-hooks
-      ;;'(quail-conv-overlay-modification-hook))
-      )))
+    (if conversion-mode
+	(if (overlayp quail-conv-overlay)
+	    (if (not (overlay-start quail-conv-overlay))
+		(move-overlay quail-conv-overlay pos pos))
+	  (setq quail-conv-overlay (make-overlay pos pos nil nil t))
+	  (if input-method-highlight-flag
+	      (overlay-put quail-conv-overlay 'face 'underline))))))
 
 ;; Delete overlays used in Quail mode.
 (defun quail-delete-overlays ()
@@ -454,30 +452,6 @@
   (if (overlayp quail-conv-overlay)
       (delete-overlay quail-conv-overlay)))
 
-;; While translating and converting, we enter and exit the recursive
-;; edit frequently, which results in frequent and annoying change of
-;; mode line.  To avoid it, we use a modified mode-line-format.
-(defvar quail-mode-line-format nil)
-
-;; Return a modified mode-line-format which doesn't show the recursive
-;; editing level.  But, we only pay attention to the top level
-;; elements of the current mode-line-format.
-(defun quail-generate-mode-line-format ()
-  (if (listp mode-line-format)
-      (let ((new (copy-sequence mode-line-format))
-	    l elt idx)
-	(setq l new)
-	(while l
-	  (setq elt (car l))
-	  (if (and (stringp elt)
-		   (or (setq idx (string-match "%\\[" elt))
-		       (setq idx (string-match "%\\]" elt))))
-	      (setcar l (concat (substring elt 0 idx)
-				(substring elt (+ idx 2)))))
-	  (setq l (cdr l)))
-	new)
-    mode-line-format))
-
 (defun quail-mode (&optional arg)
   "Toggle Quail minor mode.
 With arg, turn Quail mode on if and only if arg is positive.
@@ -493,9 +467,7 @@
 	(quail-hide-guidance-buf)
 	(quail-delete-overlays)
 	(setq describe-current-input-method-function nil)
-	(setq current-input-method nil)
-	(run-hooks 'quail-mode-exit-hook)
-	(run-hooks 'input-method-inactivate-hook))
+	(run-hooks 'quail-mode-exit-hook))
     ;; Let's turn on Quail mode.
     ;; At first, be sure that quail-mode is at the first element of
     ;; minor-mode-map-alist.
@@ -516,17 +488,15 @@
 	    (setq quail-mode nil)
 	    (error "No Quail package loaded"))
 	  (quail-select-package name)))
-    (setq inactivate-current-input-method-function 'quail-mode)
+    (setq inactivate-current-input-method-function 'quail-inactivate)
     (setq describe-current-input-method-function 'quail-help)
-    (setq quail-mode-line-format (quail-generate-mode-line-format))
     (quail-delete-overlays)
     (quail-show-guidance-buf)
     ;; If we are in minibuffer, turn off Quail mode before exiting.
     (if (eq (selected-window) (minibuffer-window))
 	(add-hook 'minibuffer-exit-hook 'quail-exit-from-minibuffer))
     (make-local-hook 'post-command-hook)
-    (run-hooks 'quail-mode-hook)
-    (run-hooks 'input-method-activate-hook))
+    (run-hooks 'quail-mode-hook))
   (force-mode-line-update))
 
 (defun quail-exit-from-minibuffer ()
@@ -534,47 +504,50 @@
   (if (<= (minibuffer-depth) 1)
       (remove-hook 'minibuffer-exit-hook 'quail-exit-from-minibuffer)))
 
-(defvar quail-saved-overriding-local-map nil)
+(defvar quail-saved-current-map nil)
 (defvar quail-saved-current-buffer nil)
 
-;; Toggle `quail-mode'.  This function is added to `post-command-hook'
-;; in Quail mode, to turn Quail mode temporarily off, or back on
-;; after one non-Quail command.
+;; Toggle Quail mode.  This function is added to `post-command-hook'
+;; in Quail mode, to turn Quail mode temporarily off, or back on after
+;; one non-Quail command.
 (defun quail-toggle-mode-temporarily ()
   (if quail-mode
       ;; We are going to handle following events out of Quail mode.
-      (setq quail-mode nil
-	    quail-saved-overriding-local-map overriding-local-map
-	    quail-saved-current-buffer (current-buffer)
-	    overriding-local-map nil)
+      (setq quail-saved-current-buffer (current-buffer)
+	    quail-saved-current-map overriding-terminal-local-map
+	    quail-mode nil
+	    overriding-terminal-local-map nil)
     ;; We have just executed one non-Quail command.  We don't need
     ;; this hook any more.
     (remove-hook 'post-command-hook 'quail-toggle-mode-temporarily t)
-    ;; If the command changed the current buffer, we should not go
-    ;; back to Quail mode.
-    (if (not (eq (current-buffer) quail-saved-current-buffer))
-	(throw 'quail-tag nil)
-      ;; Let's go back to Quail mode.
-      (setq quail-mode t)
-      (setq overriding-local-map quail-saved-overriding-local-map)
-      ;; If whole text in conversion area was deleted, exit from the
-      ;; recursive edit.
-      (let ((start (overlay-start quail-conv-overlay)))
-	(if (and start (= start (overlay-end quail-conv-overlay)))
-	    (throw 'quail-tag nil)))
-      )))
+    (if (eq (current-buffer) quail-saved-current-buffer)
+	;; We should go back to Quail mode only when the current input
+	;; method was not turned off by the last command.
+	(when current-input-method
+	  (setq quail-mode t
+		overriding-terminal-local-map quail-saved-current-map)
+	  (if input-method-exit-on-invalid-key
+	      (inactivate-input-method)))
+      ;; The last command changed the current buffer, we should not go
+      ;; back to Quail mode in this new buffer, but should turn on
+      ;; Quail mode in the original buffer.
+      (save-excursion
+	(set-buffer quail-saved-current-buffer)
+	(setq quail-mode t)
+	(quail-delete-overlays)))))
 
 (defun quail-execute-non-quail-command ()
-  "Execute one non-Quail command in Quail mode.
+  "Execute one non-Quail command out of Quail mode.
 The current translation and conversion are terminated."
   (interactive)
   (setq unread-command-events (cons last-input-event unread-command-events))
   (quail-delete-overlays)
+  (setq overriding-terminal-local-map nil)
   (if (buffer-live-p quail-guidance-buf)
       (save-excursion
 	(set-buffer quail-guidance-buf)
 	(erase-buffer)))
-  (throw 'quail-tag nil))
+  (add-hook 'post-command-hook 'quail-toggle-mode-temporarily nil t))
 
 ;; Keyboard layout translation handlers.
 
@@ -893,25 +866,6 @@
 	  ))
     map))
 
-(defun quail-conv-overlay-modification-hook (overlay after &rest ignore)
-  (if (and after
-	   (= (overlay-start overlay) (overlay-end overlay)))
-      ;; Whole text in conversion area was deleted.  Let's exit from
-      ;; the recursive edit.
-      (throw 'exit nil)))
-
-(defvar quail-suppress-conversion nil
-  "If non-nil, suppress conversion facility of the current Quail package.
-We distinguish between \"translation\" and \"conversion\" aspects
-of an input method.  Translation is the first step, done by Quail itself;
-conversion is the second step which changes the translated text into
-bettertext.  For instance, the Quail package for Japanese (`quail-jp')
-translates Roman text (transliteration of Japanese in Latin alphabets)
-to Hiragana text, and then converts the Hiragana into Kanji-and-Kana
-mixed text or Katakana text.
-
-If this variable is non-nil, translation still occurs, but not conversion.")
-
 ;; If set to non-nil, exit conversion mode before starting new translation.
 (defvar quail-exit-conversion-mode nil)
 
@@ -927,45 +881,16 @@
   ;; Check the possibility of translating the last key.
   (if (assq last-command-event (cdr (quail-map)))
       ;; Ok, we can start translation.
-      (let ((mode-line-format quail-mode-line-format))
-	(quail-setup-overlays)
-	(if (catch 'quail-tag
-	      (if (and (not quail-suppress-conversion)
-		       (quail-conversion-keymap))
-		  ;; We must start translation in conversion mode.
-		  (let ((overriding-terminal-local-map (quail-conversion-keymap)))
-		    (setq quail-exit-conversion-mode nil)
-		    (catch 'exit
-		      (while t
-			(let* ((key (read-key-sequence nil))
-			       (definition (lookup-key overriding-terminal-local-map key t)))
-			  (setq last-command-event (aref key 0))
-			  (setq prefix-arg nil)
-			  (if definition (call-interactively definition)))))
-		    (if (and auto-fill-function
-			     (> (current-column) (current-fill-column)))
-			(run-hooks 'auto-fill-function)))
-		(let ((overriding-terminal-local-map (quail-translation-keymap)))
-		  (setq quail-current-key "")
-		  (catch 'exit
-		    (while t
-		      (let* ((key (read-key-sequence nil))
-			     (definition (lookup-key overriding-terminal-local-map key t)))
-			(setq last-command-event (aref key 0))
-			(setq prefix-arg nil)
-			(if definition (call-interactively definition)))))))
-	      (if (prog1 (< (overlay-start quail-conv-overlay)
-			    (overlay-end quail-conv-overlay))
-		    (delete-overlay quail-conv-overlay))
-		  (run-hooks 'input-method-after-insert-chunk-hook))
-	      nil)
-	    ;; Someone has thrown a tag with value t, which means
-	    ;; we should turn Quail mode off.
-	    (quail-mode -1))
-	(message ""))
-    ;; Since the typed character doesn't start any translation, handle
-    ;; it out of Quail mode.  We come back to Quail mode later because
-    ;; function `quail-toggle-mode-temporarily' is in
+      (if (quail-conversion-keymap)
+	  ;; We must start translation in conversion mode.
+	  (setq quail-exit-conversion-mode nil
+		overriding-terminal-local-map (quail-conversion-keymap))
+	(quail-setup-overlays nil)
+	(setq quail-current-key "")
+	(setq overriding-terminal-local-map (quail-translation-keymap)))
+    ;; Since the last event doesn't start any translation, handle it
+    ;; out of Quail mode.  We come back to Quail mode later by setting
+    ;; function `quail-toggle-mode-temporarily' in
     ;; `post-command-hook'.
     (add-hook 'post-command-hook 'quail-toggle-mode-temporarily nil t)))
 
@@ -981,28 +906,25 @@
   (interactive "*")
   (setq unread-command-events
 	(cons last-command-event unread-command-events))
-  (if (or quail-exit-conversion-mode
-	  (not (quail-point-in-conversion-region)))
-      (progn
-	;; We must start translation with new conversion region.
-	(setq quail-exit-conversion-mode nil)
-	(throw 'exit nil)))
   ;; Check the possibility of translating the last key.
   (if (assq last-command-event (cdr (quail-map)))
       ;; Ok, we can start translation.
-      (let ((overriding-local-map (quail-translation-keymap)))
+      (progn
+	(quail-setup-overlays t)
 	(setq quail-current-key "")
-	(move-overlay quail-overlay (point) (point))
-	(recursive-edit))
-    ;; Since the typed character doesn't start any translation, handle
-    ;; it out of Quail mode.  We come back to Quail mode later because
-    ;; function `quail-toggle-mode-temporarily' is in
+	(setq overriding-terminal-local-map (quail-translation-keymap))
+	(move-overlay quail-overlay (point) (point)))
+    ;; Since the last event doesn't start any translation, handle it
+    ;; out of Quail mode.  We come back to Quail mode later by setting
+    ;; function `quail-toggle-mode-temporarily' in
     ;; `post-command-hook'.
     (add-hook 'post-command-hook 'quail-toggle-mode-temporarily nil t)))
 
 (defsubst quail-delete-region ()
   "Delete the text in the current translation region of Quail."
-  (delete-region (overlay-start quail-overlay) (overlay-end quail-overlay)))
+  (if (overlay-start quail-overlay)
+      (delete-region (overlay-start quail-overlay)
+		     (overlay-end quail-overlay))))
 
 (defun quail-terminate-translation ()
   "Terminate the translation of the current key."
@@ -1029,7 +951,10 @@
       (save-excursion
 	(set-buffer quail-guidance-buf)
 	(erase-buffer)))
-  (throw 'exit nil))
+  (setq overriding-terminal-local-map
+	(if (and (overlayp quail-conv-overlay)
+		 (overlay-start quail-conv-overlay))
+	    (quail-conversion-keymap))))
 
 (defun quail-select-current ()
   "Select the current text shown in Quail translation region."
@@ -1060,15 +985,17 @@
 			(substring quail-current-key 0 len))))
 	(insert (or quail-current-str quail-current-key)))))
   (quail-update-guidance)
-  (if control-flag
-      (quail-terminate-translation)))
+  (when control-flag
+    (quail-terminate-translation)
+    (run-hooks 'input-method-after-insert-chunk-hook)))
 
 (defun quail-self-insert-command ()
   "Add the typed character to the key for translation."
   (interactive "*")
   (setq quail-current-key
 	(concat quail-current-key (char-to-string last-command-event)))
-  (quail-update-translation (quail-translate-key)))
+  (catch 'quail-tag
+    (quail-update-translation (quail-translate-key))))
 
 ;; Return the actual definition part of Quail map MAP.
 (defun quail-map-definition (map)
@@ -1307,18 +1234,20 @@
   (if (>= (point) (overlay-end quail-conv-overlay))
       (error "End of conversion region"))
   (delete-char 1)
-  (if (= (overlay-start quail-conv-overlay)
-	 (overlay-end quail-conv-overlay))
-      (throw 'quail-tag nil)))
+  (when (= (overlay-start quail-conv-overlay)
+	   (overlay-end quail-conv-overlay))
+    (quail-delete-overlays)
+    (setq overriding-terminal-local-map nil)))
 
 (defun quail-conversion-backward-delete-char ()
   (interactive)
   (if (<= (point) (overlay-start quail-conv-overlay))
       (error "Beginning of conversion region"))
   (delete-char -1)
-  (if (= (overlay-start quail-conv-overlay)
-	 (overlay-end quail-conv-overlay))
-      (throw 'quail-tag nil)))
+  (when (= (overlay-start quail-conv-overlay)
+	   (overlay-end quail-conv-overlay))
+    (quail-delete-overlays)
+    (setq overriding-terminal-local-map nil)))
 
 (defun quail-do-conversion (func &rest args)
   "Call FUNC to convert text in the current conversion region of Quail.
@@ -1329,7 +1258,8 @@
 (defun quail-no-conversion ()
   "Do no conversion of the current conversion region of Quail."
   (interactive)
-  (throw 'exit nil))
+  (quail-delete-overlays)
+  (setq overriding-terminal-local-map nil))
 
 ;; Guidance, Completion, and Help buffer handlers.
 
@@ -1651,7 +1581,7 @@
 	(insert header))
     (save-excursion
       (save-window-excursion
-	(let ((overriding-local-map keymap))
+	(let ((overriding-terminal-local-map keymap))
 	  (describe-bindings))
 	(set-buffer "*Help*")
 	(goto-char (point-min))