Андрей
Балагута

    uj2@mail.ru

Перевод на русский

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

## Обзор

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

Функция Perl, отображенная с использованием синтаксической подсветки.

Функция Perl, отображенная с использованием синтаксической подсветки.

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

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

Какой из примеров легче читать?

&kate; имеет гибкую, легко настраиваемую систему синтаксической подсветки, которая базируется на синтаксических определениях (например, синтаксическое определение языка С++), состоящих из контекстов. Контексты содержат правила. В стандартную поставку редактора входят определения синтаксиса для большого числа языков программирования, разметки, скриптов и других текстовых форматов. Все определения хранятся в простых текстовых файлах в формате &XML;, поэтому вы без труда сможете создавать свои собственные определения.

Когда вы открываете файл, &kate; автоматически определяет правильное синтаксическое определение, основываясь на типе &MIME; (который, в свою очередь, определяется расширением файла) или содержании файла, если последний не имеет расширения. Если &kate; неправильно определил тип файла, выберите нужный режим подсветки вручную из меню Документ Режим подсветки.

Вы можете настроить стили и цвета доступных синтаксических определений, а также соответствующие им типы &MIME; в диалоговом окне Настройки &kate; на странице Подсветка.

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

На сайте &kate; вы можете загрузить обновленные или новые определения синтаксической подсветки. Для этого нужно щелкнуть по кнопке Загрузка... на странице Подсветка диалогового окна Настройки &kate;.

## Система синтаксической подсветки &kate;

В этом разделе подробно рассматривается механизм синтаксической подсветки &kate;. Прочитав этот раздел, вы сможете изменять существующие или создавать свои синтаксические определения.

### Механизм работы

Когда вы открываете файл, первое, что делает &kate; - определяет, какое синтаксическое определение использовать для этого файла. При чтении и наборе система подсветки анализирует текст в редакторе, используя правила синтаксического определения, и помечает границы контекстов и стилей.

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

Синтаксические определения &kate; хранятся в файлах &XML;. Они содержат:

- Правила определения роли текста, организованные в контекстные блоки

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

- Определения стилей

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

### Правила

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

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

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

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

Синтаксическое определение может содержать столько стилей, сколько нужно для данного формата.

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

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

Если вы откроете файлы разных форматов, например, исходный код на C++, на &Java; и документ HTML, вы увидите, что различные форматы отображаются в одних и тех же цветах. Дело в том, что &kate; содержит предопределенный набор стандартных стилей. Синтаксические определения по возможности используют этот набор.

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

Каждый стиль в синтаксическом определении базируется на одном из стилей по умолчанию. Поэтому, если вы часто используете какой-то формат с большим количеством стилей, следует проверить его конфигурацию подсветки на предмет совпадения стилей в разных понятиях. Приведу небольшой пример. В &kate; определен всего один стандартный стиль для отображения строковых констант, но в языке программирования perl существует два вида строк. Согласитесь, было бы гораздо лучше отображать их по разному - вы заходите в диалоговое окно настройки &kate; и изменяете соответствующие стили.

## Формат синтаксических определений

### Обзор

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

Описание формата синтаксических определений (DTD) находится в файле `language.dtd`, который находится в каталоге `$`KDEDIR`/share/apps/kate/syntax` (по крайней мере, должен там быть).

#### Главные компоненты синтаксического определения

Секция General

  Здесь содержится информация о формате комментариев для данного языка и о том, зависят ли от регистра ключевые слова.

Highlighting

  Секция Highlighting содержит все необходимые данные для анализа и отображения текста:

  ItemDatas

    В этой подсекции находятся элементы ItemData. Каждый такой элемент определяет один стиль формата.

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

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

  Contexts

    Эта подсекция содержит контексты, которые в свою очередь содержат синтаксические правила.

## Синтаксические правила

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

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

Параметры attribute и context являются общими для всех правил.

Синтаксис определения правил следующий:

    <RuleName attribute="(идентификатор)" context="(идентификатор|номер)" [параметры правила] />

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

В качестве значения параметра attribute может выступать имя стиля или его порядковый номер в группе ItemDatas (отсчет с нуля).

Параметр context может принимать следующие значения:

- Идентификатор. В текущей версии идентификатором может быть только порядковый номер в группе контекстов (отсчет с нуля).

- Указание системе подсветки не изменять текущий контекст (`#stay`) или вернуться к предыдущему контексту (`#pop`).

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

Некоторые правила могут иметь дочерние правила, которые проверяются только в том случае, если родительское правило совпало с текстом. Всей совпавшей строке будут присвоены атрибуты, определенные в родительском правиле. Вот пример правила с дочерними правилами:

    <RuleName (attributes)>
      <ChildRuleName (attributes) />
      ...
    </RuleName>

Параметры конкретных видов правил описаны в следующем списке.

### Более подробно о правилах

DetectChar

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

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

  Параметр `char` определяет символ.

Detect2Chars

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

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

  Параметр `char` определяет первый символ для проверки, `char1` - второй.

AnyChar

  Проверка на совпадение с любым символом из заданного набора.

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

  Параметр `String` содержит набор допустимых символов.

StringDetect

  Проверка на совпадение со строкой.

      <StringDetect String="(строка)" [insensitive="TRUE|FALSE;"] (общие параметры) />

  Параметр `String` должен содержать строку, которую нужно проверить на совпадение. `insensitive` по умолчанию имеет значение `FALSE`, он влияет на сравнение строк. Если этот параметр установлен в `TRUE`, функция сравнения не будет учитывать регистр символов.

RegExpr

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

      <RegExpr String="(строка)" [insensitive="TRUE|FALSE;"] [minimal="TRUE|FALSE"] (общие параметры) />

  Параметр `String` определяет регулярное выражение.

  `insensitive` имеет то же значение, что и в предыдущем правиле; по умолчанию установлен в `FALSE`.

  Параметр `minimal` определяет тип выражения: жадное (`FALSE`) или нежадное (`TRUE`). По умолчанию имеет значение `FALSE`

  Символ перевода каретки (`^`) в начале регулярного выражения говорит о том, что данное правило будет применяться только к тем цепочкам символов, которые начинаются с новой строки.

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

Keyword

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

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

  В параметре `String` нужно указать название списка ключевых слов. Этот список должен существовать.

Int

  Проверка на целое число.

      <Int (общие параметры) />

  Это правило не имеет своих параметров. Дочерние правила обычно используются для определения комбинаций символов `L` и `U` после числа, которые конкретизируют тип целой константы в коде программы.

Float

  Проверка на число с плавающей точкой.

      <Float (общие параметры)
      />

  Это правило не имеет своих параметров.

HlCOct

  Проверка на восьмеричное число (должно начинаться с нуля).

      <HlCOct (общие параметры) />

  Это правило не имеет своих параметров.

HlCHex

  Проверка на шестнадцатеричное число (должно начинаться с символов 0x).

      <Int (общие параметры) />

  Это правило не имеет своих параметров.

HlCStringChar

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

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

  Это правило не имеет своих параметров.

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

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

RangeDetect

  Проверка на строку, имеющую заданные начальный и конечный символы.

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

  `char` определяет символ, с которого начинается строка, а `char2` - которым она заканчивается.

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

LineContinue

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

      <LineContinue (общие параметры) />

  Это правило не имеет своих параметров.

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