diff options
author | Stefan Monnier <monnier@iro.umontreal.ca> | 2022-10-02 13:52:57 -0400 |
---|---|---|
committer | Stefan Monnier <monnier@iro.umontreal.ca> | 2022-10-02 14:07:24 -0400 |
commit | 570a11052be6178954956a1c59c8ebcbdb77d38e (patch) | |
tree | 9f3bbe2e6b6ad0ae246722db58dc88d2e84cf3af /lisp/keymap.el | |
parent | 4839b42a16635a3090f4fb374fb1fbe532ef0451 (diff) | |
download | emacs-570a11052be6178954956a1c59c8ebcbdb77d38e.tar.gz emacs-570a11052be6178954956a1c59c8ebcbdb77d38e.tar.bz2 emacs-570a11052be6178954956a1c59c8ebcbdb77d38e.zip |
keymap.el: Ease up support for non-`kbd` formats.
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.
Diffstat (limited to 'lisp/keymap.el')
-rw-r--r-- | lisp/keymap.el | 19 |
1 files changed, 16 insertions, 3 deletions
diff --git a/lisp/keymap.el b/lisp/keymap.el index 107565590c1..c46e72f0a89 100644 --- a/lisp/keymap.el +++ b/lisp/keymap.el @@ -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. |