summaryrefslogtreecommitdiff
path: root/lisp/emacs-lisp/bytecomp.el
diff options
context:
space:
mode:
authorLars Ingebrigtsen <larsi@gnus.org>2021-11-16 08:15:43 +0100
committerLars Ingebrigtsen <larsi@gnus.org>2021-11-16 08:26:24 +0100
commitde477ec683482a5dd27d791d7fdcfc4021ed3cb7 (patch)
treee76ae6aa9969b07cf71bb57651ac2368327d1bf8 /lisp/emacs-lisp/bytecomp.el
parent560c921ed8d2d14e593aaee68b8be57b189128e5 (diff)
downloademacs-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.el65
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