Function: c-newline-and-indent
c-newline-and-indent is a byte-compiled function defined in
cc-cmds.el.gz.
Signature
(c-newline-and-indent &optional NEWLINE-ARG)
Documentation
Insert a newline and indent the new line.
This function fixes line continuation backslashes if inside a macro,
and takes care to set the indentation before calling
indent-according-to-mode, so that lineup functions like
c-lineup-dont-change works better.
Source Code
;; Defined in /usr/src/emacs/lisp/progmodes/cc-cmds.el.gz
(defun c-newline-and-indent (&optional newline-arg)
"Insert a newline and indent the new line.
This function fixes line continuation backslashes if inside a macro,
and takes care to set the indentation before calling
`indent-according-to-mode', so that lineup functions like
`c-lineup-dont-change' works better."
;; TODO: Backslashes before eol in comments and literals aren't
;; kept intact.
(let ((c-macro-start (c-query-macro-start))
;; Avoid calling c-backslash-region from c-indent-line if it's
;; called during the newline call, which can happen due to
;; c-electric-continued-statement, for example. We also don't
;; want any backslash alignment from indent-according-to-mode.
(c-fix-backslashes nil)
has-backslash insert-backslash
start col)
(save-excursion
(beginning-of-line)
(setq start (point))
(while (and (looking-at "[ \t]*\\\\?$")
(= (forward-line -1) 0)))
(setq col (current-indentation)))
(when c-macro-start
(if (and (eolp) (eq (char-before) ?\\))
(setq insert-backslash t
has-backslash t)
(setq has-backslash (eq (char-before (c-point 'eol)) ?\\))))
(newline newline-arg)
(indent-to col)
(when c-macro-start
(if insert-backslash
(progn
;; The backslash stayed on the previous line. Insert one
;; before calling c-backslash-region, so that
;; bs-col-after-end in it works better. Fixup the
;; backslashes on the newly inserted line.
(insert ?\\)
(backward-char)
(c-backslash-region (point) (point) nil t))
;; The backslash moved to the new line, if there was any. Let
;; c-backslash-region fix a backslash on the previous line,
;; and the one that might be on the new line.
;; c-auto-align-backslashes is intentionally ignored here;
;; maybe the moved backslash should be left alone if it's set,
;; but we fix both lines on the grounds that the old backslash
;; has been moved anyway and is now in a different context.
(c-backslash-region start (if has-backslash (point) start) nil t)))
(when c-syntactic-indentation
;; Reindent syntactically. The indentation done above is not
;; wasted, since c-indent-line might look at the current
;; indentation.
(let ((c-syntactic-context (c-save-buffer-state nil
(c-guess-basic-syntax))))
;; We temporarily insert another line break, so that the
;; lineup functions will see the line as empty. That makes
;; e.g. c-lineup-cpp-define more intuitive since it then
;; proceeds to the preceding line in this case.
(insert ?\n)
(delete-horizontal-space)
(setq start (- (point-max) (point)))
(unwind-protect
(progn
(backward-char)
(indent-according-to-mode))
(goto-char (- (point-max) start))
(delete-char -1)))
(when has-backslash
;; Must align the backslash again after reindentation. The
;; c-backslash-region call above can't be optimized to ignore
;; this line, since it then won't align correctly with the
;; lines below if the first line in the macro is broken.
(c-backslash-region (point) (point) nil t)))))