annotate 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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
70
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1 ;; Quail -- Simple inputting method
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2 ;; Copyright (C) 1992 Free Software Foundation, Inc.
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3 ;; This file is part of XEmacs.
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
4
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
5 ;; XEmacs is free software; you can redistribute it and/or modify it
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
6 ;; under the terms of the GNU General Public License as published by
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
7 ;; the Free Software Foundation; either version 2, or (at your option)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
8 ;; any later version.
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
9
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
10 ;; XEmacs is distributed in the hope that it will be useful, but
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
11 ;; WITHOUT ANY WARRANTY; without even the implied warranty of
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
12 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
13 ;; General Public License for more details.
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
14
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
15 ;; You should have received a copy of the GNU General Public License
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
16 ;; along with XEmacs; see the file COPYING. If not, write to the Free
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
17 ;; Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
18
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
19 ;;; 92.2.12 created for Mule Ver.0.9.0 by K.Handa <handa@etl.go.jp>
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
20 ;;; long and gory change log deleted.
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
21
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
22 ;; Although, EGG is the major inputing method supported by Mule,
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
23 ;; it's, for the moment, not convenient for inputing Chinese letters.
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
24 ;; So, I wrote this program as an alternative to EGG to be used
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
25 ;; until revision of EGG.
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
26 ;; I modified all translation tables of cxterm/dict/tit of X.V11R5
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
27 ;; to be used with this system, those are named as quail-*.el.
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
28 ;; Please load only necessary tables.
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
29
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
30 ;; Quail serves as a front end processor for inputing
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
31 ;; multilingual text from normal ASCII keyboard. By defining a
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
32 ;; translation table which maps ASCII string to multilingual
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
33 ;; string, you can input any text from ASCII keyboard.
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
34
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
35 (require 'mule)
138
6608ceec7cf8 Import from CVS: tag r20-2b3
cvs
parents: 70
diff changeset
36 (require 'visual-mode)
70
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
37
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
38 ;;;###autoload
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
39 (defconst quail-version "2.2")
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
40
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
41 (defvar quail-region-face 'underline)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
42 (defvar quail-selection-face 'highlight)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
43
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
44 (defvar quail-self-insert-after-hook nil
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
45 "Function(s) to call after inserting quail characters.")
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
46 (defvar quail-last-char nil
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
47 "A character typed last time in Quail mode.")
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
48
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
49 (defvar quail-completion-buf nil)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
50 (defvar quail-guidance-buf nil)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
51 (defmacro quail-buffer-alive-p (buf)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
52 (list 'and (list 'bufferp buf) (list 'buffer-name buf)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
53
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
54 ;; Buffer local variables
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
55 (defvar quail-mode nil
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
56 "Non-nil if using Quail minor mode.")
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
57 (make-variable-buffer-local 'quail-mode)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
58 (defvar quail-sub-mode nil
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
59 "Non-nil if in sub-mode of Quail minor mode.")
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
60 (make-variable-buffer-local 'quail-sub-mode)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
61 (defvar quail-keep-state nil)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
62 (make-variable-buffer-local 'quail-keep-state)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
63 (defvar quail-mode-string nil)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
64 (make-variable-buffer-local 'quail-mode-string)
138
6608ceec7cf8 Import from CVS: tag r20-2b3
cvs
parents: 70
diff changeset
65 (defvar quail-extent nil
70
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
66 "Overlay which covers quail zone.")
138
6608ceec7cf8 Import from CVS: tag r20-2b3
cvs
parents: 70
diff changeset
67 (make-variable-buffer-local 'quail-extent)
70
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
68 (defvar quail-current-key nil
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
69 "Within Quail mode, a key string typed so far.")
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
70 (make-variable-buffer-local 'quail-current-key)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
71 (defvar quail-current-str nil
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
72 "Within Quail mode, a string currently translated from quail-current-key.")
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
73 (make-variable-buffer-local 'quail-current-str)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
74 (defvar quail-previous-extra-mode-list nil)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
75 (make-variable-buffer-local 'quail-previous-extra-mode-list)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
76
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
77 ;; Quail package
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
78
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
79 ;;;###autoload
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
80 (defvar quail-package-alist nil
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
81 "Assoc list of quail-packages. Each element is a list of:
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
82 NAME, PROMPT, MAP, GUIDANCE, DOC, SUB-MODE-MAP, NOLEARN, DETERMINISTIC,
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
83 TRANSLATE, LAYOUT, OBSOLETE, DECODE-MAP, and EXTRA-MODE-LIST.
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
84 See the document of `quail-define-package' for more detail.")
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
85
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
86 (defmacro quail-package-name () '(car quail-current-package))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
87 (defmacro quail-prompt () '(nth 1 quail-current-package))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
88 (defmacro quail-map () '(nth 2 quail-current-package))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
89 (defmacro quail-guidance () '(nth 3 quail-current-package))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
90 (defmacro quail-document () '(nth 4 quail-current-package))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
91 (defmacro quail-sub-mode-map () '(nth 5 quail-current-package))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
92 (defmacro quail-nolearn () '(nth 6 quail-current-package))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
93 (defmacro quail-deterministic () '(nth 7 quail-current-package))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
94 (defmacro quail-translate () '(nth 8 quail-current-package))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
95 (defmacro quail-layout () '(nth 9 quail-current-package))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
96 (defmacro quail-decode-map () '(nth 11 quail-current-package))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
97 (defmacro quail-extra-mode-list () '(nth 12 quail-current-package))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
98
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
99 (defalias 'quail-showkey 'quail-guidance)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
100 (defalias 'quail-dynamic-list 'quail-guidance)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
101 ;;;###autoload(make-obsolete 'quail-showkey 'quail-guidance)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
102 ;;;###autoload(make-obsolete 'quail-dynamic-list 'quail-guidance)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
103
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
104 ;;;###autoload
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
105 (defvar quail-current-package nil "Current quail-pacakge.")
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
106 ;;;###autoload
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
107 (make-variable-buffer-local 'quail-current-package)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
108
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
109 (defvar quail-last-package nil "Last quail-pacakge.")
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
110
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
111 (defmacro quail-package (name)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
112 "Return quail-package named NAME."
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
113 (list 'assoc name 'quail-package-alist))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
114
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
115 (defun quail-add-package (package)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
116 (let ((pac (quail-package (car package))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
117 (if pac
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
118 (setcdr pac (cdr package))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
119 (setq quail-package-alist (cons package quail-package-alist)))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
120
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
121 ;;;###autoload
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
122 (defun quail-use-package (name)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
123 "Set current quail package to NAME."
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
124 (setq quail-current-package (quail-package name))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
125 (if (null quail-current-package)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
126 (error "No such quail-pacakge: %s" name))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
127 (if (null (quail-map))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
128 (load-library (quail-prompt)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
129 (if (null (string= name (car quail-current-package)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
130 (setq quail-current-package (quail-package name)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
131 (setq-default quail-current-package quail-current-package))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
132
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
133 (defconst quail-mode-map
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
134 (let ((map (make-keymap)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
135 (substitute-key-definition 'self-insert-command
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
136 'quail-self-insert-command
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
137 map global-map)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
138 map))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
139
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
140 (or (assq 'quail-mode minor-mode-alist)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
141 (setq minor-mode-alist
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
142 (cons '(quail-mode " Quail") minor-mode-alist)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
143
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
144 (or (assq 'quail-mode minor-mode-map-alist)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
145 (setq minor-mode-map-alist
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
146 (cons (cons 'quail-mode quail-mode-map) minor-mode-map-alist)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
147
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
148 (defconst quail-sub-mode-map
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
149 (let ((map (copy-keymap quail-mode-map))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
150 (i ?0))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
151 (while (<= i ?9)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
152 (define-key map (char-to-string i) 'quail-self-insert-or-index)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
153 (setq i (1+ i)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
154 (define-key map "\en" 'quail-next-candidate)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
155 (define-key map "\ep" 'quail-prev-candidate)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
156 (define-key map "\eN" 'quail-next-candidate-block)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
157 (define-key map "\eP" 'quail-prev-candidate-block)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
158 (define-key map "\ei" 'quail-completion)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
159 (define-key map "\e " 'quail-select-current)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
160 (define-key map "\eg" 'quail-cancel-current)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
161 (define-key map "\177" 'quail-backward-delete-char)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
162 map))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
163
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
164 (defconst quail-sub-mode-rich-bindings
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
165 '((">" . quail-next-candidate)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
166 ("<" . quail-prev-candidate)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
167 ("." . quail-next-candidate-block)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
168 ("," . quail-prev-candidate-block)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
169 (" " . quail-select-current)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
170 ))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
171
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
172 (defun quail-define-package (name prompt &optional guidance doc key-bindings
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
173 nolearn deterministic translate layout
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
174 obsolete decode-map extra-mode-list)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
175 "Define NAME as a quail-package with initial quail map.
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
176 The second argument PROMPT is a string to be displayed as a name of
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
177 minor mode when NAME is selected as current package of quail-mode.
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
178 Optional arguments are GUIDANCE, DOC, KEY-BINDINGS, NOLEARN, DETERMINISTIC,
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
179 TRANSLATE, LAYOUT, OBSOLETE, DECODE-MAP, EXTRA-MODE-LIST.
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
180 GUIDANCE is an alist of key and correspoing string to be shown in echo area,
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
181 t means shows list of candidates,
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
182 nil means shows typed key.
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
183 DOC is a document shown by quail-help command.
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
184 KEY-BINDINGS is an additional key-bindings for control in quail-sub-mode,
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
185 the value should be a list of cons of KEY and COMMAND.
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
186 NOLEARN non-nil means not remembering a candidate seleceted last time.
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
187 DETERMINISTIC non-nil means deterministic translation
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
188 and NOLEARN is automatically set to t.
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
189 TRANSLATE non-nil means input characters are mapped to vt100 layout
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
190 with quail-keyboard-translate-table.
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
191 LAYOUT non-nil means translated keyboard layout to be displayed by quail-help.
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
192 OBSOLETE is an obsolete argument, anything specified is ignored.
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
193 DECODE-MAP non-nil means create decoding map.
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
194 EXTRA-MODE-LIST is a list of symbols of minor-modes to be set.
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
195 The current quail-package is set to this package and following quail-defrule
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
196 defines translation rules in it."
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
197 (if deterministic (setq nolearn t)) ;92.10.26 by T.Saneto
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
198 (quail-add-package
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
199 (list name prompt (make-sparse-keymap) guidance (or doc "") key-bindings
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
200 nolearn deterministic translate layout nil
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
201 (if decode-map '(0) nil)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
202 extra-mode-list))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
203 (quail-use-package name)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
204 nil)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
205
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
206 (defconst quail-keyboard-standard-table
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
207 '("\
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
208 1234567890-=`\
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
209 qwertyuiop[]\
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
210 asdfghjkl;'\\\
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
211 zxcvbnm,./\
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
212 !@#$%^&*()_+~\
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
213 QWERTYUIOP{}\
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
214 ASDFGHJKL:\"|\
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
215 ZXCVBNM<>?\
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
216 "
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
217 nil))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
218
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
219 (defvar quail-keyboard-translate-table
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
220 quail-keyboard-standard-table
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
221 "List of QUAIL-TRANSLATE-TABLE (first element) and QUAIL-ASSOC-TABLE
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
222 (second element).
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
223 QUAIL-TRANSLATE-TABLE is a string which represents the 'normalised'
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
224 layout of a particular keyboard.
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
225 QUAIL-ASSOC-TABLE is an a-list which describes 'unordinary' key
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
226 locations. A key location is given by a vector of the form
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
227 [x-position y-position shift-or-not]. For example, the '1' (one)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
228 key's location is [0 0 0], and 'W' (capital letter W) is [1 1 1]. The
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
229 third element being 0 means unshifted, 1 means shifted. If
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
230 QUAIL-ASSOC-TABLE is NIL, the first argument given to quail-defrule
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
231 will not be translated.")
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
232
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
233 (defconst quail-keyboard-translate-table-sun-type3
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
234 '("\
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
235 1234567890-=\\\
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
236 qwertyuiop[]\
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
237 asdfghjkl;'`\
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
238 zxcvbnm,./\
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
239 !@#$%^&*()_+|\
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
240 QWERTYUIOP{}\
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
241 ASDFGHJKL:\"~\
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
242 ZXCVBNM<>?\
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
243 "
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
244 ((?` [13 0 0]) (?~ [13 0 1]))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
245
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
246 (defconst quail-keyboard-translate-table-sun-type4
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
247 '("\
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
248 1234567890-=\\\
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
249 qwertyuiop[]\
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
250 asdfghjkl;'`\
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
251 zxcvbnm,./\
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
252 !@#$%^&*()_+|\
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
253 QWERTYUIOP{}\
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
254 ASDFGHJKL:\"~\
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
255 ZXCVBNM<>?\
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
256 "
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
257 ((?\\ [11 -1 0]) (?| [11 -1 1]))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
258
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
259 (defconst quail-keyboard-translate-table-sony-nwp-411a
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
260 '("\
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
261 1234567890-=\\\
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
262 qwertyuiop[]\
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
263 asdfghjkl;'`\
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
264 zxcvbnm,./\
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
265 !@#$%^&*()_+|\
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
266 QWERTYUIOP{}\
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
267 ASDFGHJKL:\"~\
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
268 ZXCVBNM<>?\
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
269 "
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
270 nil))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
271
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
272 (defconst quail-keyboard-translate-table-jis
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
273 '("\
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
274 1234567890-^\\\
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
275 qwertyuiop@[\
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
276 asdfghjkl;:]\
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
277 zxcvbnm,./\
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
278 !\"#$%&'()_=`|\
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
279 QWERTYUIOP~{\
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
280 ASDFGHJKL+*}\
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
281 ZXCVBNM<>?\
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
282 "
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
283 ((?_ [10 3 1]))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
284
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
285 (defconst quail-keyboard-translate-table-fujitsu-sigma-230
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
286 '("\
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
287 1234567890-^\\\
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
288 qwertyuiop@[\
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
289 asdfghjkl;:]\
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
290 zxcvbnm,./\
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
291 !\"#$%&'()_=~|\
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
292 QWERTYUIOP`{\
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
293 ASDFGHJKL+*}\
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
294 ZXCVBNM<>?\
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
295 "
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
296 ((?_ [10 3 1]))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
297
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
298 (defconst quail-keyboard-translate-table-ibm-at
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
299 '("\
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
300 1234567890-=\\\
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
301 qwertyuiop[]\
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
302 asdfghjkl;'`\
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
303 zxcvbnm,./\
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
304 !@#$%^&*()_+|\
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
305 QWERTYUIOP{}\
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
306 ASDFGHJKL:\"~\
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
307 ZXCVBNM<>?\
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
308 "
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
309 ((?` [-1 0 0]) (?~ [-1 0 1]))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
310
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
311 (defconst quail-keyboard-translate-table-ibm-rt/pc
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
312 '("\
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
313 1234567890-=`\
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
314 qwertyuiop[]\
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
315 asdfghjkl;'\\\
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
316 zxcvbnm,./\
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
317 !@#$%^&*()_+~\
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
318 QWERTYUIOP{}\
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
319 ASDFGHJKL:\"|\
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
320 ZXCVBNM<>?\
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
321 "
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
322 ((?` [-1 0 0]) (?~ [-1 0 1]) (?\\ [12 1 0]) (?| [12 1 1]))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
323
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
324 (defconst quail-keyboard-translate-table-decstation
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
325 '("\
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
326 1234567890-=`\
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
327 qwertyuiop[]\
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
328 asdfghjkl;'\\\
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
329 zxcvbnm,./\
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
330 !@#$%^&*()_+~\
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
331 QWERTYUIOP{}\
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
332 ASDFGHJKL:\"|\
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
333 ZXCVBNM<>?\
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
334 "
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
335 ((?` [-1 3 0]) (?~ [-1 3 1]))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
336
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
337 (defconst quail-keyboard-translate-table-dynabook
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
338 '("\
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
339 1234567890-=`\
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
340 qwertyuiop[]\
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
341 asdfghjkl;'\\\
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
342 zxcvbnm,./\
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
343 !@#$%^&*()_+~\
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
344 QWERTYUIOP{}\
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
345 ASDFGHJKL:\"|\
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
346 ZXCVBNM<>?\
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
347 "
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
348 ((?` [7 4 0]) (?~ [7 4 1]) (?\\ [1 4 0]) (?| [1 4 1]))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
349
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
350 (defconst quail-keyboard-translate-table-mac-mo110
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
351 '("\
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
352 1234567890-=`\
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
353 qwertyuiop[]\
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
354 asdfghjkl;'\\\
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
355 zxcvbnm,./\
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
356 !@#$%^&*()_+~\
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
357 QWERTYUIOP{}\
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
358 ASDFGHJKL:\"|\
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
359 ZXCVBNM<>?\
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
360 "
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
361 ((?` [-1 0 0]) (?~ [-1 0 1]) (?\\ [8 4 0]) (?| [8 4 1]))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
362
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
363 (defconst quail-keyboard-translate-table-mac-mo116
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
364 '("\
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
365 1234567890-=`\
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
366 qwertyuiop[]\
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
367 asdfghjkl;'\\\
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
368 zxcvbnm,./\
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
369 !@#$%^&*()_+~\
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
370 QWERTYUIOP{}\
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
371 ASDFGHJKL:\"|\
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
372 ZXCVBNM<>?\
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
373 "
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
374 ((?` [1 4 0]) (?~ [1 4 1]) (?\\ [7 4 0]) (?| [7 4 1]))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
375
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
376 (defun quail-defrule (key candidate &optional name)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
377 "Define KEY (string) to produce CANDIDATE in the current quail-map.
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
378 CANDIDATE is a string, a list of strings, a quail-map, a command, or a symbol.
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
379 If the string contains only one character, the character code (integer) is
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
380 also acceptable.
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
381 The command should be a lisp function suitable for interactive
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
382 calling (and called with no argument).
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
383 The symbol's function definition should be a quail-map.
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
384 Optional arg PACKAGE indicates the package name to be used."
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
385 (let* ((quail-current-package
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
386 (if name (quail-package name) quail-current-package))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
387 (map (quail-map)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
388 (if (not (keymapp map))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
389 (error "QUAIL: Invalid quail-map: %s" map)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
390 (if (or (keymapp candidate) ; another quail-map
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
391 (symbolp candidate)) ; command or symbol
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
392 (define-key map key candidate)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
393 (if (integerp candidate)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
394 (setq candidate (char-to-string candidate)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
395 (if (and (setq map (lookup-key map key))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
396 (keymapp map))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
397 (if (vectorp (car (cdr map)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
398 (define-key map "\0" candidate)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
399 (setcdr map (cons (vector candidate) (cdr map))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
400 (define-key (quail-map) key (list 'keymap (vector candidate)))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
401 (if (null (vectorp candidate))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
402 (let ((decode-map (quail-decode-map))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
403 tbl)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
404 (if decode-map
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
405 (if (setq tbl (assoc candidate decode-map))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
406 (setcdr tbl key)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
407 (setcar (nthcdr 11 quail-current-package)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
408 (cons (cons candidate key) decode-map))))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
409 ))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
410 nil)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
411
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
412 (defalias 'qd 'quail-defrule)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
413 (defmacro qdv (key str) (list 'quail-defrule key (list 'vector str)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
414
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
415 (defun quail-message (msg)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
416 (or (eq (current-buffer) (window-buffer (minibuffer-window)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
417 (message "%s" msg)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
418
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
419 (defun quail-select-package (name)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
420 "Select quail-package."
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
421 (interactive
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
422 (let* ((completion-ignore-case t)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
423 (default (if quail-last-package
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
424 (car quail-last-package)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
425 (package-name (completing-read
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
426 (format "Quail Package (%s): " default)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
427 quail-package-alist nil t nil)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
428 (if (> (length package-name) 0) (list package-name) (list default))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
429 (if (quail-package name)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
430 (progn
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
431 (setq quail-last-package quail-current-package)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
432 (quail-use-package name)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
433 (if quail-mode
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
434 (progn (quail-exit-mode) (quail-mode))))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
435
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
436 ;;;###autoload
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
437 (defun quail-mode (&optional arg)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
438 "Toggle Quail minor mode.
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
439 With arg, turn Quail mode on if and only if arg is positive.
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
440 The command key you can use in Quail mode depends on a quail package.
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
441 Try \\[describe-bindings] in quail-mode.
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
442 The description about the current quail package is shown by \\[quail-help]."
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
443 (interactive "P")
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
444 (setq quail-mode (if (null arg)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
445 (null quail-mode)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
446 (> (prefix-numeric-value arg) 0)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
447 (if quail-mode
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
448 (if quail-package-alist
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
449 (quail-enter-mode)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
450 (setq quail-mode nil)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
451 (error "QUAIL: No quail-package, one should be loaded in advance."))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
452 (quail-exit-mode))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
453 (force-mode-line-update 'all))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
454
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
455 (defun quail-setup-guidance-buf ()
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
456 (or (and (bufferp quail-guidance-buf) (buffer-name quail-guidance-buf))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
457 (setq quail-guidance-buf
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
458 (get-buffer-create " *Quail guide for minibuffer*")))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
459 (let ((prompt (quail-prompt))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
460 (curbuf (current-buffer)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
461 (set-buffer quail-guidance-buf)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
462 (if (null (assq 'quail-mode mode-line-format))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
463 (setq mode-line-format
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
464 (cons '(quail-mode (mc-flag ("[" quail-mode-string "]")))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
465 mode-line-format)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
466 (setq quail-mode t
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
467 quail-mode-string prompt)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
468 (erase-buffer)
138
6608ceec7cf8 Import from CVS: tag r20-2b3
cvs
parents: 70
diff changeset
469 (or (extentp quail-extent)
6608ceec7cf8 Import from CVS: tag r20-2b3
cvs
parents: 70
diff changeset
470 (setq quail-extent (make-extent 1 1)))
70
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
471 (set-buffer curbuf))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
472 (cond ((get-buffer-window quail-guidance-buf)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
473 ;; `buf' is already shown in some window.
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
474 )
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
475 ((null (eq (current-buffer) (window-buffer (minibuffer-window))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
476 ;; We are in normal buffer, let's use minibuffer.
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
477 (set-window-buffer (minibuffer-window) quail-guidance-buf))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
478 (t
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
479 ;; Since we are in minibuffer, we can't use it.
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
480 ;; Let's find the bottom window.
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
481 (let ((window-min-height 1)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
482 (win (frame-lowest-window (selected-frame)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
483 height)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
484 (setq height (window-height win))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
485 (if (>= height 4)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
486 (setq win (split-window win (- height 2))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
487 (set-window-buffer win quail-guidance-buf)))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
488
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
489 (defun quail-delete-guidance-buf ()
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
490 (if (and (bufferp quail-guidance-buf) (buffer-name quail-guidance-buf))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
491 (if (eq (current-buffer) (window-buffer (minibuffer-window)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
492 (let ((win (get-buffer-window quail-guidance-buf)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
493 (if win (delete-window win)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
494 (set-window-buffer (minibuffer-window)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
495 (format " *Minibuf-%d*" (minibuffer-depth))))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
496
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
497 (defun quail-enter-mode ()
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
498 (or (eq (car (car minor-mode-map-alist)) 'quail-mode)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
499 (setq minor-mode-map-alist
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
500 (cons (cons 'quail-mode quail-mode-map) minor-mode-map-alist)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
501 (quail-use-package (or (car quail-current-package)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
502 (car (car quail-package-alist))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
503 (setq quail-mode-string (quail-prompt))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
504 (if (null (assq 'quail-mode mode-line-format))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
505 (setq mode-line-format
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
506 (cons '(quail-mode (mc-flag ("[" quail-mode-string "]")))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
507 mode-line-format)))
138
6608ceec7cf8 Import from CVS: tag r20-2b3
cvs
parents: 70
diff changeset
508 (if (null (extentp quail-extent))
70
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
509 (progn
138
6608ceec7cf8 Import from CVS: tag r20-2b3
cvs
parents: 70
diff changeset
510 (setq quail-extent (make-extent (point) (point)))
6608ceec7cf8 Import from CVS: tag r20-2b3
cvs
parents: 70
diff changeset
511 (set-extent-face quail-extent 'face quail-region-face)))
70
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
512 (make-local-hook 'post-command-hook)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
513 (add-hook 'post-command-hook 'quail-reset-state nil t)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
514 (setq quail-keep-state nil)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
515 (if (quail-sub-mode-map)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
516 (progn
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
517 (if (null (keymapp (quail-sub-mode-map)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
518 (let ((bindings (quail-sub-mode-map))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
519 (map (copy-keymap quail-sub-mode-map)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
520 (while bindings
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
521 (define-key map (car (car bindings)) (cdr (car bindings)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
522 (setq bindings (cdr bindings)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
523 (setcar (nthcdr 5 quail-current-package) map)))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
524 (let ((modes (quail-extra-mode-list))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
525 (i 0))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
526 (setq quail-previous-extra-mode-list (make-list (length modes) nil))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
527 (while modes
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
528 (setcar (nthcdr i quail-previous-extra-mode-list)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
529 (symbol-value (car modes)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
530 (if (null (symbol-value (car modes)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
531 (funcall (car modes) 1))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
532 (setq i (1+ i) modes (cdr modes))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
533 (quail-init-state)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
534 (quail-message (substitute-command-keys "\\[quail-help] for help."))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
535 (run-hooks 'quail-mode-hook))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
536
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
537 (defun quail-exit-mode ()
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
538 (interactive)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
539 (kill-local-variable 'post-command-hook)
138
6608ceec7cf8 Import from CVS: tag r20-2b3
cvs
parents: 70
diff changeset
540 (delete-extent quail-extent)
70
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
541 (quail-delete-guidance-buf)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
542 (let ((modes (quail-extra-mode-list))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
543 (i 0))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
544 (while modes
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
545 (if (null (nth i quail-previous-extra-mode-list))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
546 (funcall (car modes) -1))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
547 (setq i (1+ i) modes (cdr modes))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
548 (setq quail-mode nil))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
549
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
550 (defun quail-enter-sub-mode ()
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
551 (setcdr (assoc 'quail-mode minor-mode-map-alist)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
552 (or (quail-sub-mode-map) quail-sub-mode-map))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
553 (setq quail-sub-mode t))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
554
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
555 (defun quail-exit-sub-mode ()
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
556 (setcdr (assoc 'quail-mode minor-mode-map-alist) quail-mode-map)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
557 (setq quail-sub-mode nil))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
558
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
559 (defun quail-reset-state ()
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
560 (if quail-mode
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
561 (if quail-keep-state
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
562 (setq quail-keep-state nil)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
563 (quail-init-state))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
564
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
565 (defun quail-init-state ()
138
6608ceec7cf8 Import from CVS: tag r20-2b3
cvs
parents: 70
diff changeset
566 (if (extentp quail-extent)
6608ceec7cf8 Import from CVS: tag r20-2b3
cvs
parents: 70
diff changeset
567 (set-extent-endpoints quail-extent (point) (point))
6608ceec7cf8 Import from CVS: tag r20-2b3
cvs
parents: 70
diff changeset
568 (setq quail-extent (make-extent (point) (point))))
70
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
569 (setq quail-current-key nil
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
570 quail-current-str nil)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
571 (if quail-sub-mode (quail-exit-sub-mode))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
572 (quail-setup-guidance-buf))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
573
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
574 (defun quail-check-state ()
138
6608ceec7cf8 Import from CVS: tag r20-2b3
cvs
parents: 70
diff changeset
575 (if (and (extent-object quail-extent)
6608ceec7cf8 Import from CVS: tag r20-2b3
cvs
parents: 70
diff changeset
576 (= (point) (extent-end-position quail-extent)))
70
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
577 quail-current-key
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
578 (quail-init-state)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
579 nil))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
580
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
581 (defun quail-delete-region ()
138
6608ceec7cf8 Import from CVS: tag r20-2b3
cvs
parents: 70
diff changeset
582 (delete-region (extent-start-position quail-extent) (extent-end-position quail-extent)))
70
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
583
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
584 (defun quail-insert (str)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
585 (quail-delete-region)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
586 (if visual-mode
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
587 (if (stringp str)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
588 (let ((l (string-to-char-list str))) ;93.4.30 by Takahashi N.
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
589 (while l
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
590 (visual-insert-1-char (car l))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
591 (setq l (cdr l))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
592 (visual-insert-1-char str))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
593 (insert str))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
594 (if (and auto-fill-function (> (current-column) fill-column))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
595 (run-hooks 'auto-fill-function))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
596 (let ((len (if (integerp str) (char-bytes str) (length str))))
138
6608ceec7cf8 Import from CVS: tag r20-2b3
cvs
parents: 70
diff changeset
597 (set-extent-endpoints quail-extent (- (point) len) (point)))
70
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
598 (quail-show-guidance))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
599
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
600 (defun quail-get-candidates (def)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
601 (setq def (car (cdr def)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
602 (if (null (vectorp def))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
603 nil
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
604 (let ((candidates (aref def 0)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
605 (if (vectorp candidates)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
606 (progn
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
607 (setq candidates
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
608 (cons 0 (string-to-char-list (aref candidates 0))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
609 (aset def 0 candidates))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
610 (if (and (listp candidates)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
611 (stringp (car candidates)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
612 (progn
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
613 (setq candidates (cons 0 candidates))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
614 (aset def 0 candidates))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
615 candidates)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
616
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
617 (defun quail-get-candidate (def &optional nolearn)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
618 (let ((candidates (quail-get-candidates def)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
619 (if candidates
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
620 (if (not (listp candidates)) ;93.1.17 by K.Handa
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
621 (if (integerp candidates)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
622 candidates
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
623 (if (and (symbolp candidates) (fboundp candidates))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
624 (if (keymapp (symbol-function candidates))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
625 (symbol-function candidates)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
626 (funcall candidates))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
627 candidates))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
628 (if nolearn
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
629 (rplaca candidates 0))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
630 (nth (car candidates) (cdr candidates)))))) ;93.1.17 by K.Handa
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
631
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
632 (defun quail-show-guidance ()
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
633 ;; At first, show dynamic list or current keyin string in echo area.
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
634 (quail-setup-guidance-buf)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
635 (let ((guidance (quail-guidance)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
636 (if (eq guidance t)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
637 (quail-list-dynamically)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
638 (save-excursion
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
639 (let ((key quail-current-key))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
640 (save-excursion
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
641 (set-buffer quail-guidance-buf)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
642 (if (null guidance)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
643 (insert key)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
644 (let ((i 0) (len (length key)) ch show)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
645 (while (< i len)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
646 (setq ch (aref key i))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
647 (setq show (cdr (assoc ch guidance)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
648 (insert (if show show (char-to-string ch)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
649 (setq i (1+ i))))))))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
650 ;; Then highlight the current candidate string in *Completion* buffer if any.
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
651 (if (and (quail-buffer-alive-p quail-completion-buf)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
652 (get-buffer-window quail-completion-buf))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
653 (let ((buf (current-buffer))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
654 (str (if (stringp quail-current-str)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
655 quail-current-str
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
656 (if (numberp quail-current-str)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
657 (char-to-string quail-current-str))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
658 (key quail-current-key))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
659 (select-window (get-buffer-window quail-completion-buf))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
660 (goto-char (point-min))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
661 (if (search-forward (concat " " key ":") nil t)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
662 (if (and str (search-forward (concat "." str) nil t))
138
6608ceec7cf8 Import from CVS: tag r20-2b3
cvs
parents: 70
diff changeset
663 (set-extent-endpoints quail-extent (1+ (match-beginning 0)) (point))
6608ceec7cf8 Import from CVS: tag r20-2b3
cvs
parents: 70
diff changeset
664 (set-extent-endpoints quail-extent (match-beginning 0) (point)))
6608ceec7cf8 Import from CVS: tag r20-2b3
cvs
parents: 70
diff changeset
665 (set-extent-endpoints quail-extent 1 1))
70
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
666 (select-window (get-buffer-window buf))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
667 )))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
668
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
669 (defun quail-translate-char (ch)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
670 (let* ((str (car quail-keyboard-translate-table))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
671 (len (length str))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
672 (i 0))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
673 (while (and (< i len) (/= ch (aref str i)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
674 (setq i (1+ i)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
675 (if (= i len)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
676 (error "'%c' not found in quail-keyboard-translate-table" ch))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
677 (aref (car quail-keyboard-standard-table) i)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
678
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
679 (defun quail-select-current ()
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
680 "Select the current candidate."
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
681 (interactive "*")
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
682 (quail-self-insert-command t))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
683
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
684 (defun quail-self-insert-or-index ()
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
685 "Select a character from the current 10 candidates by digit."
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
686 (interactive "*")
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
687 (quail-self-insert-command (- last-command-char ?0)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
688
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
689 (defun quail-lookup-key (key)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
690 (let ((def (lookup-key (quail-map) key)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
691 (if (and (symbolp def) (fboundp def))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
692 (setq def (symbol-function def)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
693 def))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
694
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
695 (defun quail-self-insert-command (&optional arg)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
696 (interactive "*")
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
697 (setq quail-keep-state t)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
698 (quail-check-state)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
699 (setq quail-last-char last-command-char)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
700 (let* ((ch (if (quail-translate)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
701 (quail-translate-char quail-last-char)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
702 quail-last-char))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
703 (chstr (char-to-string ch))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
704 (key (if quail-current-key
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
705 (format "%s%c" quail-current-key ch)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
706 chstr))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
707 (def (quail-lookup-key key)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
708 (cond ((keymapp def)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
709 (setq quail-current-key key)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
710 (setq quail-current-str (quail-get-candidate def (quail-nolearn)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
711 (quail-insert (or quail-current-str quail-current-key))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
712 (if (and quail-current-str
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
713 (null (nthcdr 2 def))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
714 (setq def (aref (nth 1 def) 0))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
715 (or (null (listp def)) (= (length def) 2))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
716 (null (and (>= (length quail-current-key) 3)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
717 (lookup-key (quail-map) chstr))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
718 (quail-init-state)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
719 ((commandp def)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
720 (setq quail-current-key key)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
721 (if (keymapp (symbol-function def))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
722 (progn
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
723 (setq quail-current-str nil)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
724 (quail-insert quail-current-key))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
725 (call-interactively def)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
726 ((and (numberp arg) quail-current-str (null (quail-deterministic)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
727 (quail-indexed-candidate arg))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
728 ((eq arg t)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
729 (quail-init-state))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
730 (quail-current-key
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
731 (let ((len (length key)) str)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
732 (if (and (>= len 4)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
733 (keymapp (lookup-key (quail-map) (substring key -2)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
734 (setq def (quail-lookup-key (substring key 0 -2)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
735 (keymapp def)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
736 (setq str (quail-get-candidate def (quail-nolearn))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
737 (progn
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
738 (quail-delete-region)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
739 (insert str)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
740 (quail-init-state)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
741 (setq unread-command-events
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
742 (cons (aref key (- len 2))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
743 (cons ch unread-command-events))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
744 (quail-init-state)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
745 (quail-self-insert-command))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
746 (t
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
747 (quail-init-state)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
748 (self-insert-command 1)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
749 (run-hooks 'quail-self-insert-after-hook)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
750 )
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
751 (if (and quail-current-key (null quail-sub-mode))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
752 (quail-enter-sub-mode))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
753 )
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
754
138
6608ceec7cf8 Import from CVS: tag r20-2b3
cvs
parents: 70
diff changeset
755 ;; wire us into pending-delete
6608ceec7cf8 Import from CVS: tag r20-2b3
cvs
parents: 70
diff changeset
756 (put 'quail-self-insert-command 'pending-delete t)
6608ceec7cf8 Import from CVS: tag r20-2b3
cvs
parents: 70
diff changeset
757
70
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
758 (defun quail-next-candidate ()
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
759 "Select next candidate."
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
760 (interactive)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
761 (setq quail-keep-state t)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
762 (if (and (quail-check-state) quail-current-str)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
763 (quail-select-candidate 1 t)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
764 (beep)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
765
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
766 (defun quail-prev-candidate ()
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
767 "Select previous candidate."
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
768 (interactive)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
769 (setq quail-keep-state t)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
770 (if (and (quail-check-state) quail-current-str)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
771 (quail-select-candidate -1 t)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
772 (beep)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
773
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
774 (defun quail-indexed-candidate (idx)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
775 (setq idx (if (= idx 0) 9 (1- idx)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
776 (quail-select-candidate idx nil t)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
777 (quail-init-state))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
778
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
779 (defun quail-next-candidate-block ()
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
780 "Select candidate in next 10 alternatives."
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
781 (interactive)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
782 (setq quail-keep-state t)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
783 (if (and (quail-check-state) quail-current-str)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
784 (quail-select-candidate 10 t t)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
785 (beep)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
786
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
787 (defun quail-prev-candidate-block ()
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
788 "Select candidate in previous 10 alternatives."
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
789 (interactive)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
790 (setq quail-keep-state t)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
791 (if (and (quail-check-state) quail-current-str)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
792 (quail-select-candidate -10 t t)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
793 (beep)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
794
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
795 (defun quail-select-candidate (idx &optional relative block)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
796 (let* ((def (quail-lookup-key quail-current-key))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
797 (candidates (quail-get-candidates def)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
798 (if (listp candidates)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
799 (let ((maxidx (- (length candidates) 2))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
800 (current-idx (car candidates)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
801 (if relative
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
802 (setq idx (+ current-idx idx))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
803 (if block
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
804 (setq idx (+ (* (/ current-idx 10) 10) idx))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
805 (if block
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
806 (if (> idx maxidx)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
807 (if (/= (/ maxidx 10) (/ current-idx 10))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
808 (setq idx maxidx)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
809 (beep)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
810 (setq idx current-idx))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
811 (if (< idx 0) (progn (beep) (setq idx (+ idx 10)))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
812 (if (> idx maxidx) (setq idx 0)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
813 (if (< idx 0) (setq idx maxidx))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
814 (rplaca candidates idx)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
815 (setq quail-current-str (nth (car candidates) (cdr candidates)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
816 (quail-insert quail-current-str)))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
817
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
818 (defun quail-cancel-current ()
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
819 "Cancel the current key sequence."
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
820 (interactive)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
821 (quail-delete-region)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
822 (quail-init-state))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
823
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
824 (defun quail-backward-delete-char (arg)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
825 "Delete characters backward in quail-mode."
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
826 (interactive "*p")
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
827 (if (= (length quail-current-key) 1)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
828 (progn
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
829 (quail-delete-region)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
830 (quail-init-state))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
831 (setq quail-keep-state t)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
832 (setq quail-current-key (substring quail-current-key 0 -1))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
833 (let ((def (quail-lookup-key quail-current-key)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
834 (setq quail-last-char
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
835 (aref quail-current-key (1- (length quail-current-key))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
836 (setq quail-current-str
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
837 (quail-get-candidate def (quail-nolearn))) ;93.1.17 by K.Handa
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
838 (quail-insert (or quail-current-str quail-current-key)))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
839
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
840 (defvar quail-work-str (make-string 128 0))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
841
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
842 (defun quail-list-dynamically ()
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
843 "Show list of candidates dynamically."
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
844 (let* ((def (quail-lookup-key quail-current-key))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
845 (candidates (quail-get-candidates def))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
846 (key quail-current-key))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
847 (save-excursion
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
848 (set-buffer quail-guidance-buf)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
849 (erase-buffer)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
850 (insert key)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
851 (if (or (nthcdr 2 def) (listp (car (cdr def))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
852 (let ((i ? ) (l (cdr def)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
853 (while (< i 127) (aset quail-work-str i 0) (setq i (1+ i)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
854 (while l
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
855 (if (listp (car l))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
856 (aset quail-work-str (car (car l)) 1))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
857 (setq l (cdr l)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
858 (insert "[")
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
859 (setq i ? )
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
860 (while (< i 127)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
861 (if (= (aref quail-work-str i) 1)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
862 (insert i))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
863 (setq i (1+ i)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
864 (insert "]")))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
865 (if (consp candidates)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
866 (let ((idx (car candidates))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
867 (maxidx (1+ (/ (1- (length (cdr candidates))) 10)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
868 (num 0)
138
6608ceec7cf8 Import from CVS: tag r20-2b3
cvs
parents: 70
diff changeset
869 p p1 p2)
70
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
870 (indent-to 10)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
871 (insert (format "(%d/%d)" (1+ (/ idx 10)) maxidx))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
872 (setq candidates (nthcdr (* (/ idx 10) 10) (cdr candidates)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
873 (while (and candidates (< num 10))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
874 (setq num (1+ num))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
875 (insert (format " %d." (if (< num 10) num 0)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
876 (setq p (point))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
877 (insert (car candidates))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
878 (if (= num (1+ (% idx 10)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
879 (setq p1 p p2 (point)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
880 (setq candidates (cdr candidates)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
881 (put-text-property p1 p2 'face quail-selection-face))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
882 ))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
883
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
884 (defun quail-display-buffer (buf)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
885 (if (get-buffer-window buf)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
886 nil
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
887 (let ((curwin (selected-window))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
888 (height 0)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
889 largest)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
890 (walk-windows '(lambda (win)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
891 (if (and (null (eq curwin win ))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
892 (> (window-height win) height))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
893 (setq height (window-height win)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
894 largest win))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
895 (set-window-buffer (if (> height (/ (window-height curwin) 2))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
896 largest
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
897 (split-window curwin))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
898 buf)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
899 )))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
900
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
901 (defun quail-completion ()
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
902 "Show list of candidates."
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
903 (interactive)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
904 (let ((def (quail-lookup-key quail-current-key))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
905 (key quail-current-key))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
906 (if (not (keymapp def))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
907 (quail-message "No macth.")
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
908 (setq quail-keep-state t)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
909 (save-excursion
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
910 (if (not (quail-buffer-alive-p quail-completion-buf))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
911 (setq quail-completion-buf
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
912 (get-buffer-create "*Completions*")))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
913 (set-buffer quail-completion-buf)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
914 (erase-buffer)
138
6608ceec7cf8 Import from CVS: tag r20-2b3
cvs
parents: 70
diff changeset
915 (setq quail-extent (make-extent 1 1))
6608ceec7cf8 Import from CVS: tag r20-2b3
cvs
parents: 70
diff changeset
916 (set-extent-face quail-extent 'face quail-selection-face)
70
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
917 (insert "Current candidates:\n")
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
918 (quail-completion-list key def 1)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
919 (quail-display-buffer (current-buffer)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
920 (quail-show-guidance))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
921
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
922 (defun quail-completion-list (key def indent)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
923 (let ((candidates (quail-get-candidates def)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
924 (indent-to indent)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
925 (insert key ":")
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
926 (if candidates
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
927 (quail-candidate-with-indent
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
928 (if (consp candidates) (cdr candidates) candidates)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
929 key)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
930 (insert " none\n"))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
931 (setq indent (+ indent 2))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
932 (setq def (cdr def))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
933 (while def
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
934 (if (listp (vectorp (car def)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
935 (let ((map (cdr (car def))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
936 (if (symbolp map) (setq map (symbol-function map)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
937 (quail-completion-list (format "%s%c" key (car (car def)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
938 map indent)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
939 (setq def (cdr def)))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
940
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
941 (defun quail-candidate-with-indent (candidates key)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
942 (if (consp candidates)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
943 (let ((clm (current-column))
138
6608ceec7cf8 Import from CVS: tag r20-2b3
cvs
parents: 70
diff changeset
944 (i 0))
70
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
945 (while candidates
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
946 (if (= (% i 10) 0) (insert (format "(%d)" (1+ (/ i 10)))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
947 (insert " " (if (= (% i 10) 9) "0" (+ ?1 (% i 10))) ".")
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
948 (insert (if (stringp (car candidates))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
949 (car candidates)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
950 (char-to-string (car candidates))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
951 (setq i (1+ i))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
952 (setq candidates (cdr candidates))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
953 (if (and candidates (= (% i 10) 0))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
954 (progn
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
955 (insert ?\n)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
956 (indent-to clm)))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
957 (if (and (symbolp candidates) (fboundp candidates))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
958 (insert " (1) 0."
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
959 (let ((quail-current-key key)) (funcall candidates)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
960 (insert " (1) 0." candidates)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
961 (insert ?\n))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
962
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
963 (defun quail-help ()
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
964 "Show brief description of the current quail-pacakge."
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
965 (interactive)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
966 (setq quail-keep-state t)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
967 (let ((package quail-current-package)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
968 (buf (get-buffer "*Quail-Help*"))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
969 (first t))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
970 (save-excursion
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
971 (set-buffer (or buf (get-buffer-create "*Quail-Help*")))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
972 (if (and buf (eq package quail-current-package))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
973 (setq first nil)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
974 (setq buf (current-buffer))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
975 (setq quail-current-package package)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
976 (erase-buffer)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
977 (insert (quail-document))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
978 (if (quail-layout) (quail-show-layout))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
979 (insert "\n--- Key bindinds ---\n")
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
980 (let ((map (or (quail-sub-mode-map) quail-sub-mode-map))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
981 (i 0))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
982 (while (< i 256)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
983 (quail-describe-binding map i)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
984 (setq i (1+ i)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
985 (setq map (lookup-key map (vector meta-prefix-char)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
986 (setq i 0)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
987 (while (< i 256)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
988 (quail-describe-binding map i 'meta)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
989 (setq i (1+ i)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
990 (goto-char (point-min)))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
991 (let ((win (get-buffer-window buf)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
992 (if win
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
993 (save-excursion
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
994 (set-buffer buf)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
995 (if (null first)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
996 (if (> (point-max) (window-end win))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
997 (set-window-start win (window-end win))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
998 (if (< (point-min) (window-start win))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
999 (set-window-start win 1)))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1000 (quail-display-buffer buf))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1001 (let (up down)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1002 (save-excursion
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1003 (sit-for 0)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1004 (set-buffer buf)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1005 (if (> (point-max) (window-end win))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1006 (setq up t)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1007 (if (< (point-min) (window-start win))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1008 (setq down t))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1009 (if up
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1010 (quail-message
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1011 (substitute-command-keys
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1012 "\\[quail-help] to scroll up *Quail-Help* buffer."))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1013 (if down
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1014 (quail-message
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1015 (substitute-command-keys
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1016 "\\[quail-help] to show top of *Quail-Help* buffer."))))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1017 ))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1018
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1019 (defun quail-show-layout ()
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1020 (let* ((xoff 10)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1021 (yoff 3)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1022 (space 4)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1023 (p (point))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1024 (i 0)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1025 (str (car quail-keyboard-translate-table))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1026 (len (length str))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1027 (alist (car (cdr quail-keyboard-translate-table)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1028 pos x y ch ch1 kmp)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1029 (insert "
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1030
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1031
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1032
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1033
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1034
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1035
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1036
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1037
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1038 ")
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1039 (save-excursion
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1040 (while (< i len)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1041 (goto-char p)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1042 (setq ch (aref str i))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1043 (if (setq pos (car (cdr (assoc ch alist))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1044 (progn (forward-line (+ yoff (aref pos 1)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1045 (forward-char (+ xoff (* space (aref pos 0))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1046 (aref pos 1) (aref pos 2))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1047 (cond
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1048 ((< i 13) (setq x i y 0)) ; unshifted, 1st row
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1049 ((< i 25) (setq x (- i 13) y 1)) ; unshifted, 2nd row
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1050 ((< i 37) (setq x (- i 25) y 2)) ; unshifted, 3rd row
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1051 ((< i 47) (setq x (- i 37) y 3)) ; unshifted, 4th row
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1052 ((< i 60) (setq x (- i 47) y 0)) ; shifted, 1st row
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1053 ((< i 72) (setq x (- i 60) y 1)) ; shifted, 2nd row
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1054 ((< i 84) (setq x (- i 72) y 2)) ; shifted, 3rd row
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1055 ((< i 94) (setq x (- i 84) y 3)) ; shifted, 4th row
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1056 (t (setq x (- i 90) y 4))) ; space, bottom row
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1057 (forward-line (+ yoff y))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1058 (forward-char (+ xoff (* space x) y (if (< i 47) 0 1))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1059 (delete-char 1)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1060 (if (quail-translate)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1061 (setq ch (quail-translate-char ch)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1062 (setq ch1
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1063 (and (setq kmp (quail-lookup-key (char-to-string ch)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1064 (quail-get-candidate kmp (quail-nolearn))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1065 (insert (if ch1 ch1 ch))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1066 (setq i (1+ i))))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1067
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1068 (defun quail-describe-binding (map i &optional meta)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1069 (let ((cmd (lookup-key map (vector i))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1070 (if (and (symbolp cmd) (fboundp cmd)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1071 (not (memq cmd '(quail-self-insert-command
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1072 quail-self-insert-or-index))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1073 (progn
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1074 (if meta (insert "ESC "))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1075 (insert (single-key-description i) ":")
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1076 (indent-to-column 8)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1077 (insert (documentation cmd) "\n")))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1078
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1079 ;;;###autoload
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1080 (global-set-key "\C-]" 'quail-mode)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1081
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1082 (define-key mule-keymap "M" 'quail-select-package)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1083
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1084 ;; For byte-compiler
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1085 (put 'quail-defrule 'byte-hunk-handler 'eval)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1086 (put 'qdv 'byte-hunk-handler 'eval)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1087 (put 'qd 'byte-hunk-handler 'eval)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1088 (put 'quail-define-package 'byte-hunk-handler 'eval)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1089
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1090 (defun quail-setup-current-package ()
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1091 ;; Do nothing while loading non-compiled file.
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1092 )
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1093
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1094 (defun quail-setup-current-package-handler (ignore)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1095 (list 'quail-add-package (list 'quote quail-current-package)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1096
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1097 (put 'quail-setup-current-package 'byte-hunk-handler
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1098 'quail-setup-current-package-handler)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1099
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1100 ;;
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1101 (provide 'quail)