Юрій
Чорноіван

    yurchor@ukr.net

Переклад українською

# Як працювати з підсвічуванням синтаксису

## Огляд

Підсвічування синтаксису призначено для автоматично показу тексту у різних стилях і кольорах, залежно від призначення відповідного рядка та файла, з якого взято цей рядок. У початковому коді програми, наприклад, оператори керування може бути показано жирним шрифтом, а типи даних і коментарі — кольором, відмінним від кольору решти тексту. За допомогою підсвічування можна значно покращити зручність читання тексту, а отже підвищити ефективність та продуктивність роботи з цим текстом.

Функція, написана мовою Perl, показана з підсвічуванням синтаксису.

Функція, написана мовою Perl, показана з підсвічуванням синтаксису.

Та сама функція, написана мовою Perl, без підсвічування.

Та сама функція, написана мовою Perl, без підсвічування.

Ну що, який з двох прикладів зручніше читати?

У &kate; передбачено гнучку, придатну для налаштування і потужну систему підсвічування синтаксичних конструкцій, у стандартному пакунку ви знайдете визначення для широкого спектру мов програмування, написання скриптів та розмітки, а також текстових файлів у інших форматах. Окрім того, ви можете створювати власні визначення за допомогою простих файлів &XML;.

&kate; автоматично визначатиме належні правила підсвічування синтаксису під час відкриття файла. Дія з визначення відбуватиметься на основі типу &MIME; файла, який визначатиметься за суфіксом назви файла або, якщо у назві немає суфіксу, за вмістом файла. Якщо, на вашу думку, програма зробила неправильний вибір, ви можете вручну вказати правила підсвічування за допомогою пункту меню Інструменти Підсвічування.

Гарнітури шрифту та кольори, які буде використано визначенням підсвічування синтаксису, можна налаштувати на вкладці Стилі підсвічування тексту діалогового вікна налаштування, типами ж &MIME;, для яких буде використано таке підсвічування керує вкладка Режими та типи файлів tab.

Підсвічування можна використовувати для покращення візуального сприйняття тексту, але довірятися підсвічуванню під час перевірки коректності синтаксису тексту не слід. Синтаксична розмітка тексту є непростим завданням, складність якого залежить від формату тексту, — у деяких випадках, автори синтаксичних правил вважають успіхом правильний показ 98% тексту, хоча для того, щоб побачити 2% тексту з неправильним підсвічуванням, вам доведеться скористатися не дуже поширеним стилем.

Ви можете звантажити оновлені або додаткові правила визначення підсвічування синтаксису з веб-сайта &kate;. Для цього вам слід натиснути кнопку Звантажити файли підсвічування... на вкладці Режими та типи файлів діалогового вікна налаштування.

## Система підсвічування синтаксису &kate;

У цьому розділі ми зосередимося на механізмах, які використовуються для підсвічування синтаксису у &kate;. Відомості з цього розділу призначено для тих користувачів, яким цікаво дізнатися про роботу системи підсвічування синтаксису, або тих користувачів, які бажають змінити або створити нові визначення підсвічування синтаксису.

### Як це працює

Під час відкриття файла однією з перших дій, які виконує редактор &kate;, є визначення правил підсвічування синтаксису для цього файла. Під час читання тексту з файла або отримання введених вами рядків система підсвічування синтаксису аналізуватиме текст на основі правил підсвічування синтаксису і позначатиме у показаному тексті позиції початку і завершення різних контекстів і стилів.

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

Визначення синтаксичних правил, які використовуються у системі підсвічування синтаксису &kate;, є файлами &XML;, у яких містяться

- Правила для визначення ролі тексту, впорядковані у контекстні блоки

- Списки ключових слів

- Визначення елементів стилю

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

### Правила

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

