changeset 10469:2546bad34200

(do-auto-fill): Fill, don't fill, or fill-and-justify depending on setting of justification text-property. Respect left-margin and right-margin text properties. (open-line, indent-new-comment-line): Inherit when inserting. (newline-and-indent, reindent-then-newline-and-indent): Doc fix.
author Richard M. Stallman <rms@gnu.org>
date Thu, 19 Jan 1995 04:21:56 +0000
parents d0854b6f3216
children 954a7f765673
files lisp/simple.el
diffstat 1 files changed, 34 insertions(+), 14 deletions(-) [+]
line wrap: on
line diff
--- a/lisp/simple.el	Thu Jan 19 04:20:52 1995 +0000
+++ b/lisp/simple.el	Thu Jan 19 04:21:56 1995 +0000
@@ -34,7 +34,7 @@
   (let* ((do-fill-prefix (and fill-prefix (bolp)))
 	 (loc (point)))
     (while (> arg 0)
-      (if do-fill-prefix (insert fill-prefix))
+      (if do-fill-prefix (insert-and-inherit fill-prefix))
       (newline 1)
       (setq arg (1- arg)))
     (goto-char loc))
@@ -170,7 +170,7 @@
 Indentation is done using the value of `indent-line-function'.
 In programming language modes, this is the same as TAB.
 In some text modes, where TAB inserts a tab, this command indents to the
-column specified by the variable `left-margin'."
+column specified by the function `current-left-margin'."
   (interactive "*")
   (delete-region (point) (progn (skip-chars-backward " \t") (point)))
   (newline)
@@ -182,7 +182,7 @@
 which means calling the current value of `indent-line-function'.
 In programming language modes, this is the same as TAB.
 In some text modes, where TAB inserts a tab, this indents to the
-column specified by the variable `left-margin'."
+column specified by the function `current-left-margin'."
   (interactive "*")
   (save-excursion
     (delete-region (point) (progn (skip-chars-backward " \t") (point)))
@@ -2162,18 +2162,31 @@
   "*Regexp to match lines which should not be auto-filled.")
 
 (defun do-auto-fill ()
-  (let (give-up)
-    (or (and auto-fill-inhibit-regexp
-	     (save-excursion (beginning-of-line)
-			     (looking-at auto-fill-inhibit-regexp)))
-	(while (and (not give-up) (> (current-column) fill-column))
+  (let (fc justify bol give-up)
+    (if (or (not (setq justify (justification)))
+	    (and (setq fc (current-fill-column)) ; make sure this gets set
+		 (eq justify 'left)
+		 (<= (current-column) (setq fc (current-fill-column))))
+	    (save-excursion (beginning-of-line) 
+			    (setq bol (point))
+			    (and auto-fill-inhibit-regexp
+				 (looking-at auto-fill-inhibit-regexp))))
+	nil ;; Auto-filling not required
+      ;; Remove justification-introduced whitespace before filling
+      (cond ((eq 'left justify) nil)
+	    ((eq 'full justify) ; full justify: remove extra spaces
+	     (canonically-space-region
+	      (point) (save-excursion (end-of-line) (point))))
+	    ;; right or center justify: remove extra indentation.
+	    (t (save-excursion (indent-according-to-mode))))
+      (while (and (not give-up) (> (current-column) fc))
 	  ;; Determine where to split the line.
 	  (let ((fill-point
 		 (let ((opoint (point))
 		       bounce
 		       (first t))
 		   (save-excursion
-		     (move-to-column (1+ fill-column))
+		     (move-to-column (1+ fc))
 		     ;; Move back to a word boundary.
 		     (while (or first
 				;; If this is after period and a single space,
@@ -2214,18 +2227,25 @@
 		    (save-excursion
 		      (goto-char fill-point)
 		      (indent-new-comment-line t)))
+		  ;; Now do justification, if required
+		  (if (not (eq justify 'left))
+		      (save-excursion 
+			(end-of-line 0)
+			(justify-current-line justify nil t)))
 		  ;; If making the new line didn't reduce the hpos of
 		  ;; the end of the line, then give up now;
 		  ;; trying again will not help.
 		  (if (>= (current-column) prev-column)
 		      (setq give-up t)))
 	      ;; No place to break => stop trying.
-	      (setq give-up t)))))))
+	      (setq give-up t))))
+      ;; justify last line
+      (justify-current-line justify t t)))) 
 
 (defun auto-fill-mode (&optional arg)
   "Toggle auto-fill mode.
 With arg, turn Auto-Fill mode on if and only if arg is positive.
-In Auto-Fill mode, inserting a space at a column beyond `fill-column'
+In Auto-Fill mode, inserting a space at a column beyond `current-fill-column'
 automatically breaks the line at a previous space."
   (interactive "P")
   (prog1 (setq auto-fill-function
@@ -2275,7 +2295,7 @@
     (delete-region (point)
 		   (progn (skip-chars-forward " \t")
 			  (point)))
-    (if soft (insert ?\n) (newline 1))
+    (if soft (insert-and-inherit ?\n) (newline 1))
     (if (not comment-multi-line)
 	(save-excursion
 	  (if (and comment-start-skip
@@ -2314,7 +2334,7 @@
 	       )
 	  (if (not (eolp))
 	      (setq comment-end ""))
-	  (insert ?\n)
+	  (insert-and-inherit ?\n)
 	  (forward-char -1)
 	  (indent-for-comment)
 	  (save-excursion
@@ -2322,7 +2342,7 @@
 	    (end-of-line)
 	    (delete-char 1)))
       (if fill-prefix
-	  (insert fill-prefix)
+	  (insert-and-inherit fill-prefix)
 	(indent-according-to-mode)))))
 
 (defun set-selective-display (arg)