changeset 13578:85697e02a482

(fill-region-as-paragraph): Remove redundant "setq from". Don't add extra newline at end if there is no text in paragraph -- doing so can make fill-region loop. When testing for indentation exceeding fill-column, skip back over tabs too. (fill-context-prefix): Use adaptive-fill-regexp only if non-nil. (fill-context-prefix): Check adaptive-fill-function non-nil.
author Richard M. Stallman <rms@gnu.org>
date Fri, 17 Nov 1995 23:32:15 +0000
parents d88cdc4a0cfe
children 9426437410bf
files lisp/textmodes/fill.el
diffstat 1 files changed, 30 insertions(+), 26 deletions(-) [+]
line wrap: on
line diff
--- a/lisp/textmodes/fill.el	Fri Nov 17 22:43:35 1995 +0000
+++ b/lisp/textmodes/fill.el	Fri Nov 17 23:32:15 1995 +0000
@@ -145,15 +145,16 @@
     (let ((start (point))
 	  (eol (save-excursion (end-of-line) (point))))
       (if (not (looking-at paragraph-start))
-	  (cond ((looking-at adaptive-fill-regexp)
+	  (cond ((and adaptive-fill-regexp (looking-at adaptive-fill-regexp))
 		 (buffer-substring-no-properties start (match-end 0)))
-		(t (funcall adaptive-fill-function)))))))
+		(adaptive-fill-function (funcall adaptive-fill-function)))))))
 
 (defun fill-region-as-paragraph (from to &optional justify nosqueeze)
   "Fill the region as one paragraph.
-Removes any paragraph breaks in the region and extra newlines at the end,
+It removes any paragraph breaks in the region and extra newlines at the end,
 indents and fills lines between the margins given by the
 `current-left-margin' and `current-fill-column' functions.
+It leaves point at the beginning of the line following the paragraph.
 
 Normally performs justification according to the `current-justification'
 function, but with a prefix arg, does full justification instead.
@@ -170,14 +171,20 @@
   (if (and buffer-undo-list (not (eq buffer-undo-list t)))
       (setq buffer-undo-list (cons (point) buffer-undo-list)))
 
-  ;; Make sure "to" is the endpoint.  Make sure that we end up there.
+  ;; Make sure "to" is the endpoint.
   (goto-char (min from to))
   (setq to   (max from to))
-  (setq from (point))
+  ;; Ignore blank lines at beginning of region.
+  (skip-chars-forward " \t\n")
+
+  (let ((from-plus-indent (point))
+	(oneleft nil))
 
-  ;; Delete all but one soft newline at end of region.
-  (goto-char to)
-  (let ((oneleft nil))
+    (beginning-of-line)
+    (setq from (point))
+  
+    ;; Delete all but one soft newline at end of region.
+    (goto-char to)
     (while (and (> (point) from) (eq ?\n (char-after (1- (point)))))
       (if (and oneleft
 	       (not (and use-hard-newlines
@@ -185,19 +192,16 @@
 	  (delete-backward-char 1)
 	(backward-char 1)
 	(setq oneleft t)))
-    ;; If there was no newline, create one.
-    (if (and (not oneleft) (> (point) from))
-	(save-excursion (newline))))
-  (setq to (point))
+    (setq to (point))
 
-  ;; Ignore blank lines at beginning of region.
-  (goto-char from)
-  (skip-chars-forward " \t\n")
-  (beginning-of-line)
-  (setq from (point))
-  
-  (if (>= from to)
-      nil ; There is no paragraph at all.
+    ;; If there was no newline, and there is text in the paragraph, then
+    ;; create a newline.
+    (if (and (not oneleft) (> to from-plus-indent))
+	(newline))
+    (goto-char from-plus-indent))
+
+  (if (not (> to (point)))
+      nil ; There is no paragraph, only whitespace: exit now.
 
     (or justify (setq justify (current-justification)))
 
@@ -300,7 +304,7 @@
 		;; This handles ALL BUT the first line of the paragraph.
 		(if (if (zerop prefixcol)
 			(save-excursion
-			  (skip-chars-backward " " linebeg)
+			  (skip-chars-backward " \t" linebeg)
 			  (bolp))
 		      (>= prefixcol (current-column)))
 		    ;; Ok, skip at least one word.
@@ -314,8 +318,8 @@
 					   (save-excursion (forward-char -1)
 							   (and (looking-at "\\. ")
 								(not (looking-at "\\.  ")))))))
-			(skip-chars-forward " ")
-			(skip-chars-forward "^ \n")
+			(skip-chars-forward " \t")
+			(skip-chars-forward "^ \n\t")
 			(setq first nil)))
 		  ;; Normally, move back over the single space between the words.
 		  (forward-char -1))
@@ -342,12 +346,12 @@
 					   (save-excursion (forward-char -1)
 							   (and (looking-at "\\. ")
 								(not (looking-at "\\.  ")))))))
-			(skip-chars-forward " ")
-			(skip-chars-forward "^ \n")
+			(skip-chars-forward " \t")
+			(skip-chars-forward "^ \t\n")
 			(setq first nil))))
 		;; Replace whitespace here with one newline, then indent to left
 		;; margin.
-		(skip-chars-backward " ")
+		(skip-chars-backward " \t")
 		(insert ?\n)
 		;; Give newline the properties of the space(s) it replaces
 		(set-text-properties (1- (point)) (point)