Previous: Setting Syntax Properties, Up: Font Lock Mode
Normally, elements of font-lock-keywords should not match
across multiple lines; that doesn't work reliably, because Font Lock
usually scans just part of the buffer, and it can miss a multi-line
construct that crosses the line boundary where the scan starts. (The
scan normally starts at the beginning of a line.)
Making elements that match multiline constructs work properly has two aspects: correct identification and correct rehighlighting. The first means that Font Lock finds all multiline constructs. The second means that Font Lock will correctly rehighlight all the relevant text when a multiline construct is changed—for example, if some of the text that was previously part of a multiline construct ceases to be part of it. The two aspects are closely related, and often getting one of them to work will appear to make the other also work. However, for reliable results you must attend explicitly to both aspects.
There are three ways to ensure correct identification of multiline constructs:
font-lock-multiline
property on the construct when it is added to the buffer.
font-lock-fontify-region-function hook to extend the scan
so that the scanned text never starts or ends in the middle of a
multiline construct.
font-lock-extend-region-functions that does
the identification and extends the scan so that the scanned
text never starts or ends in the middle of a multiline construct.
There are three ways to do rehighlighting of multiline constructs:
font-lock-multiline property on the construct. This
will rehighlight the whole construct if any part of it is changed. In
some cases you can do this automatically by setting the
font-lock-multiline variable.
jit-lock-contextually. This will only rehighlight the part
of the construct that follows the actual change, and will do it after
a short delay. This only works if the highlighting of the various
parts of your multiline construct never depends on text in subsequent
lines. Since jit-lock-contextually is activated by default,
this can be an attractive solution.
jit-lock-defer-multiline property on the construct.
This works only if jit-lock-contextually is used, but it can
handle the case where highlighting depends on subsequent lines.
