Подсветка синтаксиса

Обзор

Подсветка синтаксиса позволяет редактору автоматически отображать текст с использованием различных стилей и цветов в зависимости от функции строки относительно назначения файла. Например, в исходном коде программы операторы управления могут быть выделены полужирным, а типы данных и комментарии — отличаться цветом от остального текста. Это значительно повышает удобочитаемость текста и, следовательно, помогает его автору работать эффективнее и продуктивнее.

Функция на языке C++, показанная с подсветкой синтаксиса.

Функция на языке C++, показанная с подсветкой синтаксиса.

Та же самая функция на языке C++, показанная без подсветки синтаксиса.

Та же самая функция на языке C++, показанная без подсветки синтаксиса.

Очевидно, что вариант с подсветкой является более удобочитаемым.

KatePart содержит гибкую настраиваемую систему, которая позволяет выполнять подсветку синтаксиса. В стандартный дистрибутив входят определения для широкого диапазона языков программирования, написания сценариев и разметки, а также для других форматов текстовых файлов. Кроме того, поддерживается добавление пользовательских определений в простых файлах XML.

KatePart автоматически определяет корректные правила синтаксиса при открытии файла пользователем, основываясь на типе MIME этого файла (тип определяется по расширению файла, а если таковое отсутствует — по его содержимому). Если в результате автоматического определения выбраны не те правила синтаксиса, возможно указать их вручную с помощью меню: СервисПодсветка.

Стили и цвета, которые используются в определениях подсветки синтаксиса, возможно настроить на вкладке Для отдельных форматов диалога настройки, а типы MIME и расширения файлов, для которых следует использовать эти определения, — на вкладке Типы файлов.

Примечание

Подсветка синтаксиса позволяет повысить удобочитаемость корректного текста, но не позволяет обеспечить саму корректность текста. Синтаксическая разметка текста является непростой задачей, сложность которой зависит от формата текста. В некоторых случаях авторы правил синтаксиса считают успешным результатом корректную обработку 98 процентов текста (обычно проблемные 2 процента остаются в случае выбора редкого стиля).

Система подсветки синтаксиса KatePart

В этом разделе приводится более подробное описание механизма подсветки синтаксиса, который используется в KatePart. Рекомендуется ознакомиться с этой информацией перед изменением или созданием определений синтаксиса.

Принцип работы подсветки синтаксиса

При открытии файла одним из первых действий, которые выполняет редактор KatePart, является определение правил подсветки синтаксиса для этого файла. Во время чтения текста из файла или получения введенных пользователем строк система подсветки синтаксиса анализирует текст на основе правил подсветки синтаксиса и обозначает в показанном тексте позиции начала и завершения различных контекстов и стилей.

Анализ и разметка вводимого пользователем текста выполняются на лету, так что если символ, который система разметила как начало или завершение определённого контекста, будет удалён, стиль соседних с текущим фрагментов текста также изменится в соответствии с изменением контекста.

Определения синтаксиса, используемые системой подсветки синтаксиса KatePart, представляют собой файлы XML, которые содержат

  • Правила определения роли текста, объединённые в контекстные блоки

  • Списки ключевых слов

  • Определения элементов стиля

При анализе текста правила определения контекста применяются в том порядке, в котором они были указаны в файле определений. Если начало текущей строки соответствует определённому правилу, будет использован соответствующий контекст. После этого начальная точка в тексте будет перемещена в завершающую точку применения определённого правила и начнётся новый цикл поиска соответствий правилам в пределах контекста, установленного предыдущим правилом.

Правила

Правила определения — основа системы определения подсветки. Каждое правило представляет собой строку, символ или регулярное выражение, с которым будет сравниваться текст документа. Правилом определяются сведения, которые будут использованы при определении стиля соответствующего фрагмента текста. Правило позволяет переключить текущий контекст системы подсветки либо на явно указанный в правиле, либо на предыдущий использованный в тексте.

Правила объединяются в контекстные группы. Каждая контекстная группа реализует основные элементы в соответствующем формате файлов, например текстовые строки в кавычках или блоки комментариев в исходном коде программы. Благодаря такой структуре системы подсветки не требуется осуществлять перебор всего набора правил, когда в этом нет необходимости, а также имеется возможность различной трактовки некоторых последовательностей символов в тексте (в зависимости от текущего контекста).

Контексты могут генерироваться динамически, что позволяет использовать в правилах данные, связанные с экземпляром.

Контекстные стили и ключевые слова

В некоторых языках программирования целые числа обрабатываются компилятором (программой, которая преобразует исходный коды в исполняемый файл) способом, отличным от способа обработки чисел с плавающей точкой, а также в строках, взятых в кавычки, могут присутствовать символы со специальным назначением. В таких случаях целесообразно выделить подобные символы, чтобы их было проще обнаружить при чтении кода. Даже если эти символы не имеют отдельного контекста, система подсветки текста будет рассматривать их так, будто подобный контекст для них существует, что позволяет выделить их.

Определение синтаксиса может содержать произвольное количество стилей, достаточное для определения всех элементов формата текста, для которого это определение было создано.

