diff options
author | Lars Ingebrigtsen <larsi@gnus.org> | 2021-11-16 08:15:43 +0100 |
---|---|---|
committer | Lars Ingebrigtsen <larsi@gnus.org> | 2021-11-16 08:26:24 +0100 |
commit | de477ec683482a5dd27d791d7fdcfc4021ed3cb7 (patch) | |
tree | e76ae6aa9969b07cf71bb57651ac2368327d1bf8 /lisp/emacs-lisp/bytecomp.el | |
parent | 560c921ed8d2d14e593aaee68b8be57b189128e5 (diff) | |
download | emacs-de477ec683482a5dd27d791d7fdcfc4021ed3cb7.tar.gz emacs-de477ec683482a5dd27d791d7fdcfc4021ed3cb7.tar.bz2 emacs-de477ec683482a5dd27d791d7fdcfc4021ed3cb7.zip |
Add new 'keymap-*' functions
* lisp/keymap.el: New file with all the new keymap-* functions.
* lisp/loadup.el ("keymap"): Load.
* lisp/subr.el (kbd): Refactor out all the code to key-parse.
(define-key-after, keyboard-translate, global-set-key)
(local-set-key, global-unset-key, local-unset-key)
(local-key-binding, global-key-binding)
(substitute-key-definition): Note in doc strings that these are
legacy functions.
(define-keymap--define): Use keymap-set.
* lisp/emacs-lisp/byte-opt.el: Remove the optimizations for
defvar-keymap and define-keymap since the macros now only
understand the kbd syntax.
* lisp/emacs-lisp/bytecomp.el (byte-compile-define-keymap)
(byte-compile-define-keymap--define): Warn about invalid key
definitions in all keymap-* functions.
* lisp/emacs-lisp/shortdoc.el (keymaps): Add shortdocs form
keymap* functions.
* src/keymap.c (possibly_translate_key_sequence): Adjust callers
to key-valid-p and key-parse.
(syms_of_keymap): Adjust defs.
Diffstat (limited to 'lisp/emacs-lisp/bytecomp.el')
-rw-r--r-- | lisp/emacs-lisp/bytecomp.el | 65 |
1 files changed, 65 insertions, 0 deletions
diff --git a/lisp/emacs-lisp/bytecomp.el b/lisp/emacs-lisp/bytecomp.el index 471a0b623ad..4078a7314f3 100644 --- a/lisp/emacs-lisp/bytecomp.el +++ b/lisp/emacs-lisp/bytecomp.el @@ -5043,6 +5043,71 @@ binding slots have been popped." nil)) (_ (byte-compile-keep-pending form)))) + + + +;; Key syntax warnings. + +(mapc + (lambda (elem) + (put (car elem) 'byte-hunk-handler + (lambda (form) + (dolist (idx (cdr elem)) + (let ((key (elt form idx))) + (when (or (vectorp key) + (and (stringp key) + (not (key-valid-p key)))) + (byte-compile-warn "Invalid `kbd' syntax: %S" key)))) + form))) + ;; Functions and the place(s) for the key definition(s). + '((keymap-set 2) + (keymap-global-set 1) + (keymap-local-set 1) + (keymap-unset 2) + (keymap-global-unset 1) + (keymap-local-unset 1) + (keymap-substitute 1 2) + (keymap-set-after 2) + (key-translate 1 2) + (keymap-lookup 2) + (keymap-global-lookup 1) + (keymap-local-lookup 1))) + +(put 'define-keymap 'byte-hunk-handler #'byte-compile-define-keymap) +(defun byte-compile-define-keymap (form) + (let ((result nil) + (orig-form form)) + (push (pop form) result) + (while (and form + (keywordp (car form)) + (not (eq (car form) :menu))) + (unless (memq (car form) + '(:full :keymap :parent :suppress :name :prefix)) + (byte-compile-warn "Invalid keyword: %s" (car form))) + (push (pop form) result) + (when (null form) + (byte-compile-warn "Uneven number of keywords in %S" form)) + (push (pop form) result)) + ;; Bindings. + (while form + (let ((key (pop form))) + (when (stringp key) + (unless (key-valid-p key) + (byte-compile-warn "Invalid `kbd' syntax: %S" key))) + ;; No improvement. + (push key result)) + (when (null form) + (byte-compile-warn "Uneven number of key bindings in %S" form)) + (push (pop form) result)) + orig-form)) + +(put 'define-keymap--define 'byte-hunk-handler + #'byte-compile-define-keymap--define) +(defun byte-compile-define-keymap--define (form) + (when (consp (nth 1 form)) + (byte-compile-define-keymap (nth 1 form))) + form) + ;;; tags |