Translation by Artem Sereda with my minor changes
[kde-ru.git] / docs / kdesdk / kate / highlighting.docbook
blob93baee3b076c42dace5a1a087cc9a20311258049
1 <appendix id="highlight">
2 <appendixinfo>
3 <authorgroup>
4 <author
5 ><personname
6 ><firstname
7 ></firstname
8 ></personname
9 ></author>
10 <othercredit role="translator"
11 ><firstname
12 >Андрей</firstname
13 ><surname
14 >Балагута</surname
15 ><affiliation
16 ><address
17 ><email
18 >uj2@mail.ru</email
19 ></address
20 ></affiliation
21 ><contrib
22 >Перевод на русский</contrib
23 ></othercredit
24 ><othercredit role="translator"
25 ><firstname
26 >Алексей</firstname
27 ><surname
28 >Опарин</surname
29 ><affiliation
30 ><address
31 ><email
32 >opaleksej@yandex.ru</email
33 ></address
34 ></affiliation
35 ><contrib
36 >Перевод на русский</contrib
37 ></othercredit
38
39 </authorgroup>
40 </appendixinfo>
41 <title
42 >Подсветка синтаксиса</title>
44 <sect1 id="highlight-overview">
46 <title
47 >Обзор</title>
49 <para
50 >Синтаксическая подсветка позволяет отображать текст в редакторе разными цветами и стилями, таким образом отделяя одни синтаксические понятия от других. Например, в исходном тексте программы можно ключевые слова выделить полужирным шрифтом, а типы данных и комментарии отображать разными цветами, выделяя их из основного текста. Это улучшает читаемость документа и повышает продуктивность работы автора.</para>
52 <mediaobject>
53 <imageobject
54 ><imagedata format="PNG" fileref="highlighted.png"/></imageobject>
55 <textobject
56 ><phrase
57 >Функция Perl, отображенная с использованием синтаксической подсветки.</phrase
58 ></textobject>
59 <caption
60 ><para
61 >Функция Perl, отображенная с использованием синтаксической подсветки.</para>
62 </caption>
63 </mediaobject>
65 <mediaobject>
66 <imageobject
67 ><imagedata format="PNG" fileref="unhighlighted.png"/></imageobject>
68 <textobject
69 ><phrase
70 >Та же самая функция, но без подсветки.</phrase
71 ></textobject>
72 <caption
73 ><para
74 >Та же самая функция, но без подсветки.</para
75 ></caption>
76 </mediaobject>
78 <para
79 >Какой из примеров легче читать?</para>
81 <para
82 >&kate; имеет гибкую, легко настраиваемую систему синтаксической подсветки, в стандартную поставку редактора входят правила подсветки синтаксиса для большого числа языков программирования, разметки и других текстовых форматов. Все определения хранятся в простых текстовых файлах в формате &XML;, поэтому вы можете свободно создавать собственные правила.</para>
84 <para
85 >При открытии файла &kate; автоматически подбирает правила подсветки, основываясь на &MIME;-типе (который, в свою очередь, определяется расширением файла) или содержании файла, если расширения нет. Если &kate; неправильно определил тип файла, выберите нужный режим подсветки вручную в меню <menuchoice
86 ><guimenu
87 >Документ</guimenu
88 ><guisubmenu
89 >Режим подсветки</guisubmenu
90 ></menuchoice
91 >.</para>
93 <para
94 >Вы можете настроить стили и цвета доступных синтаксических определений на вкладке <link linkend="config-dialog-editor-appearance"
95 >Схемы</link
96 >диалога <link linkend="config-dialog"
97 >Настройка &kate;</link
98 > , а соответствующие им &MIME;-типы - на вкладке <link linkend="config-dialog-editor-highlighting"
99 >Подсветка</link
100 > .</para>
102 <note>
103 <para
104 >Синтаксическая подсветка улучшает читаемость корректно оформленного текста, но не факт, что текст некорректен, если он неправильно отображается системой подсветки. Синтаксическая разметка текста - достаточно сложный процесс, сложность которого зависит от формата файла, поэтому авторы синтаксических определений считают удачей, если 98% текста отображается корректно, но не стоит забывать об оставшихся 2%.</para>
105 </note>
107 <tip>
108 <para
109 >На сайте &kate; вы можете загрузить обновлённые или дополнительные правила синтаксической подсветки. Для этого нужно щёлкнуть на кнопке <guibutton
110 >Загрузить</guibutton
111 > на вкладке <link linkend="config-dialog-editor-highlighting"
112 >Подсветка</link
113 > диалога <link linkend="config-dialog"
114 >Настройка &kate;</link
115 >.</para>
116 </tip>
118 </sect1>
120 <sect1 id="katehighlight-system">
122 <title
123 >Система синтаксической подсветки &kate;</title>
125 <para
126 >В этом разделе подробно рассматривается механизм синтаксической подсветки &kate;. Прочитав его, вы сможете изменять существующие или создавать свои синтаксические определения.</para>
128 <sect2 id="katehighlight-howitworks">
130 <title
131 >Механизм работы</title>
133 <para
134 >Когда вы открываете файл, первое, что делает &kate; - определяет, какое синтаксическое определение использовать для него. При чтении и наборе система подсветки анализирует текст в редакторе, используя правила, указанные в синтаксическом определении, и помечает границы контекстов и стилей.</para>
136 <para
137 >При вводе система динамически анализирует текст, поэтому, если вы удалите символ, который был помечен как начало или конец контекста, стиль окружающего текста автоматически изменится.</para>
139 <para
140 >Синтаксические определения &kate; хранятся в &XML;-файлах. Они содержат: <itemizedlist>
141 <listitem
142 ><para
143 >Правила определения роли текста, организованного в контекстные блоки</para
144 ></listitem>
145 <listitem
146 ><para
147 >Списки ключевых слов</para
148 ></listitem>
149 <listitem
150 ><para
151 >Определения стилей</para
152 ></listitem>
153 </itemizedlist>
154 </para>
156 <para
157 >Система подсветки анализирует текст последовательно от начала до конца. Указатель анализатора перемещается от символа к символу, проверяя текст на соответствие правилам и помечая границы контекстов. Правила применяются к текущей строке в порядке их объявления, и при соответствии к ней применяется контекст, указанный в правиле. После этого указатель смещается на конец области соответствия и начинается новый цикл проверки правил, принадлежащих установленному контексту.</para>
159 </sect2>
161 <sect2 id="highlight-system-rules">
162 <title
163 >Правила</title>
165 <para
166 >Правила - это сердце системы подсветки. Правило может быть строкой, символом или <link linkend="regular-expressions"
167 >регулярным выражением</link
168 >, с которым сравнивается текст документа. Оно содержит информацию о стиле, который будет применен к тексту, если последний соответствует правилу. Оно может переключить текущий контекст системы на явно указанный или предыдущий контекст.</para>
170 <para
171 >Правила организованы в контекстные группы. Контекстная группа используется для определения главных понятий в формате, например, строка, заключенная в двойные кавычки, или блок комментария в исходном тексте программы. Такая организация правил позволяет предотвратить проверку правил, неприменимых к текущему контексту (правил из других контекстов). Эта структура делает систему подсветки более гибкой, позволяя определять одинаковые правила в разных контекстах, что делает возможным одинаковые последовательности символов отображать разными стилями в зависимости от контекста, в котором они находятся. </para>
173 <para
174 >Контексты могут образовываться динамически, чтобы сделать возможным использование правил, справедливых для данного момента.</para>
176 </sect2>
178 <sect2 id="highlight-context-styles-keywords">
179 <title
180 >Стили контекстов и ключевые слова</title>
182 <para
183 >В некоторых языках программирования целые и вещественные числа трактуются компилятором по-разному (компилятор - это программа, которая преобразует исходный текст программы в двоичный исполняемый файл). Синтаксис языка может определять символы, имеющие специальное значение, если они находятся в строке, заключенной в кавычки. В этих случаях есть смысл выделять их в тексте для более удобного чтения. Иногда бывает полезно выделять символы, не имеющие специального значения - это тоже под силу системе синтаксической подсветки &kate;.</para>
185 <para
186 >Синтаксическое определение может содержать столько стилей, сколько нужно для данного формата.</para>
188 <para
189 >Во многих форматах существуют списки слов, имеющих специальное значение. Например, в языках программирования такими словами будут являться управляющие операторы, названия типов данных и встроенные функции. Это концептуальные слова, поскольку они определяют саму суть синтаксиса. Система синтаксической подсветки &kate; использует списки подобных слов, чтобы подчеркнуть концептуальные элементы формата.</para>
191 </sect2>
193 <sect2 id="kate-highlight-system-default-styles">
194 <title
195 >Стили по умолчанию</title>
197 <para
198 >Если вы откроете файл исходного кода на C++, на &Java; или документ <acronym
199 >HTML</acronym
200 >, то увидите, что разные форматы отображаются в одних и тех же цветах. Дело в том, что &kate; содержит предустановленный набор стандартных стилей. Синтаксические определения по возможности используют этот набор.</para>
202 <para
203 >Это позволяет подобным образом отображать похожие концепции в различных форматах. Например, комментарии есть почти во всех языках программирования, разметки и скриптах.</para>
205 <tip>
206 <para
207 >Каждый стиль в синтаксическом определении основывается на одном из стандартных стилей. Поэтому, если вы часто используете какой-то формат с большим количеством стилей, следует проверить его конфигурацию на предмет их совпадения. Приведём небольшой пример. В &kate; определен всего один стандартный стиль для отображения строковых констант, но в языке программирования Perl существует два вида строк. Согласитесь, было бы гораздо лучше отображать их по разному - вы заходите в диалоговое окно настройки &kate; и изменяете соответствующие стили. Все <link linkend="kate-highlight-default-styles"
208 >доступные стандартные стили</link
209 > будут рассмотрены позже.</para>
210 </tip>
212 </sect2>
214 </sect1>
216 <sect1 id="katehighlight-xml-format">
217 <title
218 >&XML;-формат определения синтаксической подсветки</title>
220 <sect2>
221 <title
222 >Обзор</title>
224 <para
225 >В этом разделе вы познакомитесь с &XML;-форматом определения синтаксической подсветки. Вначале, на небольшом примере, будут кратко объяснены главные компоненты и их значение, затем мы более подробно остановимся на правилах подсветки.</para>
227 <para
228 >Формальное определение (<acronym
229 >DTD</acronym
230 >) находится в файле <filename
231 >language.dtd</filename
232 >, в каталоге <filename
233 >$<envar
234 >KDEDIR</envar
235 >/share/apps/katepart/syntax</filename
236 >. </para>
238 <variablelist>
239 <title
240 >Основные разделы файла определения синтаксической подсветки &kate;</title>
242 <varlistentry>
243 <term
244 >В заголовке файла подсветки указаны версия XML и тип документа:</term>
245 <listitem>
246 <programlisting
247 >&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
248 &lt;!DOCTYPE language SYSTEM &quot;language.dtd&quot;&gt;
249 </programlisting>
250 </listitem>
251 </varlistentry>
253 <varlistentry>
254 <term
255 >Главная часть файла определений - элемент <userinput
256 >language</userinput
257 >. Доступные атрибуты:</term>
259 <listitem>
260 <para
261 >Необходимые атрибуты:</para>
262 <para
263 ><userinput
264 >name</userinput
265 > определяет название языка. Впоследствии оно появляется во всех меню и диалогах.</para>
266 <para
267 ><userinput
268 >section</userinput
269 > указывает категорию.</para>
270 <para
271 ><userinput
272 >extensions</userinput
273 > определяет расширения файлов, вроде &quot;*.cpp;*.h&quot;</para>
275 <para
276 >Дополнительные атрибуты:</para>
277 <para
278 ><userinput
279 >mimetype</userinput
280 > связывает файл с определенным типом &MIME;.</para>
281 <para
282 ><userinput
283 >version</userinput
284 > указывает текущую версию файла определений.</para>
285 <para
286 ><userinput
287 >kateversion</userinput
288 > указывает новейшую из поддерживаемых версий &kate;.</para>
289 <para
290 ><userinput
291 >casesensitive</userinput
292 > определяет чувствительность ключевых слов к регистру.</para>
293 <para
294 ><userinput
295 >priority</userinput
296 > определяет приоритет в случае использования разных правил подсветки. Действует правило с высшим приоритетом.</para>
297 <para
298 ><userinput
299 >author</userinput
300 > содержит имя и email-адрес автора.</para>
301 <para
302 ><userinput
303 >license</userinput
304 > содержит лицензию, обычно LGPL, Artistic, GPL и т.п.</para>
305 <para
306 ><userinput
307 >hidden</userinput
308 > определяет, будет ли отображаться название в меню &kate;.</para>
309 <para
310 >Итак, следующая строка может быть примерно такой:</para>
311 <programlisting
312 >&lt;language name=&quot;C++&quot; version=&quot;1.00&quot; kateversion=&quot;2.4&quot; section=&quot;Sources&quot; extensions=&quot;*.cpp;*.h&quot; /&gt;
313 </programlisting>
314 </listitem>
315 </varlistentry>
318 <varlistentry>
319 <term
320 >Следующий элемент - <userinput
321 >highlighting</userinput
322 >, состоящий из необязательного <userinput
323 >list</userinput
324 > и обязательных - <userinput
325 >contexts</userinput
326 > и <userinput
327 >itemDatas</userinput
328 >.</term>
329 <listitem>
330 <para
331 >Элемент <userinput
332 >list</userinput
333 > содержит список ключевых слов. В нашем случае это <emphasis
334 >class</emphasis
335 > и <emphasis
336 >const</emphasis
337 >.Списков можете добавить, сколько хотите.</para>
338 <para
339 >Элемент <userinput
340 >contexts</userinput
341 > содержит все контексты. По умолчанию, подсветка начинается с первого контекста. В контексте <emphasis
342 >Normal Text</emphasis
343 > есть два правила, одно из которых проверяет наличие в тексте <emphasis
344 >слов</emphasis
345 >, соответствующих списку ключевых слов, другое определяет наличие кавычек и переключает контекст к <emphasis
346 >строковому</emphasis
347 > типу. Подробнее правила описаны в следующей главе.</para>
348 <para
349 >Элемент <userinput
350 >itemDatas</userinput
351 > содержит сведения о цветах и стилях, применяющихся в контекстах и правилах. В нашем примере <userinput
352 >itemData</userinput
353 > использует контексты <emphasis
354 >Normal Text</emphasis
355 >, <emphasis
356 >String</emphasis
357 > и <emphasis
358 >Keyword</emphasis
359 >. </para>
360 <programlisting
361 >&lt;highlighting&gt;
362     &lt;list name=&quot;somename&quot;&gt;
363       &lt;item&gt; class &lt;/item&gt;
364       &lt;item&gt; const &lt;/item&gt;
365     &lt;/list&gt;
366     &lt;contexts&gt;
367       &lt;context attribute=&quot;Normal Text&quot; lineEndContext=&quot;#pop&quot; name=&quot;Normal Text&quot; &gt;
368         &lt;keyword attribute=&quot;Keyword&quot; context=&quot;#stay&quot; String=&quot;somename&quot; /&gt;
369         &lt;DetectChar attribute=&quot;String&quot; context=&quot;string&quot; char=&quot;&amp;quot;&quot; /&gt;
370       &lt;/context&gt;
371       &lt;context attribute=&quot;String&quot; lineEndContext=&quot;#stay&quot; name=&quot;string&quot; &gt;
372         &lt;DetectChar attribute=&quot;String&quot; context=&quot;#pop&quot; char=&quot;&amp;quot;&quot; /&gt;
373       &lt;/context&gt;
374     &lt;/contexts&gt;
375     &lt;itemDatas&gt;
376       &lt;itemData name=&quot;Normal Text&quot; defStyleNum=&quot;dsNormal&quot; /&gt;
377       &lt;itemData name=&quot;Keyword&quot; defStyleNum=&quot;dsKeyword&quot; /&gt;
378       &lt;itemData name=&quot;String&quot; defStyleNum=&quot;dsString&quot; /&gt;
379     &lt;/itemDatas&gt;
380   &lt;/highlighting&gt;
381 </programlisting>
382 </listitem>
383 </varlistentry>
385 <varlistentry>
386 <term
387 > Последня часть файла определения синтаксической подсветки - необязательный раздел <userinput
388 >general</userinput
389 >. Здесь могут содержаться сведения о ключевых словах, сворачивании блоков кода, комментариях и отступах.</term>
391 <listitem>
392 <para
393 >Раздел <userinput
394 >comment</userinput
395 > определяет, какой строкой вводится однострочный комментарий. Можно пользоваться также многострочными комментариями, используя <emphasis
396 >multiLine</emphasis
397 > с дополнительным атрибутом <emphasis
398 >end</emphasis
399 >. Это используется тогда, когда пользователь нажимает комбинацию клавиш, назначенную для действия <emphasis
400 >закомментировать/раскомментировать</emphasis
401 >.</para>
402 <para
403 >Секция <userinput
404 >keywords</userinput
405 > определяет чувствительность ключевых слов к регистру. Остальные атрибуты рассмотрим позднее.</para>
406 <programlisting
407 >&lt;general&gt;
408     &lt;comments&gt;
409       &lt;comment name="singleLine" start="#"/&gt;
410     &lt;/comments&gt;
411     &lt;keywords casesensitive="1"/&gt;
412   &lt;/general&gt;
413 &lt;/language&gt;
414 </programlisting>
415 </listitem>
416 </varlistentry>
418 </variablelist>
421 </sect2>
423 <sect2 id="kate-highlight-sections">
424 <title
425 >Более подробно о разделах</title>
426 <para
427 >В этой части указаны все возможные атрибуты для контекстов, itemDatas, ключевых слов, комментариев, сворачивания кодов и отступов.</para>
429 <variablelist>
430 <varlistentry>
431 <term
432 >Элемент <userinput
433 >context</userinput
434 > относится к группе <userinput
435 >contexts</userinput
436 >. Контекстом определяются некоторые особые правила (например, что происходит при достижении подсвеченной структурой конца строки). Доступные атрибуты:</term>
439 <listitem>
440 <para
441 ><userinput
442 >name</userinput
443 > - название контекста. Правила используют это название для переключения на указанный контекст.</para>
444 <para
445 ><userinput
446 >lineEndContext</userinput
447 > определяет, на какой контекст подсвеченная структура переключается при достижении конца строки. Это может быть название другого контекста, <userinput
448 >#stay</userinput
449 >, если контекст не меняется (т.е. не делать ничего) или <userinput
450 >#pop</userinput
451 > для выхода из контекста. Например, набор <userinput
452 >#pop#pop#pop</userinput
453 > приведет к троекратному выходу из контекста.</para>
454 <para
455 ><userinput
456 >lineBeginContext</userinput
457 > определяет контекст при достижении начала строки. По умолчанию: #stay.</para>
458 <para
459 ><userinput
460 >fallthrough</userinput
461 > определяет поведение в случае переключения подсвеченной структуры на контекст, указанный в fallthroughContext, если не найдено соответствующее правило. По умолчанию: <emphasis
462 >false</emphasis
463 >.</para>
464 <para
465 ><userinput
466 >fallthroughContext</userinput
467 > указывает следующий контекст, если не найдено соответствующее правило.</para>
468 <para
469 >Если <userinput
470 >dynamic</userinput
471 > имеет значение <emphasis
472 >true</emphasis
473 >, то контекст запоминает строки/метки-заполнители, сохранённые в динамических правилах. Это необходимо, например, для текущих документов. По умолчанию: <emphasis
474 >false</emphasis
475 >.</para>
476 </listitem>
477 </varlistentry>
480 <varlistentry>
481 <term
482 >Элемент <userinput
483 >itemData</userinput
484 > принадлежит группе <userinput
485 >itemDatas</userinput
486 >. Он определяет стиль и цвет шрифта, их можно устанавливать самому в тех случаях, когда это необходимо. И все же, рекомендуется придерживаться стандартных стилей, чтобы помочь пользователю свободно ориентироваться в любом языке . Название атрибута (name) и defStyleNum обязательны, остальные нет. Доступные атрибуты:</term>
488 <listitem>
489 <para
490 ><userinput
491 >name</userinput
492 > даёт название itemData. Контексты и правила будут использовать это название при обращении к itemData в своих атрибутах <emphasis
493 >attribute</emphasis
494 >.</para>
495 <para
496 ><userinput
497 >defStyleNum</userinput
498 > определяет стиль, используемый по умолчанию. Доступные стандартные стили будут детально описаны ниже.</para>
499 <para
500 ><userinput
501 >color</userinput
502 > определяет цвет. Правильные форматы '#rrggbb' или '#rgb'.</para>
503 <para
504 ><userinput
505 >selColor</userinput
506 > определяет цвет выделенного текста.</para>
507 <para
508 >Если <userinput
509 >italic</userinput
510 > имеет значение <emphasis
511 >true</emphasis
512 >, шрифт будет курсивным.</para>
513 <para
514 >Если <userinput
515 >bold</userinput
516 > имеет значение <emphasis
517 >true</emphasis
518 >, шрифт будет полужирным.</para>
519 <para
520 >Если <userinput
521 >underline</userinput
522 > имеет значение <emphasis
523 >true</emphasis
524 >, текст будет подчёркнут.</para>
525 <para
526 >Если <userinput
527 >strikeout</userinput
528 > имеет значение <emphasis
529 >true</emphasis
530 >, текст будет зачёркнут.</para>
531 </listitem>
532 </varlistentry>
535 <varlistentry>
536 <term
537 >Элемент <userinput
538 >keywords</userinput
539 > в группе <userinput
540 >general</userinput
541 > определяет свойства ключевых слов. Доступные атрибуты:</term>
543 <listitem>
544 <para
545 ><userinput
546 >casesensitive</userinput
547 > может быть <emphasis
548 >true</emphasis
549 > или <emphasis
550 >false</emphasis
551 >. Если <emphasis
552 >true</emphasis
553 >, все ключевые слова будут проверяться на соответствие с учетом регистра</para>
554 <para
555 ><userinput
556 >weakDeliminator</userinput
557 > - это группа знаков, которые не могут разделять слова. Например, точка <userinput
558 >'.'</userinput
559 > - разделитель слов. Если ключевое слово в <userinput
560 >list</userinput
561 > содержит точку, оно будет использовано по назначению только, если точка будет определена как "нетвердый разделитель" (weak delimiter).</para>
562 <para
563 ><userinput
564 >additionalDeliminator</userinput
565 > определяют дополнительные разделители.</para>
566 <para
567 ><userinput
568 >wordWrapDeliminator</userinput
569 > определяют символы, после которых может происходить перевод строки.</para>
570 <para
571 >По умолчанию разделителями слов и строк являются символы <userinput
572 >.():!+,-&lt;=&gt;%&amp;*/;?[]^{|}~\</userinput
573 >, пробел (<userinput
574 >' '</userinput
575 >) и табуляция (<userinput
576 >'\t'</userinput
577 >).</para>
578 </listitem>
579 </varlistentry>
582 <varlistentry>
583 <term
584 >Элемент <userinput
585 >comment</userinput
586 > в группе <userinput
587 >comments</userinput
588 > определяет свойства комментариев, которые используются в меню<menuchoice
589 ><guimenu
590 >Сервис</guimenu
591 ><guimenuitem
592 >Закомментировать</guimenuitem
593 ></menuchoice
594 > и <menuchoice
595 ><guimenu
596 >Сервис</guimenu
597 ><guimenuitem
598 >Раскомментировать</guimenuitem
599 ></menuchoice
600 >. Доступные атрибуты:</term>
602 <listitem>
603 <para
604 ><userinput
605 >name</userinput
606 > может быть <emphasis
607 >singleLine</emphasis
608 > или <emphasis
609 >multiLine</emphasis
610 >. Если выбрать <emphasis
611 >multiLine</emphasis
612 >, то потребуются атрибуты <emphasis
613 >end</emphasis
614 > и <emphasis
615 >region</emphasis
616 >.</para>
617 <para
618 ><userinput
619 >start</userinput
620 > указывает строку начала комментария. В C++ это может быть &quot;/*&quot;.</para>
621 <para
622 ><userinput
623 >end</userinput
624 > указывает строку окончания комментария. В C++ это может быть &quot;*/&quot;.</para>
625 <para
626 ><userinput
627 >region</userinput
628 > должно быть названием сворачиваемого многострочного комментария. Допустим, если в ваших правилах указано <emphasis
629 >beginRegion="Comment"</emphasis
630 > ... <emphasis
631 >endRegion="Comment"</emphasis
632 >, вы должны использовать <emphasis
633 >region="Comment"</emphasis
634 >. В этом случае раскомментирование будет действовать, даже если не будет выделен весь текст многострочного комментария. Достаточно будет просто поместить курсор в его пределы.</para>
635 </listitem>
636 </varlistentry>
639 <varlistentry>
640 <term
641 >Элемент <userinput
642 >folding</userinput
643 > в группе <userinput
644 >general</userinput
645 > определяет свойства сворачивания кода. Доступные атрибуты:</term>
647 <listitem>
648 <para
649 >Если <userinput
650 >indentationsensitive</userinput
651 > имеет значение <emphasis
652 >true</emphasis
653 >, то маркёры сворачивания кода будут располагаться с учетом отступов, как в языке сценариев Python. Чаще всего в этом нет необходимости, поэтому по умолчанию этот параметр определен как <emphasis
654 >false</emphasis
655 >.</para>
656 </listitem>
657 </varlistentry>
660 <varlistentry>
661 <term
662 >Элемент <userinput
663 >indentation</userinput
664 > в группе <userinput
665 >general</userinput
666 > определяет формат отступов, однако мы настоятельно рекомендуем не менять этот элемент, так как отступы обычно определяются типом файла или добавлением режимной строки в текстовый файл. Если вы всё-таки укажете способ отступа, он может оказаться навязанным пользователю, которому совсем не нужен. Доступные атрибуты:</term>
668 <listitem>
669 <para
670 ><userinput
671 >mode</userinput
672 > - название формата отступов. Доступные форматы: <emphasis
673 >normal, cstyle, csands, xml, python</emphasis
674 > и <emphasis
675 >varindent</emphasis
676 >.</para>
677 </listitem>
678 </varlistentry>
681 </variablelist>
684 </sect2>
686 <sect2 id="kate-highlight-default-styles">
687 <title
688 >Стандартные стили</title>
689 <para
690 >Стандартные стили уже были кратко <link linkend="kate-highlight-system-default-styles"
691 >описаны</link
692 >: Стандартные стили предопределяют настройки цветов и шрифтов.</para>
693 <variablelist>
694 <varlistentry>
695 <term
696 >Здесь приведен только список доступных стандартных стилей:</term>
697 <listitem>
698 <para
699 ><userinput
700 >dsNormal</userinput
701 >, для нормального текста.</para>
702 <para
703 ><userinput
704 >dsKeyword</userinput
705 >, для ключевых слов.</para>
706 <para
707 ><userinput
708 >dsDataType</userinput
709 >, для типов данных.</para>
710 <para
711 ><userinput
712 >dsDecVal</userinput
713 >, для десятичных значений.</para>
714 <para
715 ><userinput
716 >dsBaseN</userinput
717 >, для значений с основанием, отличным от10.</para>
718 <para
719 ><userinput
720 >dsFloat</userinput
721 >, для значений с плавающей точкой.</para>
722 <para
723 ><userinput
724 >dsChar</userinput
725 >, для символов.</para>
726 <para
727 ><userinput
728 >dsString</userinput
729 >, для строк.</para>
730 <para
731 ><userinput
732 >dsComment</userinput
733 >, для комментариев.</para>
734 <para
735 ><userinput
736 >dsOthers</userinput
737 >, для всего остального.</para>
738 <para
739 ><userinput
740 >dsAlert</userinput
741 >, для вывода предупреждений.</para>
742 <para
743 ><userinput
744 >dsFunction</userinput
745 >, для вызова функций.</para>
746 <para
747 ><userinput
748 >dsRegionMarker</userinput
749 >, для маркёров участков.</para>
750 <para
751 ><userinput
752 >dsError</userinput
753 >, для подсветки ошибок и неверного синтаксиса.</para>
754 </listitem>
755 </varlistentry>
756 </variablelist>
758 </sect2>
760 </sect1>
762 <sect1 id="kate-highlight-rules-detailled">
763 <title
764 >Синтаксические правила</title>
766 <para
767 >В этом разделе описываются синтаксические правила.</para>
769 <para
770 >При анализе строки каждое правило может <quote
771 >запросить</quote
772 > на проверку любое количество символов (даже ноль). Если правило подходит, к соответствующим символам применяется стиль или <emphasis
773 >атрибут</emphasis
774 >, определённый в правиле. Применяемое правило также может запросить переключение текущего контекста.</para>
776 <para
777 >Правило выглядит примерно так:</para>
779 <programlisting
780 >&lt;RuleName attribute=&quot;(identifier)&quot; context=&quot;(identifier)&quot; [rule specific attributes] /&gt;</programlisting>
782 <para
783 >Параметр <emphasis
784 >attribute</emphasis
785 > указывает, какой стиль применить к  символам, соответствующим правилу. Параметр <emphasis
786 >context</emphasis
787 > определяет контекст, который будет установлен в случае применения правила.</para>
789 <para
790 >Параметр <emphasis
791 >context</emphasis
792 > может принимать следующие значения:</para>
794 <itemizedlist>
795 <listitem>
796 <para
797 ><emphasis
798 >Идентификатор</emphasis
799 >, т.е. название контекста.</para>
800 </listitem>
801 <listitem>
802 <para
803 ><emphasis
804 >order</emphasis
805 > предписывает системе подсветки не менять текущий контекст (<userinput
806 >#stay</userinput
807 >) или вернуться к предыдущему контексту (<userinput
808 >#pop</userinput
809 >).</para>
810 <para
811 >Чтобы вернуться назад на несколько контекстов, повторите нужное количество раз ключевое слово #pop: <userinput
812 >#pop#pop#pop</userinput
813 ></para>
814 </listitem>
815 </itemizedlist>
817 <para
818 >Некоторые правила могут иметь <emphasis
819 >дочерние правила</emphasis
820 >, которые проверяются только в том случае, если текст соответствует родительскому правилу. Всей совпавшей строке будут присвоены атрибуты, определенные в родительском правиле. Вот пример правила с дочерними правилами:</para>
822 <programlisting
823 >&lt;RuleName (attributes)&gt;
824   &lt;ChildRuleName (attributes) /&gt;
825   ...
826 &lt;/RuleName&gt;
827 </programlisting>
830 <para
831 >Параметры конкретных видов правил описаны в следующих разделах.</para>
834 <itemizedlist>
835 <title
836 >Общие атрибуты</title>
837 <para
838 >У любого правила есть следующие атрибуты, <userinput
839 >(common attributes)</userinput
840 >, доступные всегда. <emphasis
841 >attribute</emphasis
842 > и <emphasis
843 >context</emphasis
844 > обязательны, остальные - нет. </para>
846 <listitem>
847 <para
848 ><emphasis
849 >attribute</emphasis
850 >: Атрибут, описывающий определённые <emphasis
851 >itemData</emphasis
852 >.</para>
853 </listitem>
854 <listitem>
855 <para
856 ><emphasis
857 >context</emphasis
858 >: Определяет контекст, на который происходит переключение в случае соответствия правилу.</para>
859 </listitem>
860 <listitem>
861 <para
862 ><emphasis
863 >beginRegion</emphasis
864 >: Начало сворачиваемого блока кода. По умолчанию: не установлен (unset).</para>
865 </listitem>
866 <listitem>
867 <para
868 ><emphasis
869 >endRegion</emphasis
870 >: Окончание сворачиваемого блока кода. По умолчанию: не установлен (unset).</para>
871 </listitem>
872 <listitem>
873 <para
874 >Если <emphasis
875 >lookAhead</emphasis
876 > имеет значение <emphasis
877 >true</emphasis
878 >, то система подсветки больше не будет обрабатывать соответствия. По умолчанию: <emphasis
879 >false</emphasis
880 >.</para>
881 </listitem>
882 <listitem>
883 <para
884 ><emphasis
885 >firstNonSpace</emphasis
886 >: Соответствие, только если строка начинается не с пробела. По умолчанию: <emphasis
887 >false</emphasis
888 >.</para>
889 </listitem>
890 <listitem>
891 <para
892 ><emphasis
893 >column</emphasis
894 >: Соответствие, только если соответствует номер столбца. По умолчанию: не установлено (unset).</para>
895 </listitem>
896 </itemizedlist>
898 <itemizedlist>
899 <title
900 >Динамические правила</title>
901 <para
902 >У некоторых правил есть необязательный атрибут <userinput
903 >dynamic</userinput
904 >, имеющий логическое значение (по умолчанию <emphasis
905 >false</emphasis
906 >). Если dynamic установить <emphasis
907 >true</emphasis
908 >, то правило может использовать метки-заполнители, заменяющие текст, соответствующий правилу <emphasis
909 >регулярного выражения</emphasis
910 >, переключенного к текущему контексту по своим атрибутам <userinput
911 >string</userinput
912 > или <userinput
913 >char</userinput
914 >. В атрибуте <userinput
915 >string</userinput
916 > метка-заполнитель <replaceable
917 >%N</replaceable
918 > (где N - цифра) будет заменена номером <replaceable
919 >N</replaceable
920 > найденного регулярного выражения. В атрибуте <userinput
921 >char</userinput
922 > метка-заполнитель должна быть цифрой <replaceable
923 >N</replaceable
924 >, и будет заменена первым символом <replaceable
925 >N</replaceable
926 > найденного регулярного выражения. Чтобы правило могло использовать эти атрибуты, оно должно содержать параметр <emphasis
927 >(dynamic)</emphasis
928 >.</para>
930 <listitem>
931 <para
932 ><emphasis
933 >dynamic</emphasis
934 >: логический атрибут <emphasis
935 >(true|false)</emphasis
936 >.</para>
937 </listitem>
938 </itemizedlist>
940 <sect2 id="highlighting-rules-in-detail">
941 <title
942 >Более подробно о правилах</title>
944 <variablelist>
945 <varlistentry>
946 <term
947 >DetectChar</term>
948 <listitem>
949 <para
950 >Проверка на совпадение с одним определенным символом. Используется, например, для определения завершающего символа строки, заключённой в кавычки.</para>
951 <programlisting
952 >&lt;DetectChar char=&quot;(character)&quot; (common attributes) (dynamic) /&gt;</programlisting>
953 <para
954 >Параметр <userinput
955 >char</userinput
956 > определяет символ.</para>
957 </listitem>
958 </varlistentry>
960 <varlistentry>
961 <term
962 >Detect2Chars</term>
963 <listitem>
964 <para
965 >Проверка на совпадение с двумя символами в заданном порядке.</para>
966 <programlisting
967 >&lt;Detect2Chars char=&quot;(character)&quot; char1=&quot;(character)&quot; (common attributes) (dynamic) /&gt;</programlisting>
968 <para
969 >Параметр <userinput
970 >char</userinput
971 > определяет первый символ для проверки, <userinput
972 >char1</userinput
973 > - второй.</para>
974 </listitem>
975 </varlistentry>
977 <varlistentry>
978 <term
979 >AnyChar</term>
980 <listitem>
981 <para
982 >Проверка на совпадение с любым символом из заданного набора.</para>
983 <programlisting
984 >&lt;AnyChar String=&quot;(string)&quot; (common attributes) /&gt;</programlisting>
985 <para
986 >Параметр <userinput
987 >String</userinput
988 > содержит набор допустимых символов.</para>
989 </listitem>
990 </varlistentry>
992 <varlistentry>
993 <term
994 >StringDetect</term>
995 <listitem>
996 <para
997 >Проверка на совпадение со строкой.</para>
998 <programlisting
999 >&lt;StringDetect String=&quot;(string)&quot; [insensitive=&quot;true|false&quot;] (common attributes) (dynamic) /&gt;</programlisting>
1000 <para
1001 >Параметр <userinput
1002 >String</userinput
1003 > должен содержать строку, которую нужно проверить на соответствие. Атрибут <userinput
1004 >insensitive</userinput
1005 > по умолчанию имеет значение <userinput
1006 >false</userinput
1007 >, он влияет на сравнение строк. Если этот параметр установлен <userinput
1008 >true</userinput
1009 >, функция сравнения не будет учитывать регистр символов.</para>
1010 </listitem>
1011 </varlistentry>
1013 <varlistentry>
1014 <term
1015 >RegExpr</term>
1016 <listitem>
1017 <para
1018 >Проверка на совпадение с регулярным выражением.</para>
1019 <programlisting
1020 >&lt;RegExpr String=&quot;(string)&quot; [insensitive=&quot;true|false&quot;] [minimal=&quot;true|false&quot;] (common attributes) (dynamic) /&gt;</programlisting>
1021 <para
1022 >Параметр <userinput
1023 >String</userinput
1024 > определяет регулярное выражение.</para>
1025 <para
1026 ><userinput
1027 >insensitive</userinput
1028 > имеет то же значение, что и в предыдущем правиле; по умолчанию установлен <userinput
1029 >false</userinput
1030 >.</para>
1031 <para
1032 >Параметр <userinput
1033 >minimal</userinput
1034 > по умолчанию имеет значение <userinput
1035 >false</userinput
1036 > и передаётся функции обработки регулярных выражений.</para>
1037 <para
1038 >Символ перевода каретки (<literal
1039 >^</literal
1040 >) в начале регулярного выражения говорит о том, что данное правило будет применяться только к тем цепочкам символов, которые начинаются с новой строки.</para>
1041 <para
1042 >Более подробно регулярные выражения рассматриваются в разделе <link linkend="regular-expressions"
1043 ><quote
1044 >Регулярные выражения</quote
1045 ></link
1046 >.</para>
1047 </listitem>
1048 </varlistentry>
1050 <varlistentry>
1051 <term
1052 >keyword</term>
1053 <listitem>
1054 <para
1055 >Проверка на ключевое слово из указанного списка.</para>
1056 <programlisting
1057 >&lt;keyword String=&quot;(list name)&quot; (common attributes) /&gt;</programlisting>
1058 <para
1059 >В параметре <userinput
1060 >String</userinput
1061 > нужно указать название списка ключевых слов. Этот список должен существовать.</para>
1062 </listitem>
1063 </varlistentry>
1065 <varlistentry>
1066 <term
1067 >Int</term>
1068 <listitem>
1069 <para
1070 >Проверка на целое число.</para>
1071 <para
1072 ><programlisting
1073 >&lt;Int (common attributes) (dynamic) /&gt;</programlisting
1074 ></para>
1075 <para
1076 >Это правило не имеет своих параметров. Дочерние правила обычно используются для определения комбинаций символов <userinput
1077 >L</userinput
1078 > и <userinput
1079 >U</userinput
1080 > после числа, которые конкретизируют тип целой константы в коде программы. Вообще, все правила могут быть использованы в качестве дочерних, хотя <acronym
1081 >DTD</acronym
1082 > разрешает использовать в качестве дочернего только правило <userinput
1083 >StringDetect</userinput
1084 >.</para>
1085 <para
1086 >Пример проверки на целые числа, следующие за символом 'L'. <programlisting
1087 >&lt;Int attribute="Decimal" context="#stay" &gt;
1088   &lt;StringDetect attribute="Decimal" context="#stay" String="L" insensitive="true"/&gt;
1089 &lt;/Int&gt;
1090 </programlisting
1091 ></para>
1093 </listitem>
1094 </varlistentry>
1096 <varlistentry>
1097 <term
1098 >Float</term>
1099 <listitem>
1100 <para
1101 >Проверка на число с плавающей точкой.</para>
1102 <para
1103 ><programlisting
1104 >&lt;Float (common attributes) /&gt;</programlisting
1105 ></para>
1106 <para
1107 >У этого правила нет особых атрибутов. <userinput
1108 >AnyChar</userinput
1109 > можно использовать как дочернее, обычно оно используется для проверки комбинаций. Для примера смотрите правило <userinput
1110 >Int</userinput
1111 >.</para>
1112 </listitem>
1113 </varlistentry>
1115 <varlistentry>
1116 <term
1117 >HlCOct</term>
1118 <listitem>
1119 <para
1120 >Проверка на восьмеричное число (должно начинаться с нуля).</para>
1121 <para
1122 ><programlisting
1123 >&lt;HlCOct (common attributes) /&gt;</programlisting
1124 ></para>
1125 <para
1126 >У этого правила нет особых атрибутов.</para>
1127 </listitem>
1128 </varlistentry>
1130 <varlistentry>
1131 <term
1132 >HlCHex</term>
1133 <listitem>
1134 <para
1135 >Проверка на шестнадцатеричное число (должно начинаться с символов <quote
1136 >0x</quote
1137 >).</para>
1138 <para
1139 ><programlisting
1140 >&lt;HlCHex (common attributes) /&gt;</programlisting
1141 ></para>
1142 <para
1143 >У этого правила нет особых атрибутов.</para>
1144 </listitem>
1145 </varlistentry>
1147 <varlistentry>
1148 <term
1149 >HlCStringChar</term>
1150 <listitem>
1151 <para
1152 >Проверка на управляющий символ.</para>
1153 <para
1154 ><programlisting
1155 >&lt;HlCStringChar (common attributes) /&gt;</programlisting
1156 ></para>
1157 <para
1158 >У этого правила нет особых атрибутов.</para>
1160 <para
1161 >Проверка на специальное представление символов, которое используется в языках программирования, например, <userinput
1162 >\n</userinput
1163 > (переход на новую строку) или <userinput
1164 >\t</userinput
1165 > (символ табуляции).</para>
1167 <para
1168 >Следующие символы соответствуют правилу, если они вводятся после обратной черты (<literal
1169 >\</literal
1170 >): <userinput
1171 >abefnrtv&quot;'?\</userinput
1172 >. Также будут соответствовать шестнадцатеричные и восьмеричные числа, предварённые обратной чертой (например, <userinput
1173 >\xff</userinput
1174 > и <userinput
1175 >\033</userinput
1176 >).</para>
1178 </listitem>
1179 </varlistentry>
1181 <varlistentry>
1182 <term
1183 >HlCChar</term>
1184 <listitem>
1185 <para
1186 >Проверка на символ C.</para>
1187 <para
1188 ><programlisting
1189 >&lt;HlCChar (common attributes) /&gt;</programlisting
1190 ></para>
1191 <para
1192 >У этого правила нет особых атрибутов.</para>
1194 <para
1195 >Правило находит символы C, заключенные в одинарные кавычки (например, <userinput
1196 >'c'</userinput
1197 >). Внутри одинарных кавычек может быть как одиночный символ, так и управляющая последовательность, более подробно ознакомиться с которыми можно в описании правила HlCStringChar.</para>
1199 </listitem>
1200 </varlistentry>
1202 <varlistentry>
1203 <term
1204 >RangeDetect</term>
1205 <listitem>
1206 <para
1207 >Проверка на строку, имеющую заданные начальный и конечный символы.</para>
1208 <programlisting
1209 >&lt;RangeDetect char=&quot;(character)&quot;  char1=&quot;(character)&quot; (common attributes) /&gt;</programlisting>
1210 <para
1211 ><userinput
1212 >char</userinput
1213 > определяет символ, с которого начинается строка, а <userinput
1214 >char1</userinput
1215 > - которым она заканчивается.</para>
1216 <para
1217 >Это правило может быть использовано для поиска небольших строк, заключенных в кавычки, но, поскольку при проверке правила система подсветки работает с одной строкой, данное правило не сможет определить строку, разбитую символами перевода.</para>
1218 </listitem>
1219 </varlistentry>
1221 <varlistentry>
1222 <term
1223 >LineContinue</term>
1224 <listitem>
1225 <para
1226 >Проверка на символ перевода строки.</para>
1227 <programlisting
1228 >&lt;LineContinue (common attributes) /&gt;</programlisting>
1229 <para
1230 >У этого правила нет особых атрибутов.</para>
1231 <para
1232 >Это правило может быть удобно для переключения контекста в конце строки, если последним знаком будет обратная черта (<userinput
1233 >'\'</userinput
1234 >). Это необходимо, например, в языках C/C++ для продолжения макросов и строк.</para>
1235 </listitem>
1236 </varlistentry>
1238 <varlistentry>
1239 <term
1240 >IncludeRules</term>
1241 <listitem>
1242 <para
1243 >Включение правил из другого контекста или языка/файла.</para>
1244 <programlisting
1245 >&lt;IncludeRules context=&quot;contextlink&quot; [includeAttrib=&quot;true|false&quot;] /&gt;</programlisting>
1247 <para
1248 >Атрибут <userinput
1249 >context</userinput
1250 > определяет контекст, из которого берётся правило.</para>
1251 <para
1252 >Если это простая строка, то включаются все правила из другого контекста, например: <programlisting
1253 >&lt;IncludeRules context=&quot;anotherContext&quot; /&gt;</programlisting
1254 ></para>
1256 <para
1257 >Если строка начинается с <userinput
1258 >##</userinput
1259 >, то система подсветки найдёт описание для другого языка с указанным названием, например: <programlisting
1260 >&lt;IncludeRules context=&quot;##C++&quot; /&gt;</programlisting
1261 ></para>
1262 <para
1263 >Если <userinput
1264 >includeAttrib</userinput
1265 > выставить <emphasis
1266 >true</emphasis
1267 >, атрибут назначения должен быть таким же, как атрибут источника. Это необходимо, например, при вводе комментариев, если текст, соответствующий включаемому контексту, имеет иную подсветку, чем основной контекст. </para>
1268 </listitem>
1269 </varlistentry>
1272 <varlistentry>
1273 <term
1274 >DetectSpaces</term>
1275 <listitem>
1276 <para
1277 >Поиск пробелов.</para>
1278 <programlisting
1279 >&lt;DetectSpaces (common attributes) /&gt;</programlisting>
1281 <para
1282 >У этого правила нет особых атрибутов.</para>
1283 <para
1284 >Используйте это правило, если вы уверены, что в тексте есть несколько пробелов подряд, например в начале строк с отступом. Это правило поможет пропустить все пробелы разом, вместо проверки каждого из них по нескольким параметрам.</para>
1285 </listitem>
1286 </varlistentry>
1289 <varlistentry>
1290 <term
1291 >DetectIdentifier</term>
1292 <listitem>
1293 <para
1294 >Поиск строк идентификаторов (таких как регулярные выражения: [a-zA-Z_][a-zA-Z0-9_]*).</para>
1295 <programlisting
1296 >&lt;DetectIdentifier (common attributes) /&gt;</programlisting>
1298 <para
1299 >У этого правила нет особых атрибутов.</para>
1300 <para
1301 >Используйте это правило, чтобы пропустить все буквенные символы разом, вместо проверки каждого из них по нескольким параметрам.</para>
1302 </listitem>
1303 </varlistentry>
1305 </variablelist>
1306 </sect2>
1308 <sect2>
1309 <title
1310 >Подсказки &amp; Советы</title>
1312 <itemizedlist>
1313 <para
1314 >Усвоив принцип действия переключения контекста, вы без труда сможете написать своё определение подсветки. Подумайте о том, в какой ситуации какое правило следует применить. Регулярные выражения - мощное средство, но, по сравнению с другими правилами, очень медленное. Поэтому стоит воспользоваться следующими советами. </para>
1316 <listitem>
1317 <para
1318 >Проверяя на соответствие только пару символов, воспользуйтесь <userinput
1319 >Detect2Chars</userinput
1320 > вместо <userinput
1321 >StringDetect</userinput
1322 >. То же относится к <userinput
1323 >DetectChar</userinput
1324 >.</para>
1325 </listitem>
1326 <listitem>
1327 <para
1328 >Регулярные выражения несложны в использовании, но очень часто можно найти более быстрый способ. Допустим, вы ищете символ <userinput
1329 >'#'</userinput
1330 >, это первый символ строки. Решение с регулярным выражением будет выглядеть примерно так: <programlisting
1331 >&lt;RegExpr attribute=&quot;Macro&quot; context=&quot;macro&quot; String=&quot;^\s*#&quot; /&gt;</programlisting
1332 >. Этой же цели можно достичь значительно быстрее: <programlisting
1333 >&lt;DetectChar attribute=&quot;Macro&quot; context=&quot;macro&quot; char=&quot;#&quot; firstNonSpace=&quot;true&quot; /&gt;</programlisting
1334 >. Для поиска регулярного выражения <userinput
1335 >'^#'</userinput
1336 > можно применить <userinput
1337 >DetectChar</userinput
1338 > с атрибутом <userinput
1339 >column=&quot;0&quot;</userinput
1340 >. Отсчет для атрибута <userinput
1341 >column</userinput
1342 > идет посимвольно, поэтому знак табуляции для него - всего один символ. </para>
1343 </listitem>
1344 <listitem>
1345 <para
1346 >Можно переключать контексты без специальных символов. Допустим, вы хотите переключить контекст при достижении строки <userinput
1347 >*/</userinput
1348 >, но в новом контексте хотите продолжить обработку этой строки. Можно воспользоваться нижеследующим правилом, а атрибут <userinput
1349 >lookAhead</userinput
1350 > заставит систему подсветки сохранить найденную строку для нового контекста. <programlisting
1351 >&lt;Detect2Chars attribute=&quot;Comment&quot; context=&quot;#pop&quot; char=&quot;*&quot; char1=&quot;/&quot; lookAhead=&quot;true&quot; /&gt;</programlisting>
1352 </para>
1353 </listitem>
1354 <listitem>
1355 <para
1356 >Если известно, что в тексте много пробелов, воспользуйтесь <userinput
1357 >DetectSpaces</userinput
1358 >.</para>
1359 </listitem>
1360 <listitem>
1361 <para
1362 >Пользуйтесь <userinput
1363 >DetectIdentifier</userinput
1364 > вместо регулярного выражения <userinput
1365 >'[a-zA-Z_]\w*'</userinput
1366 >.</para>
1367 </listitem>
1368 <listitem>
1369 <para
1370 >Старайтесь использовать стандартные стили, это удобно для пользователя.</para>
1371 </listitem>
1372 <listitem>
1373 <para
1374 >Заглянув в другие XML-файлы, вы узнаете много нового о работе с правилами.</para>
1375 </listitem>
1376 <listitem>
1377 <para
1378 >Проверить правильность XML-файла можно командой <command
1379 >xmllint --dtdvalid language.dtd mySyntax.xml</command
1380 >.</para>
1381 </listitem>
1382 <listitem>
1383 <para
1384 >Если сложное регулярное выражение встречается часто, воспользуйтесь <emphasis
1385 >ENTITIES</emphasis
1386 >. Пример:</para>
1387 <programlisting
1388 >&lt;?xml version="1.0" encoding="UTF-8"?&gt;
1389 &lt;!DOCTYPE language SYSTEM "language.dtd"
1391         &lt;!ENTITY myref    "[A-Za-z_:][\w.:_-]*"&gt;
1392 ]&gt;
1393 </programlisting>
1394 <para
1395 >Теперь вместо регулярного выражения можно использовать <emphasis
1396 >&amp;myref;</emphasis
1397 >.</para>
1398 </listitem>
1399 </itemizedlist>
1400 </sect2>
1402 </sect1>
1404 </appendix>