summaryrefslogtreecommitdiff
path: root/lisp/emacs-lisp
diff options
context:
space:
mode:
authorLars Ingebrigtsen <larsi@gnus.org>2021-10-04 10:12:11 +0200
committerLars Ingebrigtsen <larsi@gnus.org>2021-10-04 10:15:11 +0200
commit192f9357f25b5b714984e5f60df2eba9dcac4120 (patch)
tree80dae4bc02148004f8166295bbae08556165f95c /lisp/emacs-lisp
parentc6be44d9b3ec09195f6279e9a503175f8fd60e14 (diff)
downloademacs-192f9357f25b5b714984e5f60df2eba9dcac4120.tar.gz
emacs-192f9357f25b5b714984e5f60df2eba9dcac4120.tar.bz2
emacs-192f9357f25b5b714984e5f60df2eba9dcac4120.zip
Add 'define-keymap' and 'defvar-keymap'
* doc/lispref/keymaps.texi (Changing Key Bindings): Document define-keymap and defvar-keymap. * lisp/subr.el (define-keymap): New function. (define-keymap--define): New function. (defvar-keymap): New macro. * lisp/emacs-lisp/lisp-mode.el (lisp-indent--defvar-keymap): New function. (lisp-indent-function): Use it to indent defvar-keymap.
Diffstat (limited to 'lisp/emacs-lisp')
-rw-r--r--lisp/emacs-lisp/lisp-mode.el63
1 files changed, 40 insertions, 23 deletions
diff --git a/lisp/emacs-lisp/lisp-mode.el b/lisp/emacs-lisp/lisp-mode.el
index 57196dfec49..a465d189b7a 100644
--- a/lisp/emacs-lisp/lisp-mode.el
+++ b/lisp/emacs-lisp/lisp-mode.el
@@ -1162,6 +1162,18 @@ STATE is the `parse-partial-sexp' state for current position."
(goto-char (scan-lists (point) -1 0))
(point)))))))))))
+(defun lisp-indent--defvar-keymap (state)
+ "Return the indent position in the options part of a `defvar-keymap' form."
+ (save-excursion
+ (let ((parens (ppss-open-parens state)))
+ (and (equal (nth 1 parens) (ppss-innermost-start state))
+ (progn
+ (goto-char (nth 0 parens))
+ (looking-at-p "(defvar-keymap"))
+ (progn
+ (goto-char (ppss-innermost-start state))
+ (1+ (current-column)))))))
+
(defun lisp-indent-function (indent-point state)
"This function is the normal value of the variable `lisp-indent-function'.
The function `calculate-lisp-indent' calls this to determine
@@ -1195,10 +1207,12 @@ Lisp function does not specify a special indentation."
(if (and (elt state 2)
(not (looking-at "\\sw\\|\\s_")))
;; car of form doesn't seem to be a symbol
- (if (lisp--local-defform-body-p state)
- ;; We nevertheless check whether we are in flet-like form
- ;; as we presume local function names could be non-symbols.
- (lisp-indent-defform state indent-point)
+ (cond
+ ((lisp--local-defform-body-p state)
+ ;; We nevertheless check whether we are in flet-like form
+ ;; as we presume local function names could be non-symbols.
+ (lisp-indent-defform state indent-point))
+ (t
(if (not (> (save-excursion (forward-line 1) (point))
calculate-lisp-indent-last-sexp))
(progn (goto-char calculate-lisp-indent-last-sexp)
@@ -1210,25 +1224,28 @@ Lisp function does not specify a special indentation."
;; thing on that line has to be complete sexp since we are
;; inside the innermost containing sexp.
(backward-prefix-chars)
- (current-column))
- (let ((function (buffer-substring (point)
- (progn (forward-sexp 1) (point))))
- method)
- (setq method (or (function-get (intern-soft function)
- 'lisp-indent-function)
- (get (intern-soft function) 'lisp-indent-hook)))
- (cond ((or (eq method 'defun)
- (and (null method)
- (> (length function) 3)
- (string-match "\\`def" function))
- ;; Check whether we are in flet-like form.
- (lisp--local-defform-body-p state))
- (lisp-indent-defform state indent-point))
- ((integerp method)
- (lisp-indent-specform method state
- indent-point normal-indent))
- (method
- (funcall method indent-point state)))))))
+ (current-column)))
+ ;; Indent `defvar-keymap' arguments.
+ (or (lisp-indent--defvar-keymap state)
+ ;; Other forms.
+ (let ((function (buffer-substring (point)
+ (progn (forward-sexp 1) (point))))
+ method)
+ (setq method (or (function-get (intern-soft function)
+ 'lisp-indent-function)
+ (get (intern-soft function) 'lisp-indent-hook)))
+ (cond ((or (eq method 'defun)
+ (and (null method)
+ (> (length function) 3)
+ (string-match "\\`def" function))
+ ;; Check whether we are in flet-like form.
+ (lisp--local-defform-body-p state))
+ (lisp-indent-defform state indent-point))
+ ((integerp method)
+ (lisp-indent-specform method state
+ indent-point normal-indent))
+ (method
+ (funcall method indent-point state))))))))
(defcustom lisp-body-indent 2
"Number of columns to indent the second line of a `(def...)' form."