Mercurial > emacs
comparison lisp/international/quail.el @ 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 | 763bc03e7797 |
children | 4492653b04e8 |
comparison
equal
deleted
inserted
replaced
19403:11d21b4613cd | 19404:8901359ae445 |
---|---|
232 (quail-mode 1)) | 232 (quail-mode 1)) |
233 | 233 |
234 (defun quail-inactivate () | 234 (defun quail-inactivate () |
235 "Turn off Quail input method." | 235 "Turn off Quail input method." |
236 (interactive) | 236 (interactive) |
237 (throw 'quail-tag t)) | 237 (setq overriding-terminal-local-map nil) |
238 (quail-mode -1)) | |
238 | 239 |
239 (or (assq 'quail-mode minor-mode-alist) | 240 (or (assq 'quail-mode minor-mode-alist) |
240 (setq minor-mode-alist | 241 (setq minor-mode-alist |
241 (cons '(quail-mode " Quail") minor-mode-alist))) | 242 (cons '(quail-mode " Quail") minor-mode-alist))) |
242 | 243 |
269 (setq i (1+ i))) | 270 (setq i (1+ i))) |
270 (while (< i 127) | 271 (while (< i 127) |
271 (define-key map (char-to-string i) 'quail-self-insert-command) | 272 (define-key map (char-to-string i) 'quail-self-insert-command) |
272 (setq i (1+ i))) | 273 (setq i (1+ i))) |
273 (define-key map "\177" 'quail-delete-last-char) | 274 (define-key map "\177" 'quail-delete-last-char) |
274 (define-key map "\C-\\" 'quail-inactivate) | |
275 (define-key map "\C-f" 'quail-next-translation) | 275 (define-key map "\C-f" 'quail-next-translation) |
276 (define-key map "\C-b" 'quail-prev-translation) | 276 (define-key map "\C-b" 'quail-prev-translation) |
277 (define-key map "\C-n" 'quail-next-translation-block) | 277 (define-key map "\C-n" 'quail-next-translation-block) |
278 (define-key map "\C-p" 'quail-prev-translation-block) | 278 (define-key map "\C-p" 'quail-prev-translation-block) |
279 (define-key map "\C-i" 'quail-completion) | 279 (define-key map "\C-i" 'quail-completion) |
303 (define-key map "\C-f" 'quail-conversion-forward-char) | 303 (define-key map "\C-f" 'quail-conversion-forward-char) |
304 (define-key map "\C-a" 'quail-conversion-beginning-of-region) | 304 (define-key map "\C-a" 'quail-conversion-beginning-of-region) |
305 (define-key map "\C-e" 'quail-conversion-end-of-region) | 305 (define-key map "\C-e" 'quail-conversion-end-of-region) |
306 (define-key map "\C-d" 'quail-conversion-delete-char) | 306 (define-key map "\C-d" 'quail-conversion-delete-char) |
307 (define-key map "\C-h" 'quail-conversion-help) | 307 (define-key map "\C-h" 'quail-conversion-help) |
308 (define-key map "\C-\\" 'quail-inactivate) | |
309 (define-key map "\e" '(keymap (t . quail-execute-non-quail-command))) | 308 (define-key map "\e" '(keymap (t . quail-execute-non-quail-command))) |
310 (define-key map "\177" 'quail-conversion-backward-delete-char) | 309 (define-key map "\177" 'quail-conversion-backward-delete-char) |
311 (define-key map [delete] 'quail-conversion-backward-delete-char) | 310 (define-key map [delete] 'quail-conversion-backward-delete-char) |
312 (define-key map [backspace] 'quail-conversion-backward-delete-char) | 311 (define-key map [backspace] 'quail-conversion-backward-delete-char) |
313 ;; At last, define default key binding. | 312 ;; At last, define default key binding. |
393 conversion region is active. It is an alist of single key character | 392 conversion region is active. It is an alist of single key character |
394 vs. corresponding command to be called." | 393 vs. corresponding command to be called." |
395 (let (translation-keymap conversion-keymap) | 394 (let (translation-keymap conversion-keymap) |
396 (if deterministic (setq forget-last-selection t)) | 395 (if deterministic (setq forget-last-selection t)) |
397 (if translation-keys | 396 (if translation-keys |
398 (progn | 397 (progn |
399 (setq translation-keymap (copy-keymap quail-translation-keymap)) | 398 (setq translation-keymap (copy-keymap quail-translation-keymap)) |
400 (while translation-keys | 399 (while translation-keys |
401 (define-key translation-keymap | 400 (define-key translation-keymap |
402 (car (car translation-keys)) (cdr (car translation-keys))) | 401 (car (car translation-keys)) (cdr (car translation-keys))) |
403 (setq translation-keys (cdr translation-keys)))) | 402 (setq translation-keys (cdr translation-keys)))) |
404 (setq translation-keymap quail-translation-keymap)) | 403 (setq translation-keymap quail-translation-keymap)) |
405 (if conversion-keys | 404 (when conversion-keys |
406 (progn | 405 (setq conversion-keymap (copy-keymap quail-conversion-keymap)) |
407 (setq conversion-keymap (copy-keymap quail-conversion-keymap)) | 406 (while conversion-keys |
408 (while conversion-keys | 407 (define-key conversion-keymap |
409 (define-key conversion-keymap | 408 (car (car conversion-keys)) (cdr (car conversion-keys))) |
410 (car (car conversion-keys)) (cdr (car conversion-keys))) | 409 (setq conversion-keys (cdr conversion-keys)))) |
411 (setq conversion-keys (cdr conversion-keys))))) | |
412 (quail-add-package | 410 (quail-add-package |
413 (list name title (list nil) guidance (or docstring "") | 411 (list name title (list nil) guidance (or docstring "") |
414 translation-keymap | 412 translation-keymap |
415 forget-last-selection deterministic kbd-translate show-layout | 413 forget-last-selection deterministic kbd-translate show-layout |
416 (if create-decode-map (list 'decode-map) nil) | 414 (if create-decode-map (list 'decode-map) nil) |
426 (quail-select-package name)) | 424 (quail-select-package name)) |
427 | 425 |
428 ;; Quail minor mode handlers. | 426 ;; Quail minor mode handlers. |
429 | 427 |
430 ;; Setup overlays used in Quail mode. | 428 ;; Setup overlays used in Quail mode. |
431 (defun quail-setup-overlays () | 429 (defun quail-setup-overlays (conversion-mode) |
432 (let ((pos (point))) | 430 (let ((pos (point))) |
433 (if (overlayp quail-overlay) | 431 (if (overlayp quail-overlay) |
434 (move-overlay quail-overlay pos pos) | 432 (move-overlay quail-overlay pos pos) |
435 (setq quail-overlay (make-overlay pos pos nil nil t)) | 433 (setq quail-overlay (make-overlay pos pos nil nil t)) |
436 (overlay-put quail-overlay 'face 'underline) | 434 (if input-method-highlight-flag |
435 (overlay-put quail-overlay 'face 'underline)) | |
437 (let ((l (quail-overlay-plist))) | 436 (let ((l (quail-overlay-plist))) |
438 (while l | 437 (while l |
439 (overlay-put quail-overlay (car l) (car (cdr l))) | 438 (overlay-put quail-overlay (car l) (car (cdr l))) |
440 (setq l (cdr (cdr l)))))) | 439 (setq l (cdr (cdr l)))))) |
441 (if (overlayp quail-conv-overlay) | 440 (if conversion-mode |
442 (move-overlay quail-conv-overlay pos pos) | 441 (if (overlayp quail-conv-overlay) |
443 (setq quail-conv-overlay (make-overlay pos pos nil nil t)) | 442 (if (not (overlay-start quail-conv-overlay)) |
444 (if input-method-highlight-flag | 443 (move-overlay quail-conv-overlay pos pos)) |
445 (overlay-put quail-conv-overlay 'face 'underline)) | 444 (setq quail-conv-overlay (make-overlay pos pos nil nil t)) |
446 ;;(overlay-put quail-conv-overlay 'modification-hooks | 445 (if input-method-highlight-flag |
447 ;;'(quail-conv-overlay-modification-hook)) | 446 (overlay-put quail-conv-overlay 'face 'underline)))))) |
448 ))) | |
449 | 447 |
450 ;; Delete overlays used in Quail mode. | 448 ;; Delete overlays used in Quail mode. |
451 (defun quail-delete-overlays () | 449 (defun quail-delete-overlays () |
452 (if (overlayp quail-overlay) | 450 (if (overlayp quail-overlay) |
453 (delete-overlay quail-overlay)) | 451 (delete-overlay quail-overlay)) |
454 (if (overlayp quail-conv-overlay) | 452 (if (overlayp quail-conv-overlay) |
455 (delete-overlay quail-conv-overlay))) | 453 (delete-overlay quail-conv-overlay))) |
456 | |
457 ;; While translating and converting, we enter and exit the recursive | |
458 ;; edit frequently, which results in frequent and annoying change of | |
459 ;; mode line. To avoid it, we use a modified mode-line-format. | |
460 (defvar quail-mode-line-format nil) | |
461 | |
462 ;; Return a modified mode-line-format which doesn't show the recursive | |
463 ;; editing level. But, we only pay attention to the top level | |
464 ;; elements of the current mode-line-format. | |
465 (defun quail-generate-mode-line-format () | |
466 (if (listp mode-line-format) | |
467 (let ((new (copy-sequence mode-line-format)) | |
468 l elt idx) | |
469 (setq l new) | |
470 (while l | |
471 (setq elt (car l)) | |
472 (if (and (stringp elt) | |
473 (or (setq idx (string-match "%\\[" elt)) | |
474 (setq idx (string-match "%\\]" elt)))) | |
475 (setcar l (concat (substring elt 0 idx) | |
476 (substring elt (+ idx 2))))) | |
477 (setq l (cdr l))) | |
478 new) | |
479 mode-line-format)) | |
480 | 454 |
481 (defun quail-mode (&optional arg) | 455 (defun quail-mode (&optional arg) |
482 "Toggle Quail minor mode. | 456 "Toggle Quail minor mode. |
483 With arg, turn Quail mode on if and only if arg is positive. | 457 With arg, turn Quail mode on if and only if arg is positive. |
484 Try \\[describe-bindings] in Quail mode to see the available key binding. | 458 Try \\[describe-bindings] in Quail mode to see the available key binding. |
491 ;; Let's turn off Quail mode. | 465 ;; Let's turn off Quail mode. |
492 (progn | 466 (progn |
493 (quail-hide-guidance-buf) | 467 (quail-hide-guidance-buf) |
494 (quail-delete-overlays) | 468 (quail-delete-overlays) |
495 (setq describe-current-input-method-function nil) | 469 (setq describe-current-input-method-function nil) |
496 (setq current-input-method nil) | 470 (run-hooks 'quail-mode-exit-hook)) |
497 (run-hooks 'quail-mode-exit-hook) | |
498 (run-hooks 'input-method-inactivate-hook)) | |
499 ;; Let's turn on Quail mode. | 471 ;; Let's turn on Quail mode. |
500 ;; At first, be sure that quail-mode is at the first element of | 472 ;; At first, be sure that quail-mode is at the first element of |
501 ;; minor-mode-map-alist. | 473 ;; minor-mode-map-alist. |
502 (or (eq (car minor-mode-map-alist) 'quail-mode) | 474 (or (eq (car minor-mode-map-alist) 'quail-mode) |
503 (let ((l minor-mode-map-alist)) | 475 (let ((l minor-mode-map-alist)) |
514 (if quail-package-alist | 486 (if quail-package-alist |
515 (setq name (car (car quail-package-alist))) | 487 (setq name (car (car quail-package-alist))) |
516 (setq quail-mode nil) | 488 (setq quail-mode nil) |
517 (error "No Quail package loaded")) | 489 (error "No Quail package loaded")) |
518 (quail-select-package name))) | 490 (quail-select-package name))) |
519 (setq inactivate-current-input-method-function 'quail-mode) | 491 (setq inactivate-current-input-method-function 'quail-inactivate) |
520 (setq describe-current-input-method-function 'quail-help) | 492 (setq describe-current-input-method-function 'quail-help) |
521 (setq quail-mode-line-format (quail-generate-mode-line-format)) | |
522 (quail-delete-overlays) | 493 (quail-delete-overlays) |
523 (quail-show-guidance-buf) | 494 (quail-show-guidance-buf) |
524 ;; If we are in minibuffer, turn off Quail mode before exiting. | 495 ;; If we are in minibuffer, turn off Quail mode before exiting. |
525 (if (eq (selected-window) (minibuffer-window)) | 496 (if (eq (selected-window) (minibuffer-window)) |
526 (add-hook 'minibuffer-exit-hook 'quail-exit-from-minibuffer)) | 497 (add-hook 'minibuffer-exit-hook 'quail-exit-from-minibuffer)) |
527 (make-local-hook 'post-command-hook) | 498 (make-local-hook 'post-command-hook) |
528 (run-hooks 'quail-mode-hook) | 499 (run-hooks 'quail-mode-hook)) |
529 (run-hooks 'input-method-activate-hook)) | |
530 (force-mode-line-update)) | 500 (force-mode-line-update)) |
531 | 501 |
532 (defun quail-exit-from-minibuffer () | 502 (defun quail-exit-from-minibuffer () |
533 (if quail-mode (quail-mode -1)) | 503 (if quail-mode (quail-mode -1)) |
534 (if (<= (minibuffer-depth) 1) | 504 (if (<= (minibuffer-depth) 1) |
535 (remove-hook 'minibuffer-exit-hook 'quail-exit-from-minibuffer))) | 505 (remove-hook 'minibuffer-exit-hook 'quail-exit-from-minibuffer))) |
536 | 506 |
537 (defvar quail-saved-overriding-local-map nil) | 507 (defvar quail-saved-current-map nil) |
538 (defvar quail-saved-current-buffer nil) | 508 (defvar quail-saved-current-buffer nil) |
539 | 509 |
540 ;; Toggle `quail-mode'. This function is added to `post-command-hook' | 510 ;; Toggle Quail mode. This function is added to `post-command-hook' |
541 ;; in Quail mode, to turn Quail mode temporarily off, or back on | 511 ;; in Quail mode, to turn Quail mode temporarily off, or back on after |
542 ;; after one non-Quail command. | 512 ;; one non-Quail command. |
543 (defun quail-toggle-mode-temporarily () | 513 (defun quail-toggle-mode-temporarily () |
544 (if quail-mode | 514 (if quail-mode |
545 ;; We are going to handle following events out of Quail mode. | 515 ;; We are going to handle following events out of Quail mode. |
546 (setq quail-mode nil | 516 (setq quail-saved-current-buffer (current-buffer) |
547 quail-saved-overriding-local-map overriding-local-map | 517 quail-saved-current-map overriding-terminal-local-map |
548 quail-saved-current-buffer (current-buffer) | 518 quail-mode nil |
549 overriding-local-map nil) | 519 overriding-terminal-local-map nil) |
550 ;; We have just executed one non-Quail command. We don't need | 520 ;; We have just executed one non-Quail command. We don't need |
551 ;; this hook any more. | 521 ;; this hook any more. |
552 (remove-hook 'post-command-hook 'quail-toggle-mode-temporarily t) | 522 (remove-hook 'post-command-hook 'quail-toggle-mode-temporarily t) |
553 ;; If the command changed the current buffer, we should not go | 523 (if (eq (current-buffer) quail-saved-current-buffer) |
554 ;; back to Quail mode. | 524 ;; We should go back to Quail mode only when the current input |
555 (if (not (eq (current-buffer) quail-saved-current-buffer)) | 525 ;; method was not turned off by the last command. |
556 (throw 'quail-tag nil) | 526 (when current-input-method |
557 ;; Let's go back to Quail mode. | 527 (setq quail-mode t |
558 (setq quail-mode t) | 528 overriding-terminal-local-map quail-saved-current-map) |
559 (setq overriding-local-map quail-saved-overriding-local-map) | 529 (if input-method-exit-on-invalid-key |
560 ;; If whole text in conversion area was deleted, exit from the | 530 (inactivate-input-method))) |
561 ;; recursive edit. | 531 ;; The last command changed the current buffer, we should not go |
562 (let ((start (overlay-start quail-conv-overlay))) | 532 ;; back to Quail mode in this new buffer, but should turn on |
563 (if (and start (= start (overlay-end quail-conv-overlay))) | 533 ;; Quail mode in the original buffer. |
564 (throw 'quail-tag nil))) | 534 (save-excursion |
565 ))) | 535 (set-buffer quail-saved-current-buffer) |
536 (setq quail-mode t) | |
537 (quail-delete-overlays))))) | |
566 | 538 |
567 (defun quail-execute-non-quail-command () | 539 (defun quail-execute-non-quail-command () |
568 "Execute one non-Quail command in Quail mode. | 540 "Execute one non-Quail command out of Quail mode. |
569 The current translation and conversion are terminated." | 541 The current translation and conversion are terminated." |
570 (interactive) | 542 (interactive) |
571 (setq unread-command-events (cons last-input-event unread-command-events)) | 543 (setq unread-command-events (cons last-input-event unread-command-events)) |
572 (quail-delete-overlays) | 544 (quail-delete-overlays) |
545 (setq overriding-terminal-local-map nil) | |
573 (if (buffer-live-p quail-guidance-buf) | 546 (if (buffer-live-p quail-guidance-buf) |
574 (save-excursion | 547 (save-excursion |
575 (set-buffer quail-guidance-buf) | 548 (set-buffer quail-guidance-buf) |
576 (erase-buffer))) | 549 (erase-buffer))) |
577 (throw 'quail-tag nil)) | 550 (add-hook 'post-command-hook 'quail-toggle-mode-temporarily nil t)) |
578 | 551 |
579 ;; Keyboard layout translation handlers. | 552 ;; Keyboard layout translation handlers. |
580 | 553 |
581 ;; Some Quail packages provide localized keyboard simulation which | 554 ;; Some Quail packages provide localized keyboard simulation which |
582 ;; requires a particular keyboard layout. In this case, what we need | 555 ;; requires a particular keyboard layout. In this case, what we need |
891 (progn | 864 (progn |
892 (setcdr map (funcall (cdr map) key len)))) | 865 (setcdr map (funcall (cdr map) key len)))) |
893 )) | 866 )) |
894 map)) | 867 map)) |
895 | 868 |
896 (defun quail-conv-overlay-modification-hook (overlay after &rest ignore) | |
897 (if (and after | |
898 (= (overlay-start overlay) (overlay-end overlay))) | |
899 ;; Whole text in conversion area was deleted. Let's exit from | |
900 ;; the recursive edit. | |
901 (throw 'exit nil))) | |
902 | |
903 (defvar quail-suppress-conversion nil | |
904 "If non-nil, suppress conversion facility of the current Quail package. | |
905 We distinguish between \"translation\" and \"conversion\" aspects | |
906 of an input method. Translation is the first step, done by Quail itself; | |
907 conversion is the second step which changes the translated text into | |
908 bettertext. For instance, the Quail package for Japanese (`quail-jp') | |
909 translates Roman text (transliteration of Japanese in Latin alphabets) | |
910 to Hiragana text, and then converts the Hiragana into Kanji-and-Kana | |
911 mixed text or Katakana text. | |
912 | |
913 If this variable is non-nil, translation still occurs, but not conversion.") | |
914 | |
915 ;; If set to non-nil, exit conversion mode before starting new translation. | 869 ;; If set to non-nil, exit conversion mode before starting new translation. |
916 (defvar quail-exit-conversion-mode nil) | 870 (defvar quail-exit-conversion-mode nil) |
917 | 871 |
918 (defvar quail-prefix-arg nil) | 872 (defvar quail-prefix-arg nil) |
919 | 873 |
925 (setq unread-command-events | 879 (setq unread-command-events |
926 (cons last-command-event unread-command-events)) | 880 (cons last-command-event unread-command-events)) |
927 ;; Check the possibility of translating the last key. | 881 ;; Check the possibility of translating the last key. |
928 (if (assq last-command-event (cdr (quail-map))) | 882 (if (assq last-command-event (cdr (quail-map))) |
929 ;; Ok, we can start translation. | 883 ;; Ok, we can start translation. |
930 (let ((mode-line-format quail-mode-line-format)) | 884 (if (quail-conversion-keymap) |
931 (quail-setup-overlays) | 885 ;; We must start translation in conversion mode. |
932 (if (catch 'quail-tag | 886 (setq quail-exit-conversion-mode nil |
933 (if (and (not quail-suppress-conversion) | 887 overriding-terminal-local-map (quail-conversion-keymap)) |
934 (quail-conversion-keymap)) | 888 (quail-setup-overlays nil) |
935 ;; We must start translation in conversion mode. | 889 (setq quail-current-key "") |
936 (let ((overriding-terminal-local-map (quail-conversion-keymap))) | 890 (setq overriding-terminal-local-map (quail-translation-keymap))) |
937 (setq quail-exit-conversion-mode nil) | 891 ;; Since the last event doesn't start any translation, handle it |
938 (catch 'exit | 892 ;; out of Quail mode. We come back to Quail mode later by setting |
939 (while t | 893 ;; function `quail-toggle-mode-temporarily' in |
940 (let* ((key (read-key-sequence nil)) | |
941 (definition (lookup-key overriding-terminal-local-map key t))) | |
942 (setq last-command-event (aref key 0)) | |
943 (setq prefix-arg nil) | |
944 (if definition (call-interactively definition))))) | |
945 (if (and auto-fill-function | |
946 (> (current-column) (current-fill-column))) | |
947 (run-hooks 'auto-fill-function))) | |
948 (let ((overriding-terminal-local-map (quail-translation-keymap))) | |
949 (setq quail-current-key "") | |
950 (catch 'exit | |
951 (while t | |
952 (let* ((key (read-key-sequence nil)) | |
953 (definition (lookup-key overriding-terminal-local-map key t))) | |
954 (setq last-command-event (aref key 0)) | |
955 (setq prefix-arg nil) | |
956 (if definition (call-interactively definition))))))) | |
957 (if (prog1 (< (overlay-start quail-conv-overlay) | |
958 (overlay-end quail-conv-overlay)) | |
959 (delete-overlay quail-conv-overlay)) | |
960 (run-hooks 'input-method-after-insert-chunk-hook)) | |
961 nil) | |
962 ;; Someone has thrown a tag with value t, which means | |
963 ;; we should turn Quail mode off. | |
964 (quail-mode -1)) | |
965 (message "")) | |
966 ;; Since the typed character doesn't start any translation, handle | |
967 ;; it out of Quail mode. We come back to Quail mode later because | |
968 ;; function `quail-toggle-mode-temporarily' is in | |
969 ;; `post-command-hook'. | 894 ;; `post-command-hook'. |
970 (add-hook 'post-command-hook 'quail-toggle-mode-temporarily nil t))) | 895 (add-hook 'post-command-hook 'quail-toggle-mode-temporarily nil t))) |
971 | 896 |
972 (defsubst quail-point-in-conversion-region () | 897 (defsubst quail-point-in-conversion-region () |
973 "Return non-nil value if the point is in conversion region of Quail mode." | 898 "Return non-nil value if the point is in conversion region of Quail mode." |
979 (defun quail-start-translation-in-conversion-mode () | 904 (defun quail-start-translation-in-conversion-mode () |
980 "Start translating the typed character in conversion mode of Quail mode." | 905 "Start translating the typed character in conversion mode of Quail mode." |
981 (interactive "*") | 906 (interactive "*") |
982 (setq unread-command-events | 907 (setq unread-command-events |
983 (cons last-command-event unread-command-events)) | 908 (cons last-command-event unread-command-events)) |
984 (if (or quail-exit-conversion-mode | |
985 (not (quail-point-in-conversion-region))) | |
986 (progn | |
987 ;; We must start translation with new conversion region. | |
988 (setq quail-exit-conversion-mode nil) | |
989 (throw 'exit nil))) | |
990 ;; Check the possibility of translating the last key. | 909 ;; Check the possibility of translating the last key. |
991 (if (assq last-command-event (cdr (quail-map))) | 910 (if (assq last-command-event (cdr (quail-map))) |
992 ;; Ok, we can start translation. | 911 ;; Ok, we can start translation. |
993 (let ((overriding-local-map (quail-translation-keymap))) | 912 (progn |
913 (quail-setup-overlays t) | |
994 (setq quail-current-key "") | 914 (setq quail-current-key "") |
995 (move-overlay quail-overlay (point) (point)) | 915 (setq overriding-terminal-local-map (quail-translation-keymap)) |
996 (recursive-edit)) | 916 (move-overlay quail-overlay (point) (point))) |
997 ;; Since the typed character doesn't start any translation, handle | 917 ;; Since the last event doesn't start any translation, handle it |
998 ;; it out of Quail mode. We come back to Quail mode later because | 918 ;; out of Quail mode. We come back to Quail mode later by setting |
999 ;; function `quail-toggle-mode-temporarily' is in | 919 ;; function `quail-toggle-mode-temporarily' in |
1000 ;; `post-command-hook'. | 920 ;; `post-command-hook'. |
1001 (add-hook 'post-command-hook 'quail-toggle-mode-temporarily nil t))) | 921 (add-hook 'post-command-hook 'quail-toggle-mode-temporarily nil t))) |
1002 | 922 |
1003 (defsubst quail-delete-region () | 923 (defsubst quail-delete-region () |
1004 "Delete the text in the current translation region of Quail." | 924 "Delete the text in the current translation region of Quail." |
1005 (delete-region (overlay-start quail-overlay) (overlay-end quail-overlay))) | 925 (if (overlay-start quail-overlay) |
926 (delete-region (overlay-start quail-overlay) | |
927 (overlay-end quail-overlay)))) | |
1006 | 928 |
1007 (defun quail-terminate-translation () | 929 (defun quail-terminate-translation () |
1008 "Terminate the translation of the current key." | 930 "Terminate the translation of the current key." |
1009 (let ((start (overlay-start quail-overlay))) | 931 (let ((start (overlay-start quail-overlay))) |
1010 (if (and start | 932 (if (and start |
1027 (delete-overlay quail-overlay) | 949 (delete-overlay quail-overlay) |
1028 (if (buffer-live-p quail-guidance-buf) | 950 (if (buffer-live-p quail-guidance-buf) |
1029 (save-excursion | 951 (save-excursion |
1030 (set-buffer quail-guidance-buf) | 952 (set-buffer quail-guidance-buf) |
1031 (erase-buffer))) | 953 (erase-buffer))) |
1032 (throw 'exit nil)) | 954 (setq overriding-terminal-local-map |
955 (if (and (overlayp quail-conv-overlay) | |
956 (overlay-start quail-conv-overlay)) | |
957 (quail-conversion-keymap)))) | |
1033 | 958 |
1034 (defun quail-select-current () | 959 (defun quail-select-current () |
1035 "Select the current text shown in Quail translation region." | 960 "Select the current text shown in Quail translation region." |
1036 (interactive) | 961 (interactive) |
1037 (quail-terminate-translation)) | 962 (quail-terminate-translation)) |
1058 unread-command-events))) | 983 unread-command-events))) |
1059 (insert (or quail-current-str | 984 (insert (or quail-current-str |
1060 (substring quail-current-key 0 len)))) | 985 (substring quail-current-key 0 len)))) |
1061 (insert (or quail-current-str quail-current-key))))) | 986 (insert (or quail-current-str quail-current-key))))) |
1062 (quail-update-guidance) | 987 (quail-update-guidance) |
1063 (if control-flag | 988 (when control-flag |
1064 (quail-terminate-translation))) | 989 (quail-terminate-translation) |
990 (run-hooks 'input-method-after-insert-chunk-hook))) | |
1065 | 991 |
1066 (defun quail-self-insert-command () | 992 (defun quail-self-insert-command () |
1067 "Add the typed character to the key for translation." | 993 "Add the typed character to the key for translation." |
1068 (interactive "*") | 994 (interactive "*") |
1069 (setq quail-current-key | 995 (setq quail-current-key |
1070 (concat quail-current-key (char-to-string last-command-event))) | 996 (concat quail-current-key (char-to-string last-command-event))) |
1071 (quail-update-translation (quail-translate-key))) | 997 (catch 'quail-tag |
998 (quail-update-translation (quail-translate-key)))) | |
1072 | 999 |
1073 ;; Return the actual definition part of Quail map MAP. | 1000 ;; Return the actual definition part of Quail map MAP. |
1074 (defun quail-map-definition (map) | 1001 (defun quail-map-definition (map) |
1075 (let ((def (car map))) | 1002 (let ((def (car map))) |
1076 (if (and (consp def) (not (vectorp (cdr def)))) | 1003 (if (and (consp def) (not (vectorp (cdr def)))) |
1305 (defun quail-conversion-delete-char () | 1232 (defun quail-conversion-delete-char () |
1306 (interactive) | 1233 (interactive) |
1307 (if (>= (point) (overlay-end quail-conv-overlay)) | 1234 (if (>= (point) (overlay-end quail-conv-overlay)) |
1308 (error "End of conversion region")) | 1235 (error "End of conversion region")) |
1309 (delete-char 1) | 1236 (delete-char 1) |
1310 (if (= (overlay-start quail-conv-overlay) | 1237 (when (= (overlay-start quail-conv-overlay) |
1311 (overlay-end quail-conv-overlay)) | 1238 (overlay-end quail-conv-overlay)) |
1312 (throw 'quail-tag nil))) | 1239 (quail-delete-overlays) |
1240 (setq overriding-terminal-local-map nil))) | |
1313 | 1241 |
1314 (defun quail-conversion-backward-delete-char () | 1242 (defun quail-conversion-backward-delete-char () |
1315 (interactive) | 1243 (interactive) |
1316 (if (<= (point) (overlay-start quail-conv-overlay)) | 1244 (if (<= (point) (overlay-start quail-conv-overlay)) |
1317 (error "Beginning of conversion region")) | 1245 (error "Beginning of conversion region")) |
1318 (delete-char -1) | 1246 (delete-char -1) |
1319 (if (= (overlay-start quail-conv-overlay) | 1247 (when (= (overlay-start quail-conv-overlay) |
1320 (overlay-end quail-conv-overlay)) | 1248 (overlay-end quail-conv-overlay)) |
1321 (throw 'quail-tag nil))) | 1249 (quail-delete-overlays) |
1250 (setq overriding-terminal-local-map nil))) | |
1322 | 1251 |
1323 (defun quail-do-conversion (func &rest args) | 1252 (defun quail-do-conversion (func &rest args) |
1324 "Call FUNC to convert text in the current conversion region of Quail. | 1253 "Call FUNC to convert text in the current conversion region of Quail. |
1325 Remaining args are for FUNC." | 1254 Remaining args are for FUNC." |
1326 (delete-overlay quail-overlay) | 1255 (delete-overlay quail-overlay) |
1327 (apply func args)) | 1256 (apply func args)) |
1328 | 1257 |
1329 (defun quail-no-conversion () | 1258 (defun quail-no-conversion () |
1330 "Do no conversion of the current conversion region of Quail." | 1259 "Do no conversion of the current conversion region of Quail." |
1331 (interactive) | 1260 (interactive) |
1332 (throw 'exit nil)) | 1261 (quail-delete-overlays) |
1262 (setq overriding-terminal-local-map nil)) | |
1333 | 1263 |
1334 ;; Guidance, Completion, and Help buffer handlers. | 1264 ;; Guidance, Completion, and Help buffer handlers. |
1335 | 1265 |
1336 ;; Make a new one-line frame for Quail guidance buffer. | 1266 ;; Make a new one-line frame for Quail guidance buffer. |
1337 (defun quail-make-guidance-frame (buf) | 1267 (defun quail-make-guidance-frame (buf) |
1649 (let (from to) | 1579 (let (from to) |
1650 (if header | 1580 (if header |
1651 (insert header)) | 1581 (insert header)) |
1652 (save-excursion | 1582 (save-excursion |
1653 (save-window-excursion | 1583 (save-window-excursion |
1654 (let ((overriding-local-map keymap)) | 1584 (let ((overriding-terminal-local-map keymap)) |
1655 (describe-bindings)) | 1585 (describe-bindings)) |
1656 (set-buffer "*Help*") | 1586 (set-buffer "*Help*") |
1657 (goto-char (point-min)) | 1587 (goto-char (point-min)) |
1658 (forward-line 4) | 1588 (forward-line 4) |
1659 (setq from (point)) | 1589 (setq from (point)) |