--- encoded-kb.el 2001/03/04 21:59:58 1.1 +++ encoded-kb.el 2001/03/04 22:07:01 @@ -116,6 +116,22 @@ (defvar encoded-kbd-iso2022-invocations nil) (put 'encoded-kbd-iso2022-invocations 'permanent-local t) +(defconst encoded-kbd-utf-8-length + (let ((ranges '((?\x00 ?\x7F 1) + (?\xC0 ?\xDF 2) + (?\xE0 ?\xEF 3))) + (vec (make-vector 256 0))) + (while ranges + (let ((first (caar ranges)) + (last (cadar ranges)) + (len (caddar ranges))) + (while (<= first last) + (aset vec first len) + (setq first (1+ first)))) + (setq ranges (cdr ranges))) + vec) + "Length of UTF-8 sequence, indexed by first character.") + (defun encoded-kbd-iso2022-designation () "Do ISO2022 designation according to the current key in Encoded-kbd mode. The following key sequence may cause multilingual text insertion." @@ -218,6 +234,20 @@ (aset encoded-kbd-iso2022-invocations 2 nil) (setq unread-command-events (cons char unread-command-events)))))) +(defun encoded-kbd-self-insert-utf-8 () + (interactive) + (let* ((len (aref encoded-kbd-utf-8-length last-command-char)) + (str (concat (char-to-string last-command-char) + (cond + ((memq len '(0 1)) "") + ((= len 2) (vector (read-char-exclusive))) + ((= len 3) (vector (read-char-exclusive) + (read-char-exclusive))) + (error "Invalid UTF-8 sequence length"))))) + (setq str (decode-coding-string str 'utf-8)) + (setq unread-command-events + (append (string-to-list str) unread-command-events)))) + (defun encoded-kbd-self-insert-sjis () (interactive) (let ((char (if (or (< last-command-char ?\xA0) (>= last-command-char ?\xE0)) @@ -245,6 +275,13 @@ (setcdr encoded-kbd-mode-map nil) ;; Then setup the keymap according to the keyboard coding system. (cond + ((eq coding 'utf-8) + (let ((i 128)) + (while (< i 256) + (define-key encoded-kbd-mode-map + (vector i) 'encoded-kbd-self-insert-utf-8) + (setq i (1+ i))))) + ((eq encoded-kbd-coding 'sjis) (let ((i 128)) (while (< i 256) @@ -275,7 +312,7 @@ ((eq encoded-kbd-coding 'ccl) (let ((valid-codes (or (coding-system-get coding 'valid-codes) - '((128 255)))) + '((128 . 255)))) elt from to) (while valid-codes (setq elt (car valid-codes) valid-codes (cdr valid-codes))