Правила об’єднуються у контекстні групи. Кожна контекстна група реалізує основні елементи у відповідному форматі файлів, наприклад, текстові рядки у лапках або блоки коментарів у файлах кодів програми. За такої структури системи підсвічування можна уникнути потреби у переборі всього набору правил, коли такий перебір не потрібен, а також мати можливість різного трактування деяких послідовностей символів у тексті, залежно від поточного контексту.

Контексти можуть створюватися і динамічно, таким чином забезпечується використання у правилах особливостей даних документа.

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

У деяких мовах програмування цілі числа обробляються компілятором (програмою, яка перетворює початкові коди програми на бінарний файл програми) у спосіб, відмінний від способу обробки чисел з плаваючою крапкою, також у рядках, взятих у лапки, можуть бути символи зі спеціальним призначенням. У таких випадках було б доцільним виокремити подібні символи, щоб їх простіше було виявити під час читання коду. Отже, навіть якщо ці символи не мають окремого контексту, система підсвічування тексту показати їх так, неначе подібний контекст для них існує, тобто виокремити їх з-поміж навколишнього тексту.

У визначенні синтаксису може бути довільна кількість стилів, достатня для визначення всіх елементів формату тексту, для якого це визначення було створено.

У багатьох форматах існують списки слів, які відповідають певному елементу. Наприклад, у мовах програмування керівні команди складають один елемент, назви типів даних — другий, вбудовані функції мови — третій. Система підсвічування синтаксису &kate; здатна використовувати такі списки для виявлення і позначення слів у тексті з метою підкреслення призначення елементів у текстових форматах.

### Типові стилі

Якщо ви відкриєте файл кодів мовою C++, &Java; або документ HTML у &kate;, ви переконаєтеся у тому, що, хоча формати цих файлів є різними, а отже у них використовуються різні слова для позначень елементів тексту, кольори, які буде використано програмою будуть тими самими. Причиною цього є існування у &kate; наперед визначеного списку типових стилів, який використовується у окремих визначеннях синтаксису.

Типові стилі спрощують розпізнавання подібних елементів у різних форматах тексту. Наприклад, коментарі передбачено майже у всіх мовах програмування, написання скриптів або мовах розмітки, отже, якщо їх буде показано у однаковому стилі у всіх форматах мов, вам не потрібно буде зупинятися і розмірковувати над тим, як виглядають коментарі у тексті документа.

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

## Формат &XML; визначення підсвічування

### Огляд

Цей розділ присвячено огляду формату &XML; визначення підсвічування. За допомогою невеличкого прикладу у розділі описано основні компоненти, їх призначення і використання. Далі ми докладно розглянемо правила визначення підсвічування синтаксису.

Формальне визначення або DTD зберігається у файлі з назвою `language.dtd`, який у вашій системі має бути встановлено до теки `$`KDEDIR`/share/apps/katepart/syntax`.

#### Головні розділи файлів визначення підсвічування &kate;

Файл підсвічування містить заголовок, у якому встановлюється версія і тип документа XML:

      <?xml version="1.0" encoding="UTF-8"?>
      <!DOCTYPE language SYSTEM "language.dtd">

Кореневим елементом файла визначення є елемент `language`. Серед можливих атрибутів:

  Обов’язкові атрибути:

  `name` визначає назву мови. Цю назву буде згодом показано у пунктах меню та діалогових вікнах програми.

  `section` визначає категорію.

  `extensions` визначає суфікси назв файлів, на зразок "*.cpp;*.h"

  Необов’язкові атрибути:

  `mimetype` прив’язує файли на основі типу &MIME;.

  `version` визначає поточну версію файла визначень.

  `kateversion` визначає найостаннішу з підтримуваних версій &kate;.

  `casesensitive` визначає, чи розрізнятимуться ключові слова за регістром символів, чи ні.

  `priority` потрібно вказати, якщо у іншому файлі визначення підсвічування використовуються ті самі суфікси файлів. Для підсвічування буде використано правила з вищим пріоритетом.

  `author` повинен містити ім’я і адресу електронної пошти автора.

  `license` повинен містити назву ліцензії файла підсвічування, зазвичай, LGPL, Artistic, GPL тощо.

  `hidden` визначає, чи має бути показано назву підсвічування у меню &kate;.

  Отже, наступний рядок має виглядати десь так:

      <language name="C++" version="1.00" kateversion="2.4" section="Sources" extensions="*.cpp;*.h" />

