summaryrefslogtreecommitdiff
path: root/lisp/newcomment.el
diff options
context:
space:
mode:
authorStefan Monnier <monnier@iro.umontreal.ca>2006-10-10 00:33:16 +0000
committerStefan Monnier <monnier@iro.umontreal.ca>2006-10-10 00:33:16 +0000
commite29d96b65f897a3cef09053c6491116de25cade5 (patch)
tree7792eca7e85eb1d9798c3f6d52f1e395857d280f /lisp/newcomment.el
parent394ccd7d8bf47c9ecef244631cfda61e065e777d (diff)
downloademacs-e29d96b65f897a3cef09053c6491116de25cade5.tar.gz
(comment-valid-prefix-p): Make the check more thorough.
From an idea by Martin Rudalics <rudalics@gmx.at>. (comment-indent-new-line): Adjust call.
Diffstat (limited to 'lisp/newcomment.el')
-rw-r--r--lisp/newcomment.el49
1 files changed, 40 insertions, 9 deletions
diff --git a/lisp/newcomment.el b/lisp/newcomment.el
index 0cf0160afb1..9d089a2e164 100644
--- a/lisp/newcomment.el
+++ b/lisp/newcomment.el
@@ -238,7 +238,7 @@ behavior for explicit filling, you might as well use \\[newline-and-indent]."
(defcustom comment-empty-lines nil
"If nil, `comment-region' does not comment out empty lines.
If t, it always comments out empty lines.
-if `eol' it only comments out empty lines if comments are
+If `eol' it only comments out empty lines if comments are
terminated by the end of line (i.e. `comment-end' is empty)."
:type '(choice (const :tag "Never" nil)
(const :tag "Always" t)
@@ -1124,12 +1124,44 @@ This has no effect in modes that do not define a comment syntax."
:group 'comment)
(defun comment-valid-prefix-p (prefix compos)
- (or
- ;; Accept any prefix if the current comment is not EOL-terminated.
- (save-excursion (goto-char compos) (comment-forward) (not (bolp)))
- ;; Accept any prefix that starts with a comment-start marker.
- (string-match (concat "\\`[ \t]*\\(?:" comment-start-skip "\\)")
- prefix)))
+ "Check that the adaptive-fill-prefix is consistent with the context.
+PREFIX is the prefix (presumably guessed by `adaptive-fill-mode').
+COMPOS is the position of the beginning of the comment we're in, or nil
+if we're not inside a comment."
+ ;; This consistency checking is mostly needed to workaround the limitation
+ ;; of auto-fill-mode whose paragraph-determination doesn't pay attention
+ ;; to comment boundaries.
+ (if (null compos)
+ ;; We're not inside a comment: the prefix shouldn't match
+ ;; a comment-starter.
+ (not (and comment-start comment-start-skip
+ (string-match comment-start-skip prefix)))
+ (or
+ ;; Accept any prefix if the current comment is not EOL-terminated.
+ (save-excursion (goto-char compos) (comment-forward) (not (bolp)))
+ ;; Accept any prefix that starts with the same comment-start marker
+ ;; as the current one.
+ (when (string-match (concat "\\`[ \t]*\\(?:" comment-start-skip "\\)")
+ prefix)
+ (let ((prefix-com (comment-string-strip (match-string 0 prefix) nil t)))
+ (string-match "\\`[ \t]*" prefix-com)
+ (let* ((prefix-space (match-string 0 prefix-com))
+ (prefix-indent (string-width prefix-space))
+ (prefix-comstart (substring prefix-com (match-end 0))))
+ (save-excursion
+ (goto-char compos)
+ ;; The comstart marker is the same.
+ (and (looking-at (regexp-quote prefix-comstart))
+ ;; The indentation as well.
+ (or (= prefix-indent
+ (- (current-column) (current-left-margin)))
+ ;; Check the indentation in two different ways, just
+ ;; to try and avoid most of the potential funny cases.
+ (equal prefix-space
+ (buffer-substring (point)
+ (progn (move-to-left-margin)
+ (point)))))))))))))
+
;;;###autoload
(defun comment-indent-new-line (&optional soft)
@@ -1182,8 +1214,7 @@ unless optional argument SOFT is non-nil."
;; If there's an adaptive prefix, use it unless we're inside
;; a comment and the prefix is not a comment starter.
((and fill-prefix
- (or (not compos)
- (comment-valid-prefix-p fill-prefix compos)))
+ (comment-valid-prefix-p fill-prefix compos))
(indent-to-left-margin)
(insert-and-inherit fill-prefix))
;; If we're not inside a comment, just try to indent.