Mercurial > emacs
comparison lisp/international/encoded-kb.el @ 27816:321027008721
Be sure to update minor-mode-alist
and minor-mode-map-alist.
(encoded-kbd-self-insert-iso2022-8bit): Handle ISO's single shift
codes SS2 and SS3 correctly.
(encoded-kbd-self-insert-ccl): New function.
(encoded-kbd-setup-keymap): New function.
(encoded-kbd-mode): Handle CCL based coding system. Setup keymap
by calling encoded-kbd-setup-keymap.
author | Kenichi Handa <handa@m17n.org> |
---|---|
date | Wed, 23 Feb 2000 08:04:56 +0000 |
parents | bf96605e00ee |
children | 00ff62c583fe |
comparison
equal
deleted
inserted
replaced
27815:24bd298ac51a | 27816:321027008721 |
---|---|
22 | 22 |
23 (defvar encoded-kbd-mode nil | 23 (defvar encoded-kbd-mode nil |
24 "Non-nil if in Encoded-kbd minor mode.") | 24 "Non-nil if in Encoded-kbd minor mode.") |
25 (put 'encoded-kbd-mode 'permanent-local t) | 25 (put 'encoded-kbd-mode 'permanent-local t) |
26 | 26 |
27 (or (assq 'encoded-kbd-mode minor-mode-alist) | 27 (let ((slot (assq 'encoded-kbd-mode minor-mode-alist)) |
28 (name " Encoded-kbd")) | |
29 (if slot | |
30 (setcar (cdr slot) name) | |
28 (setq minor-mode-alist | 31 (setq minor-mode-alist |
29 (cons '(encoded-kbd-mode " Encoded-kbd") minor-mode-alist))) | 32 (cons '(encoded-kbd-mode " Encoded-kbd") minor-mode-alist)))) |
30 | 33 |
31 (defvar encoded-kbd-mode-map | 34 (defconst encoded-kbd-mode-map (make-sparse-keymap) |
32 (let ((map (make-sparse-keymap)) | |
33 (i 128)) | |
34 (define-key map "\e" 'encoded-kbd-iso2022-esc-prefix) | |
35 (while (< i 256) | |
36 (define-key map (vector i) 'encoded-kbd-handle-8bit) | |
37 (setq i (1+ i))) | |
38 map) | |
39 "Keymap for Encoded-kbd minor mode.") | 35 "Keymap for Encoded-kbd minor mode.") |
40 | 36 |
41 (or (assq 'encoded-kbd-mode minor-mode-map-alist) | 37 (let ((slot (assq 'encoded-kbd-mode minor-mode-map-alist))) |
38 (if slot | |
39 (setcdr slot encoded-kbd-mode-map) | |
42 (setq minor-mode-map-alist | 40 (setq minor-mode-map-alist |
43 (cons (cons 'encoded-kbd-mode encoded-kbd-mode-map) | 41 (cons (cons 'encoded-kbd-mode encoded-kbd-mode-map) |
44 minor-mode-map-alist))) | 42 minor-mode-map-alist)))) |
45 | 43 |
46 ;; Subsidiary keymaps for handling ISO2022 escape sequences. | 44 ;; Subsidiary keymaps for handling ISO2022 escape sequences. |
47 | 45 |
48 (defvar encoded-kbd-iso2022-esc-map | 46 (defvar encoded-kbd-iso2022-esc-map |
49 (let ((map (make-sparse-keymap))) | 47 (let ((map (make-sparse-keymap))) |
100 ;; One of the symbols `sjis', `iso2022-7', `iso2022-8', or `big5' to | 98 ;; One of the symbols `sjis', `iso2022-7', `iso2022-8', or `big5' to |
101 ;; denote what kind of coding-system we are now handling in | 99 ;; denote what kind of coding-system we are now handling in |
102 ;; Encoded-kbd mode. | 100 ;; Encoded-kbd mode. |
103 (defvar encoded-kbd-coding nil) | 101 (defvar encoded-kbd-coding nil) |
104 | 102 |
105 ;; Keep information of designation state of ISO2022 encoding. This is | 103 ;; Keep information of designation state of ISO2022 encoding. When |
106 ;; a vector of character sets currently designated to each graphic | 104 ;; Encoded-kbd mode is on, this is set to a vector of length 4, the |
107 ;; registers (0..3). | 105 ;; elements are character sets currently designated to graphic |
106 ;; registers 0 thru 3. | |
108 | 107 |
109 (defvar encoded-kbd-iso2022-designations nil) | 108 (defvar encoded-kbd-iso2022-designations nil) |
110 (put 'encoded-kbd-iso2022-designations 'permanent-local t) | 109 (put 'encoded-kbd-iso2022-designations 'permanent-local t) |
111 | 110 |
112 ;; Keep information of invocation state of ISO2022 encoding. This is | 111 ;; Keep information of invocation state of ISO2022 encoding. When |
113 ;; a vector of graphic register numbers currently invoked to each | 112 ;; Encoded-kbd mode is on, this is set to a vector of length 3, |
114 ;; graphic plane (0..1), the third element is a single shifted graphic | 113 ;; graphic register numbers currently invoked to graphic plane 1 and |
115 ;; register number. | 114 ;; 2, and a single shifted graphic register number. |
116 | 115 |
117 (defvar encoded-kbd-iso2022-invocations nil) | 116 (defvar encoded-kbd-iso2022-invocations nil) |
118 (put 'encoded-kbd-iso2022-invocations 'permanent-local t) | 117 (put 'encoded-kbd-iso2022-invocations 'permanent-local t) |
119 | 118 |
120 (defun encoded-kbd-iso2022-designation () | 119 (defun encoded-kbd-iso2022-designation () |
201 (aset encoded-kbd-iso2022-invocations 2 nil) | 200 (aset encoded-kbd-iso2022-invocations 2 nil) |
202 (setq unread-command-events (cons char unread-command-events)))) | 201 (setq unread-command-events (cons char unread-command-events)))) |
203 | 202 |
204 (defun encoded-kbd-self-insert-iso2022-8bit () | 203 (defun encoded-kbd-self-insert-iso2022-8bit () |
205 (interactive) | 204 (interactive) |
205 (cond | |
206 ((= last-command-char ?\216) ; SS2 (Single Shift 2) | |
207 (aset encoded-kbd-iso2022-invocations 2 2)) | |
208 ((= last-command-char ?\217) ; SS3 (Single Shift 3) | |
209 (aset encoded-kbd-iso2022-invocations 2 3)) | |
210 (t | |
206 (let* ((charset (aref encoded-kbd-iso2022-designations | 211 (let* ((charset (aref encoded-kbd-iso2022-designations |
207 (or (aref encoded-kbd-iso2022-invocations 2) | 212 (or (aref encoded-kbd-iso2022-invocations 2) |
208 (aref encoded-kbd-iso2022-invocations 1)))) | 213 (aref encoded-kbd-iso2022-invocations 1)))) |
209 (char (if (= (charset-dimension charset) 1) | 214 (char (if (= (charset-dimension charset) 1) |
210 (make-char charset last-command-char) | 215 (make-char charset last-command-char) |
211 (make-char charset last-command-char (read-char-exclusive))))) | 216 (make-char charset last-command-char |
217 (read-char-exclusive))))) | |
212 (aset encoded-kbd-iso2022-invocations 2 nil) | 218 (aset encoded-kbd-iso2022-invocations 2 nil) |
213 (setq unread-command-events (cons char unread-command-events)))) | 219 (setq unread-command-events (cons char unread-command-events)))))) |
214 | 220 |
215 (defun encoded-kbd-self-insert-sjis () | 221 (defun encoded-kbd-self-insert-sjis () |
216 (interactive) | 222 (interactive) |
217 (let ((char (if (or (< last-command-char ?\xA0) (>= last-command-char ?\xE0)) | 223 (let ((char (if (or (< last-command-char ?\xA0) (>= last-command-char ?\xE0)) |
218 (decode-sjis-char (+ (ash last-command-char 8) | 224 (decode-sjis-char (+ (ash last-command-char 8) |
223 (defun encoded-kbd-self-insert-big5 () | 229 (defun encoded-kbd-self-insert-big5 () |
224 (interactive) | 230 (interactive) |
225 (let ((char (decode-big5-char (+ (ash last-command-char 8) | 231 (let ((char (decode-big5-char (+ (ash last-command-char 8) |
226 (read-char-exclusive))))) | 232 (read-char-exclusive))))) |
227 (setq unread-command-events (cons char unread-command-events)))) | 233 (setq unread-command-events (cons char unread-command-events)))) |
234 | |
235 (defun encoded-kbd-self-insert-ccl () | |
236 (interactive) | |
237 (let ((str (char-to-string last-command-char)) | |
238 (coding (keyboard-coding-system))) | |
239 (setq str (decode-coding-string str coding)) | |
240 (setq unread-command-events | |
241 (append (string-to-list str) unread-command-events)))) | |
242 | |
243 (defun encoded-kbd-setup-keymap (coding) | |
244 ;; At first, reset the keymap. | |
245 (setcdr encoded-kbd-mode-map nil) | |
246 ;; Then setup the keymap according to the keyboard coding system. | |
247 (cond | |
248 ((eq encoded-kbd-coding 'sjis) | |
249 (let ((i 128)) | |
250 (while (< i 256) | |
251 (define-key encoded-kbd-mode-map | |
252 (vector i) 'encoded-kbd-self-insert-sjis) | |
253 (setq i (1+ i))))) | |
254 | |
255 ((eq encoded-kbd-coding 'big5) | |
256 (let ((i 161)) | |
257 (while (< i 255) | |
258 (define-key encoded-kbd-mode-map | |
259 (vector i) 'encoded-kbd-self-insert-big5) | |
260 (setq i (1+ i))))) | |
261 | |
262 ((eq encoded-kbd-coding 'iso2022-7) | |
263 (define-key encoded-kbd-mode-map "\e" 'encoded-kbd-iso2022-esc-prefix)) | |
264 | |
265 ((eq encoded-kbd-coding 'iso2022-8) | |
266 (define-key encoded-kbd-mode-map | |
267 (vector ?\216) 'encoded-kbd-self-insert-iso2022-8bit) | |
268 (define-key encoded-kbd-mode-map | |
269 (vector ?\217) 'encoded-kbd-self-insert-iso2022-8bit) | |
270 (let ((i 160)) | |
271 (while (< i 256) | |
272 (define-key encoded-kbd-mode-map | |
273 (vector i) 'encoded-kbd-self-insert-iso2022-8bit) | |
274 (setq i (1+ i))))) | |
275 | |
276 ((eq encoded-kbd-coding 'ccl) | |
277 (let ((valid-codes (or (coding-system-get coding 'valid-codes) | |
278 '((128 255)))) | |
279 elt from to) | |
280 (while valid-codes | |
281 (setq elt (car valid-codes) valid-codes (cdr valid-codes)) | |
282 (if (consp elt) | |
283 (setq from (car elt) to (cdr elt)) | |
284 (setq from (setq to elt))) | |
285 (while (<= from to) | |
286 (if (>= from 128) | |
287 (define-key encoded-kbd-mode-map | |
288 (vector from) 'encoded-kbd-self-insert-ccl)) | |
289 (setq from (1+ from)))))) | |
290 | |
291 (t | |
292 (error "Invalid value in encoded-kbd-coding: %s" encoded-kbd-coding)))) | |
293 | |
228 | 294 |
229 ;; Input mode at the time Encoded-kbd mode is turned on is saved here. | 295 ;; Input mode at the time Encoded-kbd mode is turned on is saved here. |
230 (defvar saved-input-mode nil) | 296 (defvar saved-input-mode nil) |
231 | 297 |
232 ;;;###autoload | 298 ;;;###autoload |
286 (set-input-mode | 352 (set-input-mode |
287 (nth 0 saved-input-mode) (nth 1 saved-input-mode) | 353 (nth 0 saved-input-mode) (nth 1 saved-input-mode) |
288 'use-8th-bit (nth 3 saved-input-mode)) | 354 'use-8th-bit (nth 3 saved-input-mode)) |
289 (setq encoded-kbd-coding 'big5)) | 355 (setq encoded-kbd-coding 'big5)) |
290 | 356 |
357 ((= (coding-system-type coding) 4) ; CCL based coding | |
358 (set-input-mode | |
359 (nth 0 saved-input-mode) (nth 1 saved-input-mode) | |
360 'use-8th-bit (nth 3 saved-input-mode)) | |
361 (setq encoded-kbd-coding 'ccl)) | |
362 | |
291 (t | 363 (t |
292 (setq encoded-kbd-mode nil) | 364 (setq encoded-kbd-mode nil) |
293 (error "Coding-system `%s' is not supported in Encoded-kbd mode" | 365 (error "Coding-system `%s' is not supported in Encoded-kbd mode" |
294 (keyboard-coding-system)))) | 366 (keyboard-coding-system)))) |
367 (encoded-kbd-setup-keymap coding) | |
295 (run-hooks 'encoded-kbd-mode-hook)))) | 368 (run-hooks 'encoded-kbd-mode-hook)))) |
296 | 369 |
297 ;;; encoded-kb.el ends here | 370 ;;; encoded-kb.el ends here |