diff options
| -rw-r--r-- | lisp/ChangeLog | 7 | ||||
| -rw-r--r-- | lisp/international/encoded-kb.el | 23 |
2 files changed, 26 insertions, 4 deletions
diff --git a/lisp/ChangeLog b/lisp/ChangeLog index fd6246c5916..42b7c94c6aa 100644 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog | |||
| @@ -1,3 +1,10 @@ | |||
| 1 | 2008-06-15 Stefan Monnier <monnier@iro.umontreal.ca> | ||
| 2 | |||
| 3 | * international/encoded-kb.el (encoded-kbd-self-insert-utf-8): | ||
| 4 | Catch and recover from case when the bytes we thought we were reading | ||
| 5 | turn out to be something else entirely, such as latin-1 chars from | ||
| 6 | quail. See bug#396. | ||
| 7 | |||
| 1 | 2008-06-15 Dan Nicolaescu <dann@ics.uci.edu> | 8 | 2008-06-15 Dan Nicolaescu <dann@ics.uci.edu> |
| 2 | 9 | ||
| 3 | * vc.el (vc-deduce-fileset): Check if the buffer has a file. | 10 | * vc.el (vc-deduce-fileset): Check if the buffer has a file. |
diff --git a/lisp/international/encoded-kb.el b/lisp/international/encoded-kb.el index ec887659e9c..4659b499112 100644 --- a/lisp/international/encoded-kb.el +++ b/lisp/international/encoded-kb.el | |||
| @@ -219,8 +219,9 @@ The following key sequence may cause multilingual text insertion." | |||
| 219 | 219 | ||
| 220 | (defun encoded-kbd-self-insert-utf-8 (arg) | 220 | (defun encoded-kbd-self-insert-utf-8 (arg) |
| 221 | (interactive "p") | 221 | (interactive "p") |
| 222 | (let ((char (encoded-kbd-last-key)) | 222 | (let* ((lead (encoded-kbd-last-key)) |
| 223 | len) | 223 | (char lead) |
| 224 | len event) | ||
| 224 | (cond ((< char #xE0) | 225 | (cond ((< char #xE0) |
| 225 | (setq len 1 char (logand char #x1F))) | 226 | (setq len 1 char (logand char #x1F))) |
| 226 | ((< char #xF0) | 227 | ((< char #xF0) |
| @@ -230,8 +231,22 @@ The following key sequence may cause multilingual text insertion." | |||
| 230 | (t | 231 | (t |
| 231 | (setq len 4 char 0))) | 232 | (setq len 4 char 0))) |
| 232 | (while (> len 0) | 233 | (while (> len 0) |
| 233 | (setq char (logior (lsh char 6) (logand (read-char-exclusive) #x3F)) | 234 | (setq event (read-char-exclusive)) |
| 234 | len (1- len))) | 235 | (if (and (>= event #x80) (< event #xc0)) |
| 236 | ;; Valid utf-8 sequence. | ||
| 237 | (setq char (logior (lsh char 6) (- event #x80)) | ||
| 238 | len (1- len)) | ||
| 239 | ;; Invalid utf-8 sequence. Might be because Quail got involved | ||
| 240 | ;; in-between and the bytes we thought we were reading were actually | ||
| 241 | ;; latin-1 chars. Let's presume that `event' is the second "byte", | ||
| 242 | ;; i.e. there weren't any "apprently correct" between `lead' and | ||
| 243 | ;; `event': it's easy to recover in this case, and the more general | ||
| 244 | ;; case seems pretty unlikely. | ||
| 245 | ;; FIXME: We should really do encoded-kbd decoding before processing | ||
| 246 | ;; input-methods. | ||
| 247 | (push event unread-command-events) | ||
| 248 | (setq char lead) | ||
| 249 | (setq len 0))) | ||
| 235 | (vector char))) | 250 | (vector char))) |
| 236 | 251 | ||
| 237 | (defun encoded-kbd-setup-keymap (keymap coding) | 252 | (defun encoded-kbd-setup-keymap (keymap coding) |