diff options
Diffstat (limited to 'lisp/newcomment.el')
-rw-r--r-- | lisp/newcomment.el | 102 |
1 files changed, 54 insertions, 48 deletions
diff --git a/lisp/newcomment.el b/lisp/newcomment.el index 06dc7efbc99..2de4fa025fd 100644 --- a/lisp/newcomment.el +++ b/lisp/newcomment.el @@ -599,19 +599,20 @@ If CONTINUE is non-nil, use the `comment-continue' markers if any." (let* ((eolpos (line-end-position)) (begpos (comment-search-forward eolpos t)) cpos indent) - ;; 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 (and comment-insert-comment-function (not begpos)) + ;; If no comment and c-i-c-f is set, let it do everything. + (funcall comment-insert-comment-function) + ;; 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. - (if comment-insert-comment-function - (funcall comment-insert-comment-function) (save-excursion ;; Some `comment-indent-function's insist on not moving ;; comments that are in column 0, so we first go to the @@ -624,32 +625,32 @@ If CONTINUE is non-nil, use the `comment-continue' markers if any." (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))) - ;; Update INDENT to leave at least one space - ;; after other nonwhite text on the line. - (save-excursion - (skip-chars-backward " \t") - (unless (bolp) - (setq indent (max indent (1+ (current-column)))))) - ;; 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)))) + (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))) + ;; Update INDENT to leave at least one space + ;; after other nonwhite text on the line. + (save-excursion + (skip-chars-backward " \t") + (unless (bolp) + (setq indent (max indent (1+ (current-column)))))) + ;; 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))))) ;;;###autoload (defun comment-set-column (arg) @@ -1151,7 +1152,8 @@ is passed on to the respective function." If the region is active and `transient-mark-mode' is on, call `comment-region' (unless it only consists of comments, in which case it calls `uncomment-region'). -Else, if the current line is empty, insert a comment and indent it. +Else, if the current line is empty, call `comment-insert-comment-function' +if it is defined, otherwise insert a comment and indent it. Else if a prefix ARG is specified, call `comment-kill'. Else, call `comment-indent'. You can configure `comment-style' to change the way regions are commented." @@ -1163,15 +1165,19 @@ You can configure `comment-style' to change the way regions are commented." ;; FIXME: If there's no comment to kill on this line and ARG is ;; specified, calling comment-kill is not very clever. (if arg (comment-kill (and (integerp arg) arg)) (comment-indent)) - (let ((add (comment-add arg))) - ;; Some modes insist on keeping column 0 comment in column 0 - ;; so we need to move away from it before inserting the comment. - (indent-according-to-mode) - (insert (comment-padright comment-start add)) - (save-excursion - (unless (string= "" comment-end) - (insert (comment-padleft comment-end add))) - (indent-according-to-mode)))))) + ;; Inserting a comment on a blank line. comment-indent calls + ;; c-i-c-f if needed in the non-blank case. + (if comment-insert-comment-function + (funcall comment-insert-comment-function) + (let ((add (comment-add arg))) + ;; Some modes insist on keeping column 0 comment in column 0 + ;; so we need to move away from it before inserting the comment. + (indent-according-to-mode) + (insert (comment-padright comment-start add)) + (save-excursion + (unless (string= "" comment-end) + (insert (comment-padleft comment-end add))) + (indent-according-to-mode))))))) ;;;###autoload (defcustom comment-auto-fill-only-comments nil |