<appendix id="highlight">
<appendixinfo>
<authorgroup>
<author
><personname
><firstname
></firstname
></personname
></author>
<othercredit role="translator"
><firstname
>Андрей</firstname
><surname
>Балагута</surname
><affiliation
><address
><email
>uj2@mail.ru</email
></address
></affiliation
><contrib
>Перевод на русский</contrib
></othercredit
> 
</authorgroup>
</appendixinfo>
<title
>Подсветка синтаксиса</title>

<sect1 id="highlight-overview">

<title
>Обзор</title>

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

<mediaobject>
<imageobject
><imagedata format="PNG" fileref="highlighted.png"/></imageobject>
<textobject
><phrase
>Функция Perl, отображенная с использованием синтаксической подсветки.</phrase
></textobject>
<caption
><para
>Функция Perl, отображенная с использованием синтаксической подсветки.</para>
</caption>
</mediaobject>

<mediaobject>
<imageobject
><imagedata format="PNG" fileref="unhighlighted.png"/></imageobject>
<textobject
><phrase
>Та же самая функция, но без подсветки.</phrase
></textobject>
<caption
><para
>Та же самая функция, но без подсветки.</para
></caption>
</mediaobject>

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

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

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

<para
>Вы можете настроить стили и цвета доступных синтаксических определений, а также соответствующие им типы &MIME; в диалоговом окне <link linkend="config-dialog"
>Настройки &kate;</link
> на странице <link linkend="config-dialog-editor-hl"
> Подсветка</link
>.</para>

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

<tip>
<para
>На сайте &kate; вы можете загрузить обновленные или новые определения синтаксической подсветки. Для этого нужно щелкнуть по кнопке <guibutton
>Загрузка...</guibutton
> на странице <link linkend="config-dialog-editor-hl"
>Подсветка</link
> диалогового окна <link linkend="config-dialog"
>Настройки &kate;</link
>.</para>
</tip>

</sect1>

<sect1 id="katehighlight-system">

<title
>Система синтаксической подсветки &kate;</title>

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

<sect2 id="katehighlight-howitworks">

<title
>Механизм работы</title>

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

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

<para
>Синтаксические определения &kate; хранятся в файлах &XML;. Они содержат: <itemizedlist>
<listitem
><para
>Правила определения роли текста, организованные в контекстные блоки</para
></listitem>
<listitem
><para
>Списки ключевых слов</para
></listitem>
<listitem
><para
>Определения стилей</para
></listitem>
</itemizedlist>
</para>

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

</sect2>

<sect2 id="highlight-system-rules">
<title
>Правила</title>

<para
>Правила - это сердце системы подсветки. Правило может быть строкой, символом или <link linkend="regular-expressions"
>регулярным выражением</link
>, с которым сравнивается текст документа. Оно содержит информацию о стиле, который будет применен к тексту, если последний совпал с правилом. Оно может переключить текущий контекст системы на явно указанный или предыдущий контекст.</para>

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

</sect2>

<sect2 id="highlight-context-styles-keywords">
<title
>Стили контекстов и ключевые слова</title>

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

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

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

</sect2>

<sect2 id="kate-highlight-system-default-styles">
<title
>Стили по умолчанию</title>

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

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

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

</sect2>

</sect1>

<sect1 id="katehighlight-xml-format">
<title
>Формат синтаксических определений</title>

<sect2>
<title
>Обзор</title>

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

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

<variablelist>
<title
>Главные компоненты синтаксического определения</title>

<varlistentry>
<term
>Секция General</term>
<listitem>
<para
>Здесь содержится информация о формате комментариев для данного языка и о том, зависят ли от регистра ключевые слова.</para
> 
</listitem>
</varlistentry>

<varlistentry>
<term
>Highlighting</term>
<listitem>
<para
>Секция Highlighting содержит все необходимые данные для анализа и отображения текста:</para>

<variablelist>
<varlistentry>
<term
>ItemDatas</term>
<listitem
><para
>В этой подсекции находятся элементы ItemData. Каждый такой элемент определяет один стиль формата.</para
></listitem
> 
</varlistentry>

<varlistentry>
<term
>Списки ключевых слов</term>
<listitem>
<para
>Каждый список имеет имя и может содержать неограниченное количество элементов.</para>
</listitem>
</varlistentry>