Наступним елементом є `highlighting`, у цьому елементі міститься необов’язковий елемент `list` і обов’язкові елементи `contexts` і `itemDatas`.

  Елементи `list` містять список ключових слів. У цьому випадку ключовими словами будуть class і const. У разі потреби ви можете додати довільну кількість списків.

  У елементі `contexts` містяться всі контексти. Типово, першим контекстом є початок діапазону підсвічування. У контексті Normal Text існує два правила: перше визначає список ключових слів з назвою somename і правило для визначення лапок і перемикання контексту на контекст string. Докладніше правила буде розглянуто у наступній главі.

  Третя частина складається з елемента `itemDatas`. У цьому елементі містяться всі кольори і гарнітури шрифтів, потрібні для контекстів і правил. У нашому випадку було використано `itemData` Normal Text, String і Keyword.

      <highlighting>
          <list name="somename">
            <item> class </item>
            <item> const </item>
          </list>
          <contexts>
            <context attribute="Normal Text" lineEndContext="#pop" name="Normal Text" >
              <keyword attribute="Keyword" context="#stay" String="somename" />
              <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` визначається те, чи слід враховувати регістр символів у списку ключових слів, чи ні. Інші атрибути буде описано далі за текстом.

      <general>
          <comments>
            <comment name="singleLine" start="#"/>
          </comments>
          <keywords casesensitive="1"/>
        </general>
      </language>

### Докладно про розділи

У цій частині описано всі доступні атрибути для контекстів, itemDatas, ключових слів, коментарів, згортання коду і відступів.

Елемент `context` належить до групи `contexts`. Цей елемент визначає специфічні для контексту правила, на зразок того, що має трапитися, якщо система підсвічування досягне кінця рядка. Серед можливих атрибутів:

  `name` — назва контексту. За допомогою цієї назви правила визначатимуть контекст, на який слід перемкнутися у випадку виявлення відповідника правила.

  `lineEndContext` визначає контекст, на який має перемкнутися система підсвічування у разі досягнення кінця рядка. Значенням може бути назва іншого контексту, `#stay` означатиме, що контекст не слід перемикати (тобто нічого не робити) or `#pop` означатиме, що слід вийти з контексту. Наприклад, можна скористатися значенням `#pop#pop#pop` для того, щоб система після виходу піднялася на два контексти вище.

  `lineBeginContext` визначає контекст, якщо буде знайдено початок рядка. Типове значення: #stay.

  `fallthrough` вказує, чи слід системі підсвічування перемикатися на контекст вказаний параметром fallthroughContext, якщо текст не відповідає жодному з правил. Типове значення: false.

  `fallthroughContext` визначає наступний контекст, якщо не буде знайдено відповідника до правил.

  `dynamic`: якщо має значення true, контекст запам’ятовуватиме рядки або заповнювачі, збережені за допомогою динамічних правил. Це потрібно, наприклад, для документів HERE. Типове значення: false.

