Конструкции многострочных выделений текста
Обычно элементы 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.
| • Выделение многострочных участков | Разметка многострочных блоков текстовым свойством. | |
| • Область для перевыделения | Управление областью, которая перевыделяется после изменения буфера. |
Copyright © 1990-1996, 1998-2022 Free Software Foundation, Inc.
Licensed under the GNU GPL license.
https://www.gnu.org/software/emacs/manual/html_node/elisp/Multiline-Font-Lock.html