[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
master 41e946f46e: Fix key-parse problem with C-x ( ... sequences
From: |
Lars Ingebrigtsen |
Subject: |
master 41e946f46e: Fix key-parse problem with C-x ( ... sequences |
Date: |
Tue, 3 May 2022 10:22:37 -0400 (EDT) |
branch: master
commit 41e946f46e23756b7c732efdf3c5152fa8241dde
Author: Lars Ingebrigtsen <larsi@gnus.org>
Commit: Lars Ingebrigtsen <larsi@gnus.org>
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).
---
lisp/keymap.el | 13 +------------
lisp/subr.el | 14 ++++++++++++++
test/lisp/subr-tests.el | 4 ++++
3 files changed, 19 insertions(+), 12 deletions(-)
diff --git a/lisp/keymap.el b/lisp/keymap.el
index db37d80b36..71454eba5e 100644
--- a/lisp/keymap.el
+++ b/lisp/keymap.el
@@ -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.
diff --git a/lisp/subr.el b/lisp/subr.el
index cb7572423a..dec3b9190e 100644
--- a/lisp/subr.el
+++ b/lisp/subr.el
@@ -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)))
diff --git a/test/lisp/subr-tests.el b/test/lisp/subr-tests.el
index 62cf2266d6..a4f531ea4e 100644
--- a/test/lisp/subr-tests.el
+++ b/test/lisp/subr-tests.el
@@ -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
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- master 41e946f46e: Fix key-parse problem with C-x ( ... sequences,
Lars Ingebrigtsen <=