Function: fill-individual-paragraphs
fill-individual-paragraphs is an interactive and byte-compiled
function defined in fill.el.gz.
Signature
(fill-individual-paragraphs MIN MAX &optional JUSTIFY CITATION-REGEXP)
Documentation
Fill paragraphs of uniform indentation within the region.
This command divides the region into "paragraphs", treating every change in indentation level or prefix as a paragraph boundary, then fills each paragraph using its indentation level as the fill prefix.
There is one special case where a change in indentation does not start a new paragraph. This is for text of this form:
foo> This line with extra indentation starts
foo> a paragraph that continues on more lines.
These lines are filled together.
When calling from a program, pass the range to fill as the first two arguments.
Optional third and fourth arguments JUSTIFY and CITATION-REGEXP: JUSTIFY to justify paragraphs (prefix arg). When filling a mail message, pass a regexp for CITATION-REGEXP which will match the prefix of a line which is a citation marker plus whitespace, but no other kind of prefix. Also, if CITATION-REGEXP is non-nil, don't fill header lines.
Probably introduced at or before Emacs version 19.1.
Key Bindings
Source Code
;; Defined in /usr/src/emacs/lisp/textmodes/fill.el.gz
(defun fill-individual-paragraphs (min max &optional justify citation-regexp)
"Fill paragraphs of uniform indentation within the region.
This command divides the region into \"paragraphs\",
treating every change in indentation level or prefix as a paragraph boundary,
then fills each paragraph using its indentation level as the fill prefix.
There is one special case where a change in indentation does not start
a new paragraph. This is for text of this form:
foo> This line with extra indentation starts
foo> a paragraph that continues on more lines.
These lines are filled together.
When calling from a program, pass the range to fill
as the first two arguments.
Optional third and fourth arguments JUSTIFY and CITATION-REGEXP:
JUSTIFY to justify paragraphs (prefix arg).
When filling a mail message, pass a regexp for CITATION-REGEXP
which will match the prefix of a line which is a citation marker
plus whitespace, but no other kind of prefix.
Also, if CITATION-REGEXP is non-nil, don't fill header lines."
(interactive (progn
(barf-if-buffer-read-only)
(list (region-beginning) (region-end)
(if current-prefix-arg 'full))))
(save-restriction
(save-excursion
(goto-char min)
(beginning-of-line)
(narrow-to-region (point) max)
(if citation-regexp
(while (and (not (eobp))
(or (looking-at "[ \t]*[^ \t\n]+:")
(looking-at "[ \t]*$")))
(if (looking-at "[ \t]*[^ \t\n]+:")
(search-forward "\n\n" nil 'move)
(forward-line 1))))
(narrow-to-region (point) max)
;; Loop over paragraphs.
(while (progn
;; Skip over all paragraph-separating lines
;; so as to not include them in any paragraph.
(while (and (not (eobp))
(progn (move-to-left-margin)
(and (not (eobp))
(looking-at paragraph-separate))))
(forward-line 1))
(skip-chars-forward " \t\n") (not (eobp)))
(move-to-left-margin)
(let ((start (point))
fill-prefix fill-prefix-regexp)
;; Find end of paragraph, and compute the smallest fill-prefix
;; that fits all the lines in this paragraph.
(while (progn
;; Update the fill-prefix on the first line
;; and whenever the prefix good so far is too long.
(if (not (and fill-prefix
(looking-at fill-prefix-regexp)))
(setq fill-prefix
(fill-individual-paragraphs-prefix
citation-regexp)
fill-prefix-regexp (regexp-quote fill-prefix)))
(forward-line 1)
(if (bolp)
;; If forward-line went past a newline,
;; move further to the left margin.
(move-to-left-margin))
;; Now stop the loop if end of paragraph.
(and (not (eobp))
(if fill-individual-varying-indent
;; If this line is a separator line, with or
;; without prefix, end the paragraph.
(and
(not (looking-at paragraph-separate))
(save-excursion
(not (and (looking-at fill-prefix-regexp)
(progn (forward-char
(length fill-prefix))
(looking-at
paragraph-separate))))))
;; If this line has more or less indent
;; than the fill prefix wants, end the paragraph.
(and (looking-at fill-prefix-regexp)
;; If fill prefix is shorter than a new
;; fill prefix computed here, end paragraph.
(let ((this-line-fill-prefix
(fill-individual-paragraphs-prefix
citation-regexp)))
(>= (length fill-prefix)
(length this-line-fill-prefix)))
(save-excursion
(not (progn (forward-char
(length fill-prefix))
(or (looking-at "[ \t]")
(looking-at paragraph-separate)
(looking-at paragraph-start)))))
(not (and (equal fill-prefix "")
citation-regexp
(looking-at citation-regexp))))))))
;; Fill this paragraph, but don't add a newline at the end.
(let ((had-newline (bolp)))
(fill-region-as-paragraph start (point) justify)
(if (and (bolp) (not had-newline))
(delete-char -1))))))))