the region.
@findex fill-region-as-paragraph
+@vindex fill-region-as-paragraph-function
@kbd{M-q} and @code{fill-region} use the usual Emacs criteria for
finding paragraph boundaries (@pxref{Paragraphs}). For more control,
-you can use @kbd{M-x fill-region-as-paragraph}, which refills
-everything between point and mark as a single paragraph. This command
-deletes any blank lines within the region, so separate blocks of text
-end up combined into one block.
+you can use @kbd{M-x fill-region-as-paragraph}, which refills everything
+between point and mark as a single paragraph. The behavior of this
+command is controlled by the variable
+@code{fill-region-as-paragraph-function}. By default, it deletes any
+blank lines within the region, so separate blocks of text end up
+combined into one block.
@cindex justification
A numeric argument to @kbd{M-q} tells it to @dfn{justify} the text
@deffn Command fill-region-as-paragraph start end &optional justify nosqueeze squeeze-after
This command considers a region of text as a single paragraph and fills
-it. If the region was made up of many paragraphs, the blank lines
+it. The behavior of this command is controlled by the variable
+@code{fill-region-as-paragraph-function}, with the default
+implementation being @code{fill-region-as-paragraph-default}, which is
+described in detail below.
+
+If the region was made up of many paragraphs, the blank lines
between paragraphs are removed. This function justifies as well as
filling when @var{justify} is non-@code{nil}.
Manual}.
@end defvar
+@defvar fill-region-as-paragraph-function
+This variable provides a way to override how functions like
+@code{fill-region} fill text. Its value should be a function, which
+should accept the arguments defined by @code{fill-region-as-paragraph}
+and return the fill prefix used for filling. The default value of this
+variable is @code{fill-region-as-paragraph-default}.
+@end defvar
+
@defvar use-hard-newlines
If this variable is non-@code{nil}, the filling functions do not delete
newlines that have the @code{hard} text property. These hard
(indent-line-to (current-left-margin))
(put-text-property beg (point) 'face 'default)))
-(defun fill-region-as-paragraph (from to &optional justify
- nosqueeze squeeze-after)
+(defun fill-region-as-paragraph-default (from to &optional justify
+ nosqueeze squeeze-after)
"Fill the region as if it were a single paragraph.
This command removes any paragraph breaks in the region and
extra newlines at the end, and indents and fills lines between the
;; Return the fill-prefix we used
fill-prefix)))
+(defvar fill-region-as-paragraph-function #'fill-region-as-paragraph-default
+ "Function to fill the region as if it were a single paragraph.
+It should accept the arguments defined by `fill-region-as-paragraph' and
+return the `fill-prefix' used for filling.")
+
+(defun fill-region-as-paragraph (from to &optional justify
+ nosqueeze squeeze-after)
+ "Fill the region as if it were a single paragraph.
+The behavior of this command is controlled by the variable
+`fill-region-as-paragraph-function', with the default implementation
+being `fill-region-as-paragraph-default'.
+
+The arguments FROM and TO define the boundaries of the region.
+
+The optional third argument JUSTIFY, when called interactively with a
+prefix arg, is assigned the value `full'.
+When called from Lisp, JUSTIFY can specify any type of justification;
+see `default-justification' for the possible values.
+Optional fourth arg NOSQUEEZE non-nil means not to make spaces between
+words canonical before filling.
+Fifth arg SQUEEZE-AFTER, if non-nil, should be a buffer position; it
+means canonicalize spaces only starting from that position.
+See `canonically-space-region' for the meaning of canonicalization of
+spaces.
+
+It returns the `fill-prefix' used for filling."
+ (interactive (progn
+ (barf-if-buffer-read-only)
+ (list (region-beginning) (region-end)
+ (if current-prefix-arg 'full))))
+ (funcall fill-region-as-paragraph-function
+ from to justify nosqueeze squeeze-after))
+
(defsubst skip-line-prefix (prefix)
"If point is inside the string PREFIX at the beginning of line, move past it."
(when (and prefix
Return the `fill-prefix' used for filling the last paragraph.
If `sentence-end-double-space' is non-nil, then period followed by one
-space does not end a sentence, so don't break a line there."
+space does not end a sentence, so don't break a line there.
+
+The variable `fill-region-as-paragraph-function' can be used to override
+how paragraphs are filled."
(interactive (progn
(barf-if-buffer-read-only)
(list (region-beginning) (region-end)
(with-restriction (line-beginning-position) to
(let ((fill-column (point-max)))
(setq pfx (or (save-excursion
- (fill-region-as-paragraph (point)
- (point-max)
- nil
- nosqueeze
- squeeze-after))
+ (fill-region-as-paragraph-default (point)
+ (point-max)
+ nil
+ nosqueeze
+ squeeze-after))
"")))
(while (not (eobp))
(let ((fill-prefix pfx))
- (fill-region-as-paragraph (point)
- (progn (forward-sentence) (point))
- justify
- nosqueeze
- squeeze-after))
+ (fill-region-as-paragraph-default (point)
+ (progn (forward-sentence) (point))
+ justify
+ nosqueeze
+ squeeze-after))
(when (and (> (point) (line-beginning-position))
(< (point) (line-end-position)))
(delete-horizontal-space)
--- /dev/null
+Point-Char: |
+
+Name: fill region
+
+=-=
+Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor. Incididunt ut labore et dolore magna aliqua.
+
+|Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor. Incididunt ut labore et dolore magna aliqua.
+
+Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor. Incididunt ut labore et dolore magna aliqua.
+
+Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor. Incididunt ut labore et dolore magna aliqua.
+=-=
+Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor. Incididunt ut labore et dolore magna aliqua.
+
+Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+eiusmod tempor. Incididunt ut labore et dolore magna aliqua.
+
+Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+eiusmod tempor. Incididunt ut labore et dolore magna aliqua.
+
+Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor. Incididunt ut labore et dolore magna aliqua.
+=-=-=