Во многих форматах существуют списки слов, которые соответствуют определённому элементу. Например, в языках программирования операторы управления составляют один элемент, названия типов данных — другой, встроенные функции языка — третий. Система подсветки синтаксиса KatePart поддерживает использование таких списков для выявления и обозначения слов в тексте с целью смыслового подчёркивания назначения элементов в текстовых форматах.

Стили по умолчанию

Если открыть в KatePart файл исходного кода на языке C++, Java™ или документ HTML, для синтаксической разметки будут использоваться одни и те же цвета (несмотря на то, что разные форматы файлов обуславливают выбор разных слов для обозначения элементов текста). Это происходит, потому что в KatePart используется предустановленный список стилей по умолчанию, которые применяются отдельными определениями синтаксиса.

Это облегчает распознавание схожих элементов в различных текстовых форматах. Например, комментарии предусмотрены почти во всех языках программирования, написания сценариев или разметки. Следовательно, если они будут отображаться в одном стиле во всех форматах языков, не потребуется тратить время на их поиск в тексте документа.

Подсказка

При создании всех стилей определения синтаксиса используют один из стилей по умолчанию. В некоторой части определений синтаксиса используются дополнительные стили, которых нет среди стилей по умолчанию, поэтому в случае частой работы с файлами в таких форматах целесообразно открыть диалоговое окно настройки и посмотреть, не используются для определённых элементов одинаковые стили. Например, существует только один стиль по умолчанию для строк, но, поскольку в языке программирования Perl существует два типа строк, возможно настроить подсветку для каждого из этих типов немного по-разному. Обзор всех доступных стилей по умолчанию приводится далее.

Формат XML определения подсветки

Обзор

В KatePart используется библиотека подсветки синтаксических конструкций из KDE Frameworks™. По умолчанию в неё включены средства подсветки кода XML.

Этот раздел посвящён обзору формата XML определения подсветки. С помощью небольшого примера в разделе описаны основные компоненты, их назначение и использование. В следующем разделе подробно рассматриваются правила определения способа подсветки.

Формальное определение (XSD) доступно в репозитории подсветки синтаксиса, в файле language.xsd

Пользовательские файлы .xml подсветки синтаксиса расположены в каталоге org.kde.syntax-highlighting/syntax/ в папке пользователя (расположение возможно определить с помощью команды qtpaths --paths GenericDataLocation, обычно это $HOME/.local/share/ и /usr/share/).

В случае пакетов Flatpak и Snap расположение данных различается в зависимости от конкретного приложения. В приложении Flatpak расположением пользовательских файлов XML обычно является $HOME/.var/app/название-пакета-flatpak/data/org.kde.syntax-highlighting/syntax/, а в приложении Snap — $HOME/snap/название-пакета-snap/current/.local/share/org.kde.syntax-highlighting/syntax/.

В Windows® эти файлы хранятся в %USERPROFILE%\AppData\Local\org.kde.syntax-highlighting\syntax. %USERPROFILE% обычно имеет значение C:\Users\пользователь.

В целом, для большинства конфигураций каталогом пользовательских файлов XML будет:

Для локального пользователя$HOME/.local/share/org.kde.syntax-highlighting/syntax/
Для всех пользователей/usr/share/org.kde.syntax-highlighting/syntax/
Для пакетов Flatpak$HOME/.var/app/название-пакета-flatpak/data/org.kde.syntax-highlighting/syntax/
Для пакетов Snap$HOME/snap/название-пакета-snap/current/.local/share/org.kde.syntax-highlighting/syntax/
В Windows®%USERPROFILE%\AppData\Local\org.kde.syntax-highlighting\syntax

Если для одного языка имеется несколько файлов, будет загружен файл с наибольшим значением атрибута version в элементе language.

Основные разделы файлов определения синтаксиса KatePart

Файл подсветки содержит заголовок, в котором задаётся версия XML:
<?xml version="1.0" encoding="UTF-8"?>
Корневым элементом файла определения является элемент language. Доступные атрибуты:

Обязательные атрибуты:

name задаёт название языка, которое затем будет отображаться в меню и диалоговых окнах.

section определяет категорию.

extensions определяет суффиксы названий файлов, например "*.cpp;*.h".

version задаёт текущую версию файла определения в формате целого числа. Не забывайте увеличивать номер версии при каждом внесении изменений в файл.

kateversion задаёт последнюю поддерживаемую версию KatePart.

Необязательные атрибуты:

mimetype выполняет привязку файлов на основе типа MIME.

casesensitive определяет, чувствительны ли ключевые слова к регистру.

priority требуется, если в другом файле определения подсветки используются те же суффиксы файлов. Для подсветки будут использованы правила с более высоким приоритетом.

author содержит имя автора и его адрес электронной почты.

license содержит название лицензии нового файла подсветки синтаксиса, обычно это MIT.

style содержит данные о языке программирования и используется средствами расстановки отступов для атрибута required-syntax-style.

indenter определяет используемое по умолчанию средство расстановки отступов. Доступные варианты: ada, normal, cstyle, cmake, haskell, latex, lilypond, lisp, lua, pascal, python, replicode, ruby и xml.

hidden определяет, следует ли отображать название подсветки в меню KatePart.

Поэтому следующая строка может выглядеть так:

<language name="C++" version="1" kateversion="2.4" section="Sources" extensions="*.cpp;*.h" />
Следующим элементом является highlighting. В этом элементе содержится необязательный элемент list и обязательные элементы contexts и itemDatas.

Элементы list содержат список ключевых слов. В этом случае ключевыми словами являются class и const. Возможно добавить неограниченное количество списков.

Начиная с KDE Frameworks™ 5.53, в список возможно включать ключевые слова из другого списка, языка или файла с помощью элемента include. Для разделения названия списка и названия определения языка следует использовать символы ## таким же образом, что и в правиле IncludeRules. Это позволяет предотвратить дублирование списков ключевых слов, когда требуется включить ключевые слова из другого языка или файла. Например, список othername содержит ключевое слово str и все ключевые слова из списка types, который относится к языку программирования ISO C++.

В элементе contexts содержатся все контексты. По умолчанию первым контекстом является начало диапазона подсветки. В контексте Normal Text существуют два правила: одно сопоставляет список ключевых слов с названием somename, другое определяет кавычки и переключает контекст на контекст string. Дополнительные сведения о правилах приводятся в следующей главе.

Третья часть состоит из элемента itemDatas. В этом элементе содержатся все цвета и гарнитуры шрифтов, необходимые для контекстов и правил. В примере использовано itemData Normal Text, String и Keyword.

<highlighting>
    <list name="somename">
      <item>class</item>
      <item>const</item>
    </list>
    <list name="othername">
      <item>str</item>
      <include>types##ISO C++</include>
    </list>
    <contexts>
      <context attribute="Normal Text" lineEndContext="#pop" name="Normal Text" >
        <keyword attribute="Keyword" context="#stay" String="somename" />
        <keyword attribute="Keyword" context="#stay" String="othername" />
        <DetectChar attribute="String" context="string" char="&quot;" />
      </context>
      <context attribute="String" lineEndContext="#stay" name="string" >
        <DetectChar attribute="String" context="#pop" char="&quot;" />
      </context>
    </contexts>
    <itemDatas>
      <itemData name="Normal Text" defStyleNum="dsNormal" />
      <itemData name="Keyword" defStyleNum="dsKeyword" />
      <itemData name="String" defStyleNum="dsString" />
    </itemDatas>
  </highlighting>
Последней частью определения подсветки является необязательный раздел general. В нём могут содержаться сведения о ключевых словах, сворачивании блоков кода, комментариях, отступах, пустых строках и проверке правописания.

В разделе comment определяется последовательность символов, с помощью которой возможно добавить однострочный комментарий. Также возможно определить многострочный комментарий с помощью элемента multiLine с дополнительным атрибутом end. Эти определения будут использованы при выполнении пользователем действий закомментировать/раскомментировать.

В разделе keywords определяется, следует ли учитывать регистр символов в списках ключевых слов или нет. Описание других атрибутов приводится далее.

В других разделах, folding, emptyLines и spellchecking, как правило, необходимости нет. Сведения об этих разделах приводятся далее.

<general>
    <comments>
      <comment name="singleLine" start="#"/>
      <comment name="multiLine" start="###" end="###" region="CommentFolding"/>
    </comments>
    <keywords casesensitive="1"/>
    <folding indentationsensitive="0"/>
    <emptyLines>
      <emptyLine regexpr="\s+"/>
      <emptyLine regexpr="\s*#.*"/>
    </emptyLines>
    <spellchecking>
      <encoding char="á" string="\'a"/>
      <encoding char="à" string="\`a"/>
    </spellchecking>
  </general>
</language>

Подробные сведения о разделах

В этом разделе приводится описание всех доступных атрибутов для контекстов, itemDatas, ключевых слов, комментариев, сворачивания кода и отступов.

Элемент context относится к группе contexts. Этот элемент определяет связанные с контекстом правила (например, что должно произойти, если система подсветки достигнет конца строки). Доступные атрибуты:

name — название контекста. С помощью этого названия правила будут определять контекст, на который следует переключиться в случае выявления соответствия правила.

lineEndContext определяет контекст, на который переключается система подсветки при достижении конца строки. Значением этого атрибута может быть либо название другого контекста, либо #stay для запрета смены контекста (ничего не делать), либо #pop для выхода из контекста. Возможно, например, указать #pop#pop#pop, чтобы система поднялась на три контекста выше, или даже #pop#pop!OtherContext, чтобы система поднялась на два контекста выше и переключилась на контекст с названием OtherContext. Также возможно переключиться на контекст, который принадлежит другому определению языка, так же, как в правилах IncludeRules (например, SomeContext##JavaScript). Обратите внимание, что это переключение контекста невозможно использовать совместно с #pop: например, #pop!SomeContext##JavaScript является некорректным. Переключения контекста также описаны в «Правила определения способа подсветки».

lineEmptyContext определяет контекст, который используется при обнаружении пустой строки. Номенклатура переключений контекста та же, что и описанная ранее для lineEndContext. Значение по умолчанию: #stay.

fallthroughContext указывает следующий контекст для переключения, если ни одно из правил не было признано соответствующим. Номенклатура переключений контекста та же, что и описанная ранее для lineEndContext. Значение по умолчанию: #stay.

