Spec-Zone.ru › Elisp

Конструкции многострочных выделений текста

Обычно элементы 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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API