<varlistentry>
<term
>Contexts</term>
<listitem>
<para
>Эта подсекция содержит контексты, которые в свою очередь содержат синтаксические правила.</para>
</listitem>
</varlistentry>
</variablelist>

</listitem>
</varlistentry>

</variablelist>

</sect2>

</sect1>

<sect1 id="kate-highlight-rules-detailled">
<title
>Синтаксические правила</title>

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

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

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

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

<programlisting
>&lt;RuleName attribute=&quot;(идентификатор)&quot; context=&quot;(идентификатор|номер)&quot; [параметры правила] /&gt;</programlisting>

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

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

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

<itemizedlist>
<listitem>
<para
><emphasis
>Идентификатор</emphasis
>. В текущей версии идентификатором может быть только порядковый номер в группе контекстов (отсчет с нуля).</para>
</listitem>
<listitem>
<para
><emphasis
>Указание</emphasis
> системе подсветки не изменять текущий контекст (<userinput
>#stay</userinput
>) или вернуться к предыдущему контексту (<userinput
>#pop</userinput
>).</para
> 
<para
>Чтобы вернуться назад на несколько контекстов, повторите нужное количество раз ключевое слово #pop: <userinput
>#pop#pop#pop</userinput
></para
> 
</listitem>
</itemizedlist>

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

<programlisting
>&lt;RuleName (attributes)&gt;
  &lt;ChildRuleName (attributes) /&gt;
  ...
&lt;/RuleName&gt;
</programlisting>


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

<variablelist>
<title
>Более подробно о правилах</title>

<varlistentry>
<term
>DetectChar</term>
<listitem>
<para
>Проверка на совпадение с одним определенным символом. Используется, например, для определения завершающего символа строки, заключенной в кавычки.</para
> 
<programlisting
>&lt;DetectChar char=&quot;(символ)&quot; (общие параметры) /&gt;</programlisting>
<para
>Параметр <userinput
>char</userinput
> определяет символ.</para
> 
</listitem>
</varlistentry>

<varlistentry>
<term
>Detect2Chars</term>
<listitem>
<para
>Проверка на совпадение с двумя символами в заданном порядке.</para>
<programlisting
>&lt;Detect2Chars char=&quot;(символ)&quot; char1=&quot;(символ)&quot; (общие параметры) /&gt;</programlisting>
<para
>Параметр <userinput
>char</userinput
> определяет первый символ для проверки, <userinput
>char1</userinput
> - второй.</para>
</listitem>
</varlistentry>

<varlistentry>
<term
>AnyChar</term>
<listitem>
<para
>Проверка на совпадение с любым символом из заданного набора.</para>
<programlisting
>&lt;AnyChar String=&quot;(строка)&quot; (общие параметры) /&gt;</programlisting>
<para
>Параметр <userinput
>String</userinput
> содержит набор допустимых символов.</para>
</listitem>
</varlistentry>

<varlistentry>
<term
>StringDetect</term>
<listitem>
<para
>Проверка на совпадение со строкой.</para>
<programlisting
>&lt;StringDetect String=&quot;(строка)&quot; [insensitive=&quot;TRUE|FALSE;&quot;] (общие параметры) /&gt;</programlisting>
<para
>Параметр <userinput
>String</userinput
> должен содержать строку, которую нужно проверить на совпадение. <userinput
>insensitive</userinput
> по умолчанию имеет значение <userinput
>FALSE</userinput
>, он влияет на сравнение строк. Если этот параметр установлен в <userinput
>TRUE</userinput
>, функция сравнения не будет учитывать регистр символов.</para
> 
</listitem>
</varlistentry>

<varlistentry>
<term
>RegExpr</term>
<listitem>
<para
>Проверка на совпадение с регулярным выражением.</para>
<programlisting
>&lt;RegExpr String=&quot;(строка)&quot; [insensitive=&quot;TRUE|FALSE;&quot;] [minimal=&quot;TRUE|FALSE&quot;] (общие параметры) /&gt;</programlisting>
<para
>Параметр <userinput
>String</userinput
> определяет регулярное выражение.</para>
<para
><userinput
>insensitive</userinput
> имеет то же значение, что и в предыдущем правиле; по умолчанию установлен в <userinput
>FALSE</userinput
>.</para>
<para
>Параметр <userinput
>minimal</userinput
> определяет тип выражения: жадное (<userinput
>FALSE</userinput
>) или нежадное (<userinput
>TRUE</userinput
>). По умолчанию имеет значение <userinput
>FALSE</userinput
></para>
<para
>Символ перевода каретки (<literal
>^</literal
>) в начале регулярного выражения говорит о том, что данное правило будет применяться только к тем цепочкам символов, которые начинаются с новой строки.</para>
<para
>Более подробно регулярные выражения рассматриваются в разделе <link linkend="regular-expressions"
><quote
>Регулярные выражения</quote
></link
></para
> 
</listitem>
</varlistentry>

