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