fallthrough определяет, будет ли система подсветки переключаться на контекст, определённый в fallthroughContext, если ни одно из правил не было признано соответствующим. Обратите внимание, что с версии KDE Frameworks™ 5.62 этот атрибут является устаревшим. Вместо него следуетиспользовать fallthroughContext: если указан атрибут fallthroughContext, неявным образомпредполагается значение fallthrough равное true. Значение по умолчанию: false.

noIndentationBasedFolding отключает сворачивание на основе отступов в контексте. Если сворачивание на основе отступов неактивно, этот атрибут не имеет смысла. Этот атрибут указывается в элементе folding группы general. Значение по умолчанию: false.

Элемент itemData находится в группе itemDatas. Она определяет гарнитуры шрифтов и цвета. Возможно указывать пользовательские гарнитуры и цвета. Рекомендуется использовать стили по умолчанию, чтобы пользователь всегда видел одинаковые цвета в файлах различных форматов. Но всё же иногда другого способа нет, и придётся изменить атрибуты цветов и шрифтов. Обязательные атрибуты — name и defStyleNum, прочие являются необязательными. Доступные атрибуты:

name задаёт название itemData. Оно будет использоваться в контекстах и правилах для ссылки на itemData в атрибуте attribute.

defStyleNum определяет стиль по умолчанию, который следует использовать. Подробный перечень доступных стилей по умолчанию приводится далее.

color определяет цвет. Возможные форматы: '#rrggbb' или '#rgb'.

selColor определяет цвет выделенного текста.

italic, если значение true, текст будет выделен курсивом.

bold, если значение true, текст будет выделен полужирным.

underline, если значение true, текст будет подчёркнут.

strikeout, если значение true, текст будет перечёркнут.

spellChecking, если значение true, будет проверено правописание текста.

Элемент keywords в группе general определяет свойства ключевых слов. Доступные атрибуты:

casesensitive может иметь значение true или false. Если значение true, все ключевые слова сопоставляются с учётом регистра.

weakDeliminator — список символов, которые не являются символами разделения слов. Например, точка '.' является символом разделения слов. Допустим, что ключевое слово в list содержит точку: это слово будет задействовано, только если точка будет указана среди значений этого аргумента.

additionalDeliminator определяет дополнительные символы разметки.

wordWrapDeliminator определяет символы, после которых возможен перенос строки.

Стандартные символы разметки и разделения слов: .():!+,-<=>%&*/;?[]^{|}~\, пробел (' ') и символ табуляции ('\t').

Элемент comment в группе comments определяет свойства комментариев, которые будут использованы для действий в пунктах меню СервисЗакомментировать, СервисРаскомментировать и СервисЗакомментировать или раскомментировать. Доступные атрибуты:

name может иметь иметь значение singleLine или multiLine. Если выбрано значение multiLine, необходимо также указать атрибуты end и region. Если выбрано значение singleLine, возможно добавить необязательный атрибут position.

start определяет строку, которая используется для обозначения начала комментария. В C++ этой строкой для многострочных комментариев является "/*". Этот атрибут является обязательным для типов multiLine и singleLine.

end определяет строку, которой завершается комментарий. В C++ этой строкой будет "*/". Этот атрибут доступен только для комментариев типа multiLine и является обязательным для них.

Атрибут region должен иметь значение названия пригодного для сворачивания многострочного комментария. Например, если в правилах указано beginRegion="Comment" ... endRegion="Comment", следует использовать значение region="Comment". Это позволяет применять действие раскомментирования, даже если был выделен не весь текст многострочного комментария. Нужно только, чтобы курсор находился внутри этого многострочного комментария. Этот атрибут доступен только для типа multiLine.

position определяет место вставки однострочного комментария. По умолчанию однострочный комментарий будет вставлен в начале строки в нулевой позиции. Но если использовать запись position="afterwhitespace", комментарий будет вставлен справа после первого пробельного блока, перед первым непробельным символом. Эта возможность полезна для языков, где важны отступы в строках, таких как Python и YAML. Этот атрибут является необязательным, его единственное возможное значение — это afterwhitespace. Он доступен только для типа singleLine.

Элемент folding в группе general определяет свойства сворачивания кода. Доступны атрибуты:

indentationsensitive, если значение true, отметки сворачивания кода будут добавлены на основе отступов, как в языке сценариев Python. Обычно не требуется указывать этот атрибут, так как его значением по умолчанию является false.

Элемент emptyLine в группе emptyLines определяет, какие из строк следует считать пустыми. Это позволяет изменить поведение атрибута lineEmptyContext в элементах context. Доступные атрибуты:

regexpr определяет регулярное выражение, соответствие которому будет считаться пустой строкой. По умолчанию пустые строки не содержат никаких символов, поэтому это регулярное выражение добавляет «пустые» строки, например, если следует считать строки из пробелов пустыми. Впрочем, для большинства определений синтаксиса в этом атрибуте нет необходимости.

Элемент encoding в группе spellchecking определяет кодировку символов, которая используется для проверки орфографии. Доступные атрибуты:

char — кодированный символ.

string — последовательность символов, которая будет закодирована как символ char при проверке правописания. Например, если выполняется обработка кода на языке LaTeX, строка \"{A} соответствует символу Ä.

Доступные стили по умолчанию

Как следует из ранее приведённого краткого описания: стили по умолчанию — это предустановленные стили шрифтов и цветов.

