1
Fork 0
mirror of git://git.sv.gnu.org/emacs.git synced 2025-12-06 06:20:55 -08:00

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.
This commit is contained in:
Lars Ingebrigtsen 2021-10-04 10:12:11 +02:00
parent c6be44d9b3
commit 192f9357f2
4 changed files with 258 additions and 23 deletions

View file

@ -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."