<varlistentry>
<term
>Keyword</term>
<listitem>
<para
>Проверка на ключевое слово из указанного списка.</para>
<programlisting
>&lt;keyword String=&quot;(название списка)&quot; (общие параметры) /&gt;</programlisting>
<para
>В параметре <userinput
>String</userinput
> нужно указать название списка ключевых слов. Этот список должен существовать.</para>
</listitem>
</varlistentry>

<varlistentry>
<term
>Int</term>
<listitem>
<para
>Проверка на целое число.</para>
<para
><programlisting
>&lt;Int (общие параметры) /&gt;</programlisting
></para>
<para
>Это правило не имеет своих параметров. Дочерние правила обычно используются для определения комбинаций символов <userinput
>L</userinput
> и <userinput
>U</userinput
> после числа, которые конкретизируют тип целой константы в коде программы.</para>
</listitem>
</varlistentry>

<varlistentry>
<term
>Float</term>
<listitem>
<para
>Проверка на число с плавающей точкой.</para>
<para
><programlisting
>&lt;Float (общие параметры)
/&gt;</programlisting
></para
> 
<para
>Это правило не имеет своих параметров.</para>
</listitem>
</varlistentry>

<varlistentry>
<term
>HlCOct</term>
<listitem>
<para
>Проверка на восьмеричное число (должно начинаться с нуля).</para>
<para
><programlisting
>&lt;HlCOct (общие параметры) /&gt;</programlisting
></para>
<para
>Это правило не имеет своих параметров.</para>
</listitem>
</varlistentry>

<varlistentry>
<term
>HlCHex</term>
<listitem>
<para
>Проверка на шестнадцатеричное число (должно начинаться с символов <quote
>0x</quote
>).</para>
<para
><programlisting
>&lt;Int (общие параметры) /&gt;</programlisting
></para>
<para
>Это правило не имеет своих параметров.</para>
</listitem>
</varlistentry>

<varlistentry>
<term
>HlCStringChar</term>
<listitem>
<para
>Проверка на управляющий символ.</para>
<para
><programlisting
>&lt;HlCStringChar (общие параметры)
/&gt;</programlisting
></para>
<para
>Это правило не имеет своих параметров.</para>

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

<para
>Следующие символы совпадут с правилом, если перед ними будет стоять бэк-слеш (<literal
>\</literal
>): <userinput
>abefnrtv&quot;'?</userinput
>. Также совпадут шестнадцатеричные и восьмеричные числа, предваренные бэк-слешем (например, <userinput
>\xff</userinput
> и <userinput
>\033</userinput
>).</para>

</listitem>
</varlistentry>

<varlistentry>
<term
>RangeDetect</term>
<listitem>
<para
>Проверка на строку, имеющую заданные начальный и конечный символы.</para>
<programlisting
>&lt;RangeDetect char=&quot;(символ)&quot;  char1=&quot;(символ)&quot; (общие параметры) /&gt;</programlisting>
<para
><userinput
>char</userinput
> определяет символ, с которого начинается строка, а <userinput
>char2</userinput
> - которым она заканчивается.</para>
<para
>Это правило может быть использовано для определения небольших строк, заключенных в кавычки, но, поскольку при проверке правила система подсветки работает с одной строкой, данное правило не сможет определить строку, разбитую символами перевода строки.</para>
</listitem>
</varlistentry>

<varlistentry>
<term
>LineContinue</term>
<listitem>
<para
>Проверка на символ перевода строки.</para>
<programlisting
>&lt;LineContinue (общие параметры) /&gt;</programlisting>
<para
>Это правило не имеет своих параметров.</para>
<para
>Оно используется, когда при переходе на новую строку текущий контест должен быть переключен.</para>
</listitem>
</varlistentry>

</variablelist>

</sect1>

</appendix>
