aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKenichi Handa2000-02-23 08:04:56 +0000
committerKenichi Handa2000-02-23 08:04:56 +0000
commit068b074ebee4198221f5cb725ee7751d35ae0c81 (patch)
tree41d0421a1a4bd9a4b8e5eb4007a6796709d5ea13
parentc709bcf10baf3275b21fca17f9854862bfb70f9c (diff)
downloademacs-068b074ebee4198221f5cb725ee7751d35ae0c81.tar.gz
emacs-068b074ebee4198221f5cb725ee7751d35ae0c81.zip
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.
-rw-r--r--lisp/international/encoded-kb.el115
1 files changed, 94 insertions, 21 deletions
diff --git a/lisp/international/encoded-kb.el b/lisp/international/encoded-kb.el
index b77e4b36cf9..53bd38de53d 100644
--- a/lisp/international/encoded-kb.el
+++ b/lisp/international/encoded-kb.el
@@ -24,24 +24,22 @@
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
@@ -102,17 +100,18 @@
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)
@@ -203,14 +202,21 @@ The following key sequence may cause multilingual text insertion."
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)
@@ -226,6 +232,66 @@ The following key sequence may cause multilingual text insertion."
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))))
228 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
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
@@ -288,10 +354,17 @@ as a multilingual text encoded in a coding system set by
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