Общие стили по умолчанию:

dsNormal, если не требуется особая подсветка.

dsKeyword, встроенные ключевые слова языка.

dsFunction, вызовы и определения функций.

dsVariable, если применимо: названия переменных (например, $someVar в PHP/Perl).

dsControlFlow, ключевые слова управления обработкой, включая if, else, switch, break, return, yield, ...

dsOperator, операторы, например + - * / :: < >

dsBuiltIn, встроенные функции, классы и объекты.

dsExtension, общие расширения, например классы Qt™ и функции и макросы в C++ и Python.

dsPreprocessor, инструкции препроцессора или определения макросов.

dsAttribute, аннотации, например @override и __declspec(...).

Стили по умолчанию, связанные со строками:

dsChar, отдельные символы, например 'x'.

dsSpecialChar, символы со специальным назначением в строках, например символы экранирования, подстановки или операторы регулярных выражений.

dsString, строки, например "hello world".

dsVerbatimString, буквальные или необработанные строки, например 'raw \backlash' в Perl, CoffeeScript и командных оболочках, а также r'\raw' в Python.

dsSpecialString, SQL, регулярные выражения, документация HERE, математический режим LATEX, ...

dsImport, импорт, включение или потребность в модулях.

Стили по умолчанию, связанные с числами:

dsDataType, встроенные типы данных, например int, void, u64.

dsDecVal, десятичные значения.

dsBaseN, значения с основой, отличной от 10.

dsFloat, значения с плавающей точкой.

dsConstant, встроенные и заданные пользователем константы, например PI.

Стили по умолчанию, связанные с комментариями и документацией:

dsComment, комментарии.

dsDocumentation, /** Комментарии в документах */ или """docstrings""".

dsAnnotation, команды документации, например @param, @brief.

dsCommentVar, названия переменных, используемых в приведённых выше командах, например "foobar" в @param foobar.

dsRegionMarker, отметки области, например //BEGIN, //END в комментариях.

Прочие стили по умолчанию:

dsInformation, примечания и подсказки, например @note в doxygen.

dsWarning, предупреждения, например @warning в doxygen.

dsAlert, специальные слова, например TODO, FIXME, XXXX.

dsError, подсветка ошибок и синтаксических неточностей.

dsOthers, если не подходит иное.

Правила определения способа подсветки

В этом разделе приводится описание правил определения синтаксиса.

Каждое из правил может соответствовать нулевому или большему количеству символов в начале строки, которая проверяется на соответствие. Если такое соответствие будет найдено, найденным символам будет назначен стиль или attribute, указанный с помощью правила, также правило позволяет направить системе запрос на изменение текущего контекста.

Правило выглядит следующим образом:

<RuleName attribute="(идентификатор)" context="(идентификатор)" [специфичные для правила атрибуты] />

Значение attribute определяет название стиля, который будет использован для соответствующих символов, а значение context — контекст, который следует использовать, начиная с этого места.

context возможно определить с помощью:

  • идентификатора, который является названием другого контекста.

  • Значения порядка, которое сообщает движку, что следует остаться в текущем контексте (#stay) или вернуться к предыдущему контексту, использованному в строке (#pop).

    Чтобы вернуться на несколько уровней контекста назад, ключевое слово #pop возможно повторить несколько раз: #pop#pop#pop

  • Значения порядка, за которым следуют восклицательный знак (!) и значение идентификатора, что заставит движок сначала использовать порядок, а затем переключиться на другой контекст, например #pop#pop!OtherContext.

  • Идентификатор, который является названием контекста, за которым следуют два символа решётки (##) и другой идентификатор, который является названием определения языка. Такое именование похоже на используемое в правилах IncludeRules и позволяет переключаться на контекст, принадлежащий другому определению подсветки синтаксиса (например, SomeContext##JavaScript). Обратите внимание, что это переключение контекста невозможно использовать совместно с #pop (например, запись #pop!SomeContext##JavaScript является некорректной).

Специфичные для правила атрибуты могут быть разными, их описание приводится в следующих разделах.

Общие атрибуты

Следующие атрибуты являются общими для всех правил, их возможно указывать везде, где в списке имеется надпись (общие атрибуты). Атрибуты attribute и context являются обязательными, все остальные атрибуты являются необязательными.

  • attribute: атрибут, указывающий на заданный itemData.

  • context: определяет контекст, на который следует переключить систему подсветки в случае выявления соответствия правила.

  • beginRegion: начать блок сворачивания кода. Значение по умолчанию: unset.

  • endRegion: закрыть блок сворачивания кода. Значение по умолчанию: unset.

  • lookAhead: если значение true, система подсветки не обрабатывает длину соответствия. Значение по умолчанию: false.

  • firstNonSpace: соответствие устанавливается, только если строка является первой отличной от пробелов последовательностью символов в строке текста. Значение по умолчанию: false.

  • column: соответствие устанавливается, если будет совпадать строка. Значение по умолчанию: unset.

Динамические правила

Некоторые из правил позволяют устанавливать необязательный атрибут dynamic. Это атрибут логического типа, его значение по умолчанию: false. Если атрибут dynamic имеет значение true, в правиле возможно использовать заполнители, которые обозначают текст, найденный с помощью правила регулярного выражения. Текст будет переключён в текущий контекст в его атрибутах string или char. В атрибуте string заполнитель %N (где N — это число) будет заменён соответствующим захваченным элементом N из вызывающего регулярного выражения, начиная с 1. В атрибуте char заполнитель должен быть числом N, он будет заменён на первый символ соответствующего захваченного элемента N из вызывающего регулярного выражения. Все правила, разрешающие использование этого атрибута, обозначены надписью (dynamic).

  • dynamic: может иметь значение (true|false).

Как это работает:

В регулярных выражениях правил RegExpr средство обработки захватывает и запоминает весь текст в простых круглых скобках (ШАБЛОН). Захваченные фрагменты текста можно использовать в контексте, на который переключается средство, в правилах с атрибутом dynamic true для замены %NString) или Nchar).

