comparison lisp/quail/quail.el @ 138:6608ceec7cf8 r20-2b3

Import from CVS: tag r20-2b3
author cvs
date Mon, 13 Aug 2007 09:31:46 +0200
parents 131b0175ea99
children
comparison
equal deleted inserted replaced
137:cae984061f40 138:6608ceec7cf8
31 ;; multilingual text from normal ASCII keyboard. By defining a 31 ;; multilingual text from normal ASCII keyboard. By defining a
32 ;; translation table which maps ASCII string to multilingual 32 ;; translation table which maps ASCII string to multilingual
33 ;; string, you can input any text from ASCII keyboard. 33 ;; string, you can input any text from ASCII keyboard.
34 34
35 (require 'mule) 35 (require 'mule)
36 (require 'visual-mode)
36 37
37 ;;;###autoload 38 ;;;###autoload
38 (defconst quail-version "2.2") 39 (defconst quail-version "2.2")
39 40
40 (defvar quail-region-face 'underline) 41 (defvar quail-region-face 'underline)
59 (make-variable-buffer-local 'quail-sub-mode) 60 (make-variable-buffer-local 'quail-sub-mode)
60 (defvar quail-keep-state nil) 61 (defvar quail-keep-state nil)
61 (make-variable-buffer-local 'quail-keep-state) 62 (make-variable-buffer-local 'quail-keep-state)
62 (defvar quail-mode-string nil) 63 (defvar quail-mode-string nil)
63 (make-variable-buffer-local 'quail-mode-string) 64 (make-variable-buffer-local 'quail-mode-string)
64 (defvar quail-overlay nil 65 (defvar quail-extent nil
65 "Overlay which covers quail zone.") 66 "Overlay which covers quail zone.")
66 (make-variable-buffer-local 'quail-overlay) 67 (make-variable-buffer-local 'quail-extent)
67 (defvar quail-current-key nil 68 (defvar quail-current-key nil
68 "Within Quail mode, a key string typed so far.") 69 "Within Quail mode, a key string typed so far.")
69 (make-variable-buffer-local 'quail-current-key) 70 (make-variable-buffer-local 'quail-current-key)
70 (defvar quail-current-str nil 71 (defvar quail-current-str nil
71 "Within Quail mode, a string currently translated from quail-current-key.") 72 "Within Quail mode, a string currently translated from quail-current-key.")
463 (cons '(quail-mode (mc-flag ("[" quail-mode-string "]"))) 464 (cons '(quail-mode (mc-flag ("[" quail-mode-string "]")))
464 mode-line-format))) 465 mode-line-format)))
465 (setq quail-mode t 466 (setq quail-mode t
466 quail-mode-string prompt) 467 quail-mode-string prompt)
467 (erase-buffer) 468 (erase-buffer)
468 (or (overlayp quail-overlay) 469 (or (extentp quail-extent)
469 (setq quail-overlay (make-overlay 1 1))) 470 (setq quail-extent (make-extent 1 1)))
470 (set-buffer curbuf)) 471 (set-buffer curbuf))
471 (cond ((get-buffer-window quail-guidance-buf) 472 (cond ((get-buffer-window quail-guidance-buf)
472 ;; `buf' is already shown in some window. 473 ;; `buf' is already shown in some window.
473 ) 474 )
474 ((null (eq (current-buffer) (window-buffer (minibuffer-window)))) 475 ((null (eq (current-buffer) (window-buffer (minibuffer-window))))
502 (setq quail-mode-string (quail-prompt)) 503 (setq quail-mode-string (quail-prompt))
503 (if (null (assq 'quail-mode mode-line-format)) 504 (if (null (assq 'quail-mode mode-line-format))
504 (setq mode-line-format 505 (setq mode-line-format
505 (cons '(quail-mode (mc-flag ("[" quail-mode-string "]"))) 506 (cons '(quail-mode (mc-flag ("[" quail-mode-string "]")))
506 mode-line-format))) 507 mode-line-format)))
507 (if (null (overlayp quail-overlay)) 508 (if (null (extentp quail-extent))
508 (progn 509 (progn
509 (setq quail-overlay (make-overlay (point) (point))) 510 (setq quail-extent (make-extent (point) (point)))
510 (overlay-put quail-overlay 'face quail-region-face))) 511 (set-extent-face quail-extent 'face quail-region-face)))
511 (make-local-hook 'post-command-hook) 512 (make-local-hook 'post-command-hook)
512 (add-hook 'post-command-hook 'quail-reset-state nil t) 513 (add-hook 'post-command-hook 'quail-reset-state nil t)
513 (setq quail-keep-state nil) 514 (setq quail-keep-state nil)
514 (if (quail-sub-mode-map) 515 (if (quail-sub-mode-map)
515 (progn 516 (progn
534 (run-hooks 'quail-mode-hook)) 535 (run-hooks 'quail-mode-hook))
535 536
536 (defun quail-exit-mode () 537 (defun quail-exit-mode ()
537 (interactive) 538 (interactive)
538 (kill-local-variable 'post-command-hook) 539 (kill-local-variable 'post-command-hook)
539 (delete-overlay quail-overlay) 540 (delete-extent quail-extent)
540 (quail-delete-guidance-buf) 541 (quail-delete-guidance-buf)
541 (let ((modes (quail-extra-mode-list)) 542 (let ((modes (quail-extra-mode-list))
542 (i 0)) 543 (i 0))
543 (while modes 544 (while modes
544 (if (null (nth i quail-previous-extra-mode-list)) 545 (if (null (nth i quail-previous-extra-mode-list))
560 (if quail-keep-state 561 (if quail-keep-state
561 (setq quail-keep-state nil) 562 (setq quail-keep-state nil)
562 (quail-init-state)))) 563 (quail-init-state))))
563 564
564 (defun quail-init-state () 565 (defun quail-init-state ()
565 (if (overlayp quail-overlay) 566 (if (extentp quail-extent)
566 (move-overlay quail-overlay (point) (point)) 567 (set-extent-endpoints quail-extent (point) (point))
567 (setq quail-overlay (make-overlay (point) (point)))) 568 (setq quail-extent (make-extent (point) (point))))
568 (setq quail-current-key nil 569 (setq quail-current-key nil
569 quail-current-str nil) 570 quail-current-str nil)
570 (if quail-sub-mode (quail-exit-sub-mode)) 571 (if quail-sub-mode (quail-exit-sub-mode))
571 (quail-setup-guidance-buf)) 572 (quail-setup-guidance-buf))
572 573
573 (defun quail-check-state () 574 (defun quail-check-state ()
574 (if (and (overlay-buffer quail-overlay) 575 (if (and (extent-object quail-extent)
575 (= (point) (overlay-end quail-overlay))) 576 (= (point) (extent-end-position quail-extent)))
576 quail-current-key 577 quail-current-key
577 (quail-init-state) 578 (quail-init-state)
578 nil)) 579 nil))
579 580
580 (defun quail-delete-region () 581 (defun quail-delete-region ()
581 (delete-region (overlay-start quail-overlay) (overlay-end quail-overlay))) 582 (delete-region (extent-start-position quail-extent) (extent-end-position quail-extent)))
582 583
583 (defun quail-insert (str) 584 (defun quail-insert (str)
584 (quail-delete-region) 585 (quail-delete-region)
585 (if visual-mode 586 (if visual-mode
586 (if (stringp str) 587 (if (stringp str)
591 (visual-insert-1-char str)) 592 (visual-insert-1-char str))
592 (insert str)) 593 (insert str))
593 (if (and auto-fill-function (> (current-column) fill-column)) 594 (if (and auto-fill-function (> (current-column) fill-column))
594 (run-hooks 'auto-fill-function)) 595 (run-hooks 'auto-fill-function))
595 (let ((len (if (integerp str) (char-bytes str) (length str)))) 596 (let ((len (if (integerp str) (char-bytes str) (length str))))
596 (move-overlay quail-overlay (- (point) len) (point))) 597 (set-extent-endpoints quail-extent (- (point) len) (point)))
597 (quail-show-guidance)) 598 (quail-show-guidance))
598 599
599 (defun quail-get-candidates (def) 600 (defun quail-get-candidates (def)
600 (setq def (car (cdr def))) 601 (setq def (car (cdr def)))
601 (if (null (vectorp def)) 602 (if (null (vectorp def))
657 (key quail-current-key)) 658 (key quail-current-key))
658 (select-window (get-buffer-window quail-completion-buf)) 659 (select-window (get-buffer-window quail-completion-buf))
659 (goto-char (point-min)) 660 (goto-char (point-min))
660 (if (search-forward (concat " " key ":") nil t) 661 (if (search-forward (concat " " key ":") nil t)
661 (if (and str (search-forward (concat "." str) nil t)) 662 (if (and str (search-forward (concat "." str) nil t))
662 (move-overlay quail-overlay (1+ (match-beginning 0)) (point)) 663 (set-extent-endpoints quail-extent (1+ (match-beginning 0)) (point))
663 (move-overlay quail-overlay (match-beginning 0) (point))) 664 (set-extent-endpoints quail-extent (match-beginning 0) (point)))
664 (move-overlay quail-overlay 1 1)) 665 (set-extent-endpoints quail-extent 1 1))
665 (select-window (get-buffer-window buf)) 666 (select-window (get-buffer-window buf))
666 ))) 667 )))
667 668
668 (defun quail-translate-char (ch) 669 (defun quail-translate-char (ch)
669 (let* ((str (car quail-keyboard-translate-table)) 670 (let* ((str (car quail-keyboard-translate-table))
749 ) 750 )
750 (if (and quail-current-key (null quail-sub-mode)) 751 (if (and quail-current-key (null quail-sub-mode))
751 (quail-enter-sub-mode)) 752 (quail-enter-sub-mode))
752 ) 753 )
753 754
755 ;; wire us into pending-delete
756 (put 'quail-self-insert-command 'pending-delete t)
757
754 (defun quail-next-candidate () 758 (defun quail-next-candidate ()
755 "Select next candidate." 759 "Select next candidate."
756 (interactive) 760 (interactive)
757 (setq quail-keep-state t) 761 (setq quail-keep-state t)
758 (if (and (quail-check-state) quail-current-str) 762 (if (and (quail-check-state) quail-current-str)
860 (insert "]"))) 864 (insert "]")))
861 (if (consp candidates) 865 (if (consp candidates)
862 (let ((idx (car candidates)) 866 (let ((idx (car candidates))
863 (maxidx (1+ (/ (1- (length (cdr candidates))) 10))) 867 (maxidx (1+ (/ (1- (length (cdr candidates))) 10)))
864 (num 0) 868 (num 0)
865 p p1 p2 str) 869 p p1 p2)
866 (indent-to 10) 870 (indent-to 10)
867 (insert (format "(%d/%d)" (1+ (/ idx 10)) maxidx)) 871 (insert (format "(%d/%d)" (1+ (/ idx 10)) maxidx))
868 (setq candidates (nthcdr (* (/ idx 10) 10) (cdr candidates))) 872 (setq candidates (nthcdr (* (/ idx 10) 10) (cdr candidates)))
869 (while (and candidates (< num 10)) 873 (while (and candidates (< num 10))
870 (setq num (1+ num)) 874 (setq num (1+ num))
906 (if (not (quail-buffer-alive-p quail-completion-buf)) 910 (if (not (quail-buffer-alive-p quail-completion-buf))
907 (setq quail-completion-buf 911 (setq quail-completion-buf
908 (get-buffer-create "*Completions*"))) 912 (get-buffer-create "*Completions*")))
909 (set-buffer quail-completion-buf) 913 (set-buffer quail-completion-buf)
910 (erase-buffer) 914 (erase-buffer)
911 (setq quail-overlay (make-overlay 1 1)) 915 (setq quail-extent (make-extent 1 1))
912 (overlay-put quail-overlay 'face quail-selection-face) 916 (set-extent-face quail-extent 'face quail-selection-face)
913 (insert "Current candidates:\n") 917 (insert "Current candidates:\n")
914 (quail-completion-list key def 1) 918 (quail-completion-list key def 1)
915 (quail-display-buffer (current-buffer))) 919 (quail-display-buffer (current-buffer)))
916 (quail-show-guidance)))) 920 (quail-show-guidance))))
917 921
935 (setq def (cdr def))))) 939 (setq def (cdr def)))))
936 940
937 (defun quail-candidate-with-indent (candidates key) 941 (defun quail-candidate-with-indent (candidates key)
938 (if (consp candidates) 942 (if (consp candidates)
939 (let ((clm (current-column)) 943 (let ((clm (current-column))
940 (i 0) 944 (i 0))
941 num)
942 (while candidates 945 (while candidates
943 (if (= (% i 10) 0) (insert (format "(%d)" (1+ (/ i 10))))) 946 (if (= (% i 10) 0) (insert (format "(%d)" (1+ (/ i 10)))))
944 (insert " " (if (= (% i 10) 9) "0" (+ ?1 (% i 10))) ".") 947 (insert " " (if (= (% i 10) 9) "0" (+ ?1 (% i 10))) ".")
945 (insert (if (stringp (car candidates)) 948 (insert (if (stringp (car candidates))
946 (car candidates) 949 (car candidates)