<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 ><othercredit role="translator" ><firstname >Алексей</firstname ><surname >Опарин</surname ><affiliation ><address ><email >opaleksej@yandex.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 >Вы можете настроить стили и цвета доступных синтаксических определений на вкладке <link linkend="config-dialog-editor-appearance" >Схемы</link >диалога <link linkend="config-dialog" >Настройка &kate;</link > , а соответствующие им &MIME;-типы - на вкладке <link linkend="config-dialog-editor-highlighting" >Подсветка</link >.</para> <note> <para >Синтаксическая подсветка улучшает читаемость корректно оформленного текста, но не факт, что текст некорректен, если он неправильно отображается системой подсветки. Синтаксическая разметка текста - достаточно сложный процесс, сложность которого зависит от формата файла, поэтому авторы синтаксических определений считают удачей, если 98% текста отображается корректно, но не стоит забывать об оставшихся 2%.</para> </note> <tip> <para >На сайте &kate; вы можете загрузить обновлённые или дополнительные правила синтаксической подсветки. Для этого нужно щёлкнуть на кнопке <guibutton >Загрузить</guibutton > на вкладке <link linkend="config-dialog-editor-highlighting" >Подсветка</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> <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; и изменяете соответствующие стили. Все <link linkend="kate-highlight-default-styles" >доступные стандартные стили</link > будут рассмотрены позже.</para> </tip> </sect2> </sect1> <sect1 id="katehighlight-xml-format"> <title >&XML;-формат определения синтаксической подсветки</title> <sect2> <title >Обзор</title> <para >В этом разделе вы познакомитесь с &XML;-форматом определения синтаксической подсветки. Вначале, на небольшом примере, будут кратко объяснены главные компоненты и их значение, затем мы более подробно остановимся на правилах подсветки.</para> <para >Формальное определение (<acronym >DTD</acronym >) находится в файле <filename >language.dtd</filename >, в каталоге <filename >$<envar >KDEDIR</envar >/share/apps/katepart/syntax</filename >. </para> <variablelist> <title >Основные разделы файла определения синтаксической подсветки &kate;</title> <varlistentry> <term >В заголовке файла подсветки указаны версия XML и тип документа:</term> <listitem> <programlisting ><?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE language SYSTEM "language.dtd"> </programlisting> </listitem> </varlistentry> <varlistentry> <term >Главная часть файла определений - элемент <userinput >language</userinput >. Доступные атрибуты:</term> <listitem> <para >Необходимые атрибуты:</para> <para ><userinput >name</userinput > определяет название языка. Впоследствии оно появляется во всех меню и диалогах.</para> <para ><userinput >section</userinput > указывает категорию.</para> <para ><userinput >extensions</userinput > определяет расширения файлов, вроде "*.cpp;*.h"</para> <para >Дополнительные атрибуты:</para> <para ><userinput >mimetype</userinput > связывает файл с определенным типом &MIME;.</para> <para ><userinput >version</userinput > указывает текущую версию файла определений.</para> <para ><userinput >kateversion</userinput > указывает новейшую из поддерживаемых версий &kate;.</para> <para ><userinput >casesensitive</userinput > определяет чувствительность ключевых слов к регистру.</para> <para ><userinput >priority</userinput > определяет приоритет в случае использования разных правил подсветки. Действует правило с высшим приоритетом.</para> <para ><userinput >author</userinput > содержит имя и email-адрес автора.</para> <para ><userinput >license</userinput > содержит лицензию, обычно LGPL, Artistic, GPL и т.п.</para> <para ><userinput >hidden</userinput > определяет, будет ли отображаться название в меню &kate;.</para> <para >Итак, следующая строка может быть примерно такой:</para> <programlisting ><language name="C++" version="1.00" kateversion="2.4" section="Sources" extensions="*.cpp;*.h" /> </programlisting> </listitem> </varlistentry> <varlistentry> <term >Следующий элемент - <userinput >highlighting</userinput >, состоящий из необязательного <userinput >list</userinput > и обязательных - <userinput >contexts</userinput > и <userinput >itemDatas</userinput >.</term> <listitem> <para >Элемент <userinput >list</userinput > содержит список ключевых слов. В нашем случае это <emphasis >class</emphasis > и <emphasis >const</emphasis >.Списков можете добавить, сколько хотите.</para> <para >Элемент <userinput >contexts</userinput > содержит все контексты. По умолчанию, подсветка начинается с первого контекста. В контексте <emphasis >Normal Text</emphasis > есть два правила, одно из которых проверяет наличие в тексте <emphasis >слов</emphasis >, соответствующих списку ключевых слов, другое определяет наличие кавычек и переключает контекст к <emphasis >строковому</emphasis > типу. Подробнее правила описаны в следующей главе.</para> <para >Элемент <userinput >itemDatas</userinput > содержит сведения о цветах и стилях, применяющихся в контекстах и правилах. В нашем примере <userinput >itemData</userinput > использует контексты <emphasis >Normal Text</emphasis >, <emphasis >String</emphasis > и <emphasis >Keyword</emphasis >. </para> <programlisting ><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> </programlisting> </listitem> </varlistentry> <varlistentry> <term > Последня часть файла определения синтаксической подсветки - необязательный раздел <userinput >general</userinput >. Здесь могут содержаться сведения о ключевых словах, сворачивании блоков кода, комментариях и отступах.</term> <listitem> <para >Раздел <userinput >comment</userinput > определяет, какой строкой вводится однострочный комментарий. Можно пользоваться также многострочными комментариями, используя <emphasis >multiLine</emphasis > с дополнительным атрибутом <emphasis >end</emphasis >. Это используется тогда, когда пользователь нажимает комбинацию клавиш, назначенную для действия <emphasis >закомментировать/раскомментировать</emphasis >.</para> <para >Секция <userinput >keywords</userinput > определяет чувствительность ключевых слов к регистру. Остальные атрибуты рассмотрим позднее.</para> <programlisting ><general> <comments> <comment name="singleLine" start="#"/> </comments> <keywords casesensitive="1"/> </general> </language> </programlisting> </listitem> </varlistentry> </variablelist> </sect2> <sect2 id="kate-highlight-sections"> <title >Более подробно о разделах</title> <para >В этой части указаны все возможные атрибуты для контекстов, itemDatas, ключевых слов, комментариев, сворачивания кодов и отступов.</para> <variablelist> <varlistentry> <term >Элемент <userinput >context</userinput > относится к группе <userinput >contexts</userinput >. Контекстом определяются некоторые особые правила (например, что происходит при достижении подсвеченной структурой конца строки). Доступные атрибуты:</term> <listitem> <para ><userinput >name</userinput > - название контекста. Правила используют это название для переключения на указанный контекст.</para> <para ><userinput >lineEndContext</userinput > определяет, на какой контекст подсвеченная структура переключается при достижении конца строки. Это может быть название другого контекста, <userinput >#stay</userinput >, если контекст не меняется (т.е. не делать ничего) или <userinput >#pop</userinput > для выхода из контекста. Например, набор <userinput >#pop#pop#pop</userinput > приведет к троекратному выходу из контекста.</para> <para ><userinput >lineBeginContext</userinput > определяет контекст при достижении начала строки. По умолчанию: #stay.</para> <para ><userinput >fallthrough</userinput > определяет поведение в случае переключения подсвеченной структуры на контекст, указанный в fallthroughContext, если не найдено соответствующее правило. По умолчанию: <emphasis >false</emphasis >.</para> <para ><userinput >fallthroughContext</userinput > указывает следующий контекст, если не найдено соответствующее правило.</para> <para >Если <userinput >dynamic</userinput > имеет значение <emphasis >true</emphasis >, то контекст запоминает строки/метки-заполнители, сохранённые в динамических правилах. Это необходимо, например, для текущих документов. По умолчанию: <emphasis >false</emphasis >.</para> </listitem> </varlistentry> <varlistentry> <term >Элемент <userinput >itemData</userinput > принадлежит группе <userinput >itemDatas</userinput >. Он определяет стиль и цвет шрифта, их можно устанавливать самому в тех случаях, когда это необходимо. И все же, рекомендуется придерживаться стандартных стилей, чтобы помочь пользователю свободно ориентироваться в любом языке . Название атрибута (name) и defStyleNum обязательны, остальные нет. Доступные атрибуты:</term> <listitem> <para ><userinput >name</userinput > даёт название itemData. Контексты и правила будут использовать это название при обращении к itemData в своих атрибутах <emphasis >attribute</emphasis >.</para> <para ><userinput >defStyleNum</userinput > определяет стиль, используемый по умолчанию. Доступные стандартные стили будут детально описаны ниже.</para> <para ><userinput >color</userinput > определяет цвет. Правильные форматы '#rrggbb' или '#rgb'.</para> <para ><userinput >selColor</userinput > определяет цвет выделенного текста.</para> <para >Если <userinput >italic</userinput > имеет значение <emphasis >true</emphasis >, шрифт будет курсивным.</para> <para >Если <userinput >bold</userinput > имеет значение <emphasis >true</emphasis >, шрифт будет полужирным.</para> <para >Если <userinput >underline</userinput > имеет значение <emphasis >true</emphasis >, текст будет подчёркнут.</para> <para >Если <userinput >strikeout</userinput > имеет значение <emphasis >true</emphasis >, текст будет зачёркнут.</para> </listitem> </varlistentry> <varlistentry> <term >Элемент <userinput >keywords</userinput > в группе <userinput >general</userinput > определяет свойства ключевых слов. Доступные атрибуты:</term> <listitem> <para ><userinput >casesensitive</userinput > может быть <emphasis >true</emphasis > или <emphasis >false</emphasis >. Если <emphasis >true</emphasis >, все ключевые слова будут проверяться на соответствие с учетом регистра</para> <para ><userinput >weakDeliminator</userinput > - это группа знаков, которые не могут разделять слова. Например, точка <userinput >'.'</userinput > - разделитель слов. Если ключевое слово в <userinput >list</userinput > содержит точку, оно будет использовано по назначению только, если точка будет определена как "нетвердый разделитель" (weak delimiter).</para> <para ><userinput >additionalDeliminator</userinput > определяют дополнительные разделители.</para> <para ><userinput >wordWrapDeliminator</userinput > определяют символы, после которых может происходить перевод строки.</para> <para >По умолчанию разделителями слов и строк являются символы <userinput >.():!+,-<=>%&*/;?[]^{|}~\</userinput >, пробел (<userinput >' '</userinput >) и табуляция (<userinput >'\t'</userinput >).</para> </listitem> </varlistentry> <varlistentry> <term >Элемент <userinput >comment</userinput > в группе <userinput >comments</userinput > определяет свойства комментариев, которые используются в меню<menuchoice ><guimenu >Сервис</guimenu ><guimenuitem >Закомментировать</guimenuitem ></menuchoice > и <menuchoice ><guimenu >Сервис</guimenu ><guimenuitem >Раскомментировать</guimenuitem ></menuchoice >. Доступные атрибуты:</term> <listitem> <para ><userinput >name</userinput > может быть <emphasis >singleLine</emphasis > или <emphasis >multiLine</emphasis >. Если выбрать <emphasis >multiLine</emphasis >, то потребуются атрибуты <emphasis >end</emphasis > и <emphasis >region</emphasis >.</para> <para ><userinput >start</userinput > указывает строку начала комментария. В C++ это может быть "/*".</para> <para ><userinput >end</userinput > указывает строку окончания комментария. В C++ это может быть "*/".</para> <para ><userinput >region</userinput > должно быть названием сворачиваемого многострочного комментария. Допустим, если в ваших правилах указано <emphasis >beginRegion="Comment"</emphasis > ... <emphasis >endRegion="Comment"</emphasis >, вы должны использовать <emphasis >region="Comment"</emphasis >. В этом случае раскомментирование будет действовать, даже если не будет выделен весь текст многострочного комментария. Достаточно будет просто поместить курсор в его пределы.</para> </listitem> </varlistentry> <varlistentry> <term >Элемент <userinput >folding</userinput > в группе <userinput >general</userinput > определяет свойства сворачивания кода. Доступные атрибуты:</term> <listitem> <para >Если <userinput >indentationsensitive</userinput > имеет значение <emphasis >true</emphasis >, то маркёры сворачивания кода будут располагаться с учетом отступов, как в языке сценариев Python. Чаще всего в этом нет необходимости, поэтому по умолчанию этот параметр определен как <emphasis >false</emphasis >.</para> </listitem> </varlistentry> <varlistentry> <term >Элемент <userinput >indentation</userinput > в группе <userinput >general</userinput > определяет формат отступов, однако мы настоятельно рекомендуем не менять этот элемент, так как отступы обычно определяются типом файла или добавлением режимной строки в текстовый файл. Если вы всё-таки укажете способ отступа, он может оказаться навязанным пользователю, которому совсем не нужен. Доступные атрибуты:</term> <listitem> <para ><userinput >mode</userinput > - название формата отступов. Доступные форматы: <emphasis >normal, cstyle, csands, xml, python</emphasis > и <emphasis >varindent</emphasis >.</para> </listitem> </varlistentry> </variablelist> </sect2> <sect2 id="kate-highlight-default-styles"> <title >Стандартные стили</title> <para >Стандартные стили уже были кратко <link linkend="kate-highlight-system-default-styles" >описаны</link >: Стандартные стили предопределяют настройки цветов и шрифтов.</para> <variablelist> <varlistentry> <term >Здесь приведен только список доступных стандартных стилей:</term> <listitem> <para ><userinput >dsNormal</userinput >, для нормального текста.</para> <para ><userinput >dsKeyword</userinput >, для ключевых слов.</para> <para ><userinput >dsDataType</userinput >, для типов данных.</para> <para ><userinput >dsDecVal</userinput >, для десятичных значений.</para> <para ><userinput >dsBaseN</userinput >, для значений с основанием, отличным от10.</para> <para ><userinput >dsFloat</userinput >, для значений с плавающей точкой.</para> <para ><userinput >dsChar</userinput >, для символов.</para> <para ><userinput >dsString</userinput >, для строк.</para> <para ><userinput >dsComment</userinput >, для комментариев.</para> <para ><userinput >dsOthers</userinput >, для всего остального.</para> <para ><userinput >dsAlert</userinput >, для вывода предупреждений.</para> <para ><userinput >dsFunction</userinput >, для вызова функций.</para> <para ><userinput >dsRegionMarker</userinput >, для маркёров участков.</para> <para ><userinput >dsError</userinput >, для подсветки ошибок и неверного синтаксиса.</para> </listitem> </varlistentry> </variablelist> </sect2> </sect1> <sect1 id="kate-highlight-rules-detailled"> <title >Синтаксические правила</title> <para >В этом разделе описываются синтаксические правила.</para> <para >При анализе строки каждое правило может <quote >запросить</quote > на проверку любое количество символов (даже ноль). Если правило подходит, к соответствующим символам применяется стиль или <emphasis >атрибут</emphasis >, определённый в правиле. Применяемое правило также может запросить переключение текущего контекста.</para> <para >Правило выглядит примерно так:</para> <programlisting ><RuleName attribute="(identifier)" context="(identifier)" [rule specific attributes] /></programlisting> <para >Параметр <emphasis >attribute</emphasis > указывает, какой стиль применить к символам, соответствующим правилу. Параметр <emphasis >context</emphasis > определяет контекст, который будет установлен в случае применения правила.</para> <para >Параметр <emphasis >context</emphasis > может принимать следующие значения:</para> <itemizedlist> <listitem> <para ><emphasis >Идентификатор</emphasis >, т.е. название контекста.</para> </listitem> <listitem> <para ><emphasis >order</emphasis > предписывает системе подсветки не менять текущий контекст (<userinput >#stay</userinput >) или вернуться к предыдущему контексту (<userinput >#pop</userinput >).</para> <para >Чтобы вернуться назад на несколько контекстов, повторите нужное количество раз ключевое слово #pop: <userinput >#pop#pop#pop</userinput ></para> </listitem> </itemizedlist> <para >Некоторые правила могут иметь <emphasis >дочерние правила</emphasis >, которые проверяются только в том случае, если текст соответствует родительскому правилу. Всей совпавшей строке будут присвоены атрибуты, определенные в родительском правиле. Вот пример правила с дочерними правилами:</para> <programlisting ><RuleName (attributes)> <ChildRuleName (attributes) /> ... </RuleName> </programlisting> <para >Параметры конкретных видов правил описаны в следующих разделах.</para> <itemizedlist> <title >Общие атрибуты</title> <para >У любого правила есть следующие атрибуты, <userinput >(common attributes)</userinput >, доступные всегда. <emphasis >attribute</emphasis > и <emphasis >context</emphasis > обязательны, остальные - нет. </para> <listitem> <para ><emphasis >attribute</emphasis >: Атрибут, описывающий определённые <emphasis >itemData</emphasis >.</para> </listitem> <listitem> <para ><emphasis >context</emphasis >: Определяет контекст, на который происходит переключение в случае соответствия правилу.</para> </listitem> <listitem> <para ><emphasis >beginRegion</emphasis >: Начало сворачиваемого блока кода. По умолчанию: не установлен (unset).</para> </listitem> <listitem> <para ><emphasis >endRegion</emphasis >: Окончание сворачиваемого блока кода. По умолчанию: не установлен (unset).</para> </listitem> <listitem> <para >Если <emphasis >lookAhead</emphasis > имеет значение <emphasis >true</emphasis >, то система подсветки больше не будет обрабатывать соответствия. По умолчанию: <emphasis >false</emphasis >.</para> </listitem> <listitem> <para ><emphasis >firstNonSpace</emphasis >: Соответствие, только если строка начинается не с пробела. По умолчанию: <emphasis >false</emphasis >.</para> </listitem> <listitem> <para ><emphasis >column</emphasis >: Соответствие, только если соответствует номер столбца. По умолчанию: не установлено (unset).</para> </listitem> </itemizedlist> <itemizedlist> <title >Динамические правила</title> <para >У некоторых правил есть необязательный атрибут <userinput >dynamic</userinput >, имеющий логическое значение (по умолчанию <emphasis >false</emphasis >). Если dynamic установить <emphasis >true</emphasis >, то правило может использовать метки-заполнители, заменяющие текст, соответствующий правилу <emphasis >регулярного выражения</emphasis >, переключенного к текущему контексту по своим атрибутам <userinput >string</userinput > или <userinput >char</userinput >. В атрибуте <userinput >string</userinput > метка-заполнитель <replaceable >%N</replaceable > (где N - цифра) будет заменена номером <replaceable >N</replaceable > найденного регулярного выражения. В атрибуте <userinput >char</userinput > метка-заполнитель должна быть цифрой <replaceable >N</replaceable >, и будет заменена первым символом <replaceable >N</replaceable > найденного регулярного выражения. Чтобы правило могло использовать эти атрибуты, оно должно содержать параметр <emphasis >(dynamic)</emphasis >.</para> <listitem> <para ><emphasis >dynamic</emphasis >: логический атрибут <emphasis >(true|false)</emphasis >.</para> </listitem> </itemizedlist> <sect2 id="highlighting-rules-in-detail"> <title >Более подробно о правилах</title> <variablelist> <varlistentry> <term >DetectChar</term> <listitem> <para >Проверка на совпадение с одним определенным символом. Используется, например, для определения завершающего символа строки, заключённой в кавычки.</para> <programlisting ><DetectChar char="(character)" (common attributes) (dynamic) /></programlisting> <para >Параметр <userinput >char</userinput > определяет символ.</para> </listitem> </varlistentry> <varlistentry> <term >Detect2Chars</term> <listitem> <para >Проверка на совпадение с двумя символами в заданном порядке.</para> <programlisting ><Detect2Chars char="(character)" char1="(character)" (common attributes) (dynamic) /></programlisting> <para >Параметр <userinput >char</userinput > определяет первый символ для проверки, <userinput >char1</userinput > - второй.</para> </listitem> </varlistentry> <varlistentry> <term >AnyChar</term> <listitem> <para >Проверка на совпадение с любым символом из заданного набора.</para> <programlisting ><AnyChar String="(string)" (common attributes) /></programlisting> <para >Параметр <userinput >String</userinput > содержит набор допустимых символов.</para> </listitem> </varlistentry> <varlistentry> <term >StringDetect</term> <listitem> <para >Проверка на совпадение со строкой.</para> <programlisting ><StringDetect String="(string)" [insensitive="true|false"] (common attributes) (dynamic) /></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 ><RegExpr String="(string)" [insensitive="true|false"] [minimal="true|false"] (common attributes) (dynamic) /></programlisting> <para >Параметр <userinput >String</userinput > определяет регулярное выражение.</para> <para ><userinput >insensitive</userinput > имеет то же значение, что и в предыдущем правиле; по умолчанию установлен <userinput >false</userinput >.</para> <para >Параметр <userinput >minimal</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 ><keyword String="(list name)" (common attributes) /></programlisting> <para >В параметре <userinput >String</userinput > нужно указать название списка ключевых слов. Этот список должен существовать.</para> </listitem> </varlistentry> <varlistentry> <term >Int</term> <listitem> <para >Проверка на целое число.</para> <para ><programlisting ><Int (common attributes) (dynamic) /></programlisting ></para> <para >Это правило не имеет своих параметров. Дочерние правила обычно используются для определения комбинаций символов <userinput >L</userinput > и <userinput >U</userinput > после числа, которые конкретизируют тип целой константы в коде программы. Вообще, все правила могут быть использованы в качестве дочерних, хотя <acronym >DTD</acronym > разрешает использовать в качестве дочернего только правило <userinput >StringDetect</userinput >.</para> <para >Пример проверки на целые числа, следующие за символом 'L'. <programlisting ><Int attribute="Decimal" context="#stay" > <StringDetect attribute="Decimal" context="#stay" String="L" insensitive="true"/> </Int> </programlisting ></para> </listitem> </varlistentry> <varlistentry> <term >Float</term> <listitem> <para >Проверка на число с плавающей точкой.</para> <para ><programlisting ><Float (common attributes) /></programlisting ></para> <para >У этого правила нет особых атрибутов. <userinput >AnyChar</userinput > можно использовать как дочернее, обычно оно используется для проверки комбинаций. Для примера смотрите правило <userinput >Int</userinput >.</para> </listitem> </varlistentry> <varlistentry> <term >HlCOct</term> <listitem> <para >Проверка на восьмеричное число (должно начинаться с нуля).</para> <para ><programlisting ><HlCOct (common attributes) /></programlisting ></para> <para >У этого правила нет особых атрибутов.</para> </listitem> </varlistentry> <varlistentry> <term >HlCHex</term> <listitem> <para >Проверка на шестнадцатеричное число (должно начинаться с символов <quote >0x</quote >).</para> <para ><programlisting ><HlCHex (common attributes) /></programlisting ></para> <para >У этого правила нет особых атрибутов.</para> </listitem> </varlistentry> <varlistentry> <term >HlCStringChar</term> <listitem> <para >Проверка на управляющий символ.</para> <para ><programlisting ><HlCStringChar (common attributes) /></programlisting ></para> <para >У этого правила нет особых атрибутов.</para> <para >Проверка на специальное представление символов, которое используется в языках программирования, например, <userinput >\n</userinput > (переход на новую строку) или <userinput >\t</userinput > (символ табуляции).</para> <para >Следующие символы соответствуют правилу, если они вводятся после обратной черты (<literal >\</literal >): <userinput >abefnrtv"'?\</userinput >. Также будут соответствовать шестнадцатеричные и восьмеричные числа, предварённые обратной чертой (например, <userinput >\xff</userinput > и <userinput >\033</userinput >).</para> </listitem> </varlistentry> <varlistentry> <term >HlCChar</term> <listitem> <para >Проверка на символ C.</para> <para ><programlisting ><HlCChar (common attributes) /></programlisting ></para> <para >У этого правила нет особых атрибутов.</para> <para >Правило находит символы C, заключенные в одинарные кавычки (например, <userinput >'c'</userinput >). Внутри одинарных кавычек может быть как одиночный символ, так и управляющая последовательность, более подробно ознакомиться с которыми можно в описании правила HlCStringChar.</para> </listitem> </varlistentry> <varlistentry> <term >RangeDetect</term> <listitem> <para >Проверка на строку, имеющую заданные начальный и конечный символы.</para> <programlisting ><RangeDetect char="(character)" char1="(character)" (common attributes) /></programlisting> <para ><userinput >char</userinput > определяет символ, с которого начинается строка, а <userinput >char1</userinput > - которым она заканчивается.</para> <para >Это правило может быть использовано для поиска небольших строк, заключенных в кавычки, но, поскольку при проверке правила система подсветки работает с одной строкой, данное правило не сможет определить строку, разбитую символами перевода.</para> </listitem> </varlistentry> <varlistentry> <term >LineContinue</term> <listitem> <para >Проверка на символ перевода строки.</para> <programlisting ><LineContinue (common attributes) /></programlisting> <para >У этого правила нет особых атрибутов.</para> <para >Это правило может быть удобно для переключения контекста в конце строки, если последним знаком будет обратная черта (<userinput >'\'</userinput >). Это необходимо, например, в языках C/C++ для продолжения макросов и строк.</para> </listitem> </varlistentry> <varlistentry> <term >IncludeRules</term> <listitem> <para >Включение правил из другого контекста или языка/файла.</para> <programlisting ><IncludeRules context="contextlink" [includeAttrib="true|false"] /></programlisting> <para >Атрибут <userinput >context</userinput > определяет контекст, из которого берётся правило.</para> <para >Если это простая строка, то включаются все правила из другого контекста, например: <programlisting ><IncludeRules context="anotherContext" /></programlisting ></para> <para >Если строка начинается с <userinput >##</userinput >, то система подсветки найдёт описание для другого языка с указанным названием, например: <programlisting ><IncludeRules context="##C++" /></programlisting ></para> <para >Если <userinput >includeAttrib</userinput > выставить <emphasis >true</emphasis >, атрибут назначения должен быть таким же, как атрибут источника. Это необходимо, например, при вводе комментариев, если текст, соответствующий включаемому контексту, имеет иную подсветку, чем основной контекст. </para> </listitem> </varlistentry> <varlistentry> <term >DetectSpaces</term> <listitem> <para >Поиск пробелов.</para> <programlisting ><DetectSpaces (common attributes) /></programlisting> <para >У этого правила нет особых атрибутов.</para> <para >Используйте это правило, если вы уверены, что в тексте есть несколько пробелов подряд, например в начале строк с отступом. Это правило поможет пропустить все пробелы разом, вместо проверки каждого из них по нескольким параметрам.</para> </listitem> </varlistentry> <varlistentry> <term >DetectIdentifier</term> <listitem> <para >Поиск строк идентификаторов (таких как регулярные выражения: [a-zA-Z_][a-zA-Z0-9_]*).</para> <programlisting ><DetectIdentifier (common attributes) /></programlisting> <para >У этого правила нет особых атрибутов.</para> <para >Используйте это правило, чтобы пропустить все буквенные символы разом, вместо проверки каждого из них по нескольким параметрам.</para> </listitem> </varlistentry> </variablelist> </sect2> <sect2> <title >Подсказки & Советы</title> <itemizedlist> <para >Усвоив принцип действия переключения контекста, вы без труда сможете написать своё определение подсветки. Подумайте о том, в какой ситуации какое правило следует применить. Регулярные выражения - мощное средство, но, по сравнению с другими правилами, очень медленное. Поэтому стоит воспользоваться следующими советами. </para> <listitem> <para >Проверяя на соответствие только пару символов, воспользуйтесь <userinput >Detect2Chars</userinput > вместо <userinput >StringDetect</userinput >. То же относится к <userinput >DetectChar</userinput >.</para> </listitem> <listitem> <para >Регулярные выражения несложны в использовании, но очень часто можно найти более быстрый способ. Допустим, вы ищете символ <userinput >'#'</userinput >, это первый символ строки. Решение с регулярным выражением будет выглядеть примерно так: <programlisting ><RegExpr attribute="Macro" context="macro" String="^\s*#" /></programlisting >. Этой же цели можно достичь значительно быстрее: <programlisting ><DetectChar attribute="Macro" context="macro" char="#" firstNonSpace="true" /></programlisting >. Для поиска регулярного выражения <userinput >'^#'</userinput > можно применить <userinput >DetectChar</userinput > с атрибутом <userinput >column="0"</userinput >. Отсчет для атрибута <userinput >column</userinput > идет посимвольно, поэтому знак табуляции для него - всего один символ. </para> </listitem> <listitem> <para >Можно переключать контексты без специальных символов. Допустим, вы хотите переключить контекст при достижении строки <userinput >*/</userinput >, но в новом контексте хотите продолжить обработку этой строки. Можно воспользоваться нижеследующим правилом, а атрибут <userinput >lookAhead</userinput > заставит систему подсветки сохранить найденную строку для нового контекста. <programlisting ><Detect2Chars attribute="Comment" context="#pop" char="*" char1="/" lookAhead="true" /></programlisting> </para> </listitem> <listitem> <para >Если известно, что в тексте много пробелов, воспользуйтесь <userinput >DetectSpaces</userinput >.</para> </listitem> <listitem> <para >Пользуйтесь <userinput >DetectIdentifier</userinput > вместо регулярного выражения <userinput >'[a-zA-Z_]\w*'</userinput >.</para> </listitem> <listitem> <para >Старайтесь использовать стандартные стили, это удобно для пользователя.</para> </listitem> <listitem> <para >Заглянув в другие XML-файлы, вы узнаете много нового о работе с правилами.</para> </listitem> <listitem> <para >Проверить правильность XML-файла можно командой <command >xmllint --dtdvalid language.dtd mySyntax.xml</command >.</para> </listitem> <listitem> <para >Если сложное регулярное выражение встречается часто, воспользуйтесь <emphasis >ENTITIES</emphasis >. Пример:</para> <programlisting ><?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE language SYSTEM "language.dtd" [ <!ENTITY myref "[A-Za-z_:][\w.:_-]*"> ]> </programlisting> <para >Теперь вместо регулярного выражения можно использовать <emphasis >&myref;</emphasis >.</para> </listitem> </itemizedlist> </sect2> </sect1> </appendix>