Необходимо помнить, что фрагмент текста, захваченный в правиле RegExpr, сохраняется только в переключённом контексте, который указан с помощью атрибута context элемента.

Подсказка

  • Если захваченные фрагменты текста не будет использоваться ни динамическими правилами, ни в том же регулярном выражении, следует использовать группы без захвата: (?:ШАБЛОН)

    Захват групп с поиском вперёд или поиском назад, например (?=ШАБЛОН), (?!ШАБЛОН) или (?<=ШАБЛОН), не выполняется. Дополнительные сведения доступны в разделе Регулярные выражения.

  • Группы с захватом возможно использовать внутри того же регулярного выражения, если указать \N вместо %N. Дополнительные сведения: Захват совпавшего текста (обратные ссылки) в разделе Регулярные выражения.

Пример 1:

В этом простом примере обработчик захватывает текст, соответствующий регулярному выражению =*, и вставляет его вместо %1 в динамическом правиле. Это позволяет определить комментарий, который завершается тем же количеством символов =, что и начинается. Соответствующим текстом будет: [[ комментарий ]], [=[ комментарий ]=] или [=====[ комментарий ]=====].

Кроме того, захваченные данные доступны только в переключённом контексте Multi-line Comment.

<context name="Normal" attribute="Normal Text" lineEndContext="#stay">
  <RegExpr context="Multi-line Comment" attribute="Comment" String="\[(=*)\[" beginRegion="RegionComment"/>
</context>
<context name="Multi-line Comment" attribute="Comment" lineEndContext="#stay">
  <StringDetect context="#pop" attribute="Comment" String="]%1]" dynamic="true" endRegion="RegionComment"/>
</context>

Пример 2:

В динамическом правиле %1 соответствует захваченному фрагменту текста, который соответствует шаблону #+, а %2 — шаблону &quot;+. Следовательно, соответствующий фрагмент текста будет таким: #метка""""в контексте""""#.

Захваченными данным нельзя будет воспользоваться в других контекстах, таких как OtherContext, FindEscapes или SomeContext.

<context name="SomeContext" attribute="Normal Text" lineEndContext="#stay">
  <RegExpr context="#pop!NamedString" attribute="String" String="(#+)(?:[\w-]|[^[:ascii:]])(&quot;+)"/>
</context>
<context name="NamedString" attribute="String" lineEndContext="#stay">
  <RegExpr context="#pop!OtherContext" attribute="String" String="%2(?:%1)?" dynamic="true"/>
  <DetectChar context="FindEscapes" attribute="Escape" char="\"/>
</context>

Пример 3:

Эта запись соответствует такому тексту: Class::function<T>( ... ).

<context name="Normal" attribute="Normal Text" lineEndContext="#stay">
  <RegExpr context="FunctionName" lookAhead="true"
              String="\b([a-zA-Z_][\w-]*)(::)([a-zA-Z_][\w-]*)(?:&lt;[\w\-\s]*&gt;)?(\()"/>
</context>
<context name="FunctionName" attribute="Normal Text" lineEndContext="#pop">
  <StringDetect context="#stay" attribute="Class" String="%1" dynamic="true"/>
  <StringDetect context="#stay" attribute="Operator" String="%2" dynamic="true"/>
  <StringDetect context="#stay" attribute="Function" String="%3" dynamic="true"/>
  <DetectChar context="#pop" attribute="Normal Text" char="4" dynamic="true"/>
</context>

Локальные разделители

В некоторых правилах можно воспользоваться дополнительными атрибутами weakDeliminator и additionalDeliminator, которые сочетаются с атрибутами с тем же названием тегаkeywords. Например, если '%' является слабым разделителем keywords, он может статьразделителем слов только для определённого правила, если его добавить в атрибут additionalDeliminator этого правила. Если правило разрешает эти атрибуты, оно содержит запись (локальные разделители).

  • weakDeliminator: список символов, не являющихся разделителями слов.

  • additionalDeliminator: определяет дополнительные символы разметки.

Подробные сведения о правилах

DetectChar

Проверка на соответствие одному определённому символу. Обычно используется для поиска конца строк, взятых в кавычки.

<DetectChar char="(символ)" (общие атрибуты) (dynamic) />

Атрибут char определяет символ, с которым будет происходить сравнение.

Detect2Chars

Проверка на соответствие двум определённым символам в заданном порядке.

<Detect2Chars char="(символ)" char1="(символ)" (общие атрибуты) />

