Emacs rices: Difference between revisions

From razwiki
Jump to navigation Jump to search
(Created page with "Want to make the indent function of elisp aligned like this post: https://emacs.stackexchange.com/questions/10230/how-to-indent-keywords-aligned The long answer with advice didn't work, but the code from fuco1 did. It's mit licensed; could package it up as its own package. Here it is in all its glory <pre> (eval-after-load "lisp-mode" '(defun lisp-indent-function (indent-point state) "This function is the normal value of the variable `lisp-indent-function'. The...")
 
No edit summary
Line 1: Line 1:
Want to make the indent function of elisp aligned like this post: https://emacs.stackexchange.com/questions/10230/how-to-indent-keywords-aligned
Want to make the indent function of elisp aligned like this post: https://emacs.stackexchange.com/questions/10230/how-to-indent-keywords-aligned


The long answer with advice didn't work, but the code from fuco1 did. It's mit licensed; could package it up as its own package. Here it is in all its glory
The long answer with advice didn't work, but the code from fuco1 did. It's mit licensed; could package it up as its own package. Here it is in all its glory: https://github.com/Fuco1/.emacs.d/blob/af82072196564fa57726bdbabf97f1d35c43b7f7/site-lisp/redef.el#L20-L94

<pre>
(eval-after-load "lisp-mode"
'(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
if the arguments of a Lisp function call should be indented specially.

INDENT-POINT is the position at which the line being indented begins.
Point is located at the point to indent under (for default indentation);
STATE is the `parse-partial-sexp' state for that position.

If the current line is in a call to a Lisp function that has a non-nil
property `lisp-indent-function' (or the deprecated `lisp-indent-hook'),
it specifies how to indent. The property value can be:

* `defun', meaning indent `defun'-style
\(this is also the case if there is no property and the function
has a name that begins with \"def\", and three or more arguments);

* an integer N, meaning indent the first N arguments specially
(like ordinary function arguments), and then indent any further
arguments like a body;

* a function to call that returns the indentation (or nil).
`lisp-indent-function' calls this function with the same two arguments
that it itself received.

This function returns either the indentation to use, or nil if the
Lisp function does not specify a special indentation."
(let ((normal-indent (current-column))
(orig-point (point)))
(goto-char (1+ (elt state 1)))
(parse-partial-sexp (point) calculate-lisp-indent-last-sexp 0 t)
(cond
;; car of form doesn't seem to be a symbol, or is a keyword
((and (elt state 2)
(or (not (looking-at "\\sw\\|\\s_"))
(looking-at ":")))
(if (not (> (save-excursion (forward-line 1) (point))
calculate-lisp-indent-last-sexp))
(progn (goto-char calculate-lisp-indent-last-sexp)
(beginning-of-line)
(parse-partial-sexp (point)
calculate-lisp-indent-last-sexp 0 t)))
;; Indent under the list or under the first sexp on the same
;; line as calculate-lisp-indent-last-sexp. Note that first
;; thing on that line has to be complete sexp since we are
;; inside the innermost containing sexp.
(backward-prefix-chars)
(current-column))
((and (save-excursion
(goto-char indent-point)
(skip-syntax-forward " ")
(not (looking-at ":")))
(save-excursion
(goto-char orig-point)
(looking-at ":")))
(save-excursion
(goto-char (+ 2 (elt state 1)))
(current-column)))
(t
(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)))
(lisp-indent-defform state indent-point))
((integerp method)
(lisp-indent-specform method state
indent-point normal-indent))
(method
(funcall method indent-point state)))))))))
</pre>

Revision as of 16:35, 28 December 2023

Want to make the indent function of elisp aligned like this post: https://emacs.stackexchange.com/questions/10230/how-to-indent-keywords-aligned

The long answer with advice didn't work, but the code from fuco1 did. It's mit licensed; could package it up as its own package. Here it is in all its glory: https://github.com/Fuco1/.emacs.d/blob/af82072196564fa57726bdbabf97f1d35c43b7f7/site-lisp/redef.el#L20-L94