Елемент `itemData` знаходиться у групі `itemDatas`. За його допомогою визначаються тип шрифту і кольори. Таким чином можна визначати власні типи шрифтів і кольори, але ми рекомендуємо, за можливості, використовувати лише типові стилі так, щоб користувач завжди бачив однакові кольори у файлах різних форматів. Все ж іноді іншого способу не існує, і вам доведеться змінити колір і атрибути шрифту. Обов’язковими атрибутами є name і defStyleNum, інші атрибути є необов’язковими. Серед можливих атрибутів:

  `name` визначає назву itemData. Цю назву буде використано у контекстах і правилах для посилання на itemData у атрибуті attribute.

  `defStyleNum` визначає, який тип слід використовувати типово. Докладний перелік можливих типових стилів ви знайдете нижче.

  `color` визначає колір. Можливі формати: '#rrggbb' і '#rgb'.

  `selColor` визначає колір виділеного тексту.

  `italic`, якщо має значення true, шрифт буде курсивним.

  `bold`, якщо має значення true, шрифт тексту буде напівжирним.

  `underline`: якщо цей атрибут має значення true, текст буде підкреслено.

  `strikeout`, якщо цей параметр має значення true, текст буде перекреслено.

Елемент `keywords` у групі `general` визначає властивості ключових слів. Серед можливих атрибутів:

  `casesensitive`, може приймати значення true або false. Якщо має значення true, пошук ключових слів відбуватиметься з врахуванням регістру символів.

  `weakDeliminator` — це список символів, які не є символами відокремлення слів. Наприклад, крапка `«.»` є символом відокремлення слів. Припустімо тепер, що ключове слово у `list` містить крапку, тоді це слово буде задіяно, лише якщо ви вкажете крапку серед значень цього аргументу.

  `additionalDeliminator` визначає додаткові символи розмітки.

  `wordWrapDeliminator` визначає символи, після яких можна розривати рядок.

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

Елемент `comment` у групі `comments` визначає властивості коментаря, які буде використано для дій за пунктами меню Інструменти Закоментувати і Інструменти Розкоментувати. Серед доступних атрибутів:

  `name`: може мати значення singleLine або multiLine. Якщо буде обрано варіант multiLine, слід буде також вказати атрибути end і region.

  `start` визначає рядок, який використовується для позначення початку коментаря. У C++ цим рядком є "/*".

  `end` визначає рядок, яким завершуватиметься коментар. У C++ цим рядком буде "*/".

  Атрибут `region` повинен мати значення назви придатного для згортання багаторядкового коментаря. Припустімо, що у правилах вказано beginRegion="Comment" ... endRegion="Comment", тоді вам слід взяти значення region="Comment". За допомогою цього атрибута можна користуватися дією з розкоментування, навіть якщо було виділено не весь текст багаторядкового коментаря. Потрібно лише, щоб курсор знаходився всередині цього багаторядкового коментаря.

Елемент `folding` у групі `general` призначено для визначення властивостей згортання коду. Серед можливих атрибутів:

  `indentationsensitive`: якщо має значення true, позначки згортання коду буде додано на основі відступів, так, як це робиться у скриптовій мові Python. Зазвичай, вам не потрібно буде встановлювати цей атрибут, оскільки його типовим значенням є false.

Елемент `indentation` у групі `general` призначено для зазначення інструменту визначення відступів. Ми наполегливо рекомендуємо вам уникати використання цього елемента, оскільки інструмент визначення відступів, зазвичай, визначається або за типом файла або за рядком режиму, доданим до текстового файла. Якщо ви все ж визначите цей інструмент програма примусово буде використовувати саме його, що може бути дуже небажаним для користувача програми. Серед можливих атрибутів:

  `mode`: назва інструменту визначення відступів. У поточній версії можливими значеннями є: normal, cstyle, haskell, lilypond, lisp, python, ruby та xml.

### Можливі типові стилі

Ви вже обговорювали типові стилі у короткому резюме: типовими стилями є наперед визначені набори з гарнітур шрифтів та кольорів.

