Function: comment-indent

comment-indent is an interactive and byte-compiled function defined in newcomment.el.gz.

Signature

(comment-indent &optional CONTINUE)

Documentation

Indent this line's comment to comment-column, or insert an empty comment.

If CONTINUE is non-nil, use the comment-continue markers if any.

Key Bindings

Aliases

indent-for-comment tcl-indent-for-comment (obsolete since 28.1)

Source Code

;; Defined in /usr/src/emacs/lisp/newcomment.el.gz
;;;###autoload
(defun comment-indent (&optional continue)
  "Indent this line's comment to `comment-column', or insert an empty comment.
If CONTINUE is non-nil, use the `comment-continue' markers if any."
  (interactive "*")
  (comment-normalize-vars)
  (beginning-of-line)
  (let ((starter (or (and continue comment-continue)
                     comment-start
                     (error "No comment syntax defined")))
	(ender (or (and continue comment-continue "")
                   comment-end))
	(begpos (comment-search-forward (line-end-position) t))
	cpos indent)
    (cond
     ;; If we couldn't find a comment *starting* on this line, see if we
     ;; are already within a multiline comment at BOL (bug#78003).
     ((and (not begpos) (not continue)
           comment-use-syntax comment-use-global-state
           (save-excursion (nth 4 (syntax-ppss (line-beginning-position)))))
      ;; We don't know anything about the nature of the multiline
      ;; construct, so immediately delegate to the mode.
      (indent-according-to-mode))
     ((and (not begpos) comment-insert-comment-function)
      ;; If no comment and c-i-c-f is set, let it do everything.
      (funcall comment-insert-comment-function))
     (t
      ;; An existing comment?
      (if begpos
	  (progn
	    (if (and (not (looking-at "[\t\n ]"))
		     (looking-at comment-end-skip))
		;; The comment is empty and we have skipped all its space
		;; and landed right before the comment-ender:
		;; Go back to the middle of the space.
		(forward-char (/ (skip-chars-backward " \t") -2)))
	    (setq cpos (point-marker)))
	;; If none, insert one.
	(save-excursion
	  ;; Some `comment-indent-function's insist on not moving
	  ;; comments that are in column 0, so we first go to the
	  ;; likely target column.
	  (indent-to comment-column)
	  ;; Ensure there's a space before the comment for things
	  ;; like sh where it matters (as well as being neater).
	  (unless (memq (char-before) '(nil ?\n ?\t ?\s))
	    (insert ?\s))
	  (setq begpos (point))
	  (insert starter)
	  (setq cpos (point-marker))
	  (insert ender)))
      (goto-char begpos)
      ;; Compute desired indent.
      (setq indent (save-excursion (funcall comment-indent-function)))
      ;; If `indent' is nil and there's code before the comment, we can't
      ;; use `indent-according-to-mode', so we default to comment-column.
      (unless (or indent (save-excursion (skip-chars-backward " \t") (bolp)))
	(setq indent comment-column))
      (if (not indent)
	  ;; comment-indent-function refuses: delegate to line-indent.
	  (indent-according-to-mode)
	;; If the comment is at the right of code, adjust the indentation.
	(unless (save-excursion (skip-chars-backward " \t") (bolp))
	  (setq indent (comment-choose-indent indent)))
	;; If that's different from comment's current position, change it.
	(unless (= (current-column) indent)
	  (delete-region (point) (progn (skip-chars-backward " \t") (point)))
	  (indent-to indent)))
      (goto-char cpos)
      (set-marker cpos nil)))))