Атрибут char определяет первый символ, с которым будет происходить сравнение, char1 — второй.

AnyChar

Проверка на соответствие одному символу из набора указанных символов.

<AnyChar String="(строка)" (общие атрибуты) />

Атрибут String определяет набор символов.

StringDetect

Проверка на соответствие указанной строке.

<StringDetect String="(строка)" [insensitive="true|false"] (общие атрибуты) (dynamic) />

Атрибут String определяет строку, с которой будет происходить сравнение. Атрибут insensitive по умолчанию имеет значение false, этот атрибут передаётся функции сравнения строк. Если он имеет значение true, сравнение выполняется без учёта регистра.

WordDetect

Проверка на соответствие указанной строке, но с дополнительным требованием относительно границ слов, в частности, точки '.' или пробела в начале и конце слова. Обработка \b<string>\b выполняется подобно обработке регулярного выражения, но быстрее, чем обработка правила RegExpr.

<WordDetect String="(строка)" [insensitive="true|false"] (общие атрибуты) (локальные разделители) />

Атрибут String определяет строку, с которой будет происходить сравнение. Атрибут insensitive по умолчанию имеет значение false, этот атрибут передаётся функции сравнения строк. Если он имеет значение true, сравнение выполняется без учёта регистра.

Начиная с Kate 3.5 (KDE 4.5)

RegExpr

Проверка на совпадение с регулярным выражением.

<RegExpr String="(строка)" [insensitive="true|false"] [minimal="true|false"] (общие атрибуты) (dynamic) />

Атрибут String определяет регулярное выражение.

insensitive по умолчанию имеет значение false, этот атрибут передаётся движку поиска по регулярным выражениям.

minimal по умолчанию имеет значение false, этот атрибут передаётся движку поиска по регулярным выражениям.

Поскольку поиск соответствий для применения правила всегда происходит в начале текущей строки, регулярное выражение, начинающееся с символа каретки (^), указывает на то, что поиск соответствия правилу следует выполнять только в начале строки.

Подробные сведения доступны в разделе Регулярные выражения.

keyword

Проверка на соответствие ключевому слову из указанного списка.

<keyword String="(название списка)" (общие атрибуты) (локальные разделители) />

Атрибут String определяет название списка ключевых слов. Список с указанным названием уже должен существовать.

Система подсветки обрабатывает правила ключевых слов оптимизированным способом. Поэтому совершенно необходимо, чтобы все ключевые слова, которые следует найти, были ограничены заданными разделителями, заранее предусмотренными (разделителями по умолчанию) или явно указанными в свойстве additionalDeliminator тега keywords.

Если ключевое слово, которое следует найти, должно содержать символ разделителя, соответствующий символ следует добавить в свойство weakDeliminator тега keywords. После этого символ утратит своё свойство разделителя во всех правилах keyword. Также можно воспользоваться атрибутом weakDeliminator тега keyword, чтобы конкретное изменение применялось только к конкретному правилу.

Int

Проверка на соответствие целому числу (регулярное выражение: \b[0-9]+).

<Int (общие атрибуты) (локальные разделители) />

У этого правила нет специфичных атрибутов.

Float

Проверка на соответствие числу с плавающей точкой (регулярное выражение: (\b[0-9]+\.[0-9]*|\.[0-9]+)([eE][-+]?[0-9]+)?).

<Float (общие атрибуты) (локальные разделители) />

У этого правила нет специфичных атрибутов.

HlCOct

Проверка на соответствие восьмеричному преставлению числа (регулярное выражение: \b0[0-7]+).

<HlCOct (общие атрибуты) (локальные разделители) />

У этого правила нет специфичных атрибутов.

HlCHex

Проверка на соответствие шестнадцатеричному представлению числа (регулярное выражение: \b0[xX][0-9a-fA-F]+).

<HlCHex (общие атрибуты) (локальные разделители) />

У этого правила нет специфичных атрибутов.

HlCStringChar

Проверка на соответствие символу управляющей последовательности.

<HlCStringChar (общие атрибуты) />

У этого правила нет специфичных атрибутов.

Проверка на соответствие символам, которые часто используются в коде программ, например \n (переход на новую строку) или \t (табуляция).

Поиск будет выполняться по перечисленным далее символам, если эти символы расположены сразу после обратной косой черты (\): abefnrtv"'?\. Кроме того, соответствующими считаются экранированные шестнадцатеричные числа, например \xff, и экранированные восьмеричные числа, например \033.

HlCChar

Проверка на соответствие символу C.

<HlCChar (общие атрибуты) />

У этого правила нет специфичных атрибутов.

Проверка на соответствие символам C, заключённым в одинарные кавычки (пример: 'c'). Кавычки могут содержать обычный или экранированный символ. Сведения о поиске экранированных последовательностей символов доступны в пункте, посвящённом HlCStringChar.

RangeDetect

Проверка на соответствие строке с заданными символами начала и конца.

<RangeDetect char="(символ)"  char1="(символ)" (общие атрибуты) />

char определяет символ начала диапазона, char1 — символ конца диапазона.

Полезно для поиска, например, небольших строк в кавычках и тому подобного, но следует учитывать, что, поскольку движок подсветки обрабатывает за раз только одну строку, таким образом невозможно найти строки в кавычках, которые продолжаются после разрыва строки.

