emacs-diffs
[Top][All Lists]
Advanced

[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



reply via email to

[Prev in Thread] Current Thread [Next in Thread]