Fix key-parse problem with C-x ( ... sequences

* lisp/keymap.el (key-parse): Move the read-kbd-macro compat code
from here...
* lisp/subr.el (kbd): ... to here.  (And fix the logic, too.)
This allows `key-parse' to have a less puzzling result while
maintaining backwards compatibility (bug#38775).
This commit is contained in:
Lars Ingebrigtsen 2022-05-03 16:19:50 +02:00
parent a4c96147d1
commit 41e946f46e
3 changed files with 19 additions and 12 deletions

View file

@ -281,18 +281,7 @@ See `kbd' for a descripion of KEYS."
(when key
(dolist (_ (number-sequence 1 times))
(setq res (vconcat res key))))))
(if (and (>= (length res) 4)
(eq (aref res 0) ?\C-x)
(eq (aref res 1) ?\()
(eq (aref res (- (length res) 2)) ?\C-x)
(eq (aref res (- (length res) 1)) ?\)))
(apply #'vector (let ((lres (append res nil)))
;; Remove the first and last two elements.
(setq lres (cdr (cdr lres)))
(nreverse lres)
(setq lres (cdr (cdr lres)))
(nreverse lres)))
res))))
res)))
(defun key-valid-p (keys)
"Say whether KEYS is a valid key.

View file

@ -941,6 +941,20 @@ Here's some example key sequences:
For an approximate inverse of this, see `key-description'."
(declare (pure t) (side-effect-free t))
(let ((res (key-parse keys)))
;; For historical reasons, parse "C-x ( C-d C-x )" as "C-d", since
;; `kbd' used to be a wrapper around `read-kbd-macro'.
(when (and (>= (length res) 4)
(eq (aref res 0) ?\C-x)
(eq (aref res 1) ?\()
(eq (aref res (- (length res) 2)) ?\C-x)
(eq (aref res (- (length res) 1)) ?\)))
(setq res (apply #'vector (let ((lres (append res nil)))
;; Remove the first and last two elements.
(setq lres (cddr lres))
(setq lres (nreverse lres))
(setq lres (cddr lres))
(nreverse lres)))))
(if (not (memq nil (mapcar (lambda (ch)
(and (numberp ch)
(<= 0 ch 127)))

View file

@ -1053,5 +1053,9 @@ final or penultimate step during initialization."))
(should (equal (string-lines "foo\n\n\nbar" t t)
'("foo\n" "bar"))))
(defun test-keymap-parse-macros ()
(should (equal (key-parse "C-x ( C-d C-x )") [24 40 4 24 41]))
(should (equal (kbd "C-x ( C-d C-x )") "")))
(provide 'subr-tests)
;;; subr-tests.el ends here