LineContinue

Проверка на соответствие указанному символу в конце строки.

<LineContinue (общие атрибуты) [char="\"] />

Необязательный для установления соответствия атрибут char, значением по умолчанию является символ обратной косой черты ('\'). Введён с KDE 4.13.

Это правило позволяет переключить контекст в конце строки. Такая возможность требуется, например, в коде на языке C/C++ для продолжения макросов или строк.

IncludeRules

Включение правил из другого контекста, языка или файла.

<IncludeRules context="ссылка на контекст" [includeAttrib="true|false"] />

Атрибут context определяет контекст, который следует включить.

Если значением является простая строка, в текущий контекст будут включены все заданные правила, например:

<IncludeRules context="anotherContext" />

Если строка содержит последовательность символов ##, система подсветки выполнит поиск контекста в другом определении языка с указанным названием. Например,

<IncludeRules context="String##C++" />

позволяет включить контекст String из определения правил подсветки C++.

Если атрибут includeAttrib имеет значение true, атрибут назначения будет изменён на атрибут источника. Это необходимо, например, для выполнения комментирования в том случае, если подсветка соответствующего включённому контексту текста отличается от подсветки из основного контекста.

DetectSpaces

Поиск пробелов.

<DetectSpaces (общие атрибуты) />

У этого правила нет специфичных атрибутов.

Этим правилом следует воспользоваться, если известно, что перед текстом строки может быть несколько пробелов, например, в начале строк с отступом. С помощью этого правила возможно пропустить сразу все пробелы, а не проводить последовательную проверку на основе нескольких правил, каждое из которых будет предоставлять возможность отвергать по одному пробелу за раз из-за несоответствия.

DetectIdentifier

Поиск строк идентификаторов (регулярное выражение: [a-zA-Z_][a-zA-Z0-9_]*).

<DetectIdentifier (общие атрибуты) />

У этого правила нет специфичных атрибутов.

С помощью этого правила возможно сразу пропустить строку из словообразующих символов, а не выполнять последовательную проверку на основе нескольких правил, каждое из которых будет предоставлять возможность отвергать по одному символу за раз из-за несоответствия.

Советы и рекомендации

Понимание принципов работы средства переключения контекста позволяет перейти к написанию собственных определений подсветки. Но следует с осторожностью относиться к выбору правил. Регулярные выражения предоставляют обширную функциональность, но работают достаточно медленно по сравнению с другими правилами. Воспользуйтесь приведёнными далее советами.

  • Если необходимо определить соответствие только двух символов, используйте Detect2Chars вместо StringDetect. То же относится и к DetectChar.

  • Регулярные выражения просты в использовании, но зачастую имеются способы, позволяющие намного быстрее получить тот же результат. Предположим, требуется проверить, является ли '#' первым символом в строке. Соответствующее регулярное выражение выглядело бы следующим образом:

    <RegExpr attribute="Macro" context="macro" String="^\s*#" />

    Тот же результат возможно получить гораздо быстрее:

    <DetectChar attribute="Macro" context="macro" char="#" firstNonSpace="true" />

    Если требуется найти регулярное выражение '^#', возможно опять же использовать DetectChar с атрибутом column="0". Отсчёт значения атрибута column основан на количестве символов, следовательно, табуляция считается одним символом.

  • В правилах RegExpr используйте атрибут column="0", если будет использован шаблон ^ШАБЛОН для установления соответствия текста в начале строки. Это ускорит обработку, так как средству обработки не потребуется выполнять поиск в остальных позициях строки.

  • Используйте в регулярных выражениях группы без захвата (?:ШАБЛОН) вместо групп с захватом (ШАБЛОН), если захваченные данные не будут использоваться в том же регулярном выражении или в динамических правилах. Это позволяет избежать ненужного хранения этих данных.

  • Возможно переключать контексты без обработки символов. Предположим, что требуется переключить контекст при обнаружении строки */, но при этом обработать эту строку в следующем контексте. Приведённое далее правило позволяет найти соответствие, а благодаря атрибуту lookAhead средство определения подсветки сохранит найденную строку для обработки в следующем контексте.

    <Detect2Chars attribute="Comment" context="#pop" char="*" char1="/" lookAhead="true" />

  • Используйте DetectSpaces, если известно, что имеется несколько пробелов.

  • Используйте DetectIdentifier вместо регулярного выражения '[a-zA-Z_]\w*'.

  • Используйте стили по умолчанию всегда, когда это возможно. Это позволит пользователям работать в знакомой среде.

  • Просмотрите другие файлы XML, чтобы узнать, как другие пользователи реализуют сложные правила.

  • Корректность каждого файла XML возможно проверить с помощью команды validatehl.sh language.xsd mySyntax.xml. Файлы validatehl.sh и language.xsd доступны в репозитории подсветки синтаксиса.

  • Если в файле часто используются сложные регулярные выражения, возможно воспользоваться определением ENTITIES. Пример:

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE language SYSTEM "language.dtd"
    [
            <!ENTITY myref    "[A-Za-z_:][\w.:_-]*">
    ]>
    

    После такого определения возможно использовать &myref; вместо регулярного выражения.