Function: lisp-indent-function

lisp-indent-function is a byte-compiled function defined in lisp-mode.el.gz.

Signature

(lisp-indent-function INDENT-POINT STATE)

Documentation

This function is the normal value of the variable lisp-indent-function(var)/lisp-indent-function(fun).

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(var)/lisp-indent-function(fun) (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(var)/lisp-indent-function(fun) 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.

View in manual

Probably introduced at or before Emacs version 22.1.

Source Code

;; Defined in /usr/src/emacs/lisp/emacs-lisp/lisp-mode.el.gz
(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)))
    (goto-char (1+ (elt state 1)))
    (parse-partial-sexp (point) calculate-lisp-indent-last-sexp 0 t)
    (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)
          (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))
      (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)
                   ;; 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)))))))