Обычно элементы font-lock-keywords не должны соответствовать
нескольким строкам; это работает ненадежно, потому что блокировка шрифта
обычно сканирует только часть буфера, и она может пропустить многострочную
конструкцию, которая пересекает границу строки, с которой начинается сканирование.
(Сканирование обычно начинается в начале строки.)
Чтобы элементы, соответствующие многострочным конструкциям, работали должным образом, необходимо учесть два аспекта: правильное определение и правильное повторное выделение. Первое означает, что блокировка шрифта находит все многострочные конструкции. Второе означает, что блокировка шрифта правильно повторно выделяет весь соответствующий текст, когда изменяется многострочная конструкция — например, если часть текста, которая ранее была частью многострочной конструкции, перестает ею быть. Эти два аспекта тесно связаны, и часто заставить один из них работать кажется, что заставляет работать и другой. Однако для надежных результатов вы должны явно уделять внимание обоим аспектам.
Существует три способа обеспечения правильного определения многострочных конструкций:
font-lock-extend-region-functions, которая
выполняет определение и расширяет сканирование так, чтобы
сканируемый текст никогда не начинался и не заканчивался в середине
многострочной конструкции.font-lock-fontify-region-function
подобным образом, чтобы расширить сканирование так, чтобы сканируемый
текст никогда не начинался и не заканчивался в середине многострочной
конструкции.font-lock-multiline, что укажет блокировке шрифта не
начинать и не заканчивать сканирование в середине конструкции.Существует несколько способов выполнения повторного выделения многострочных конструкций:
font-lock-multiline на конструкцию.
Это повторно выделит всю конструкцию, если изменится какая-либо ее часть.
В некоторых случаях вы можете сделать это автоматически, установив
переменную font-lock-multiline, см.jit-lock-contextually установлено и
полагаться на то, что оно выполнит свою работу. Это повторно выделит только
часть конструкции, следующую за фактическим изменением, и сделает это
через короткую задержку. Это работает только в том случае, если выделение
различных частей вашей многострочной конструкции никогда не зависит от текста
в последующих строках. Поскольку jit-lock-contextually
активируется по умолчанию, это может быть привлекательным решением.jit-lock-defer-multiline на
конструкцию. Это работает только в том случае, если используется
jit-lock-contextually, и с той же задержкой перед
повторным выделением, но, как и font-lock-multiline,
оно также обрабатывает случай, когда выделение зависит от последующих
строк.syntax-multiline к рассматриваемой конструкции. Наиболее
распространенное использование этого — когда синтаксическое свойство,
применяемое к «FOO», зависит от какого-либо более
позднего текста «BAR»: помещая это текстовое
свойство над всем «FOO...BAR», вы гарантируете, что
любое изменение «BAR» также вызовет пересчет
синтаксического свойства «FOO».
Примечание: Для того чтобы это сработало, режим должен добавить
syntax-propertize-multiline в
syntax-propertize-extend-region-functions.