Отже, ось список доступних типових стилів:

  `dsNormal`, використовується для звичайного тексту.

  `dsKeyword`, використовується для ключових слів.

  `dsDataType`, використовується для типів даних.

  `dsDecVal`, використовується для десяткових значень.

  `dsBaseN`, використовується для величин у численні з основою, відмінною від 10.

  `dsFloat`, використовується для значень з плаваючою комою.

  `dsChar`, використовується для символів.

  `dsString`, використовується для рядків.

  `dsComment`, використовується для коментарів.

  `dsOthers`, використовується для «інших» значень.

  `dsAlert`, використовується для попереджувальних повідомлень.

  `dsFunction`, використовується для викликів функцій.

  `dsRegionMarker`, використовується для позначок ділянок.

  `dsError`, використовується для підсвічування помилок та синтаксичних неточностей.

## Правила визначення способу підсвічування

Цей розділ присвячено опису правил визначення синтаксису.

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

Правило виглядає так:

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

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

context може бути визначено за допомогою:

- Ідентифікатора, який є назвою іншого контексту.

- Значення порядку, яке повідомляє рушієві, чи слід залишатися у поточному контексті (`#stay`), чи слід повернутися до попереднього контексту, використаного у рядку (`#pop`).

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

У деяких правил можуть бути дочірні правила, перевірка можливості використання яких виконуватиметься, лише якщо буде задіяно батьківське правило. Атрибути, визначені у батьківському правилі, буде застосовано до всього знайденого рядка. Правило з дочірніми правилами виглядає так:

    <НазваПравила (атрибути)>
      <НазваДочірньогоПравила (атрибути) />
      ...
    </НазваПравила>

Специфічні для правила атрибути можуть бути різними, їх описано у наступних розділах.

### Загальні атрибути

Всі правила мають перелічені нижче атрибути, їх можна вказувати всюди, де ви побачите напис `(загальні атрибути)` у списку. Атрибути 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 з виклику формального виразу. У атрибуті `char` заповнювач повинен бути числом N, його буде замінено на перший символ відповідного елемента N з виклику формального виразу. Всі правила, які дозволяють використання цього атрибута, буде позначено написом (dynamic).

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

### Докладно про правила

DetectChar

  Перевірка на рівність одному певному символу. Зазвичай, використовується для пошуку кінця рядків, взятих у лапки.

      <DetectChar char="(символ)" (загальні атрибути) (dynamic) />

  Атрибут `char` визначає символ, з яким відбуватиметься порівняння.

Detect2Chars

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

      <Detect2Chars char="(символ)" char1="(символ)" (загальні атрибути) (dynamic) />

  Атрибут `char` визначає перший символ для порівняння, `char1` — другий.

AnyChar

  Перевірка на рівність одному з символів вказаного набору.

      <AnyChar String="(рядок)" (загальні атрибути) />

  Атрибут `String` визначає набір символів.

StringDetect

  Перевірка на рівність вказаному рядку.

      <StringDetect String="(рядок)" [insensitive="true|false"] (загальні атрибути) (dynamic) />

  Атрибут `String` визначає рядок для порівняння. Типовим значенням атрибута `insensitive` є false, цей атрибут передається функції порівняння рядків. Якщо значенням атрибута буде true, порівняння відбуватиметься без врахування регістру.

StringDetect

  Виявити рядок, але з додатковою вимогою щодо меж слів, зокрема крапки, `'.'`, або пробілу на початку або у кінці слова. Обробка `\b<рядок>\b` відбувається подібно до формального виразу, але виконується швидше за обробку правила `RegExpr`.

      <WordDetect String="(рядок)" [insensitive="true|false"] (загальні атрибути) (dynamic) />

  Атрибут `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` визначає назву списку ключових слів. Список з вказаною назвою має існувати.

Int

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

      <Int (загальні атрибути) (dynamic) />

  У цього правила немає специфічних атрибутів. Зазвичай, для виявлення символів, що стоять після числа і позначають тип цілого числа у коді програми, `L` і `U`, використовуються дочірні правила. Насправді, можна використовувати будь-які правила як дочірні, але у DTD передбачено використання лише правила `StringDetect`.

  Приклад пошуку цілих чисел, які слідують за символом «L».

      <Int attribute="Decimal" context="#stay" >
        <StringDetect attribute="Decimal" context="#stay" String="L" insensitive="true"/>
      </Int>

