1
0
mirror of https://git.savannah.gnu.org/git/emacs.git synced 2025-01-25 19:11:56 +00:00

(do-auto-fill): Better handling of a very long word

after a fill-prefix.  Don't break right after the prefix and
don't break at the end of the line.
This commit is contained in:
Richard M. Stallman 1997-08-14 03:55:49 +00:00
parent bd873746d3
commit db893d0032

View File

@ -2649,60 +2649,65 @@ Setting this variable automatically makes it local to the current buffer.")
(while (and (not give-up) (> (current-column) fc))
;; Determine where to split the line.
(let ((fill-point
(let ((opoint (point))
bounce
(first t)
after-prefix)
(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))
;; Move back to the point where we can break the
;; line at. We break the line between word or
;; after/before the character which has character
;; category `|'. We search space, \c| followed by
;; a character, or \c| follwoing a character. If
;; not found, place the point at beginning of line.
(while (or first
;; If this is after period and a single space,
;; move back once more--we don't want to break
;; the line there and make it look like a
;; sentence end.
(and (not (bobp))
(not bounce)
sentence-end-double-space
(save-excursion (forward-char -1)
(and (looking-at "\\. ")
(not (looking-at "\\. "))))))
(setq first nil)
(re-search-backward "[ \t]\\|\\c|.\\|.\\c|\\|^")
;; If we find nowhere on the line to break it,
;; break after one word. Set bounce to t
;; so we will not keep going in this while loop.
(if (<= (point) after-prefix)
(progn
(re-search-forward "[ \t]" opoint t)
(setq bounce t))
(if (looking-at "[ \t]")
;; Break the line at word boundary.
(skip-chars-backward " \t")
;; Break the line after/before \c|.
(forward-char 1))))
(if (and enable-kinsoku enable-multibyte-characters)
(kinsoku (save-excursion
(forward-line 0) (point))))
;; Let fill-point be set to the place where we end up.
(point)))))
(let* (after-prefix
(fill-point
(let ((opoint (point))
bounce
(first t))
(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))
;; Move back to the point where we can break the
;; line at. We break the line between word or
;; after/before the character which has character
;; category `|'. We search space, \c| followed by
;; a character, or \c| follwoing a character. If
;; not found, place the point at beginning of line.
(while (or first
;; If this is after period and a single space,
;; move back once more--we don't want to break
;; the line there and make it look like a
;; sentence end.
(and (not (bobp))
(not bounce)
sentence-end-double-space
(save-excursion (forward-char -1)
(and (looking-at "\\. ")
(not (looking-at "\\. "))))))
(setq first nil)
(re-search-backward "[ \t]\\|\\c|.\\|.\\c|\\|^")
;; If we find nowhere on the line to break it,
;; break after one word. Set bounce to t
;; so we will not keep going in this while loop.
(if (<= (point) after-prefix)
(progn
(goto-char after-prefix)
(re-search-forward "[ \t]" opoint t)
(setq bounce t))
(if (looking-at "[ \t]")
;; Break the line at word boundary.
(skip-chars-backward " \t")
;; Break the line after/before \c|.
(forward-char 1))))
(if (and enable-kinsoku enable-multibyte-characters)
(kinsoku (save-excursion
(forward-line 0) (point))))
;; Let fill-point be set to the place where we end up.
(point)))))
;; If that place is not the beginning of the line,
;; break the line there.
;; See whether the place we found is any good.
(if (save-excursion
(goto-char fill-point)
(and (not (bolp))
;; There is no use breaking at end of line.
(not (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.
(not (and after-prefix (<= (point) after-prefix)))
;; Don't split right after a comment starter
;; since we would just make another comment starter.
(not (and comment-start-skip
@ -2711,6 +2716,7 @@ Setting this variable automatically makes it local to the current buffer.")
(and (re-search-forward comment-start-skip
limit t)
(eq (point) limit)))))))
;; Ok, we have a useful place to break the line. Do it.
(let ((prev-column (current-column)))
;; If point is at the fill-point, do not `save-excursion'.
;; Otherwise, if a comment prefix or fill-prefix is inserted,
@ -2732,7 +2738,7 @@ Setting this variable automatically makes it local to the current buffer.")
;; trying again will not help.
(if (>= (current-column) prev-column)
(setq give-up t)))
;; No place to break => stop trying.
;; No good place to break => stop trying.
(setq give-up t))))
;; Justify last line.
(justify-current-line justify t t)