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