]> git.eshelyaron.com Git - emacs.git/commitdiff
Make `lookup-key' understand the new key sequence syntax
authorLars Ingebrigtsen <larsi@gnus.org>
Tue, 19 Oct 2021 03:07:51 +0000 (05:07 +0200)
committerLars Ingebrigtsen <larsi@gnus.org>
Tue, 19 Oct 2021 03:07:51 +0000 (05:07 +0200)
* src/keymap.c (possibly_translate_key_sequence): Factored out
into own function.
(Fdefine_key):
(Flookup_key): Use it.

src/keymap.c
test/src/keymap-tests.el

index 60e736efc710425e0d299f42b8e970e1696cedba..ca1dbe368eac5474cf3d03cf83557ee94c90575e 100644 (file)
@@ -1024,6 +1024,28 @@ is not copied.  */)
 \f
 /* Simple Keymap mutators and accessors.                               */
 
+static Lisp_Object
+possibly_translate_key_sequence (Lisp_Object key, ptrdiff_t *length)
+{
+  if (VECTORP (key) && ASIZE (key) == 1 && STRINGP (AREF (key, 0)))
+    {
+      /* KEY is on the ["C-c"] format, so translate to internal
+        format.  */
+      if (NILP (Ffboundp (Qkbd_valid_p)))
+       xsignal2 (Qerror,
+                 build_string ("`kbd-valid-p' is not defined, so this syntax can't be used: %s"),
+                 key);
+      if (NILP (call1 (Qkbd_valid_p, AREF (key, 0))))
+       xsignal2 (Qerror, build_string ("Invalid `kbd' syntax: %S"), key);
+      key = call1 (Qkbd, AREF (key, 0));
+      *length = CHECK_VECTOR_OR_STRING (key);
+      if (*length == 0)
+       xsignal2 (Qerror, build_string ("Invalid `kbd' syntax: %S"), key);
+    }
+
+  return key;
+}
+
 /* GC is possible in this function if it autoloads a keymap.  */
 
 DEFUN ("define-key", Fdefine_key, Sdefine_key, 3, 3, 0,
@@ -1084,21 +1106,7 @@ binding KEY to DEF is added at the front of KEYMAP.  */)
       def = tmp;
     }
 
-  if (VECTORP (key) && ASIZE (key) == 1 && STRINGP (AREF (key, 0)))
-    {
-      /* KEY is on the ["C-c"] format, so translate to internal
-        format.  */
-      if (NILP (Ffboundp (Qkbd_valid_p)))
-       xsignal2 (Qerror,
-                 build_string ("`kbd-valid-p' is not defined, so this syntax can't be used: %s"),
-                 key);
-      if (NILP (call1 (Qkbd_valid_p, AREF (key, 0))))
-       xsignal2 (Qerror, build_string ("Invalid `kbd' syntax: %S"), key);
-      key = call1 (Qkbd, AREF (key, 0));
-      length = CHECK_VECTOR_OR_STRING (key);
-      if (length == 0)
-       xsignal2 (Qerror, build_string ("Invalid `kbd' syntax: %S"), key);
-    }
+  key = possibly_translate_key_sequence (key, &length);
 
   ptrdiff_t idx = 0;
   while (1)
@@ -1229,6 +1237,8 @@ recognize the default bindings, just as `read-key-sequence' does.  */)
   if (length == 0)
     return keymap;
 
+  key = possibly_translate_key_sequence (key, &length);
+
   ptrdiff_t idx = 0;
   while (1)
     {
index 68b42c346c9eaba20496a768a9063570915dca5c..13f47b45f811a2cdb672f55d27ef791c3dba1664 100644 (file)
@@ -317,6 +317,13 @@ g .. h             foo
   (should (equal (single-key-description 'C-s-home)
                  "C-s-<home>")))
 
+(ert-deftest keymap-test-lookups ()
+  (should (eq (lookup-key (current-global-map) "\C-x\C-f") 'find-file))
+  (should (eq (lookup-key (current-global-map) [(control x) (control f)])
+              'find-file))
+  (should (eq (lookup-key (current-global-map) ["C-x C-f"]) 'find-file))
+  (should (eq (lookup-key (current-global-map) [?\C-x ?\C-f]) 'find-file)))
+
 (provide 'keymap-tests)
 
 ;;; keymap-tests.el ends here