Function: fill-context-prefix
fill-context-prefix is a byte-compiled function defined in fill.el.gz.
Signature
(fill-context-prefix FROM TO &optional FIRST-LINE-REGEXP)
Documentation
Compute a fill prefix from the text between FROM and TO.
This uses the variables adaptive-fill-regexp and adaptive-fill-function
and adaptive-fill-first-line-regexp. paragraph-start also plays a role;
we reject a prefix based on a one-line paragraph if that prefix would
act as a paragraph-separator.
Source Code
;; Defined in /usr/src/emacs/lisp/textmodes/fill.el.gz
(defun fill-context-prefix (from to &optional first-line-regexp)
"Compute a fill prefix from the text between FROM and TO.
This uses the variables `adaptive-fill-regexp' and `adaptive-fill-function'
and `adaptive-fill-first-line-regexp'. `paragraph-start' also plays a role;
we reject a prefix based on a one-line paragraph if that prefix would
act as a paragraph-separator."
(or first-line-regexp
(setq first-line-regexp adaptive-fill-first-line-regexp))
(save-excursion
(goto-char from)
(if (eolp) (forward-line 1))
;; Move to the second line unless there is just one.
(move-to-left-margin)
(let (first-line-prefix
;; Non-nil if we are on the second line.
second-line-prefix)
(setq first-line-prefix
;; We don't need to consider `paragraph-start' here since it
;; will be explicitly checked later on.
;; Also setting first-line-prefix to nil prevents
;; second-line-prefix from being used.
;; ((looking-at paragraph-start) nil)
(fill-match-adaptive-prefix))
(forward-line 1)
(if (< (point) to)
(progn
(move-to-left-margin)
(setq second-line-prefix
(cond ((looking-at paragraph-start) nil) ;Can it happen? -Stef
(t (fill-match-adaptive-prefix))))
;; If we get a fill prefix from the second line,
;; make sure it or something compatible is on the first line too.
(when second-line-prefix
(unless first-line-prefix (setq first-line-prefix ""))
;; If the non-whitespace chars match the first line,
;; just use it (this subsumes the 2 checks used previously).
;; Used when first line is `/* ...' and second-line is
;; ` * ...'.
(let ((tmp second-line-prefix)
(re "\\`"))
(while (string-match "\\`[ \t]*\\([^ \t]+\\)" tmp)
(setq re (concat re ".*" (regexp-quote (match-string 1 tmp))))
(setq tmp (substring tmp (match-end 0))))
;; (assert (string-match "\\`[ \t]*\\'" tmp))
(if (string-match re first-line-prefix)
second-line-prefix
;; Use the longest common substring of both prefixes,
;; if there is one.
(fill-common-string-prefix first-line-prefix
second-line-prefix)))))
;; If we get a fill prefix from a one-line paragraph,
;; maybe change it to whitespace,
;; and check that it isn't a paragraph starter.
(if first-line-prefix
(let ((result
;; If first-line-prefix comes from the first line,
;; see if it seems reasonable to use for all lines.
;; If not, replace it with whitespace.
(if (or (and first-line-regexp
(string-match first-line-regexp
first-line-prefix))
(and comment-start-skip
(string-match comment-start-skip
first-line-prefix)))
first-line-prefix
(make-string (string-width first-line-prefix) ?\s))))
;; But either way, reject it if it indicates the start
;; of a paragraph when text follows it.
(if (not (eq 0 (string-match paragraph-start
(concat result "a"))))
result)))))))