]> git.eshelyaron.com Git - emacs.git/commitdiff
Do not split line before width of fill-prefix
authorSamuel Freilich <sfreilich@google.com>
Wed, 23 Aug 2017 17:40:45 +0000 (13:40 -0400)
committerNoam Postavsky <npostavs@gmail.com>
Thu, 31 Aug 2017 00:10:36 +0000 (20:10 -0400)
When auto-filling a paragraph, don't split a line before the width of the
fill-prefix, creating a subsequent line that is as long or longer (Bug#20774).
* lisp/simple.el (do-auto-fill): Only consider break-points that are later in
the line than the width of the fill-prefix.  This is a more general solution
than the previous logic, which only skipped over the exact fill-prefix.  The
fill-prefix doesn't necessarily match the prefix of the first line of a
paragraph in adaptive-fill-mode.

lisp/simple.el
test/lisp/simple-tests.el

index 13cfa3487da0b2334860405ddf7b821d688b5305..27990bb6611fed042176134d74903927fd82a7b0 100644 (file)
@@ -7151,18 +7151,18 @@ Returns t if it really did any work."
               (setq fill-prefix prefix))))
 
       (while (and (not give-up) (> (current-column) fc))
-       ;; Determine where to split the line.
-       (let* (after-prefix
-              (fill-point
-               (save-excursion
-                 (beginning-of-line)
-                 (setq after-prefix (point))
-                 (and fill-prefix
-                      (looking-at (regexp-quote fill-prefix))
-                      (setq after-prefix (match-end 0)))
-                 (move-to-column (1+ fc))
-                 (fill-move-to-break-point after-prefix)
-                 (point))))
+        ;; Determine where to split the line.
+        (let ((fill-point
+               (save-excursion
+                 (beginning-of-line)
+                 ;; Don't split earlier in the line than the length of the
+                 ;; fill prefix, since the resulting line would be longer.
+                 (when fill-prefix
+                   (move-to-column (string-width fill-prefix)))
+                 (let ((after-prefix (point)))
+                    (move-to-column (1+ fc))
+                    (fill-move-to-break-point after-prefix)
+                    (point)))))
 
          ;; See whether the place we found is any good.
          (if (save-excursion
@@ -7170,9 +7170,6 @@ Returns t if it really did any work."
                (or (bolp)
                    ;; There is no use breaking at end of line.
                    (save-excursion (skip-chars-forward " ") (eolp))
-                   ;; It is futile to split at the end of the prefix
-                   ;; since we would just insert the prefix again.
-                   (and after-prefix (<= (point) after-prefix))
                    ;; Don't split right after a comment starter
                    ;; since we would just make another comment starter.
                    (and comment-start-skip
index ad7aee1db1773aa0a2e65931f1112b23ca5789d1..729001bdf3ade7a71f451e073efe69e2a3b7fd8e 100644 (file)
@@ -497,5 +497,19 @@ See Bug#21722."
       (should (equal (line-number-at-pos 5) 3))
       (should (equal (line-number-at-pos 7) 4)))))
 
+\f
+;;; Auto fill.
+
+(ert-deftest auto-fill-mode-no-break-before-length-of-fill-prefix ()
+  (with-temp-buffer
+    (setq-local fill-prefix "   ")
+    (set-fill-column 5)
+    ;; Shouldn't break after 'foo' (3 characters) when the next
+    ;; line is indented >= to that, that woudln't result in shorter
+    ;; lines.
+    (insert "foo bar")
+    (do-auto-fill)
+    (should (string-equal (buffer-string) "foo bar"))))
+
 (provide 'simple-test)
 ;;; simple-test.el ends here