]> git.eshelyaron.com Git - emacs.git/commitdiff
keymap.el: Ease up support for non-`kbd` formats.
authorStefan Monnier <monnier@iro.umontreal.ca>
Sun, 2 Oct 2022 17:52:57 +0000 (13:52 -0400)
committerStefan Monnier <monnier@iro.umontreal.ca>
Sun, 2 Oct 2022 18:07:24 +0000 (14:07 -0400)
While we want to standardize on the `kbd` syntax for user-facing code,
the internal vector representation of key sequences is not going away,
so let's not impose silly `key-description + key-parse` roundtrips.
Also, provide some support for packages stuck with user configs defined
to hold old-style key formats.

* lisp/keymap.el (keymap-set): Allow vectors as `key`.
(key-parse-old-format): New function, which stands out better than
`key-description` when searching for uses of the old syntax.

* list/outline.el (outline-minor-mode): Use it.

lisp/keymap.el
lisp/outline.el

index 107565590c14314bf7099488213521734e8e7a48..c46e72f0a898b7abfb4aa2adfdb901b10564adaa 100644 (file)
@@ -39,7 +39,8 @@
 
 (defun keymap-set (keymap key definition)
   "Set KEY to DEFINITION in KEYMAP.
-KEY is a string that satisfies `key-valid-p'.
+KEY is a string that satisfies `key-valid-p' (or a vector using the
+internal representation of key sequences).
 
 DEFINITION is anything that can be a key's definition:
  nil (means key is undefined in this keymap),
@@ -57,13 +58,13 @@ DEFINITION is anything that can be a key's definition:
  or an extended menu item definition.
  (See info node `(elisp)Extended Menu Items'.)"
   (declare (compiler-macro (lambda (form) (keymap--compile-check key) form)))
-  (keymap--check key)
+  (unless (vectorp key) (keymap--check key))
   ;; If we're binding this key to another key, then parse that other
   ;; key, too.
   (when (stringp definition)
     (keymap--check definition)
     (setq definition (key-parse definition)))
-  (define-key keymap (key-parse key) definition))
+  (define-key keymap (if (vectorp key) key (key-parse key)) definition))
 
 (defun keymap-global-set (key command)
   "Give KEY a global binding as COMMAND.
@@ -283,6 +284,18 @@ See `kbd' for a descripion of KEYS."
               (setq res (vconcat res key))))))
       res)))
 
+(defun key-parse-old-format (keys)
+  "Convert old-style string representation of KEYS to a vector.
+Simpler alternative to the Rube-Goldbergesque composition of
+`key-description' and `key-parse'."
+  (cond
+   ((vectorp keys) keys)
+   ((multibyte-string-p keys) (vconcat keys))
+   ((stringp keys)
+    (vconcat (mapcar (lambda (c) (if (> c 127) (logior (- c 128) ?\M-\0) c))
+                     keys)))
+   (t (error "Invalid old-style key sequence: %S" keys))))
+
 (defun key-valid-p (keys)
   "Say whether KEYS is a valid key.
 A key is a string consisting of one or more key strokes.
index 93a9247f613269045fdd6e89c67cc53dcf6db95e..388a04ed25da91776248bc623833d8d9ef42c50e 100644 (file)
@@ -496,7 +496,8 @@ See the command `outline-mode' for more information on this mode."
             "<right-margin> <mouse-1>" 'outline-cycle
             "<left-margin> S-<mouse-1>" 'outline-cycle-buffer
             "<right-margin> S-<mouse-1>" 'outline-cycle-buffer
-            (key-description outline-minor-mode-prefix) outline-mode-prefix-map)
+            (key-parse-old-format outline-minor-mode-prefix)
+            outline-mode-prefix-map)
   (if outline-minor-mode
       (progn
         (cond