elisp: Font Lock Multiline
22.6.9.1 Font Lock Multiline
............................
One way to ensure reliable rehighlighting of multiline Font Lock
constructs is to put on them the text property ‘font-lock-multiline’.
It should be present and non-‘nil’ for text that is part of a multiline
construct.
When Font Lock is about to highlight a range of text, it first
extends the boundaries of the range as necessary so that they do not
fall within text marked with the ‘font-lock-multiline’ property. Then
it removes any ‘font-lock-multiline’ properties from the range, and
highlights it. The highlighting specification (mostly
‘font-lock-keywords’) must reinstall this property each time, whenever
it is appropriate.
*Warning:* don’t use the ‘font-lock-multiline’ property on large
ranges of text, because that will make rehighlighting slow.
-- Variable: font-lock-multiline
If the ‘font-lock-multiline’ variable is set to ‘t’, Font Lock will
try to add the ‘font-lock-multiline’ property automatically on
multiline constructs. This is not a universal solution, however,
since it slows down Font Lock somewhat. It can miss some multiline
constructs, or make the property larger or smaller than necessary.
For elements whose MATCHER is a function, the function should
ensure that submatch 0 covers the whole relevant multiline
construct, even if only a small subpart will be highlighted. It is
often just as easy to add the ‘font-lock-multiline’ property by
hand.
The ‘font-lock-multiline’ property is meant to ensure proper
refontification; it does not automatically identify new multiline
constructs. Identifying the requires that Font Lock mode operate on
large enough chunks at a time. This will happen by accident on many
cases, which may give the impression that multiline constructs magically
work. If you set the ‘font-lock-multiline’ variable non-‘nil’, this
impression will be even stronger, since the highlighting of those
constructs which are found will be properly updated from then on. But
that does not work reliably.
To find multiline constructs reliably, you must either manually place
the ‘font-lock-multiline’ property on the text before Font Lock mode
looks at it, or use ‘font-lock-fontify-region-function’.