Float

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

      <Float (загальні атрибути) />

  У цього правила немає специфічних атрибутів. Можна використовувати правило `AnyChar` як дочірнє, це правило типово використовується для виявлення комбінацій, порівняйте з правилом `Int`.

HlCOct

  Перевірка на відповідність рядка запису вісімкового числа (починається з «0»).

      <HlCOct (загальні атрибути) />

  У цього правила немає особливих атрибутів.

HlCHex

  Перевірка на відповідність рядка запису шістнадцяткового числа (починається з «0x»).

      <HlCHex (загальні атрибути) />

  У цього правила немає особливих атрибутів.

HlCStringChar

  Перевірка на відповідність символу керівної послідовності.

      <HlCStringChar (загальні атрибути) />

  У цього правила немає особливих атрибутів.

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

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

HlCChar

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

      <HlCChar (загальні атрибути) />

  У цього правила немає особливих атрибутів.

  Перевірка на відповідність символам C, взятим у одинарні лапки (Приклад: `'c'`). Отже, у таких лапках може бути простий символ або екранований символ. Щоб дізнатися про пошук екранованих послідовностей символів, перегляньте пункт для HlCStringChar.

RangeDetect

  Перевірка на відповідність рядку з вказаними початковим і кінцевим символами.

      <RangeDetect char="(символ)"  char1="(символ)" (загальні атрибути) />

  `char` визначає символ, який повинен починати діапазон символів, `char1` — символ, який має завершувати діапазон.

  Корисно для виявлення, наприклад, невеличких рядків у лапках, але зауважте, що, оскільки рушій підсвічування обробляє за раз лише один рядок, у такий спосіб неможливо знайти рядки у лапках, які розбито між декількома рядками документа.

LineContinue

  Перевірка на відповідність символу кінця рядка.

      <LineContinue (загальні атрибути) />

  У цього правила немає особливих атрибутів.

  Це правило корисне для перемикання контексту наприкінці рядка, якщо останнім символом є зворотна навскісна риска (`'\'`). Така риска потрібна зокрема у коді мовами C/C++ для продовження макросів або рядків.

IncludeRules

  Включити правила з іншого контексту або мови/файла.

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

  Атрибут `context` визначає контекст, який слід включити.

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

      <IncludeRules context="anotherContext" />

  Якщо рядок починатиметься з `##`, система підсвічування шукатиме інше визначення для мови з вказаною назвою. Приклад:

      <IncludeRules context="##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` засновано на кількості символів, отже табуляція вважатиметься лише одним символом.

- Ви можете перемикати контексти без обробки символів тексту. Припустімо, що вам потрібно перемкнути контекст у разі виявлення рядка `*/`, але також слід обробити цей рядок у наступному контексті. Ви можете скористатися наведеним нижче правилом, у якому атрибут `lookAhead` призведе до того, що інструмент визначення підсвічування збереже знайдений рядок для обробки у наступному контексті.

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

- Скористайтеся `DetectSpaces`, якщо вам відома точна кількість пробілів.

- Скористайтеся `DetectIdentifier` замість формального виразу `'[a-zA-Z_]\w*'`.

- За можливості, використовуйте типові стилі. Таким чином, ви полегшите користувачеві призвичаювання до середовища.

- Зазирайте до інших файлів XML, щоб дізнатися як інші люди реалізують складні правила.

- Ви можете перевірити файл XML на коректність за допомогою команди `xmllint --dtdvalid language.dtd мійСинтаксичнийФайл.xml`.

- Якщо у вашому файлі часто вживаються складні формальні вирази, ви можете скористатися визначенням ENTITIES. Приклад:

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

  Після такого визначення ви зможете використовувати &myref; замість формального виразу.