changeset 48208:0cdc12c2cf68

(fill-paragraph): Consider a comment-start as a paragraph starter when filling non-comments. (fill-comment-paragraph): Use comment-search-forward. Recognize paragraph starters and separators within comments. Use adaptive-fill-prefix when it works. Don't narrow while doing the fill.
author Stefan Monnier <monnier@iro.umontreal.ca>
date Thu, 07 Nov 2002 22:50:57 +0000
parents c1a9d25fa0b7
children eb57ed5ddc1d
files lisp/textmodes/fill.el
diffstat 1 files changed, 92 insertions(+), 68 deletions(-) [+]
line wrap: on
line diff
--- a/lisp/textmodes/fill.el	Thu Nov 07 21:01:20 2002 +0000
+++ b/lisp/textmodes/fill.el	Thu Nov 07 22:50:57 2002 +0000
@@ -704,14 +704,21 @@
 	     (funcall function arg)))
       ;; Then try our syntax-aware filling code.
       (and fill-paragraph-handle-comment
-	   ;; Our code only handle \n-terminated comments right now.
+	   ;; Our code only handles \n-terminated comments right now.
 	   comment-start comment-start-skip (equal comment-end "")
 	   (let ((fill-paragraph-handle-comment nil))
 	     (fill-comment-paragraph arg)))
       ;; If it all fails, default to the good ol' text paragraph filling.
       (let ((before (point))
+	    (paragraph-start paragraph-start)
 	    ;; Fill prefix used for filling the paragraph.
 	    fill-pfx)
+	;; Try to prevent code sections and comment sections from being
+	;; filled together.
+	(when (and fill-paragraph-handle-comment comment-start-skip)
+	  (setq paragraph-start
+		(concat paragraph-start "\\|[ \t]*\\(?:"
+			comment-start-skip "\\)")))
 	(save-excursion
 	  ;; To make sure the return value of forward-paragraph is meaningful,
 	  ;; we have to start from the beginning of line, otherwise skipping
@@ -741,86 +748,103 @@
 (defun fill-comment-paragraph (&optional justify)
   "Fill current comment.
 If we're not in a comment, just return nil so that the caller
-can take care of filling."
-  (let ((comment-re (concat "[ \t]*" comment-start-skip))
-	has-comment	   ; Non-nil if the current line contains a comment.
-	has-code-and-comment	; Non-nil if it contains code and a comment.
-	comment-fill-prefix)   ; If has-comment, the appropriate fill-prefix.
-
+can take care of filling.  JUSTIFY is used as in `fill-paragraph'."
+  (comment-normalize-vars)
+  (let (has-code-and-comment	; Non-nil if it contains code and a comment.
+	comin comstart)
     ;; Figure out what kind of comment we are looking at.
     (save-excursion
       (beginning-of-line)
-      (cond
-
-       ;; A line with nothing but a comment on it?
-       ((looking-at comment-re)
-	(setq has-comment t
-	      comment-fill-prefix (match-string 0)))
-
-       ;; A line with some code, followed by a comment?  Remember that the
-       ;; semi which starts the comment shouldn't be part of a string or
-       ;; character.
-       ((let ((state (syntax-ppss (line-end-position))))
-	  (when (nth 4 state)
-	    (goto-char (nth 8 state))
-	    (save-restriction
-	      ;; comment-start-skip sometimes tries to count \ quoting from ^.
-	      (narrow-to-region (point) (point-max))
-	      (looking-at comment-start-skip))))
-	(setq has-comment t has-code-and-comment t)
-	(setq comment-fill-prefix
-	      (concat (make-string (/ (current-column) tab-width) ?\t)
-		      (make-string (% (current-column) tab-width) ?\ )
-		      (match-string 0))))))
-
-    (if (not has-comment)
+      (when (setq comstart (comment-search-forward (line-end-position) t))
+	(setq comin (point))
+	(goto-char comstart) (skip-chars-backward " \t")
+	(setq has-code-and-comment (not (bolp)))))
+	 
+    (if (not comstart)
 	;; Return nil, so the normal filling will take place.
 	nil
 
       ;; Narrow to include only the comment, and then fill the region.
-      (save-excursion
-	(save-restriction
-	  (beginning-of-line)
-	  (narrow-to-region
-	   ;; Find the first line we should include in the region to fill.
-	   (save-excursion
-	     (while (and (zerop (forward-line -1))
-			 (looking-at comment-re)))
-	     ;; We may have gone too far.  Go forward again.
-	     (or (looking-at (concat ".*" comment-start-skip))
-		 (forward-line 1))
-	     (point))
+      (let* ((fill-prefix fill-prefix)
+	     (comment-re (concat "[ \t]*\\(?:" comment-start-skip "\\)"))
+	     (comment-fill-prefix	; Compute a fill prefix.
+	      (save-excursion
+		(goto-char comstart)
+		(if has-code-and-comment
+		    (concat (make-string (/ (current-column) tab-width) ?\t)
+			    (make-string (% (current-column) tab-width) ?\ )
+			    (buffer-substring (point) comin))
+		  (buffer-substring (line-beginning-position) comin))))
+	     beg end)
+	(save-excursion
+	  (save-restriction
+	    (beginning-of-line)
+	    (narrow-to-region
+	     ;; Find the first line we should include in the region to fill.
+	     (if has-code-and-comment
+		 (line-beginning-position)
+	       (save-excursion
+		 (while (and (zerop (forward-line -1))
+			     (looking-at comment-re)))
+		 ;; We may have gone too far.  Go forward again.
+		 (line-beginning-position
+		  (if (looking-at (concat ".*" comment-start-skip))
+		      1 2))))
 	   ;; Find the beginning of the first line past the region to fill.
 	   (save-excursion
 	     (while (progn (forward-line 1)
 			   (looking-at comment-re)))
 	     (point)))
+	    ;; Obey paragraph starters and boundaries within comments.
+	    (let* ((paragraph-separate
+		    ;; Use the default values since they correspond to
+		    ;; the values to use for plain text.
+		    (concat paragraph-separate "\\|[ \t]*\\(?:"
+			    comment-start-skip "\\)\\(?:"
+			    (default-value 'paragraph-separate) "\\)"))
+		   (paragraph-start
+		    (concat paragraph-start "\\|[ \t]*\\(?:"
+			    comment-start-skip "\\)\\(?:"
+			    (default-value 'paragraph-start) "\\)"))
+		   (paragraph-ignore-fill-prefix nil)
+		   (fill-prefix comment-fill-prefix)
+		   (after-line (if has-code-and-comment
+				   (line-beginning-position 2)))
+		   )
+	      (setq end (progn
+			  (forward-paragraph)
+			  (or (bolp) (newline 1))
+			  (point)))
+	      ;; If this comment starts on a line with code,
+	      ;; include that line in the filling.
+	      (setq beg (progn (backward-paragraph)
+			       (if (eq (point) after-line)
+				   (forward-line -1))
+			       (point))))
+	    )
 
-	  ;; Lines with only semicolons on them can be paragraph boundaries.
-	  (let* ((paragraph-separate
-		  (concat paragraph-start "\\|" comment-re "$"))
-		 (paragraph-ignore-fill-prefix nil)
-		 (fill-prefix comment-fill-prefix)
-		 (after-line (if has-code-and-comment
-				 (line-beginning-position 2)))
-		 (end (progn
-			(forward-paragraph)
-			(or (bolp) (newline 1))
-			(point)))
-		 ;; If this comment starts on a line with code,
-		 ;; include that like in the filling.
-		 (beg (progn (backward-paragraph)
-			     (if (eq (point) after-line)
-				 (forward-line -1))
-			     (point))))
-	    (fill-region-as-paragraph beg end
-				      justify nil
-				      (save-excursion
-					(goto-char beg)
-					(if (looking-at fill-prefix)
-					    nil
-					  (re-search-forward comment-start-skip))))
-	    t))))))
+	  ;; Find the fill-prefix to use.
+	  (cond
+	   (fill-prefix)		; Use the user-provided fill prefix.
+	   ((and adaptive-fill-mode	; Try adaptive fill mode.
+		 (setq fill-prefix (fill-context-prefix beg end))
+		 (string-match comment-start-skip fill-prefix)))
+	   (t
+	    (setq fill-prefix comment-fill-prefix)))
+
+	  ;; Don't fill with narrowing.
+	  (or
+	   (fill-region-as-paragraph
+	    beg end justify nil
+	    ;; Don't canonicalize spaces within the code just before
+	    ;; the comment.
+	    (save-excursion
+	      (goto-char beg)
+	      (if (looking-at fill-prefix)
+		  nil
+		(re-search-forward comment-start-skip))))
+	   ;; Make sure we don't return nil.
+	   t))))))
 
 (defun fill-region (from to &optional justify nosqueeze to-eop)
   "Fill each of the paragraphs in the region.