<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE book PUBLIC "-//KDE//DTD DocBook XML V4.5-Based Variant V1.1//EN" "dtd/kdedbx45.dtd" [
  <!ENTITY kdiff3 "<application
>KDiff3</application
>">
  <!ENTITY % addindex "IGNORE">
  <!ENTITY % Ukrainian "INCLUDE">
]>

<book lang="&language;">

<!-- This header contains all of the meta-information for the document such
as Authors, publish date, the abstract, and Keywords -->

<bookinfo>
<title
>Підручник з &kdiff3;</title>

<authorgroup>
  <othercredit role="developer"
><firstname
>Michael</firstname
> <surname
>Reeves</surname
> <affiliation
><address
> <email
>reeves.87@gmail.com</email>
    </address
></affiliation>
  </othercredit>
  <othercredit role="developer"
><firstname
>Joachim</firstname
> <surname
>Eibl</surname
> <affiliation
><address
> <email
>joachim.eibl at gmx.de</email>
    </address
></affiliation>
  </othercredit>
<othercredit role="translator"
><firstname
>Юрій</firstname
><surname
>Чорноіван</surname
><affiliation
><address
><email
>yurchor@ukr.net</email
></address
></affiliation
><contrib
>Переклад українською</contrib
></othercredit
> 
</authorgroup>

<copyright>
<year
>2002-2007</year>
<holder
>Joachim Eibl</holder>
</copyright>
<copyright>
<year
>2017-2019</year>
<holder
>Michael Reeves</holder>
</copyright>
<!-- Translators: put here the copyright notice of the translation -->
<!-- Put here the FDL notice.  Read the explanation in fdl-notice.docbook
     and in the FDL itself on how to use it. -->
<legalnotice
>&FDLNotice;</legalnotice>

<!-- Date and version information of the documentation
Don't forget to include this last date and this last revision number, we
need them for translation coordination !
Please respect the format of the date (YYYY-MM-DD) and of the version
(V.MM.LL), it could be used by automation scripts.
Do NOT change these in the translation. -->

<date
>23 грудня 2023 року</date>
<releaseinfo
>1.11.0</releaseinfo>


<abstract>
<para
>&kdiff3; — це інструмент для порівняння і об'єднання тек, який <itemizedlist>
<listitem
><para
>порівнює і об'єднує два або три вхідних текстових файли або теки.</para
></listitem>
<listitem
><para
>показує рядки і символи(!), що відрізняються,</para
></listitem>
<listitem
><para
>надає можливість автоматичного об'єднання,</para
></listitem>
<listitem
><para
>містить редактор для полегшення розв'язання конфліктів під час об'єднання,</para
></listitem>
<listitem
><para
>забезпечує мережеву прозорість за допомогою KIO,</para
></listitem>
<listitem
><para
>може підсвічувати або ховати зміни у пробілах або коментарях,</para
></listitem>
<listitem
><para
>підтримує Unicode, UTF-8 та інші кодування текстів файлів,</para
></listitem>
<listitem
><para
>може надсилати на друк різницю,</para
></listitem>
<listitem
><para
>підтримує об'єднання за ключовими словами і журналом інструментів керування версіями.</para
></listitem>
</itemizedlist>
</para
><para
>У цьому документі описано &kdiff3; версії 1.12. </para>
</abstract>

<!-- This is a set of Keywords for indexing by search engines.
Please at least include KDE, the KDE package it is in, the name
 of your application, and a few relevant keywords. -->

<keywordset>
<keyword
>KDE</keyword>
<keyword
>kdiff3</keyword>
<keyword
>різниця</keyword>
<keyword
>злиття</keyword>
<keyword
>CVS</keyword>
<keyword
>потрійна різниця</keyword>
<keyword
>порівняння</keyword>
<keyword
>файли</keyword>
<keyword
>теки</keyword>
<keyword
>каталоги</keyword>
<keyword
>керування версіями</keyword>
<keyword
>трикомпонентне об'єднання</keyword>
<keyword
>посимвольна різниця</keyword>
<keyword
>синхронізація</keyword>
<keyword
>kio</keyword>
<keyword
>прозора робота з мережею</keyword>
<keyword
>редактор</keyword>
<keyword
>пробіл</keyword>
<keyword
>коментарі</keyword>
</keywordset>

</bookinfo>

<chapter id="introduction"
><title
>Вступ</title>
<sect1 id="why"
><title
>Ще одна оболонка для Diff?</title>
<para
>Існує декілька графічних інструментів для роботи з різницями (diff). Чому саме &kdiff3;? Давайте я, як автор, поясню, чому мною було написано цю програму. </para
><para
>Я почав писати &kdiff3;, оскільки мені доводилося виконувати складні операції з об'єднання версій. Потреба у такому об'єднанні виникає, коли декілька осіб працюють над однаковими файлами у проєкті. Процес об'єднання можна до певної міри автоматизувати, якщо інструмент об'єднання може працювати не лише з новими модифікованими файлами (які називаються «гілками»), але і з початковим файлом (який називається «базою»). Інструмент об'єднання автоматично обере всі зміни, які було внесено лише у одній гілці. Якщо декілька розробників вносять зміни до одних і тих самих рядків, інструмент об'єднання має визначити конфлікт, який слід буде розв'язати вручну. </para
><para
>У останньому випадку об'єднання ускладнюється тим, що один з розробників міг змінити багато рядків і виправити відступи у багатьох місцях. Інший розробник теж міг внести зміни у значну частину тексту того ж файла. Все це призводить до декількох конфліктів під час об'єднання. </para
><para
>Інструмент, яким я користувався раніше, показував лише змінені рядки, але не показував, які саме зміни сталися у цих рядках. Він також не міг показувати відомості щодо зміни лише відступів. Об'єднання було схоже на нічний жах. </para
><para
>Ось з цього я і розпочав свою роботу. Перша версія програми могла показувати різницю у символах рядків, а також різницю у пробілах. Пізніше було додано багато інших можливостей, які поширили перелік корисних можливостей програми. </para
><para
>Наприклад, якщо вам потрібно швидко порівняти якісь фрагменти тексту, ви можете скопіювати їх до буфера обміну інформацією і вставити до відповідних частин вікон порівняння. </para
><para
>Багато зусиль було покладено на реалізацію порівняння тек і можливість їх об'єднання. Втілення цієї можливості майже перетворило програму на повноцінний навігатор файлової системи. </para
><para
>Сподіваємось &kdiff3; допоможе і вам. Нехай щастить! </para
><para
>Joachim Eibl (2003) </para>
</sect1>

<sect1 id="screenshots"
><title
>Знімки вікон і можливості</title>
<para
>На цьому знімку показано різницю між двома текстовими файлами (за допомогою ранньої версії &kdiff3;):</para>
<screenshot
><mediaobject>
   <imageobject
><imagedata fileref="screenshot_diff.png" format="PNG"/></imageobject>
</mediaobject
></screenshot>

<para
>Повністю підтримується трикомпонентне об'єднання. Ця можливість буде корисною, якщо двоє розробників незалежно змінюють код. Початковий файл (база) буде використано для того, щоб допомогти &kdiff3; автоматично обирати правильні зміни. За допомогою вікна редактора об'єднання під вікнами різниці ви зможете розв'язувати конфлікти, — програма покаже вам результат. Ви навіть можете редагувати результат. На наступному знімку вікна показано три вхідних файли у процесі об'єднання: </para
><para>
<screenshot
><mediaobject>
   <imageobject
><imagedata fileref="screenshot_merge.png" format="PNG"/></imageobject>
</mediaobject
></screenshot>
</para>

<para id="dirmergebigscreenshot"
>Крім того &kdiff3; допоможе вам порівнювати і об'єднувати цілі теки. На наступному знімку вікна показано &kdiff3; у процесі об'єднання тек: </para
><para>
<screenshot
><mediaobject>
   <imageobject
><imagedata fileref="dirmergebig.png" format="PNG"/></imageobject>
</mediaobject
></screenshot>
</para>
</sect1>

<sect1 id="features"
><title
>Інші можливості</title>
<sect2
><title
>Інструмент перегляду різниці за рядками і за символами</title>
<para
>За допомогою виділення кольорами &kdiff3; точно покаже вам відмінності у файлах. Якщо вам потрібно виконати значну кількість коду, ви оціните переваги, які надає ця можливість. </para>
<screenshot
><mediaobject>
   <imageobject
><imagedata fileref="letter_by_letter.png" format="PNG"/></imageobject>
</mediaobject
></screenshot>
</sect2>

<sect2
><title
>Визначення відмінностей у пробілах з першого погляду</title>
<para
>Різниця у пробілах і символах табуляції стає видимою. Якщо рядки відрізняються лише наявність (чи відсутністю) пробілів, це можна визначити з першого погляду на стовпчик резюме, розташований ліворуч. (Вам більше не потрібно буде перейматися випадками, коли розробник змінює лише відступи.) </para>
<screenshot
><mediaobject>
   <imageobject
><imagedata fileref="white_space.png" format="PNG"/></imageobject>
</mediaobject
></screenshot>
</sect2>

<sect2
><title
>Потрійна різниця</title>
<para
>За її допомогою можна аналізувати одразу три файли і бачити різницю між ними. </para
><para
>Ліве/середнє/праве вікна мають назви A/B/C і відповідні кольори: синій/зелений/малиновий. </para
><para
>Якщо певний рядок у одному з файлів збігається з базою, але відрізняється від бази у іншому файлі, колір відповідного рядка покаже вам, у якому саме файлі було внесено зміни. Червоний колір позначатиме рядки, які було змінено у обох файлах. </para>
<screenshot
><mediaobject>
   <imageobject
><imagedata fileref="triple_diff.png" format="PNG"/></imageobject>
</mediaobject
></screenshot>
</sect2>

<sect2
><title
>Зручне об'єднання двох або трьох вхідних файлів</title>
<para
>&kdiff3; можна скористатися для об'єднання двох або трьох вхідних файлів, таке об'єднання буде за можливості виконано у автоматичному режимі. Результат буде показано у вікні, у якому ви зможете редагувати текст і розв'язувати більшість конфліктів одним клацанням кнопкою миші: вам достатньо буде натиснути одну з кнопок <guibutton
>...</guibutton
> у вікнах <guilabel
>A</guilabel
>/<guilabel
>B</guilabel
>/<guilabel
>C</guilabel
>, на панелі кнопок, щоб вибрати джерело об'єднання, яке буде використано. Ви також можете вибрати одразу декілька джерел. Оскільки вікно результату є вікном редактора, у ньому можна розв'язати навіть конфлікти, які потребують подальшого виправлення, — вам не потрібно буде використовувати сторонні інструменти. </para>
</sect2>

<sect2
><title
>І...</title>
<itemizedlist>
   <listitem
><para
>Швидка навігація за допомогою кнопок.</para
></listitem>
   <listitem
><para
>Наведення вказівника миші на стовпчик резюме з наступним клацанням лівою кнопкою миші призведе до синхронізації всіх вікон для показу єдиної позиції.</para
></listitem>
   <listitem
><para
>Вибір і копіювання з будь-якого вікна і вставка у вікно об'єднання результатів.</para
></listitem>
   <listitem
><para
>Стовпчик огляду, у якому буде показано розташування змін і конфліктів.</para
></listitem>
   <listitem
><para
>Можливість налаштування кольорів відповідно до ваших уподобань.</para
></listitem>
   <listitem
><para
>Можливість налаштування ширини табуляції.</para
></listitem>
   <listitem
><para
>Пункт для вставки пробілів замість символів табуляції.</para
></listitem>
   <listitem
><para
>Відкриття файлів у зручному режимі за допомогою діалогового вікна або визначення файлів з командного рядка.</para
></listitem>
   <listitem
><para
>Виконати пошук рядків у всіх текстових вікнах можна за допомогою пунктів меню <menuchoice
><guimenu
>Зміни</guimenu
><guimenuitem
>Пошук</guimenuitem
></menuchoice
> (<keycombo
>&Ctrl;<keycap
>F</keycap
></keycombo
>) і <menuchoice
><guimenu
>Зміни</guimenu
><guimenuitem
>Знайти далі</guimenuitem
></menuchoice
> (<keycap
>F3</keycap
>).</para
></listitem>
   <listitem
><para
>Показ номерів рядків для кожного рядка. </para
></listitem>
   <listitem
><para
>Вставка вмісту буфера обміну інформацією або перетягування тексту до вікна вводу різниці.</para
></listitem>
   <listitem
><para
>Прозорість у роботі з мережею через використання KIO.</para
></listitem>
   <listitem
><para
>Може бути використано для перегляду різниці у &kdevelop; 3.</para
></listitem>
   <listitem
><para
>Розбиття на підрядки довгих рядків.</para
></listitem>
   <listitem
><para
>Підтримка Unicode, UTF-8 та інших кодеків.</para
></listitem>
   <listitem
><para
>Підтримка для мов з напрямком письма справа ліворуч.</para
></listitem>
   <listitem
><para
>...</para
></listitem>
</itemizedlist>
</sect2>
</sect1>
</chapter>

<chapter id="documentation"
><title
>Порівняння і об'єднання файлів</title>

<sect1 id="commandline"
><title
>Параметри командного рядка</title>

<sect2
><title
>Порівняння 2 файлів: </title>
<screen
><command
>kdiff3</command
> <replaceable
>файл1 файл2</replaceable
>
</screen>
</sect2>

<sect2
><title
>Об'єднання 2 файлів: </title>
<screen
><command
>kdiff3</command
> <replaceable
>файл1 файл2</replaceable
> -m
   <command
>kdiff3</command
> <replaceable
>файл1 файл2</replaceable
> -o <replaceable
>файл_виводу</replaceable
>
</screen>
</sect2>

<sect2
><title
>Порівняння 3 файлів: </title>
<screen
><command
>kdiff3</command
> <replaceable
>файл1 файл2 файл3</replaceable
>
</screen>
</sect2>

<sect2
><title
>Об'єднання 3 файлів: </title>
<screen
><command
>kdiff3</command
> <replaceable
>файл1 файл2 файл3</replaceable
> -m
   <command
>kdiff3</command
> <replaceable
>файл1 файл2 файл3</replaceable
> -o <replaceable
>файл_виводу</replaceable
>
</screen>
<para
>Зауважте, що <replaceable
>файл1</replaceable
> буде вважатися базою щодо <replaceable
>файл2</replaceable
> і <replaceable
>файл3</replaceable
>. </para>
</sect2>

<sect2
><title
>Особливий випадок: файли з однаковими назвами </title>
<para
>Якщо всі файли мають однакову назву, але розташовані у різних теках, ви можете зменшити об'єм інформації для введення, якщо вкажете назву файла лише для першого з файлів. Приклад: </para>
<screen
><command
>kdiff3</command
> <replaceable
>тека1/назва_файла тека2 тека3</replaceable
>
</screen>
</sect2>

<sect2
><title
>Рядок команди для виконання порівняння або об'єднання тек: </title>
<para
>Дуже подібне до попереднього розділу, але тепер слід вказувати теки.</para>
<screen
><command
>kdiff3</command
> <replaceable
>тека1 тека2</replaceable>
   <command
>kdiff3</command
> <replaceable
>тека1 тека2</replaceable
> -o <replaceable
>тека_призначення</replaceable>
   <command
>kdiff3</command
> <replaceable
>тека1 тека2 тека3</replaceable>
   <command
>kdiff3</command
> <replaceable
>тека1 тека2 тека3</replaceable
> -o <replaceable
>тека_призначення</replaceable
>
</screen>
<para
>Докладніші відомості щодо порівняння тек або їх об'єднання можна прочитати у <link linkend="dirmerge"
>цьому розділі</link
>.</para>
</sect2>

<sect2
><title
>Інші параметри командного рядка</title>
<para
>Щоб ознайомитися з переліком інших можливих параметрів командного рядка, виконайте команду</para>
<screen
><command
>kdiff3</command
> --help
</screen>
<para
>Приклад виводу команди:</para>
<screen
>Параметри:
  -m, --merge               Об'єднати вхідні елементи.
  -b, --base файл           Явно вказати базовий файл. Призначено для сумісності з деякими інструментами.
  -o, --output файл         Файл результату. Використовується разом -m. Наприклад: -o newfile.txt
  --out файл                Знову ж таки, файл результату. (Призначено для сумісності з деякими інструментами.)
  --noauto                  Ігнорувати --auto і завжди показувати графічний інтерфейс.
  --auto                    Не показувати графічний інтерфейс, якщо всі конфлікти можна розв'язати автоматично. (Потрібен параметр -o файл)
  --L1 псевдонім1           Візуальний замінник назви вхідного файла 1 (бази).
  --L2 псевдонім2           Візуальний замінник назви файла 2.
  --L3 псевдонім3           Візуальний замінник назви файла 3.
  -L, --fname псевдонім     Альтернативний візуальний замінник назви файла. Вкажіть його один раз для кожного вводу.
  --cs рядок                Перевизначити параметр налаштування. Використовується один раз для кожного з параметрів. Приклад: --cs "AutoAdvance=1"
  --confighelp              Показати список параметрів налаштування і поточних значень.
  --config файл             Використати інший файл налаштування.
</screen>
<para
>За допомогою параметра <option
>--cs</option
> ви можете вказати значення параметра налаштування, які інакше можна налаштувати лише за допомогою діалогових вікон налаштування. Але будьте уважні: якщо потім &kdiff3;, буде перервано, змінені значення буде збережено разом з іншими параметрами. За допомогою параметра <option
>--confighelp</option
> ви зможете переглянути назви всіх можливих параметрів та їх поточні значення.</para>
<para
>За допомогою параметра <option
>--config</option
> ви можете вказати інший файл налаштування. Якщо ви часто користуєтеся &kdiff3;, за допомогою різних наборів налаштувань ви легко перемикатися між різними наборами налаштувань.</para>
</sect2>
<sect2
><title
>Параметри командного рядка, які буде проігноровано</title>
<para
>Багато користувачів бажають використовувати &kdiff3; з деякими системами керування версіями. Але, якщо ця система керування версіями викликає &kdiff3; за допомогою параметрів командного рядка, які не &kdiff3; не розуміє, &kdiff3; завершить роботу повідомленням про помилку. За допомогою параметрів інтеграції ви можете вказати параметри командного рядка, які &kdiff3; має ігнорувати. Цей параметр буде показано у довідці з використання, як у цьому прикладі:</para>
<screen
>--<replaceable
>щось_там</replaceable
>                Ігнорується. (Використовується користувачем.)
</screen>
<variablelist>
  <varlistentry
><term
><guilabel
>Ігнорувати параметри командного рядка:</guilabel
></term
><listitem
><para
>Список параметрів, відокремлених символом крапки з комою, «;». Якщо один з цих параметрів з'явиться у командному рядку, &kdiff3; проігнорує його і виконає роботу без повідомлення про помилку. (Типовим є список <literal
>u;query;html;abort</literal
>).</para
></listitem
></varlistentry>
</variablelist>
<para
>Якщо цього не буде достатньо, рекомендуємо вам написати скрипт оболонки, який виконає зміну параметрів.</para>
</sect2>

</sect1>

<sect1 id="opendialog"
><title
>Діалогове вікно відкриття</title>
<para
>Оскільки має бути передбачено можливість вибору вхідних файлів, у програмі є особливе діалогове вікно відкриття файлів: </para>
<screenshot
><mediaobject>
<imageobject
><imagedata fileref="open_dialog.png" format="PNG"/></imageobject>
</mediaobject
></screenshot>
<para
>Ви можете змінювати назви файлів вручну безпосередньо у діалоговому вікні відкриття файлів, там же можна вибрати файл за допомогою навігатора файлової системи (<guibutton
>Файл...</guibutton
>) або вибрати нещодавно відкриті файли за допомогою спадних списків. Якщо ви повторно відкриєте це діалогове вікно, поточні назви залишатимуться на своїх місцях. Третій вхідний файл є необов'язковим. Якщо поле «C» залишатиметься порожнім, буде виконано аналіз відмінностей лише між двома файлами. </para
><para
>Крім того, ви може вибрати теку за допомогою кнопки <guibutton
>Тека...</guibutton
>. Якщо буде вказано теку для поля <guilabel
>A</guilabel
>, програма перейде у режим порівняння/об'єднання тек. Якщо у полі <guilabel
>A</guilabel
> буде вказано файл, у полях <guilabel
>B</guilabel
>, <guilabel
>C</guilabel
> або виводі буде вказано теку, &kdiff3; використовуватиме назву файла з поля <guilabel
>A</guilabel
> для пошуку відповідного файла у вказаних теках. </para
><para
>Якщо буде позначено пункт <guilabel
>Об'єднати</guilabel
>, ви зможете змінити значення у рядку <guilabel
>Вивід</guilabel
>. Але вказувати назву файла виводу не обов'язково. Ви можете вказати її безпосередньо під час збереження. </para
><para
>За допомогою натискання кнопки <guibutton
>Налаштувати...</guibutton
> можна відкрити діалогове вікно налаштування параметрів аналізу файлів. </para>
</sect1>

<sect1 id="pasteinput"
><title
>Вставка і визначення вхідних файлів скиданням</title>
<para
>Іноді виникає потреба у порівнянні фрагментів тексту, які не зберігаються у окремих файлах. У &kdiff3; передбачено можливість вставки тексту з буфера обміну даними до вікна вхідних даних порівняння, яке перебуває у фокусі. Після вставки буде негайно виконано аналіз відмінностей. У разі подібного порівняння діалоговому вікні відкриття файлів вам не потрібно вказувати файлів: ви можете просто закрити це вікно за допомогою кнопки <guibutton
>Скасувати</guibutton
>. </para
><para
>Крім того, ви можете скористатися перетягуванням зі скиданням: перетягніть файл з менеджера файлів або виділіть текст у редакторі, перетягніть його і скиньте у вікно вхідних даних для порівняння. </para
><para
>Навіщо це потрібно? Іноді у файлі містяться дві подібні функції, але перевірка їх подібності може бути досить марудною: слід спочатку створити два файли, потім завантажити їх для порівняння. У &kdiff3; достатньо лише скопіювати, вставити і порівняти відповідні фрагменти файлів. </para
><note
><para
>У поточній версії &kdiff3; не передбачено можливості перетягування фрагментів тексту з програми. Підтримується лише скидання до вікна вхідних даних. </para
></note
><warning
><para
>У деяких редакторах дія з перетягування зі скиданням до іншої програми призводить до вирізання (а не копіювання) виділеного тексту. У такому випадку можлива втрата початкових даних. </para
></warning>
</sect1>

<sect1 id="interpretinginformation"
><title
>Порівняння файлів і аналіз даних у вікнах виводу</title>
<screenshot
><mediaobject>
<imageobject
><imagedata fileref="screenshot_diff.png" format="PNG"/></imageobject>
</mediaobject
></screenshot>
<sect2
><title
>Інформаційний рядок</title
><para
>У верхній частині кожного з вікон ви побачите «інформаційний рядок». У інформаційних рядках вікон вхідних даних містяться літери <guilabel
>A</guilabel
>, <guilabel
>B</guilabel
> та <guilabel
>C</guilabel
>, придатне для редагування поле назви файла, кнопка навігації і номер першого з видимих рядків у вікні. (Зауважте, що вікно <guilabel
>C</guilabel
> не є обов'язковим.) Кожен з інформаційних рядків має власний колір. </para
><para
>Після вибору іншого файла за допомогою інструменту навігації або завершення редагування назви файла вам слід натиснути клавішу &Enter;. Програма завантажить новий файл і порівняє його з вже завантаженими файлами. </para
></sect2
><sect2
><title
>Фарбування</title
><para
>Трьом вікнам вхідних даних буде призначено літери <guilabel
>A</guilabel
>, <guilabel
>B</guilabel
> і <guilabel
>C</guilabel
>. Літері <guilabel
>A</guilabel
> відповідатиме синій колір, <guilabel
>B</guilabel
> — зелений, а <guilabel
>C</guilabel
> — малиновий. (Це типові кольори, але ви можете їх змінити за допомогою меню «Параметри».) </para
><para
>За виявлення відмінності програма змінюватиме колір вмісту вікна вхідних даних. Якщо дані відрізнятимуться у обох вікнах вхідних даних, їх, типово, буде позначено червоним кольором (<guilabel
>Колір конфліктів</guilabel
> у вікні <guilabel
>Параметри</guilabel
>). Подібна схема кольорів особливо корисна у випадку порівняння трьох файлів вхідних даних, як це можна буде бачити з наступного розділу (<link linkend="merging"
>Об'єднання</link
>). </para
></sect2
><sect2
><title
>Стовпчик резюме</title
><para
>Ліворуч від тексту буде показано «стовпчик резюме». Якщо у рядку буде знайдено відмінності, його буде показано відповідним кольором. Якщо відмінності полягають лише у розташуванні пробілів, у стовпчик резюме буде розфарбовано як шахівницю. Якщо ви працюєте з файлами вихідних кодів мовами програмування, де розташування пробілів не є важливим, ви зможете з першого погляду визначити, чи було змінено щось суттєве. (У C/C++ пробіли мають значення лише у рядках, коментарях, у рядках, призначених для інструменту попередньої обробки, і у певних досить екзотичних випадках.) </para
><para
>Вертикальну лінію, що відокремлює стовпчик резюме від тексту буде розірвано, якщо у вхідному файлі немає відповідних рядків. Якщо увімкнено режим перенесення рядків програма показуватиме штриховану лінію у місцях перенесення рядків. </para
></sect2
><sect2
><title
>Стовпчик огляду</title
><para
>У правій частині області вікна, ліворуч від вертикальної смужки гортання, буде показано стовпчик «огляду». У цьому стовпчику буде показано резюме вхідних даних <guilabel
>A</guilabel
>. Ви зможете одразу побачити всі відмінності і конфлікти. Якщо використовується лише дві області вхідних даних, всі відмінності буде показано червоним кольором, оскільки відмінності у такому випадку є конфліктами. Чорною прямокутною рамкою буде показано видиму частину вхідних даних. Якщо файли, які порівнюються є достатньо об'ємними, кількість рядків у файлі може перевищити кількість пікселів у стовпчику огляду, отже декілька рядків відповідатимуть одній лінії у стовпчику огляду. У такому випадку показу конфліктів надаватиметься перевага перед показом простих відмінностей, які, у свою чергу, матимуть пріоритет перед відсутністю відмінностей. Отже буде показано всі відмінності і конфлікти. Наведення вказівника на певне місце у стовпчику огляду з наступним клацанням лівою кнопкою миші призведе до показу відповідного фрагмента файла у області показу. </para
></sect2
><sect2 id="manualdiffhelp"
><title
>Вирівнювання рядків вручну</title
><para
>Іноді алгоритмові обробки тексту, використаному у програмі, не вдається розташувати належні рядки один навпроти одного. У вас також може виникнути бажання порівняти фрагмент тексту з фрагментом тексту, розташованим у зовсім іншому місці файла, з яким виконується порівняння. У таких випадках ви можете вказати &kdiff3; рядки для вирівнювання вручну. Позначте текст, вирівнювання якого ви бажаєте покращити за допомогою вказівника миші у першому перегляді даних так, як ви це робите, коли бажаєте скопіювати фрагмент тексту, а потім скористайтеся пунктом <guimenuitem
>Додати вирівнювання різниці вручну</guimenuitem
> з меню <guimenu
>Diffview</guimenu
> (клавіатурне скорочення <keycombo
>&Ctrl;<keycap
>Y</keycap
></keycombo
>). Поряд з вибраним фрагментом тексту у стовпчику огляду з'явиться жовтогарячий прямокутник. Повторіть процедуру для другої і (якщо така є) третьої області даних. &kdiff3; негайно переобчислюватиме відмінності після виконання вами дій і вирівнюватиме вибрані рядки. Звичайно ж, деякі з рядків, які збігалися за попереднього порівняння, можуть стати відмінними за нового порівняння. </para
><para
>У поточній версії програми ви не можете втручатися вручну у процес об'єднання. </para
></sect2
><sect2 id="joinsplitsections"
><title
>Об'єднання і розділення розділів відмінностей вручну</title
><para
>У певних випадках &kdiff3; визначить забагато або замало розділів відмінностей для об'єднання. У такому випадку ви можете об'єднати або поділити існуючі розділи. </para
><para
>Додайте нові розділи: спочатку виберіть текст у рядках, які відповідають один одному у кожній з областей вхідних даних (так як ви це робите під час копіювання даних до буфера). Потім скористайтеся пунктом <guimenuitem
>Розділити різницю на вибраному</guimenuitem
> з меню <guimenu
>Об'єднання</guimenu
>. Розрізи буде додано над першим рядком і під останнім рядком вибраного тексту. Якщо ви бажаєте додати лише один розділ, виберіть текст, що починається з іншого розрізу розділів. </para
><para
>Щоб об'єднати розділи у всіх областях вхідних даних, оберіть певну частину рядків розділів, які слід з'єднати. (Ви можете з'єднувати декілька розділів за один крок.) Після цього оберіть пункт <guimenuitem
>Об'єднати вибрані різниці</guimenuitem
> з меню <guimenu
>Об'єднання</guimenu
>. </para
></sect2>
</sect1>


<sect1 id="merging"
><title
>Об'єднання і вікно редактора виводу об'єднання</title>
<screenshot
><mediaobject>
<imageobject
><imagedata fileref="screenshot_merge.png" format="PNG"/></imageobject>
</mediaobject
></screenshot>
<para
>У області редактора даних об'єднання (розташованому під областями вхідних даних) є інформаційний рядок з заголовком <guilabel
>Вивід:</guilabel
>, назвою файла і рядком <replaceable
>[Змінено]</replaceable
>, який з'явиться, якщо вами було внесено якісь зміни. Зазвичай, у цьому рядку буде міститися певні дані, виведені інструментами автоматичного об'єднання, але часто у цій області з'являтимуться повідомлення про конфлікти. </para
><para
>!!! Ви не зможете зберегти дані, аж доки всі конфлікти не буде розв'язано !!! (Скористайтеся кнопками <guibutton
>Перейти до попер./наст. нерозв'язаного конфлікту</guibutton
>, щоб перевести перегляд до конфліктів, які ще не розв'язано.) </para
><para
>Якщо ви працюєте з двома файлами вхідних даних, кожна з відмінностей є конфліктом, який слід розв'язати вручну. </para
><para
>Якщо вхідних файлів буде три, перший з них вважатиметься базовим, а другий і третій — такими, що містять зміни. Якщо певний з рядків змінено лише у файлі <guilabel
>B</guilabel
> або <guilabel
>C</guilabel
>, але не у двох цих файлах, програма автоматично обере змінений варіант. Лише у випадках, коли і у <guilabel
>B</guilabel
>, і у <guilabel
>C</guilabel
> одночасно змінено однакові рядки, програма вважатиме ситуацію конфліктною і пропонуватиме розв'язати конфлікт вручну. Якщо зміни, внесені у <guilabel
>B</guilabel
> і <guilabel
>C</guilabel
> є тотожними, буде вибрано варіант <guilabel
>C</guilabel
>. </para
><sect2
><title
>Стовпчик резюме</title
><para
>У області редактора виводу об'єднання також передбачено стовпчик резюме, розташований ліворуч. У цьому стовпчику буде показано літеру варіанта, з якого було взято рядок, або нічого, якщо всі у всіх трьох джерелах рядок є однаковим. Конфліктні рядки буде позначено символом знака питання («?»), а у самому рядку буде показано червоний запис «Конфлікт об'єднання». Оскільки порядкове розв'язання конфліктів є справою досить марудною, рядки буде впорядковано за групами з однаковими відмінностями і характеристиками конфліктів. Конфлікти, які полягають лише у розташуванні пробілів, буде відокремлено від інших конфліктів, щоб полегшити об'єднання файлів, де зміни у відступах було внесено до багатьох рядків. </para
></sect2
><sect2 id="synchronise_views"
><title
>Визначення поточної групи і синхронізація позиції об'єднання і перегляду відмінностей</title
><para
>Після наведення вказівника миші у стовпчику резюме будь-якої з областей на певну позицію і клацання лівою кнопкою миші програма відкриє у всіх вікнах фрагмент тексту на початку групи, до якої належить позначений клацанням рядок. Після цього група стане «поточною групою». Цю групу буде позначено <guilabel
>Кольором тла поточного діапазону різниці</guilabel
> (можна змінити за допомогою пункту <guilabel
>Інтеграція</guilabel
> діалогового вікна параметрів програми), а зліва від тексту буде показано чорну рамку. </para
></sect2
><sect2
><title
>Вибір вхідних даних з A, B або C для розв'язання поточного конфлікту і редагування</title
><para
>На панелі з кнопками, розташованій під смужкою меню, містяться три кнопки вибору вхідних даних, які позначено літерами <guilabel
>A</guilabel
>, <guilabel
>B</guilabel
> і <guilabel
>C</guilabel
>. Натисніть кнопку вибору вхідних даних, щоб вставити рядки (або вилучити рядки, якщо ці рядки вже було раніше вставлено) з відповідного джерела. Щоб позначити рядки з декількох вхідних джерел натисніть відповідні кнопки у потрібному порядку. Наприклад, якщо ви бажаєте, щоб рядкам з <guilabel
>B</guilabel
> було надано перевагу перед рядками з <guilabel
>A</guilabel
> у вихідних даних, спочатку натисніть <guilabel
>B</guilabel
>, а вже потім <guilabel
>A</guilabel
>. </para
><para
>Якщо ви використовуєте автоматичний перехід (позначено пункт <link linkend="autoadvance"
>«Автоматично перейти до наступного конфлікту за визначення джерела»</link
>), вам слід вимкнути його перед вибором рядків з декількох джерел або редагуванням рядків після вибору. Якщо ви цього не зробите, &kdiff3; перейде до наступного конфлікту після вибору першого джерела даних. </para
><para
>Часто корисно напряму змінити вивід об'єднання. У перегляді резюме буде показано літеру «m» навпроти всіх рядків, які було змінено вручну. Якщо, наприклад, відмінності вирівняно таким чином, що простого вибору потрібного джерела буде недостатньо, ви можете позначити потрібний текст і скористатися звичайною дією з <link linkend="selections"
>копіювання з вставленням</link
>, щоб розмістити потрібний фрагмент тексту у області виводу об'єднання. </para
><para
>Іноді, якщо певний рядок було вилучено або у результаті автоматично об'єднання, або редагування, і у групі більше не залишиться жодного рядка, програма показуватиме у відповідному рядку текст &lt;Немає рядка джерела&gt;. Цей рядок є лише заповнювачем для групи на випадок, якщо ви зміните свою думку і захочете знову позначити якийсь текст. Відповідний текст заповнювача не буде показано у збереженому файлі, його не буде включено до жодного з фрагментів, які ви копіюватимете і вставлятимете. </para
><para
>Якщо ви спробуєте скопіювати і вставити певний текст, що містить такий рядок, у буфері обміну даними буде лише рядок «&lt;Конфлікт об'єднання&gt;». Але будьте обережними, коли виконуєте подібне копіювання. </para
></sect2
><sect2
><title
>Вибір даних A, B або C для всіх конфліктів</title
><para
>Звичайне об'єднання починатиметься з автоматичного розв'язання простих конфліктів. Але у меню <guimenu
>Об'єднання</guimenu
> передбачено і деякі інші пункти для виконання типових завдань. Якщо ви бажаєте вибрати певне джерело даних для розв'язання більшості конфліктів, ви можете вказати джерело <guilabel
>A</guilabel
>, <guilabel
>B</guilabel
> або <guilabel
>C</guilabel
> всюди або лише для ще нерозв'язаних конфліктів або для нерозв'язаних конфліктів, що полягають у різній кількості пробілів. Якщо ви бажаєте вирішувати кожен з конфліктів окремо, ви можете позначити пункт <guimenuitem
>Застосувати різницю до конфліктів</guimenuitem
>. Якщо ви бажаєте повернутися до автоматичного вибору &kdiff3;, скористайтеся пунктом <guimenuitem
>Автоматично розв'язувати прості конфлікти</guimenuitem
>. Після вибору цього пункту &kdiff3; виконає об'єднання повторно. Якщо використання певного пункту меню змінюватиме результати попереднього редагування, &kdiff3; запитає у вас підтвердження, перш ніж виконувати відповідну дію. </para
><note
><para
>Зауваження: якщо ви обираєте одне з джерел для розв'язання конфліктах пробілів і позначили один з пунктів «Ігнорувати числа» або «Ігнорувати коментарі C/C++» на сторінці <guilabel
>Diff</guilabel
> діалогового вікна параметрів програми, зміни у числах або коментарях вважатимуться змінами у пробілах. </para
></note
></sect2
><sect2 id="vcskeywordsmergesupport"
><title
>Автоматичне об'єднання за ключовими словами системи керування версіями і журналу</title
><para
>Значна кількість систем керування версіями підтримує особливі ключові слова (наприклад "&#36;Date&#36;", "&#36;Header&#36;", "&#36;Author&#36;", "&#36;Log&#36;" тощо). Під час синхронізації системи керування версіями змінюють ці рядки. Наприклад, "&#36;Date&#36;" перетвориться на "&#36;Date: 2009/03/22 18:45:01 &#36;". Оскільки цей рядок буде різним у кожній з версій файла, під час спроби об'єднання потрібне буде втручання користувача. </para
><para
>У &kdiff3; передбачено автоматичне об'єднання таких елементів. Для простих рядків, які відповідатимуть значенню параметра «Формальний вираз автооб'єднання» у всіх файлах вхідних даних, &kdiff3; обере рядок з B або, у разі доступності, з C. Крім того, потрібно, щоб відповідні рядки стояли поруч у області порівняння, а попередній рядок не містив конфліктів. Подібне автоматичне об'єднання можна виконати або негайно після запуску об'єднання (позначенням пункту <guilabel
>Запустити автооб'єднання за формальними виразом на початку об'єднання</guilabel
>»), або пізніше, за допомогою пункту меню <menuchoice
><guimenu
>Об'єднання</guimenu
> <guimenuitem
>Запустити автооб'єднання за формальними виразом на початку об'єднання</guimenuitem
></menuchoice
>. </para
><para
>Програмою підтримується і автоматичне об'єднання за журналом системи керування версіями. Автоматичне об'єднання за журналом можна виконати негайно після запуску об'єднання, якщо позначити пункт <guilabel
>Об'єднувати за журналом керування версіями на початку об'єднання</guilabel
> або пізніше за допомогою пункт меню <menuchoice
><guimenu
>Об'єднання</guimenu
> <guimenuitem
>Автоматично розв'язувати конфлікти у журналі</guimenuitem
></menuchoice
>. </para
><para
>Зазвичай, журнал системи керування версіями починається з рядка, що містить ключове слово «<literal
>&#36;Log&#36;</literal
>». Початок журналу має відповідати значенню параметра <guilabel
>Початковий формальний вираз журналу</guilabel
>. &kdiff3; визначає, які з рядків належать до журналу, аналізуючи початкові символи, які передують ключовому слову «<literal
>&#36;Log&#36;</literal
>». Якщо такі самі «початкові коментарі» зустрічаються і у наступних рядках, ці рядки також буде включено до журналу. </para
><para
>Під час кожної транзакції система керування версіями записує унікальний рядок з відомостями щодо версії, дати і часу транзакції та коментарів користувача. З цих елементів утворюється окремий запис журналу. Цей розділ журналу збільшується під час кожної транзакції, найсвіжіші записи з'являтимуться у верхній частині журналу (після початкового рядка журналу). </para
><para
>Якщо під час розробки двоє або декілька розробників вивантажують свої версії одного файл, у журналі об'єднання міститимуться декілька записів, які вважатимуться конфліктними під час об'єднання гілок. Оскільки подібні об'єднання можуть бути досить марудною справою, у &kdiff3; передбачено підтримку двох можливих стратегій: простої вставки інформації від обох розробників у верхню частину журналу або впорядкування інформації журналу за визначеним користувачем ключем. </para
><para
>Налаштувати спосіб одночасної вставки всіх записів простіше. Слід просто вказати &kdiff3; метод визначення рядків, які належатимуть до одного запису журналу. У більшості систем керування версіями після кожного запису журналу додається порожній рядок. Якщо система керування версіями не додає порожніх рядків у інших випадках, подібні рядки можуть слугувати достатнім критерієм для &kdiff3;. Достатньо вказати порожнє значення для параметра <guilabel
>Початковий формальний вираз елемента історії</guilabel
> на сторінці <guilabel
>Об'єднання</guilabel
> діалогового вікна параметрів програми. Якщо використання критерію порожнього рядка є недостатнім, ви можете вказати формальний вираз, за яким можна визначити початок запису журналу. </para
><para
>Зауважте, що &kdiff3; вилучатиме записи журналу, що повторюватимуться. Якщо запис журналу зустрічається декілька разів у журналі певного вхідного файла, у виведених даних залишиться лише один запис. </para
><para
>Якщо ви бажаєте впорядкувати журнал, вам слід вказати спосіб побудови ключа впорядкування. Скористайтеся круглими дужками у полі параметра <guilabel
>Початковий формальний вираз елемента історії</guilabel
> на сторінці <guilabel
>Об'єднання</guilabel
> діалогового вікна параметрів програми для групування частин формального виразу, який пізніше буде використано як ключ впорядкування. Після цього вкажіть у полі <guilabel
>Порядок сортування початків записів за ключем</guilabel
> відокремлений комами список чисел, які відповідають позиції групи у формальному виразі. </para
><para
>Оскільки зробити все правильно від початку не так уже і просто, ви можете випробувати та покращити формальний вираз і створення ключів у відповідному діалоговому вікні за допомогою натискання кнопки <guibutton
>Перевірити ваші формальні вирази</guibutton
>. </para
><para
>Приклад: припустімо журнал виглядає так: </para>
<screen
>/**************************************************************************
** HISTORY:    &#36;Log: \toms_merge_main_view\MyApplication\src\complexalgorithm.cpp &#36;
**
**     \main\integration_branch_12   2 Apr 2001 10:45:41   tom
**  Merged branch simon_branch_15.
**
**     \main\henry_bugfix_branch_7\1   30 Mar 2001 19:22:05   henry
**  Improved the speed for subroutine convertToMesh().
**  Fixed crash.
**************************************************************************/
</screen>
<para
>Початковому рядку журналу відповідатиме формальний вираз ".*\&#36;Log.*\&#36;.*". Після цього рядка йдуть записи журналу. </para
><para
>Рядок з записом ключового слова «<literal
>&#36;Log&#36;</literal
>» починається з двох символів «*», за якими слідує пробіл. &kdiff3; вважає перший непробільний рядок «початковим коментарем» і припускає, що журнал завершується першим же рядком без такого коментаря. У нашому прикладі останній з рядків завершується фрагментом тексту, який також починається з двох символів «*», але замість символу пробілу за ними слідують додаткові символи «*». Отже цей рядок є кінцевим рядком журналу. </para
><para
>Якщо впорядкування журналу не потрібне, формальний вираз початку запису журналу може виглядати так (рядок було розбито на два через обмеження на довжину): </para>
<screen
>\s*\\main\\\S+\s+[0-9]+ (Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)
 [0-9][0-9][0-9][0-9] [0-9][0-9]:[0-9][0-9]:[0-9][0-9]\s+.*
</screen>
<para
>Докладніше про формальні вирази можна дізнатися з <ulink url="https://doc.qt.io/qt-5/qregularexpression.html"
>документації щодо формальних виразів</ulink
>. Зауважте, що «\s» (з маленьким «s») відповідає будь-якій кількості пробілів, а «\S» (з великим «S») відповідає будь-якій послідовності символів, що не містить пробілів. У нашому прикладі початок запису журналу містить спочатку інформацію про версію з формальним виразом «\\main\\\S+», дату, що складається з дня «[0-9]+», місяця «(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)» і року «[0-9][0-9][0-9][0-9]», час у форматі «[0-9][0-9]:[0-9][0-9]:[0-9][0-9]» і нарешті назву облікового запису розробника «.*». </para
><para
>Зауважте, що символи «початкового коментаря» (у нашому прикладі «<literal
>**</literal
>») буде попередньо вилучено &kdiff3; ще перед порівнянням, отже формальний вираз починається з пошуку жодного або іншої кількості символів пробілу «<literal
>\s*</literal
>». Оскільки символи коментаря можуть бути різними у різних файлах (наприклад, у C/C++ використовуються символи коментування, відмінні від тих, які використовуються у скриптах Perl), &kdiff3; сам визначає початкові символи коментаря, отже вам не потрібно вказувати їх у формальному виразі. </para
><para
>Якщо вам потрібне впорядкування журналу, програмі доведеться обчислити ключ впорядкування. Для цього слід згрупувати відповідні частини формального виразу у дужках (додаткові дужки можна і не прибирати, якщо ви захочете вимкнути впорядкування журналу): </para>
<screen
>\s*\\main\\(\S+)\s+([0-9]+) (Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)
 ([0-9][0-9][0-9][0-9]) ([0-9][0-9]:[0-9][0-9]:[0-9][0-9])\s+(.*)
</screen>
<para
>Тепер у дужках містяться: 1. інформація про версію, 2. день, 3. місяць, 4. рік, 5. час, 6. назва облікового запису. Але якщо нам потрібне впорядкування за часом і датою, доведеться побудувати ключ впорядкування за допомогою елементів у іншій послідовності: спочатку рік, далі місяць, день, час, інформація про версію і назва облікового запису. Отже, порядок рядків має бути таким: «4,3,2,5,1,6». </para
><para
>Оскільки назви місяців не є гарним критерієм впорядкування (наприклад, «<literal
>Apr</literal
>» (квітень) буде першим), &kdiff3; проаналізує послідовність, у якій було вказано назви, а потім використає замість назв відповідні номери («<literal
>Apr</literal
>»-&gt;«<literal
>04</literal
>»). Якщо буде знайдено якесь число, програма перетворить його на 4-цифрове значення за допомогою додавання початкових нулів, а потім застосує впорядкування. Нарешті, остаточний ключ впорядкування для початкового рядка першого запису журналу виглядатиме так: </para>
<screen
>2001 04 0002 10:45:41 integration_branch_12   tom
</screen>
<para
>Докладніші відомості можна отримати з розділу <link linkend="mergeoptions"
>Параметри об'єднання</link
>. </para>
</sect2>
</sect1>

<sect1 id="navigation"
><title
>Навігація і редагування</title>
<para
>Більшість завдань з навігації текстом можна виконати за допомогою смужок гортання і миші, але пересування області видимого тексту можна здійснювати і за допомогою клавіш. Якщо ви наведете вказівник на будь-яку з областей програми, клацнете лівою кнопкою миші, ви зможете скористатися клавішами пересування курсора (&Left;, &Right;, &Up;, &Down;, &PgUp;, &PgDn;, &Home;, &End;, <keycombo
>&Ctrl;&Home;</keycombo
> та <keycombo
>&Ctrl;&End;</keycombo
>) так, як ви це робите у інших програмах. Крім того, ви можете скористатися клавішами для пересування області видимості за допомогою стовпчика огляду, розташованого поряд зі смужкою гортання: достатньо навести на нього вказівник і один раз клацнути лівою кнопкою миші. </para
><para
>Крім того, для гортання тексту вгору і вниз ви можете скористатися прокручуванням коліщатка миші. </para
><para
>Крім того, ви можете користуватися іншими клавішами у вікні редактора виводу об'єднання. Перемикатися між режимами вставки і перезапису можна за допомогою клавіші &Ins;. Типовим є режим вставки. </para
><para
>Наведення вказівника миші на певну позицію у будь-якому зі стовпчиків резюме з наступним клацанням лівою кнопкою миші синхронізує всі вікна на показі початку однакової групи рядків (як це описано у розділі <link linkend="synchronise_views"
>"Визначення поточної групи і синхронізація позиції об'єднання і перегляду відмінностей"</link
>). </para
><para
>Крім того, на панелі навігації міститься дев'ять навігаційних кнопок, за допомогою натискання яких ви можете переводити область перегляду до поточної/першої/останньої відмінності, наступної/попередньої відмінності (<keycombo
>&Ctrl;&Down;</keycombo
>/<keycombo
>&Ctrl;&Up;</keycombo
>), до наступного/попереднього конфлікту (<keycombo
>&Ctrl;&PgDn;</keycombo
>/<keycombo
>&Ctrl;&PgUp;</keycombo
>) або наступного/попереднього нерозв'язаного конфлікту. Зауважте, що для &kdiff3; «конфлікт», який не було автоматично розв'язано на початку об'єднання, залишатиметься «конфліктом», навіть якщо його буде розв'язано. Отже немає потреби у виокремленні випадку «нерозв'язаного конфлікту». </para>
<sect2 id="autoadvance"
><title
>Автоматичний перехід</title>
<para
>Крім того, передбачено кнопку <guibutton
>Автоматично перейти до наступного конфлікту за визначення джерела</guibutton
> (автоматичне продовження). Якщо ви позначите відповідний пункт, за вибору одного з джерел &kdiff3; переходитиме до наступного нерозв'язаного конфлікту у автоматичному режимі. Подібна поведінка буде корисною, якщо ви маєте намір під час розв'язання завжди обирати лише одне з джерел даних. Якщо вам потрібні два джерела, або результат доведеться редагувати, ймовірно, вам слід зняти позначку з відповідного пункту. Перш ніж перейти до наступного нерозв'язаного конфлікту, &kdiff3; деякий час показуватиме вам результат вашого вибору. Тривалість затримки можна визначити у параметрах <guilabel
>Об'єднання</guilabel
>: ви можете вказати значення <guilabel
>Автоматичне продовження за (у мс)</guilabel
> у діапазоні від 0 до 2000. Підказка: втомилися клацати? — зменшіть значення автоматичного продовження і скористайтеся клавіатурними скороченнями <keycombo
>&Ctrl;<keycap
>1</keycap
></keycombo
>/<keycap
>2</keycap
>/<keycap
>3</keycap
> для вибору джерела <guilabel
>A</guilabel
>/<guilabel
>B</guilabel
>/<guilabel
>C</guilabel
>, якщо конфліктів дуже багато. </para>
</sect2>
</sect1>

<sect1 id="selections"
><title
>Вибір, копіювання і вставка</title>
<para
>Курсор у вікнах вхідних даних програми показано не буде, отже вибір слід робити за допомогою миші: натисніть ліву кнопку миші, коли вказівник знаходитиметься на початку області вибору, утримуючи кнопку натиснутою, пересуньте вказівник у кінцеву точку області вибору, після чого відпустіть кнопку. Вибрати слово можна наведенням вказівника миші на це слово з наступним подвійним клацанням. Вибір у вікні редактора виводу об'єднання можна здійснювати за допомогою клавіатури: утримуйте натиснутою клавішу &Shift; і пересувайте межу області вибору за допомогою навігаційних клавіш. </para
><para
>Якщо вибраний фрагмент не може бути показаний у видимому діапазоні тексту, ви можете пересунути вказівник миші за межі вікна програми, що спричинить гортання тексту програмою &kdiff3; у відповідному напрямку. </para
><para
>Для вибору дуже великих фрагментів тексту ви можете також скористатися натисканням клавіш навігації з одночасним утримуванням натиснутою кнопки миші. Наприклад, можна скористатися клавішами Page Up і Page Down, щоб швидко перейти до певної позиції. Коли вибір досягне потрібної позиції, відпустіть кнопку миші. </para
><para
>Щоб позначити увесь вміст поточного вікна, скористайтеся пунктом меню <menuchoice
><guimenu
>Зміни</guimenu
> <guimenuitem
>Вибрати все</guimenuitem
></menuchoice
> (<keycombo
>&Ctrl;<keycap
>A</keycap
></keycombo
>). </para
><para
>Щоб скопіювати вибране до буфера обміну даними, вам слід натиснути кнопку <guibutton
>Копіювати</guibutton
> (або скористатися комбінацією клавіш <keycombo
>&Ctrl;<keycap
>C</keycap
></keycombo
> чи <keycombo
>&Ctrl;&Ins;</keycombo
>). Крім цього, передбачено пункт «Автоматичне копіювання позначеного». Якщо його буде позначено, всі вибрані вами фрагменти буде негайно скопійовано, вам не доведеться явно користуватися дією з копіювання. Але користуйтеся цією можливістю обережно, оскільки за її використання ви можете випадково пошкодити вміст буфера обміну даними. </para
><para
>Дія <guibutton
>Вирізати</guibutton
> (<keycombo
>&Ctrl;<keycap
>X</keycap
></keycombo
> або <keycombo
>&Shift;&Del;</keycombo
>) призводить до копіювання фрагмента тексту до буфера обміну даним з наступним його вилученням з тексту. </para
><para
>Команда <guibutton
>Вставити</guibutton
> (клавіатурні скорочення <keycombo
>&Ctrl;<keycap
>V</keycap
></keycombo
> або <keycombo
>&Shift;&Ins;</keycombo
>) вставляє текст з буфера обміну даними у позицію курсора або замість вибраного тексту. Якщо ви виконаєте команду вставлення у будь-якому з вікон вхідних даних, у цьому вікні буде показано вміст буфера обміну даними, а порівняння буде негайно перезапущено. Ця дія буде корисною, якщо вам потрібно нашвидкуруч порівняти взятий звідкись фрагмент тексту з іншим фрагментом без створення файлів з текстом фрагментів. </para>
</sect1>

<sect1 id="saving"
><title
>Збереження</title>
<para
>Збереження стане можливим, лише якщо буде розв'язано всі конфлікти. Якщо файл вже існує і ви позначите пункт <guilabel
>Файли резерву</guilabel
> на сторінці <guilabel
>Тека</guilabel
> діалогового вікна параметрів програми, наявний файл буде перейменовано з додаванням суфікса <literal role="extension"
>.orig</literal
>, якщо ж файл з таким суфіксом вже існуватиме, його буде перезаписано. Якщо на час завершення роботи програми або початку іншого порівняння відмінностей дані ще не буде збережено, &kdiff3; запитає вас про те, яку дію ви бажаєте виконати: зберегти файл, скасувати завершення редагування або продовжити без збереження файла. (Сама програма &kdiff3; не перехоплює ніяких сигналів. Отже, якщо ви скористаєтеся командою на зразок «kill» щодо &kdiff3;, ваші дані буде втрачено.) </para
><para
>Програма використовуватиме символи завершення рядків, які характерні для системи, у які запущено програму. У &UNIX; всі рядки завершуються символом переходу на наступний рядок «\n», у системах заснованих на архітектурі Win32 всі рядки завершуються сукупністю символу повернення каретки і переходу на наступний рядок «\r\n». &kdiff3; не зберігає символи завершення рядків, використані у файлах з вхідними даними, а це означає, що не слід використовувати &kdiff3; для двійкових даних. </para>
</sect1>

<sect1 id="find"
><title
>Пошук рядків</title>
<para
>Ви можете виконати пошук текстового рядка у будь-якому з вікон &kdiff3;. За допомогою пункту меню <menuchoice
><guimenu
>Зміни</guimenu
><guimenuitem
>Пошук...</guimenuitem
></menuchoice
> (клавіатурне скорочення <keycombo
>&Ctrl;<keycap
>F</keycap
></keycombo
>) можна відкрити діалогове вікно, у якому ви зможете вказати рядок, який ви шукаєте. Крім того, ви можете вказати вікна, у яких відбуватиметься пошук. Пошук завжди виконуватиметься від початку даних. Для переходу до наступного знайденого рядка можна скористатися пунктом меню <menuchoice
><guimenu
>Зміни</guimenu
><guimenuitem
>Знайти далі...</guimenuitem
></menuchoice
> menu item (<keycap
>F3</keycap
>). Якщо пошук виконуватиметься у декількох вікнах, спочатку буде вказано варіанти у першому вікні, згори до низу, потім у другому вікні тощо. </para>
</sect1>

<sect1 id="printing"
><title
>Друк</title>
<para
>У &kdiff3; передбачено підтримку друку відмінностей у текстових файлах. За допомогою пункту меню <menuchoice
><guimenu
>Файл</guimenu
><guimenuitem
>Друкувати...</guimenuitem
></menuchoice
> (клавіатурне скорочення <keycombo
>&Ctrl;<keycap
>P</keycap
></keycombo
>) ви можете відкрити діалогове вікно, за допомогою якого можна вибрати принтер та налаштувати інші параметри друку. </para
><para
>Існує декілька способів налаштування діапазону друку. Через відмінності у діалогових вікна друку у різних операційних системах, методи визначення певного діапазону можуть бути різними. </para>
<variablelist>
   <varlistentry
><term
>Всі:</term
><listitem
><para
>Надрукувати все.</para
></listitem
></varlistentry>
   <varlistentry
><term
>Поточна:</term
><listitem
><para
>Надрукувати сторінку, починаючи з першого рядка, який видно у вікні. (У системах, де немає подібного параметра, цей спосіб друку можна увімкнути за допомогою визначення для друку номера сторінки 10000.)</para
></listitem
></varlistentry>
   <varlistentry
><term
>Вибір:</term
><listitem
><para
>Перш ніж наказати програмі надрукувати дані, виберіть фрагмент тексту за допомогою миші (у той самий спосіб, що і під час копіювання з вставленням) у одному з вікон вхідних даних з метою визначення початкового і кінцевого рядка. Якщо не буде позначено жодного фрагмента тексту у жодній з областей вхідних даних, вибір рядків буде недоступним. (У системах, де не буде цього пункту, ви можете досягнути потрібного результату, якщо вкажете для друку сторінку за номером 9999.)</para
></listitem
></varlistentry>
   <varlistentry
><term
>Діапазон:</term
><listitem
><para
>Тут вам слід вказати першу і останню сторінки. </para
></listitem
></varlistentry>
</variablelist>
<para
>Інші важливі параметри друку буде взято зі звичайних параметрів. </para
><itemizedlist>
   <listitem
><para
>Шрифт, розмір шрифту</para
></listitem>
   <listitem
><para
>Показати номери рядків</para
></listitem>
   <listitem
><para
>Перенесення слів</para
></listitem>
   <listitem
><para
>Кольори</para
></listitem>
   <listitem
><para
>тощо</para
></listitem>
</itemizedlist>
<para
>Крім того, радимо вам скористатися альбомною орієнтацією для друку. </para>
</sect1>

<sect1 id="options"
><title
>Параметри</title>
<para
>Параметри і список нещодавніх файлів зберігатимуться під час завершення роботи програми, а потім знову завантажуватимуться під час наступного запуску. (Меню <menuchoice
><guimenu
>Параметри</guimenu
> <guimenuitem
>Налаштувати &kdiff3;...</guimenuitem
></menuchoice
>) </para>
<sect2
><title
>Шрифт</title>
<para
>Вибрати моноширинний шрифт. (У деяких системах у цьому діалоговому вікні буде показано і шрифти зі змінною шириною символів, але вам не слід їх використовувати.) </para>
</sect2>

<sect2
><title
>Кольори</title>
<variablelist>
  <varlistentry
><term
><guilabel
>Вікна редактора і різниці:</guilabel
></term
><listitem>
  <variablelist>
    <varlistentry
><term
><guilabel
>Колір тексту:</guilabel
></term
><listitem
><para
>Зазвичай, чорний. </para
></listitem
></varlistentry>
    <varlistentry
><term
><guilabel
>Колір тла:</guilabel
></term
><listitem
><para
>Зазвичай, білий. </para
></listitem
></varlistentry>
    <varlistentry
><term
><guilabel
>Колір тла різниці:</guilabel
></term
><listitem
><para
>Зазвичай, світло-сірий. </para
></listitem
></varlistentry>
    <varlistentry
><term
><guilabel
>Колір A:</guilabel
></term
><listitem
><para
>Зазвичай, темно-синій. </para
></listitem
></varlistentry>
    <varlistentry
><term
><guilabel
>Колір B:</guilabel
></term
><listitem
><para
>Зазвичай, темно-зелений. </para
></listitem
></varlistentry>
    <varlistentry
><term
><guilabel
>Колір C:</guilabel
></term
><listitem
><para
>Зазвичай, темно-пурпуровий. </para
></listitem
></varlistentry>
    <varlistentry
><term
><guilabel
>Колір конфліктів:</guilabel
></term
><listitem
><para
>Зазвичай, червоний.</para
></listitem
></varlistentry>
    <varlistentry
><term
><guilabel
>Колір тла поточного діапазону:</guilabel
></term
><listitem
><para
>Зазвичай, світло-жовтий.</para
></listitem
></varlistentry>
    <varlistentry
><term
><guilabel
>Колір тла поточного діапазону різниці:</guilabel
></term
><listitem
><para
>Зазвичай, темно-жовтий.</para
></listitem
></varlistentry>
    <varlistentry
><term
><guilabel
>Колір для діапазонів різниць вирівняних вручну:</guilabel
></term
><listitem
><para
>Зазвичай, жовтогарячий.</para
></listitem
></varlistentry>
  </variablelist
></listitem
></varlistentry>
  <varlistentry
><term
><guilabel
>Перегляд порівняння тек:</guilabel
></term
><listitem>
  <variablelist>
    <varlistentry
><term
><guilabel
>Колір найновішого файла:</guilabel
></term
><listitem
><para
>Зазвичай, зелений.</para
></listitem
></varlistentry>
    <varlistentry
><term
><guilabel
>Колір найстарішого файла:</guilabel
></term
><listitem
><para
>Зазвичай, червоний.</para
></listitem
></varlistentry>
    <varlistentry
><term
><guilabel
>Колір файлів проміжного віку:</guilabel
></term
><listitem
><para
>Зазвичай, темно-жовтий.</para
></listitem
></varlistentry>
    <varlistentry
><term
><guilabel
>Колір відсутніх файлів:</guilabel
></term
><listitem
><para
>Зазвичай, чорний.</para
></listitem
></varlistentry>
  </variablelist
></listitem
></varlistentry>
</variablelist>
<para
>Зміна кольорів у режимі порівняння тек набуде чинності лише під час наступного порівняння тек. </para>
<para
>У системах, відеопідсистема яких може показувати лише 16 або 256 кольорів, певні кольори не можна буде показати у початковій формі. У таких системах точний колір можна вибрати за допомогою кнопки <guibutton
>Типовий</guibutton
>. </para>
</sect2>

<sect2
><title
>Параметри редактора</title>
<variablelist>
   <varlistentry
><term
><guilabel
>Використовувати пробіли замість табуляції</guilabel
></term
><listitem
><para
>Якщо цей пункт не буде позначено, а ви натиснете клавішу табуляції, буде вставлено символ табуляції, у іншому випадку у документ буде вставлено належну кількість символів пробілу.</para
></listitem
></varlistentry>
   <varlistentry
><term
><guilabel
>Розмір табуляції:</guilabel
></term
><listitem
><para
>Можна налаштувати відповідно до ваших потреб. Типове значення — <literal
>8</literal
>.</para
></listitem
></varlistentry>
   <varlistentry
><term
><guilabel
>Автовідступ</guilabel
></term
><listitem
><para
>Після натискання клавіші &Enter; або <keycap
>Return</keycap
> відступ попереднього рядка використовується у наступному рядку.</para
></listitem
></varlistentry>
   <varlistentry
><term
><guilabel
>Автоматичне копіювання позначеного</guilabel
></term
><listitem
><para
>Якщо буде позначено цей пункт, всі виділені фрагменти негайно копіюватимуться до буфера обміну даними, вам не потрібно буде виконувати явного копіювання.</para
></listitem
></varlistentry>
   <varlistentry
><term
><guilabel
>Стиль кінців рядка:</guilabel
></term
><listitem
><para
>Ви можете вказати, якому стилю завершення рядків слід надавати перевагу програмі під час зберігання даних. Типовим буде завершення рядка загальне для всієї системи.</para
></listitem
></varlistentry>
</variablelist>
</sect2>

<sect2 id="diffoptions"
><title
>Параметри Diff</title>
<para
>Під час порівняння файлів &kdiff3; спочатку намагається знайти однакові рядки у всіх файлах вхідних даних. Лише на цьому етапі програма може ігнорувати пробіли. На другому етапі програма порівнює всі рядки окремо. На цьому етапі програма не ігноруватиме пробіли. Крім того, пробіли не ігноруватимуться під час об'єднання. </para>

<variablelist>
   <varlistentry
><term
><guilabel
>Ігнорувати числа (вважати пробілами)</guilabel
></term
><listitem
><para
>Типово пункт не позначено. Символи, які є частиною чисел, («0»-«9», «.», «-») буде проігноровано під час першої частини аналізу, під час якої програма встановлює відповідність рядків. У результатах порівняння відмінність у символах чисел буде враховано, але самі ці символи вважатимуться пробілами. </para
></listitem
></varlistentry>
   <varlistentry
><term
><guilabel
>Ігнорувати коментарі C/C++ (вважати пробілами)</guilabel
></term
><listitem
><para
>Типово вимкнено. За позначення, зміни у коментарях будуть оброблятися як зміни у пробілах. </para
></listitem
></varlistentry>
   <varlistentry
><term
><guilabel
>Ігнорувати зміни регістру (вважати пробілами)</guilabel
></term
><listitem
><para
>Типово вимкнено. За позначення, відмінності у регістрі літер (зокрема «A» і «a») будуть оброблятися як зміни у пробілах. </para
></listitem
></varlistentry>
   <varlistentry
><term
><guilabel
>Команда препроцесора:</guilabel
></term
><listitem
><para
>Див. <link linkend="preprocessors"
>наступний розділ</link
>. </para
></listitem
></varlistentry>
   <varlistentry
><term
><guilabel
>Команда відповідності рядків препроцесора:</guilabel
></term
><listitem
><para
>Див. <link linkend="preprocessors"
>наступний розділ</link
>. </para
></listitem
></varlistentry>
   <varlistentry
><term
><guilabel
>Агресивніше (повільніше)</guilabel
></term
><listitem
><para
>Намагатися знайти найменші відмінності. Типово увімкнено. Подібне порівняння, ймовірно буде корисним для складних і великих файлів. Значно сповільнює обробку великих файлів. </para
></listitem
></varlistentry>
   <varlistentry
><term
><guilabel
>Вирівняти B і C для 3 вхідних файлів</guilabel
></term
><listitem
><para
>Спробувати вирівняти <guilabel
>B</guilabel
> і <guilabel
>C</guilabel
> під час порівняння або об'єднання трьох вхідних файлів. Не рекомендується для об'єднання, оскільки такі дії можуть його ускладнити. (Типово вимкнено.) </para
></listitem
></varlistentry>
</variablelist>
</sect2>

<sect2 id="mergeoptions"
><title
>Параметри об'єднання</title>
<variablelist>
   <varlistentry
><term
><guilabel
>Автоматичне продовження за (у мс):</guilabel
></term
><listitem
><para
>У режимі автоматичного продовження цей параметр визначає час, протягом якого програма показуватиме результат вибору перед переходом до наступного нерозв'язаного конфлікту. </para
></listitem
></varlistentry>
   <varlistentry
><term
><guilabel
>Показувати інформаційні вікна</guilabel
></term
><listitem
><para
>Показувати діалогове вікно з відомостями про кількість конфліктів. </para
></listitem
></varlistentry>
   <varlistentry
><term
><guilabel
>Типове значення пробілів для об'єднання 2/3 файлів:</guilabel
></term
><listitem
><para
>Автоматично розв'язати всі конфлікти у пробілах вибором вказаного файла. (Типово, визначеного вручну) Корисно, якщо пробіли не є суттєвими у багатьох файлах. Якщо ви не бажаєте використовувати подібні налаштування постійно, краще скористайтеся пунктом <guilabel
>Вибрати A/B/C для всіх нерозв'язаних конфліктів пробілів</guilabel
> з меню <guimenu
>Об'єднання</guimenu
>. Зауважте, що якщо ви позначили якийсь з пунктів <guilabel
>Ігнорувати числа</guilabel
> або <guilabel
>Ігнорувати коментарі C/C++</guilabel
>, подібний автоматичний вибір стосуватиметься і конфліктів, пов'язаних з відмінностями у числах або коментарях. </para
></listitem
></varlistentry>
   <varlistentry
><term
><guilabel
>Формальний вираз автооб'єднання:</guilabel
></term
><listitem
><para
>Формальний вираз для рядків, у яких &kdiff3; слід автоматично обирати одне джерело. Див. також <link linkend="vcskeywordsmergesupport"
>Автоматичне об'єднання...</link
> </para
></listitem
></varlistentry>
   <varlistentry
><term
><guilabel
>Запустити автооб'єднання за формальними виразом на початку об'єднання</guilabel
></term
><listitem
><para
>Якщо позначити цей пункт, &kdiff3; виконає автоматичне об'єднання на основі даних пункту <guilabel
>Формальний вираз автооб'єднання</guilabel
> після запуску процесу об'єднання. </para
></listitem
></varlistentry>
   <varlistentry
><term
><guilabel
>Початковий формальний вираз елемента історії:</guilabel
></term
><listitem
><para
>Формальний вираз для початку запису історії керування версіями. Зазвичай, цей рядок містить ключове слово «<literal
>&#36;Log&#36;</literal
>». Типове значення: «<literal
>.*\&#36;Log.*\&#36;.*</literal
>» </para
></listitem
></varlistentry>
   <varlistentry
><term
><guilabel
>Початковий формальний вираз елемента історії:</guilabel
></term
><listitem
><para
>Під час об'єднання записів журналу програма працюватиме з записами, що складаються з декількох рядків. Тут ви можете вказати формальний вираз, за яким програма визначатиме перший рядок такого запису (без початкового коментаря). Скористайтеся круглими дужками для групування ключів, які ви бажаєте згодом використати для впорядкування. Якщо у цьому полі буде порожньо, &kdiff3; вважатиме, що записи журналу відокремлюються порожніми рядками. Див. також <link linkend="vcskeywordsmergesupport"
>Автоматичне об'єднання...</link
> </para
></listitem
></varlistentry>
   <varlistentry
><term
><guilabel
>Впорядкування історії при об'єднанні</guilabel
></term
><listitem
><para
>Увімкнути впорядкування за журналом системи керування версіями. </para
></listitem
></varlistentry>
   <varlistentry
><term
><guilabel
>Порядок сортування початків записів за ключем:</guilabel
></term
><listitem
><para
>Кожна пара дужок, які використовуються у формальному виразі, містить ключ впорядкування записів історії. Вкажіть список ключів (пронумерованих у порядку появи, починаючи з <literal
>1</literal
>), з використання роздільника "," (наприклад "4,5,6,1,2,3,7"). Якщо залишити це поле порожнім, сортування не проводитиметься. Подробиці можна дізнатися з <link linkend="vcskeywordsmergesupport"
>Автоматичне об'єднання...</link
>документації. </para
></listitem
></varlistentry>
   <varlistentry
><term
><guilabel
>Об'єднувати за журналом керування версіями на початку об'єднання</guilabel
></term
><listitem
><para
>Якщо буде позначено &kdiff3; виконуватиме автоматичне об'єднання журналів на основі раніше згаданих параметрів після запуску процесу об'єднання. </para
></listitem
></varlistentry>
   <varlistentry
><term
><guilabel
>Макс. кількість записів у історії:</guilabel
></term
><listitem
><para
>&kdiff3; обмежуватиме кількість записів журналу до вказаної. Значенням <literal
>-1</literal
> можна скористатися, щоб вимкнути обмеження. (Типовим значенням є <literal
>-1</literal
>). </para
></listitem
></varlistentry>
   <varlistentry
><term
><guilabel
>Перевіряти ваші формальні вирази</guilabel
></term
><listitem
><para
>За допомогою натискання цієї кнопки ви можете наказати програмі відкрити діалогове вікно, у якому ви зможете випробувати і покращити вказаний вище формальний вираз. Достатньо просто скопіювати відповідні дані з ваших файлів до рядків прикладу. У полі <guilabel
>Результати порівняння</guilabel
> негайно буде показано, було ваше порівняння вдалим чи ні. У полі <guilabel
>Результат ключа впорядкування</guilabel
> буде показано ключ, який буде використано під час впорядкування результату об'єднання журналів. </para
></listitem
></varlistentry>
   <varlistentry
><term
><guilabel
>Безвідносна команда об'єднання:</guilabel
></term
><listitem
><para
>Вкажіть власну команду, яку слід виконати, якщо &kdiff3; виявить, що під час трикомпонентного об'єднання файл з <guilabel
>B</guilabel
> не містить ніяких відповідних даних, яких би не містилося у файлі з <guilabel
>C</guilabel
>. Команда виконуватиметься з параметрами — назвами трьох файлів. Дані, що відповідатимуть <guilabel
>Формальному виразу автооб'єднання</guilabel
> або дані з журналу не вважатимуться відповідними. </para
></listitem
></varlistentry>
   <varlistentry
><term
><guilabel
>Автоматично зберегти і вийти, якщо немає конфліктів</guilabel
></term
><listitem
><para
>Якщо &kdiff3; було запущено для об'єднання файлів з командного рядка і всі
конфлікти можна розв'язати без втручання користувача, автоматично зберегти файли і вийти. (Відповідає параметру командного рядка <option
>--auto</option
>.) </para
></listitem
></varlistentry>
</variablelist>

</sect2>

<sect2
><title
>Об'єднання тек</title>
<para
>Ці параметри використовуватимуться під час сканування теки і виконання об'єднання: докладніше про це можна дізнатися з розділу щодо <link linkend="dirmergeoptions"
>порівняння тек/об'єднання</link
>. </para
><para
>Крім того, тут є ще один параметр, пов'язаних зі збереженням окремих файлів: </para>
<variablelist>
   <varlistentry
><term
><guilabel
>Створювати резервні копії файлів (.orig)</guilabel
></term
><listitem
><para
>Якщо програма зберігатиме файл, який має попередню версію, початкову версію файла буде перейменовано з додаванням суфікса <literal role="extension"
>.orig</literal
>. Якщо у теці вже є файл резервної копії з назвою, що містить суфікс <literal role="extension"
>.orig</literal
>, цей файл буде заміщено новим без створення додаткових резервних копій. </para
></listitem
></varlistentry>
</variablelist>
</sect2>

<sect2
><title
>Параметри локалізації</title>
  <variablelist>
    <varlistentry
><term
><guilabel
>Використовувати однакове кодування для всього</guilabel
></term
><listitem
><para
>Наведені нижче параметри кодування можна скоригувати окремо для кожного з елементів, якщо ж цей пункт буде позначено, всім параметрам буде надано значення першого параметра. </para
></listitem
></varlistentry>
    <varlistentry
><term
><guilabel
>Зауваження: локальним кодуванням є «...»</guilabel
></term
><listitem
><para
>Над списком, призначеним для вибору кодування, буде показано пункт, який інформуватиме вас про поточне системне кодування. (Значення цього пункту змінювати не можна. Його призначено для інформування вас, якщо поточне кодування вам не відоме.) </para
></listitem
></varlistentry>
    <varlistentry
><term
><guilabel
>Автовизначення</guilabel
></term
><listitem
><para
>Якщо буде позначено цей пункт, програма використовуватиме позначку порядку байтів (BOM) або метадані з документів XML/HTML для визначення кодування. Якщо визначити кодування у такий спосіб не вдасться, програма виконає перевірку того, чи може бути короткий зразок з початку файла оброблено як UTF-8. Якщо цю перевірку буде пройдено, буде використано кодування UTF-8. Якщо і цю перевірку не буде пройдено, програма скористається вибраним користувачем кодеком. Якщо не буде виявлено позначки порядку байтів або метаданих, підтримку кодувань буде обмежено лише UTF-8. </para
></listitem
></varlistentry>
    <varlistentry
><term
><guilabel
>Кодування файла для A/B/C:</guilabel
></term
><listitem
><para
>Визначає кодування файлів з вхідними даними. Значення цього параметра визначає спосіб обробки спеціальних символів. Оскільки кодування для кожного з вхідних файлів можна визначати окремо, ви маєте змогу порівнювати навіть файли у різному кодуванні. </para
></listitem
></varlistentry>
    <varlistentry
><term
><guilabel
>Кодування файла для об'єднання і збереження:</guilabel
></term
><listitem
><para
>Якщо ви маєте намір змінити файл, ви можете вказати кодування, яке буде використано для збереження цього файла. </para
></listitem
></varlistentry>
    <varlistentry
><term
><guilabel
>Кодування файлів для файлів препроцесора:</guilabel
></term
><listitem
><para
>Якщо ви визначаєте інструменти попередньої обробки, може так статися, що вони не зможуть працювати з вашим кодуванням. Приклад: ваші файли зберігаються у 16-бітовому кодуванні Unicode, а ваш інструмент попередньої обробки може працювати лише з даним у 8-бітовому кодуванні ASCII. За допомогою цього пункту ви можете визначити кодування для вихідних даних інструменту попередньої обробки (препроцесора). </para
></listitem
></varlistentry>
	<varlistentry
><term
><guilabel
>Мова з записом справа ліворуч:</guilabel
></term
><listitem
><para
>Запис текстів деякими мовами виконується справа ліворуч. Якщо буде позначено цей пункт, &kdiff3; показуватиме текст у напрямку справа ліворуч у областях вхідних даних і у області об'єднаних даних. Зауважте, що, якщо &kdiff3; було запущено командою з параметром <option
>--reverse</option
> всі елементи компонування вікна програми буде також вирівняно справа ліворуч. Цю можливість реалізовано за допомогою бібліотеки &Qt;. </para
><note
><para
>Цю документацію було написано у припущенні, що пункт «Мова з записом справа ліворуч» не позначено, а зворотне компонування не увімкнено. Отже, якщо відповідні параметри все ж було увімкнено, вам слід поміняти місцями слова «ліворуч» і «праворуч», використані у цьому підручнику. </para
></note
></listitem
></varlistentry>

  </variablelist>
</sect2>

<sect2
><title
>Різне</title>
<para
>(Доступ до цих параметрів можна отримати за допомогою меню або кнопок панелі інструментів.)</para>
<variablelist>
  <varlistentry
><term
><emphasis
>Параметри огляду:</emphasis
></term
><listitem
><para
>Відповідні варіанти будуть доступними лише у разі порівняння трьох файлів. У звичайному режимі всі відмінності буде показано у одному розфарбованому у різні кольори стовпчику огляду. Але іноді у вас може виникати зацікавленість у перегляді відмінностей лише у двох з цих трьох файлів. У разі вибору одного з варіантів перегляду, «A з B», «A з C» або «B з C», програма покаже другий стовпчик огляду з потрібними даними, розташований поряд зі звичайним стовпчиком огляду. </para
></listitem
></varlistentry>
  <varlistentry
><term
><guimenuitem
>Перенесення рядків у вікнах різниці</guimenuitem
></term
><listitem
><para
>Переносити рядки, чия довжина перевищує ширину вікна. </para
></listitem
></varlistentry>
  <varlistentry
><term
><guibutton
>Показати вікно A/B/C:</guibutton
></term
><listitem
><para
>Іноді бажано максимально використати простір вікна для показу довгих рядків. Сховайте вікна, які не є важливими (за допомогою меню «Вікно»).</para
></listitem
></varlistentry>
  <varlistentry
><term
><guibutton
>Перемкнути орієнтацію відокремлення</guibutton
></term
><listitem
><para
>Перемикає орієнтацію вікон різниць, розташованих поруч (<guilabel
>A</guilabel
> ліворуч від <guilabel
>B</guilabel
>, а <guilabel
>B</guilabel
> ліворуч від <guilabel
>C</guilabel
>) або одне над одним (<guilabel
>A</guilabel
> над <guilabel
>B</guilabel
> над <guimenu
>C</guimenu
>). Цей параметр може допомогти вам покращити перегляд, якщо рядки достатньо довгі (у меню <guilabel
>Вікна</guilabel
>). </para
></listitem
></varlistentry>
  <varlistentry
><term
><guibutton
>Об'єднати поточний файл</guibutton
></term
><listitem
><para
>Працюватиме лише у випадку, коли ви маєте справу з порівнянням двох файлів. Одним клацанням лівою кнопкою миші ви можете розпочати об'єднання з використанням назви файла останнього файла вхідних даних як типової назви для файла виводу. Якщо ви скористалися відповідним пунктом для перезапуску об'єднання, назву файла виводу змінено не буде.</para
></listitem
></varlistentry>
  <varlistentry
><term
><guibutton
>Показувати пробіли</guibutton
></term
><listitem
><para
>Зніміть позначку з цього пункту, щоб придушити підсвічування відмінностей у кількості пробілів у тексті або стовпчиках огляду. Зауважте, що це також стосується відмінностей у числах та коментарях, якщо позначено пункти <guilabel
>Ігнорувати числа (вважати пробілами)</guilabel
> та <guilabel
>Ігнорувати коментарі C/C++ (вважати пробілами)</guilabel
>.</para
></listitem
></varlistentry>
  <varlistentry
><term
><guibutton
>Показувати символи пробілів і табуляцій для різниць:</guibutton
></term
><listitem
><para
>Іноді візуалізація пробілів і символів табуляції заважає перегляду. За допомогою цього пункту ви можете її вимкнути.</para
></listitem
></varlistentry>
  <varlistentry
><term
><guibutton
>Показувати номери рядків</guibutton
></term
><listitem
><para
>За допомогою цього пункту ви можете наказати програмі показувати або не показувати номери рядків тексту.</para
></listitem
></varlistentry>
</variablelist>
</sect2>

<sect2 id="shortcuts"
><title
>Налаштування клавіатурних скорочень</title>
<para
>У поточній версії програми можливість налаштування клавіатурних скорочень користувачем підтримується лише у версії програми для Frameworks. (Меню <menuchoice
><guimenu
>Параметри</guimenu
> <guimenuitem
>Налаштувати скорочення...</guimenuitem
></menuchoice
>) </para>
</sect2>
</sect1>

<sect1 id="preprocessors"
><title
>Команди попередньо обробки</title>
<para
>У &kdiff3; підтримуються два параметри попередньої обробки. </para
><para>
<variablelist>
   <varlistentry
><term
><guilabel
>Команда препроцесора:</guilabel
></term
><listitem
><para
>Під час читання будь-якого файла його буде оброблено вказаною зовнішньою програмою. Замість вмісту початкового файла ви побачите дані, виведене відповідною програмою. Ви можете написати ваш власний інструмент попередньої обробки (препроцесор), який виконуватиме потрібні вам дії. Препроцесор може вирізати непотрібні частини файлів або автоматично виправити відступи тощо. </para
></listitem
></varlistentry>
   <varlistentry
><term
><guilabel
>Команда відповідності рядків препроцесора:</guilabel
></term
><listitem
><para
>Під час читання будь-якого файла його буде оброблено вказаною зовнішньою програмою. Якщо було вказано команду-препроцесор (див. вище), дані, виведені препроцесором стануть вхідними даними для препроцесора пошуку відповідних рядків. Виведені цим препроцесором дані буде використано лише під час фази знаходження відповідників аналізу вмісту файлів. Ви можете написати ваш власний інструмент попередньої обробки (препроцесор), який виконуватиме потрібні вам дії. За використання такого препроцесора кожному рядку вхідних даних має відповідати точно один рядок виведених даних. </para
></listitem
></varlistentry>
</variablelist>
</para>
<para
>Призначенням препроцесорів є надання у розпорядження користувача більшої гнучкості у налаштуванні результату порівняння. Використання препроцесора вимагає наявності зовнішньої програми, а більшість користувачів не є програмістами. Непоганою новиною тут має стати те, що дуже часто для виконання потрібних завдань достатньо скористатися командами <command
>sed</command
> або <command
>perl</command
>. </para>
<para
>Приклад. Простий тест: розглянемо файл a.txt (6 рядків): </para>
<screen
>aa
      ba
      ca
      da
      ea
      fa
</screen>
<para
>і файл b.txt (3 рядки): </para>
<screen
>cg
      dg
      eg
</screen>
<para
>Якщо не використовувати препроцесора, у відповідність буде "#~ "поставлено такі рядки: </para>
<screen
>aa - cg
      ba - dg
      ca - eg
      da
      ea
      fa
</screen>
<para
>Навряд чи ми бажали саме цього, оскільки насправді важливу інформацію містить перша літера рядка. Щоб допомогти алгоритмові пошуку відповідників уникнути порівняння за другою літерою, ми можемо скористатися командою-препроцесором, яка замінить «g» на «a»: </para>
<screen
><command
>sed</command
> 's/g/a/'
</screen>
<para
>У результаті виконання цієї команди порівняння матимемо: </para>
<screen
>aa
      ba
      ca - cg
      da - dg
      ea - eg
      fa
</screen>
<para
>З точки зору внутрішньої структури програми, алгоритм пошуку відповідників застосовується лише після запуску препроцесора пошуку відповідників, але на екрані файл залишиться незмінним. Звичайний же препроцесор змінив би вміст файла на екрані. </para>

<sect2 id="sedbasics"
><title
>Основи <command
>sed</command
></title>
<para
>Цей розділ є лише вступом, у якому обговорено найпростіші можливості команди <command
>sed</command
>. Докладніші відомості можна знайти на сторінці <ulink url="info:/sed"
>info:/sed</ulink
> або <ulink url="https://www.gnu.org/software/sed/manual/html_mono/sed.html"
> http://www.gnu.org/software/sed/manual/html_mono/sed.html</ulink
>. Зібрану версію цієї програми для &Windows; можна знайти за адресою <ulink url="http://unxutils.sourceforge.net"
> http://unxutils.sourceforge.net</ulink
>. Зауважте, що у наведених нижче прикладах припускається, що файл програми  <command
>sed</command
> зберігається у одній з тек, які вказано у змінній середовища <envar
>PATH</envar
>. Якщо це не так, вам доведеться вказувати повний абсолютний шлях до файла програми. </para>
<para
>У цьому контексті використовується лише команда заміни <command
>sed</command
>: </para>
<screen
><command
>sed</command
> 's/<replaceable
>ФОРМАЛЬНИЙ_ВИРАЗ</replaceable
>/<replaceable
>ЗАМІННИК</replaceable
>/<replaceable
>ПРАПОРЦІ</replaceable
>'
</screen>
<para
>Перш ніж користуватися новою командою у &kdiff3;, вам слід спочатку випробувати її у консолі. Для такої перевірки вам знадобиться команда <command
>echo</command
>. Приклад: </para>
<screen
><command
>echo</command
> abrakadabra | <command
>sed</command
> 's/a/o/'
   -> obrakadabra
</screen>
<para
>У цьому прикладі ми продемонстрували дуже просту команду sed, яка заміняє перше знайдене «a» на «o». Якщо ви бажаєте замінити всі «a», вам слід скористатися прапорцем «g»: </para>
<screen
><command
>echo</command
> abrakadabra | <command
>sed</command
> 's/a/o/g'
   -> obrokodobro
</screen>
<para
>Символ «|» використовується для створення конвеєрів: дані, виведені попередньою командою, передаються як вхідні дані наступній команді. Якщо ви бажаєте виконати перевірку на великому файлі, вам слід скористатися командою <command
>cat</command
> у &UNIX;-подібних системах або командою  <command
>type</command
> у &Windows;-подібних системах. <command
>sed</command
> виконає заміну у всіх рядках. <screen
><command
>cat</command
> <replaceable
>назва файла</replaceable
> | <command
>sed</command
> <replaceable
>параметри</replaceable
>
</screen>
</para>
</sect2>
<sect2 id="sedforkdiff3"
><title
>Приклади використання <command
>sed</command
> у &kdiff3;</title>
<sect3
><title
>Ігнорування коментарів інших типів</title>
<para
>Поточна версія &kdiff3; розуміє лише коментарі у стилі C/C++. За допомогою команди препроцесора пошуку відповідників ви можете наказати програмі ігнорувати інші типи коментарів перетворенням цих коментарів на коментарі C/C++. </para>
<para
> Приклад: щоб наказати програмі ігнорувати коментарі, що починаються з «#», вам слід перетворити цей символ на «//». Зауважте, що вам також слід позначити пункт <guilabel
>Ігнорувати коментарі C/C++</guilabel
>, щоб отримати бажаний результат. Відповідна команда препроцесора пошуку відповідників буде такою: </para>
<screen
><command
>sed</command
> 's/#/\/\//'
</screen>
<para
>Оскільки у <command
>sed</command
> символ «/» має особливе призначення, у рядку-заміннику перед кожним символом «/» слід додавати символ «\». Цей символ потрібен для додавання або вилучення особливого призначення інших символів. Крім того, символи одинарних лапок (') перед і після команди заміни є важливими лише під час тестування команд командної оболонки, оскільки якщо ви їх не використовуватимете, оболонка виконання команд намагатиметься інтерпретувати деякі символи. Сама програма &kdiff3; не виконуватиме інтерпретації, окрім як для послідовностей символів «\"» та «\\». </para>
</sect3>
<sect3
><title
>Пошук відмінностей без врахування регістру</title>
<para
>Скористайтеся такою командою препроцесора пошуку відповідників для перетворення усіх символів вхідних даних до верхнього регістру: </para>
<screen
><command
>sed</command
> 's/\(.*\)/\U\1/'
</screen>
<para
>У цій команді ми використали «<literal
>.*</literal
>» — формальний вираз, що відповідає будь-якому рядку, а у нашому контексті відповідними вважатимуться всі символи рядка. Послідовність символів «<literal
>\1</literal
>» у рядку-заміннику відповідає знайденому тексту у першій парі круглих дужок, «<literal
>\(</literal
>» і «<literal
>\)</literal
>». Команда «<literal
>\U</literal
>» перетворює символи вставленого тексту на символи у верхньому регістрі. </para>
</sect3>

<sect3
><title
>Ігнорування ключових слів системи керування версіями</title>
<para
>У CVS та інших системах керування версіями використовується декілька ключових слів, призначених для вставки автоматично створених рядків (див. <ulink url="info:/cvs/Keyword substitution"
>info:/cvs/Keyword substitution</ulink
>). Всі ці ключові слова буде вказано за схемою: <replaceable
>$КЛЮЧОВЕ_СЛОВО створений текст$</replaceable
>. Нам буде потрібна команда препроцесора пошуку відповідників, який вилучить лише створений текст: </para>
<screen
><command
>sed</command
> 's/\$\(Revision\|Author\|Log\|Header\|Date\).*\$/\$\1\$/'
</screen>
<para
>Символ «<literal
>\|</literal
>» відокремлює можливі варіанти ключових слів. Можливо, вам слід змінити цей список відповідно до ваших потреб. Перед символом «<literal
>$</literal
>» обов'язково слід додати символ екранування «<literal
>\</literal
>», оскільки у іншому випадку команда вважатиме, що «<literal
>$</literal
>» позначає кінець рядка. </para>
<para
>Під час експериментів з <command
>sed</command
> ви краще зрозумієте механізм дії і навіть полюбите формальні вирази. Це буде корисним, оскільки значна кількість інших програм підтримують подібні формальні вирази. </para>
</sect3>

<sect3
><title
>Ігнорування цифр</title>
<para
>Насправді ігнорування чисел є вбудованою функцією. Але, як ще один приклад, ми покажемо, як зробити так, щоб під час пошуку відповідників програма ігнорувала числа, за допомогою команди препроцесора порівняння рядків: </para>
<screen
><command
>sed</command
> 's/[0123456789.-]//g'
</screen>
<para
>Препроцесор знайде всі символи, вказані між квадратними дужками, і вилучить їх (замінить на порожнє місце). </para>
</sect3>

<sect3
><title
>Ігнорування певних стовпчиків</title>
<para
>Іноді ви маєте справу зі строго форматованим текстом, який містить позиції, які завжди слід ігнорувати, інші ж позиції тексту потрібно проаналізувати. У наступному прикладі буде проігноровано перших п'ять позицій (символів), наступні десять позицій буде збережено, наступні п'ять знову проігноровано, решту рядка буде збережено: </para>
<screen
><command
>sed</command
> 's/.....\(..........\).....\(.*\)/\1\2/'
</screen>
<para
>Кожна крапка «<literal
>.</literal
>» замінює собою будь-який одинарний символ. Записи «<literal
>\1</literal
>» і «<literal
>\2</literal
>» у рядку-заміннику посилаються на знайдений текст у першій і другій парі круглих дужок («<literal
>\(</literal
>» і «<literal
>\)</literal
>») і є замінниками знайденого тексту без змін. </para>
</sect3>

<sect3
><title
>Комбінування декількох підстановок</title>
<para
>Іноді виникає потреба у одночасному виконанні декількох підстановок. У такому випадку ви можете скористатися крапкою з комою («;»), щоб відокремити одну підстановку від інших. Приклад: </para>
<screen
><command
>echo</command
> abrakadabra | <command
>sed</command
> 's/a/o/g;s/\(.*\)/\U\1/'
   -> OBROKODOBRO
</screen>
</sect3>

<sect3
><title
>Використання <command
>perl</command
> замість <command
>sed</command
></title>
<para
>Замість <command
>sed</command
> ви можете скористатися, наприклад, <command
>perl</command
>. </para>
<screen
><command
>perl</command
> -p -e 's/<replaceable
>ФОРМАЛЬНИЙ_ВИРАЗ</replaceable
>/<replaceable
>ЗАМІННИК</replaceable
>/<replaceable
>ПРАПОРЦІ</replaceable
>'
</screen>
<para
>Але у <command
>perl</command
> ви матимете справу з дещо відмінними конструкціями формальних виразів. Зауважте, що там, де у <command
>sed</command
> слід використовувати "\(" і "\)", у <command
>perl</command
> слід використовувати простіший варіант "(" і ")" без попередніх '\'. Приклад: </para>
<screen
><command
>sed</command
> 's/\(.*\)/\U\1/'
   <command
>perl</command
> -p -e 's/(.*)/\U\1/'
</screen>
</sect3>
</sect2>

<sect2
><title
>Порядок виконання попередньої обробки</title>
<para
>Дані буде пропущено через всі внутрішні та зовнішні препроцесори у такому порядку: </para>
<itemizedlist>
<listitem
><para
>Звичайний препроцесор,</para
></listitem>
<listitem
><para
>Препроцесор пошуку рядків,</para
></listitem>
<listitem
><para
>Ігнорування регістру (вважати пробілами) (перетворення на літери верхнього регістру),</para
></listitem>
<listitem
><para
>Визначення коментарів C/C++,</para
></listitem>
<listitem
><para
>Ігнорування чисел (вважати пробілами),</para
></listitem>
<listitem
><para
>Ігнорування пробілів</para
></listitem>
</itemizedlist>
<para
>Після обробки звичайним препроцесором дані не буде змінено: їх буде показано і об'єднано у початковому вигляді. За допомогою інших дій у програмі можна буде змінити лише дані, які було повернуто алгоритмом пошуку відповідних рядків. </para
><para
>У рідкісних випадках використання звичайного препроцесора зауважте, що препроцесор пошуку відповідних рядків оброблятиме лише рядки, передані йому звичайним препроцесором. </para>
</sect2>

<sect2
><title
>Попередження</title>
<para
>Часто команди попередньої обробки виявляються дуже корисними, але, як це трапляється з будь-якою дією, внаслідок якої відбувається автоматична заміна фрагментів вашого тексту або приховування певних відмінностей, може статися випадковий пропуск певних даних або, у найгіршому випадку, знищення важливих даних. </para
><para
>З цієї причини під час об'єднання, якщо було використано звичайну команду-препроцесор, &kdiff3; повідомить вас про це і запитає про те, бажаєте ви вимкнути наслідки дії цієї команди чи ні. Але програма не попереджатиме вас про використання команди-препроцесора, призначеної для пошуку відповідних рядків. Об'єднання не буде завершено, доки ви не розв'яжете всі конфлікти. Якщо ви знімете позначку з пункту «Показувати пробіли», відмінності, які було вилучено командою-препроцесором пошуку відповідних рядків, також стануть невидимими. Якщо після цього ви не зможете зробити кнопку «Зберегти» активною під час об'єднання (оскільки залишатимуться не розв'язані конфлікти), знову позначте пункт «Показувати пробіли». Якщо ви не бажаєте виконувати розв'язання цих малозначущих конфліктів вручну, ви можете скористатися пунктами «Вибрати A/B/C для всіх нерозв'язаних конфліктів пробілів» з меню «Об'єднання». </para>
</sect2>
</sect1>
</chapter>


<chapter id="dirmerge"
><title
>Порівняння і об'єднання тек за допомогою &kdiff3;</title>
<sect1 id="dirmergeintro"
><title
>Вступ до порівняння і об'єднання тек</title>
<para
>Часто програмістам для досягнення потрібної мети доводиться змінювати багато файлів у певній теці. У такому випадку &kdiff3; надасть вам змогу порівняти і об'єднати цілі теки рекурсивно! </para
><para
>Хоча порівняння і об'єднання тек здається зовсім очевидною дією, існує декілька моментів, на які вам слід звернути увагу. Найважливішим є, звичайно ж, той факт, що кожна з дій на цей раз включатиме цілий набір файлів. Якщо у вас немає резервних копій початкових даних, теку буде дуже важко або навіть неможливо повернути у початковий стан. Отже, перш ніж виконувати об'єднання, переконайтеся, що ваші дані у безпеці і повернення до попереднього стану можливе. Можна скористатися архівуванням або використати одну з систем керування версіями, але навіть досвідченим програмістам та інтеграторам іноді можуть знадобитися старі коди програм. Зауважте, що хоча автор &kdiff3; намагався (і намагатиметься) зробити програму якомога кращою, гарантувати відсутність вад у програмі просто неможливо. Відповідно до GNU-GPL автор НІЧОГО НЕ ГАРАНТУЄ щодо цієї програми. Отже, змиріться і завжди пам'ятайте, що: </para>
<blockquote
><para>
   <emphasis
>Людині властиво помилятися, але, щоб насправді все заплутати, їй потрібен комп'ютер.</emphasis>
</para
></blockquote>
<para
>Отже, ось що ця програма може зробити для вас: &kdiff3; ... </para>
<itemizedlist>
     <listitem
><para
>...рекурсивно прочитати і порівняти дві або три теки,</para
></listitem>
     <listitem
><para
>...виконати особливу обробку символічних посилань,</para
></listitem>
     <listitem
><para
>...надати вам змогу переглянути файли подвійним клацанням кнопкою миші,</para
></listitem>
     <listitem
><para
>...для кожного з пунктів запропонувати дію з об'єднання, яку ви можете змінити перед тим, як розпочати об'єднання тек,</para
></listitem>
     <listitem
><para
>...надати вам змогу зімітувати об'єднання і показати список дій, які буде виконано без їх виконання насправді,</para
></listitem>
     <listitem
><para
>...надати вам змогу насправді виконати об'єднання і втрутитися, якщо знадобиться ваше втручання вручну,</para
></listitem>
     <listitem
><para
>...надати вам змогу виконати вибрану дію для всіх елементів (клавіша <keycap
>F7</keycap
>) або вибраного елемента (клавіша <keycap
>F6</keycap
>),</para
></listitem>
     <listitem
><para
>...надати вам змогу продовжити автоматичне об'єднання за допомогою клавіші <keycap
>F7</keycap
>, після вашого втручання вручну,</para
></listitem>
     <listitem
><para
>...за бажання, створити резервні копії з суфіксом <literal role="extension"
>.orig</literal
>,</para
></listitem>
     <listitem
><para
>...</para
></listitem>
</itemizedlist>
</sect1>

<sect1 id="startingdirmerge"
><title
>Запуск порівняння або об'єднання тек</title>
<para
>Виконання цього завдання дуже подібне на виконання завдання з порівняння і об'єднання окремих файлів. Вам просто слід вказати теки у командному рядку або у діалоговому вікні відкриття файлів. </para>
<sect2
><title
>Порівняння/Об'єднання двох тек: </title>
<screen
><command
>kdiff3</command
> <replaceable
>тека1 тека2</replaceable>
   <command
>kdiff3</command
> <replaceable
>тека1 тека2</replaceable
> -o <replaceable
>тека_призначення</replaceable
>
</screen>
<para
>Якщо не буде вказано теки призначення, &kdiff3; використовуватиме <replaceable
>тека2</replaceable
>. </para>
</sect2>

<sect2
><title
>Порівняння/Об'єднання трьох тек: </title>
<screen
><command
>kdiff3</command
> <replaceable
>тека1 тека2 тека3</replaceable>
   <command
>kdiff3</command
> <replaceable
>тека1 тека2 тека3</replaceable
> -o <replaceable
>тека_призначення</replaceable
>
</screen>
<para
>Якщо об'єднуються три теки, базовою для об'єднання буде <replaceable
>тека1</replaceable
>. Якщо теки призначення не вказано, &kdiff3; використає з цією метою <replaceable
>тека3</replaceable
>. </para>

<para
>Зауважте, що автоматично починається лише порівняння, але не об'єднання. Щоб виконати об'єднання, вам слід скористатися відповідним пунктом меню або натиснути клавішу <keycap
>F7</keycap
> (докладніше про це згодом). </para>
</sect2>
</sect1>

<sect1 id="dirmergevisible"
><title
>Візуальні дані щодо об'єднання тек</title>
<para
>Під час читання тек програма показуватиме піктограму з поштовою скринькою, яка позначає виконання завдання. Якщо ви перервете сканування тек, буде показано список лише тих файлів, які програма встигла просканувати. </para
><para
>Після завершення сканування тек &kdiff3; покаже панель з результатами ліворуч... </para>
<screenshot
><mediaobject>
<imageobject
><imagedata fileref="dirbrowser.png" format="PNG"/></imageobject
> <!--alt="Image of the folder browser."-->
</mediaobject
></screenshot>
<para
>... і подробиці щодо поточного вибраного елемента праворуч: </para>
<screenshot
><mediaobject>
<imageobject
><imagedata fileref="iteminfo.png" format="PNG"/></imageobject>
   <!--alt="Image with information about the selected item."-->
</mediaobject
></screenshot>

<sect2 id="name"
><title
>Стовпчик назви</title>
<para
>Тут буде показано ієрархічний список всіх файлів і тек, які було знайдено під час сканування. Вибрати пункт списку можна наведенням на нього вказівника миші з наступним клацанням лівою кнопкою миші. </para
><para
>Типово, теки буде згорнуто. Розгортати або згортати теки можна натисканням кнопки «+»/«-», подвійним на позначці теки або за допомогою натискання клавіш зі стрілочками ліворуч і праворуч на клавіатурі. Крім того, у меню <guimenu
>Тека</guimenu
> міститься два пункти, <guimenuitem
>Згорнути всі підтеки</guimenuitem
> і <guimenuitem
>Розгорнути всі підтеки</guimenuitem
>, за допомогою яких ви можете згортати або розгортати всі теки одразу. </para
><para
>Після наведення вказівника миші на позначку файла з наступним подвійним клацанням лівою кнопкою миші буде відкрито перегляд відмінностей для відповідного файла. </para>
<para
>Зображення у стовпчику назви відповідатиме типу файла у першій теці (<guilabel
>A</guilabel
>). Можливі такі варіанти: </para>
<itemizedlist>
     <listitem
><para
>Звичайний файл</para
></listitem>
     <listitem
><para
>Звичайна тека (зображення теки)</para
></listitem>
     <listitem
><para
>Посилання на файл (зображення файла з стрілочкою посилання)</para
></listitem>
     <listitem
><para
>Посилання на теку (зображення теки зі стрілочкою посилання)</para
></listitem>
</itemizedlist>
<para
>Якщо типи файлів у теках відрізнятимуться, ви зможете помітити це за стовпчиками <guilabel
>A</guilabel
>/<guilabel
>B</guilabel
>/<guilabel
>C</guilabel
>, а також за вікном докладними відомостями щодо вибраного пункту. Зауважте, що у таких випадках вибір автоматичного об'єднання неможливий. Якщо користувач викличе дію з об'єднання, його буде попереджено про проблеми з типом файлів. </para>
</sect2>

<sect2 id="coloring"
><title
>Стовпчики A/B/C і схема кольорів</title>
<para
>Як можна бачити на наведеному вище зображенні для стовпчиків <guilabel
>A</guilabel
>/<guilabel
>B</guilabel
>/<guilabel
>C</guilabel
> використовуються червоний, зелений, жовтий і чорний кольори. </para>
<itemizedlist>
     <listitem
><para
>Чорний: елемента не існує у цій теці.</para
></listitem>
     <listitem
><para
>Зелений: найновіший елемент.</para
></listitem>
     <listitem
><para
>Жовтий: старіший за зелений, новіший за червоний.</para
></listitem>
     <listitem
><para
>Червоний: найстаріший елемент.</para
></listitem>
</itemizedlist>
<para
>Але елементи, які є однаковими у всіх теках колір теж буде однаковим, хоча їх вік і відрізнятиметься. </para
><para
>Теки вважатимуться однаковими, якщо всі елементи, які у них містяться, є однаковими. Однакові елементи програма показуватиме однаковим кольором. Під час визначення кольору вік теки до уваги не братиметься. </para
><para
>Ідею подібного розфарбування запозичено з програми <ulink url="https://www.samba.org/ftp/paulus/"
><command
>dirdiff</command
></ulink
>. Кольори відповідають кольорам листя: воно зелене, коли тільки-но з'являється на деревах, пізніше перетворюється на жовте, а згодом на червоне. </para>

</sect2
><sect2 id="operation"
><title
>Стовпчик дій</title>
<para
>Після порівняння тек &kdiff3; намагається визначитися пропозиціями щодо дії з об'єднання. Ці пропозиції буде показано у стовпчику <guilabel
>Дія</guilabel
>. Ви можете змінити дію натисканням позначки дії, яку ви бажаєте змінити. Програма відкриє невеличке меню, за допомогою якого ви зможете вибрати дію для відповідного пункту. Крім того, ви можете вибрати одну з найпоширеніших дій за допомогою клавіатури. Натискання комбінацій клавіш <keycombo
>&Ctrl;<keycap
>1</keycap
></keycombo
>/<keycap
>2</keycap
>/<keycap
>3</keycap
>/<keycap
>4</keycap
>/&Del; призведе до вибору дій A/B/C/Об'єднати/Вилучити, відповідно. Вибрану вами дію буде виконано під час об'єднання. Перелік можливих дій і режим об'єднання залежатиме від вибраного пункту. Можливі такі режими об'єднання: </para>
<itemizedlist>
     <listitem
><para
>Об'єднання трьох тек (<guilabel
>A</guilabel
> вважається старішою базою для двох інших).</para
></listitem>
     <listitem
><para
>Об'єднання двох тек.</para
></listitem>
     <listitem
><para
>Режим синхронізації двох тек (активується за допомогою пункту <guilabel
>Синхронізувати теки</guilabel
>).</para
></listitem>
</itemizedlist>
<para
>Під час виконання об'єднання трьох тек логіка програми виглядає так: Якщо елемент... </para>
<itemizedlist>
     <listitem
><para
>...всі три теки містять однакові файли: копіювання з <guilabel
>C</guilabel
> </para
></listitem>
     <listitem
><para
>... <guilabel
>A</guilabel
> і <guilabel
>C</guilabel
> є однаковими, <guilabel
>B</guilabel
> відрізняється: копіювати з <guilabel
>B</guilabel
> (або, якщо <guilabel
>B</guilabel
> не існує, вилучити файли з <guilabel
>A</guilabel
> і <guilabel
>С</guilabel
>) </para
></listitem>
     <listitem
><para
>... <guilabel
>A</guilabel
> і <guilabel
>B</guilabel
> є однаковими, <guilabel
>C</guilabel
> відрізняється: копіювати з <guilabel
>C</guilabel
> (або, якщо <guilabel
>C</guilabel
> не існує, вилучити файли з <guilabel
>A</guilabel
> і <guilabel
>B</guilabel
>) </para
></listitem>
     <listitem
><para
>... <guilabel
>B</guilabel
> і <guilabel
>C</guilabel
> є однаковими, <guilabel
>A</guilabel
> відрізняється: копіювати з <guilabel
>C</guilabel
> (або, якщо <guilabel
>C</guilabel
> не існує, вилучити файли з <guilabel
>A</guilabel
>) </para
></listitem>
     <listitem
><para
>...існує лише <guilabel
>A</guilabel
>: вилучення призначення (якщо воно існує) </para
></listitem>
     <listitem
><para
>... існує лише у <guilabel
>B</guilabel
>: копіювати з <guilabel
>B</guilabel
> </para
></listitem>
     <listitem
><para
>... існує лише у <guilabel
>C</guilabel
>: копіювати з <guilabel
>C</guilabel
> </para
></listitem>
     <listitem
><para
>... <guilabel
>A</guilabel
>, <guilabel
>B</guilabel
> і <guilabel
>C</guilabel
> є різними: об'єднати </para
></listitem>
     <listitem
><para
>... файли у <guilabel
>A</guilabel
>, <guilabel
>B</guilabel
> і <guilabel
>C</guilabel
> належать до різних типів (наприклад у <guilabel
>A</guilabel
> — це тека, у <guilabel
>B</guilabel
> — файл): «Помилка: Конфлікти типів файлів». Хоча відповідні елементи і існують, об'єднання тек розпочати неможливо. </para
></listitem>
</itemizedlist>
<para
>Під час виконання об'єднання двох тек логіка програми виглядає так: Якщо елемент... </para>
<itemizedlist>
     <listitem
><para
>... є однаковим у обох теках: копіювати з <guilabel
>B</guilabel
> </para
></listitem>
     <listitem
><para
>... існує у <guilabel
>A</guilabel
>, але не існує у <guilabel
>B</guilabel
>: копіювати з <guilabel
>A</guilabel
> </para
></listitem>
     <listitem
><para
>... існує у <guilabel
>B</guilabel
>, але не існує <guilabel
>A</guilabel
>: копіювати з <guilabel
>B</guilabel
> </para
></listitem>
     <listitem
><para
>... елемент існує у <guilabel
>A</guilabel
> і <guilabel
>B</guilabel
>, але він є різним: об'єднати </para
></listitem>
     <listitem
><para
>... файли у <guilabel
>A</guilabel
> і <guilabel
>B</guilabel
> належать до різних типів (наприклад у <guilabel
>A</guilabel
> це тека, у <guilabel
>B</guilabel
> — файл): «Помилка: Конфлікти типів файлів». Хоча відповідні елементи і існують об'єднання тек розпочати неможливо. </para
></listitem>
</itemizedlist>
<para
>Режим синхронізації буде задіяно, лише якщо виконується порівняння двох тек, а призначення не вказано явним чином, і якщо позначено пункт <guilabel
>Синхронізувати теки</guilabel
>. У такому разі &kdiff3; обере типову дію, після виконання якої обидві теки будуть однаковими. Якщо... </para>
<itemizedlist>
     <listitem
><para
>...обидві теки містять однакові файли: ніяких дій виконано не буде. </para
></listitem>
     <listitem
><para
>...існує <guilabel
>A</guilabel
>, але не існує <guilabel
>B</guilabel
>: копіювання <guilabel
>A</guilabel
> до <guilabel
>B</guilabel
> </para
></listitem>
     <listitem
><para
>...існує <guilabel
>B</guilabel
>, але не існує <guilabel
>A</guilabel
>: копіювання <guilabel
>B</guilabel
> до <guilabel
>A</guilabel
> </para
></listitem>
     <listitem
><para
>...існують <guilabel
>A</guilabel
> і <guilabel
>B</guilabel
>, але вони не збігаються: об'єднання зі збереженням даних результату у обох теках. (Для користувача видимим файлом, куди буде збережено дані буде <guilabel
>B</guilabel
>, але після зберігання &kdiff3; скопіює <guilabel
>B</guilabel
> до <guilabel
>A</guilabel
>.) </para
></listitem>
     <listitem
><para
>... файли у <guilabel
>A</guilabel
> і <guilabel
>B</guilabel
> належать до різних типів (наприклад у <guilabel
>A</guilabel
> це тека, у <guilabel
>B</guilabel
> — файл): «Помилка: Конфлікти типів файлів». Хоча відповідні елементи і існують об'єднання тек розпочати неможливо. </para
></listitem>
</itemizedlist>
<para
>Якщо виконується об'єднання двох тек і позначено пункт <guilabel
>Копіювати новіший, замість об'єднання</guilabel
>, &kdiff3; виконуватиме визначення дат зміни файлів і пропонуватиме вибрати новіший файл. Якщо файли мають різний вміст, але однакову дату зміни, дія міститиме напис «Помилка: Дати однакові, а файли відрізняються». У такому разі, хоча елементи існують, неможливо розпочати об'єднання тек. </para>
</sect2>

<sect2 id="status"
><title
>Стовпчик стану</title>
<para
>Під час об'єднання файли оброблятимуться один за одним. У стовпчику стану буде показано слово <guilabel
>Виконано</guilabel
> для пунктів, для яких дія з об'єднання була успішною, та інший текст, якщо сталося щось непередбачене. Після завершення дії об'єднання вам слід перевірити, чи для всіх пунктів стан об'єднання є задовільним. </para>
</sect2>

<sect2 id="statisticscolulmns"
><title
>Стовпчики статистики</title>
<para
>Якщо у параметрах програми увімкнено режим <guilabel
>Повний аналіз</guilabel
>, &kdiff3; покаже додаткові стовпчики з кількістю нерозв'язаних і розв'язаних конфліктів, а також кількістю конфліктів у пробілах і конфліктів, не пов'язаних з пробілами. Стовпчик розв'язаних конфліктів буде показано лише у випадку порівняння або об'єднання трьох тек. </para>
</sect2>

<sect2 id="selectingvisiblefiles"
><title
>Вибір файлів зі списку</title>
<para
>Переліком файлів, показаних у цьому списку, керує декілька параметрів. Доступ до деяких з них можна отримати за допомогою <link linkend="dirmergeoptions"
>діалогового вікна параметрів</link
>. У меню <guilabel
>Тека</guilabel
> містяться такі пункти: </para
><para
><itemizedlist>
     <listitem
><para
><guilabel
>Показувати однакові файли</guilabel
>: показати файли, які програма визначила як однакові у всіх початкових теках. </para
></listitem>
     <listitem
><para
><guilabel
>Показувати різні файли</guilabel
>: показати файли, які існують у декількох теках, але не є однаковими. </para
></listitem>
     <listitem
><para
><guilabel
>Показувати файли лише у A</guilabel
>: показати файли, які існують лише у <guilabel
>A</guilabel
>, і яких немає у <guilabel
>B</guilabel
> і <guilabel
>C</guilabel
>. </para
></listitem>
     <listitem
><para
><guilabel
>Показувати файли лише у B</guilabel
>: показати файли, які існують лише у <guilabel
>B</guilabel
>, і яких немає у <guilabel
>A</guilabel
> і <guilabel
>C</guilabel
>. </para
></listitem>
     <listitem
><para
><guilabel
>Показувати файли лише у C</guilabel
>: показати файли, які існують лише у <guilabel
>C</guilabel
>, і яких немає у <guilabel
>A</guilabel
> і <guilabel
>B</guilabel
>. </para
></listitem>
</itemizedlist
></para>
<para
>Позначте пункти <guilabel
>Показувати</guilabel
> лише для тих елементів, які ви бажаєте бачити у списку. Якщо, наприклад, ви бажаєте бачити у списку лише ті елементи, які існують або у <guilabel
>A</guilabel
>, або у <guilabel
>B</guilabel
>, але не у обох теках, вам слід позначити пункти <guilabel
>Показувати файли лише у A</guilabel
> і <guilabel
>Показувати файли лише у B</guilabel
> і зняти позначки з усіх інших пунктів (<guilabel
>Показувати однакові файли</guilabel
>, <guilabel
>Показувати різні файли</guilabel
>, <guilabel
>Показувати файли лише у C</guilabel
>). Після внесення змін список буде негайно оновлено відповідним чином. </para
><para
>Ці параметри буде також використано і для тек, за одним винятком: зняття позначки з пункту <guilabel
>Показувати різні файли</guilabel
> не призведе до приховування жодної з тек. Цей параметр призначено лише для файлів у цих теках. </para
><para
>Зауважте, що серед усіх цих параметрів програма зберігатиме значення лише параметра <guilabel
>Показувати однакові файли</guilabel
>. Інші пункти буде знову позначено після наступного запуску &kdiff3;. </para>
</sect2>

</sect1>


<sect1 id="dothemerge"
><title
>Виконання об'єднання тек</title>
<para
>Ви можете наказати програмі виконати об'єднання поточного вибраного елемента (файла чи теки) або всіх елементів. Коли ви визначитеся з усіма параметрами дії (у всіх підтеках), можна розпочинати об'єднання. </para
><para
>Пам'ятайте, що якщо ви не вказали теку призначення явно, призначенням буде <guilabel
>C</guilabel
> у режимі роботи з трьома теками, <guilabel
>B</guilabel
> у режимі порівняння двох тек, і <guilabel
>A</guilabel
> або/і <guilabel
>B</guilabel
> у режимі синхронізації. </para
><para
>Якщо ви вказали теку призначення, вам також слід перевірити, що у ньому наявні всі належні елементи структури. Існують параметри, які можуть призвести до того, що програма не оброблятиме певні елементи під час порівняння і об'єднання тек. Щоб уникнути небажаних сюрпризів, вам слід перевірити наявність позначок навпроти таких пунктів: </para>
<itemizedlist>
     <listitem
><para
><guilabel
>Рекурсивні теки</guilabel
>: якщо цей пункт не буде позначено, програма не шукатиме у підтеках.</para
></listitem>
     <listitem
><para
><guilabel
>Шаблон включення/виключення</guilabel
>: включити/виключити пункти, які відповідають певному критерію</para
></listitem>
     <listitem
><para
><guilabel
>Виключити приховані файли</guilabel
></para
></listitem>
     <listitem
><para
><link linkend="selectingvisiblefiles"
>Пункти показу</link
> (<guilabel
>Показати однакові/різні файли</guilabel
>, <guilabel
>Файли лише у A/B/C</guilabel
>)</para
></listitem>
</itemizedlist>
<para
>Якщо ви змінили параметри так, що список файлів збільшився, вам слід вручну наказати програмі виконати повторне сканування тек за допомогою пункту меню <menuchoice
><guimenu
>Тека</guimenu
> <guimenuitem
>Пересканувати</guimenuitem
></menuchoice
>. Причиною цього є те, що для пришвидшення порівняння &kdiff3; уникає порівняння файлів, які не відповідають вказаним на початку критеріям. Якщо ж ви змінили ваші шаблони файлів або тек так, щоб виключити певні файли, список файлів буде негайно оновлено одразу після закриття діалогового вікна параметрів. </para
><para
>Зауважте, що, якщо ви наказали програмі виконати запис до тільки-но створеної теки, бажано, щоб було скопійовано і однакові файли. Для цього слід позначити пункт <guilabel
>Показувати однакові файли</guilabel
>. Якщо вашою текою призначення є один з тек з початковими даними, вам не доведеться цього робити, оскільки відповідні файли вже зберігатимуться у цій теці. </para
><para
>Якщо вас все задовольняє, решта дій буде простою. </para
><para
>Щоб наказати програмі об'єднати всі пункти, скористайтеся пунктом <guimenuitem
>Почати/Продовжити порівняння тек</guimenuitem
> з меню <guimenu
>Тека</guimenu
> або натисніть клавішу <keycap
>F7</keycap
> (типове клавіатурне скорочення). Щоб наказати програмі об'єднати лише поточний пункт, оберіть пункт <guilabel
>Виконати операцію для поточного елемента</guilabel
> або натисніть клавішу <keycap
>F6</keycap
>. </para
><para
>Якщо через конфлікт типів файлів у списку існують пункти з некоректними діями, програма відкриє вікно повідомлення, у якому буде вказано перелік цих пунктів, отже ви зможете вибрати належну дію для кожного з таких пунктів. </para
><para
>Якщо ви оберете об'єднання всіх пунктів, програма відкриє діалогове вікно, у якому запропонує вибрати один з варіантів: <guilabel
>Зробити це</guilabel
>, <guilabel
>Імітувати це</guilabel
> і <guilabel
>Скасувати</guilabel
>. </para>
<itemizedlist>
     <listitem
><para
>Натисніть кнопку <guilabel
>Імітувати це</guilabel
>, якщо ви бажаєте просто подивитися, які дії буде виконано без виконання цих дій. Програма покаже вам докладний список дій.</para
></listitem>
     <listitem
><para
>Натисніть кнопку <guilabel
>Зробити це</guilabel
>, щоб розпочати процедуру об'єднання.</para
></listitem>
</itemizedlist>
<para
>&kdiff3; виконає вказану дію для всіх пунктів. Якщо потрібне буде втручання користувача (об'єднання окремого файла), програма відкриє вікно об'єднання (<link linkend="dirmergebigscreenshot"
>див. великий знімок вікна</link
>). </para
><para
>Після завершення об'єднання окремого файла, знову скористайтеся пунктом меню <guimenuitem
>Почати/Продовжити об'єднання тек</guimenuitem
> або натисніть клавішу <keycap
>F7</keycap
>. Якщо ви не забули зберегти об'єднаний файл, програма відкриє діалогове вікно, у якому попросить вас це зробити. Потім &kdiff3; продовжить обробку наступного з пункту. </para
><para
>Якщо під час виконання &kdiff3; дій станеться помилка, програма повідомить вам про неї і покаже докладні відомості про стан. У нижній частині списку міститимуться повідомлення про помилки, які допоможуть вам зрозуміти, у чому полягає проблема. Якщо ви спробуєте продовжити об'єднання (натиснете клавішу <keycap
>F7</keycap
>), &kdiff3; надасть вам змогу вибрати між повторенням спроби об'єднання елемента, який спричинив помилку, і його пропуском. Це означає, що перш ніж продовжувати, ви зможете вибрати іншу дію стосовно файла або розв'язати проблему у інших спосіб. </para
><para
>Після завершення процедури об'єднання &kdiff3; відкриє вікно повідомлення про завершення дії. </para
><para
>Якщо деякі з елементів було об'єднано окремо, перш ніж було виконано запуск об'єднання тек, &kdiff3; врахує це (на час поточного сеансу об'єднання) і не виконуватиме їх повторного об'єднання під час наступного загального об'єднання. Навіть якщо об'єднання було пропущено або результати об'єднання не було збережено, програма вважатиме об'єднання відповідних пунктів завершеним. Стан <guilabel
>Виконано</guilabel
> з таких елементів буде знято, лише якщо ви зміните дію з об'єднання. Після цього можна буде повторно виконати їх об'єднання. </para>
</sect1>

<sect1 id="dirmergeoptions"
><title
>Варіанти порівняння і об'єднання тек</title>
<para
>У вікні параметрів &kdiff3; (пункт меню <menuchoice
><guimenu
>Параметри</guimenu
> <guimenuitem
>Налаштувати &kdiff3;</guimenuitem
></menuchoice
>) є розділ з назвою «Об'єднання тек» з такими пунктами: </para>

<variablelist>
   <varlistentry
><term
><guilabel
>Рекурсивні теки</guilabel
></term
><listitem
><para
>За допомогою цього пункту можна увімкнути або вимкнути рекурсивний перегляд тек.</para
></listitem
></varlistentry>
   <varlistentry
><term
><guilabel
>Шаблони файлів:</guilabel
></term
><listitem
><para
>У ієрархії буде показано лише файли, назви яких відповідають одному з шаблонів, вказаних у цьому полі. Відокремлювати окремі шаблони у списку слід за допомогою крапки з комою, «;». Можна використовувати шаблони заміни: «*» і «?» (наприклад <literal
>*.cpp;*.h</literal
>). Типовим шаблоном є «*». Цей шаблон не стосується тек.</para
></listitem
></varlistentry>
   <varlistentry
><term
><guilabel
>Шаблон(и) виключення файлів:</guilabel
></term
><listitem
><para
>Файли, назви яких відповідають вказаному у цьому полі шаблону, буде виключено з ієрархії перегляду. Відокремлювати окремі шаблони у списку слід за допомогою крапки з комою, «;». Можна використовувати шаблони заміни: «*» і «?». Типовим шаблоном є «<literal
>*.orig;*.o;*.obj</literal
>».</para
></listitem
></varlistentry>
   <varlistentry
><term
><guilabel
>Шаблон(и) виключення тек:</guilabel
></term
><listitem
><para
>Теки, назви яких відповідають вказаному у цьому полі шаблону, буде виключено з ієрархії перегляду. Відокремлювати окремі шаблони у списку слід за допомогою крапки з комою, «;». Можна використовувати шаблони заміни: «*» і «?». Типовим шаблоном є «<literal
>CVS;deps;.svn</literal
>».</para
></listitem
></varlistentry>
   <varlistentry
><term
><guilabel
>Використовувати файл ігнорування</guilabel
></term
><listitem
><para
>За допомогою цього пункту можна наказати програмі ігнорувати файли і теки, які ігноруватиме також і ваша система керування версіями. Значна кількість з автоматично створених файлів ігноруватиметься CVS. Великою перевагою цього способу є те, що ігнорування виконуватиметься окремо для кожної з тек, за відповідними локальними файлами ігнорування. Докладніший опис таких файлів можна знайти у документації до вашої системи керування версіями. </para
></listitem
></varlistentry>
   <varlistentry
><term
><guilabel
>Показувати приховані файли і теки</guilabel
></term
><listitem
><para
>У деяких файлових системах певні файли мають атрибут «прихованих». У інших системах файли, назви яких починаються з крапки, «.», вважаються прихованими. За допомогою цього пункту ви може вказати програмі, чи слід включати подібні файли до ієрархії тек. Типово, цей пункт позначено.</para
></listitem
></varlistentry>
   <varlistentry
><term
><guilabel
>Йти за посиланнями на файли</guilabel
></term
><listitem
><para
>Для посилань на файли: якщо цей пункт не буде позначено, програма порівнюватиме символічні посилання. Якщо пункт буде позначено, порівнюватимуться файли за посиланнями. Типово, цей пункт не буде позначено.</para
></listitem
></varlistentry>
   <varlistentry
><term
><guilabel
>Йти за посиланнями на теки</guilabel
></term
><listitem
><para
>Призначено для посилань на теки. Якщо пункт не буде позначено, програма порівнюватиме символічні посилання. Якщо ж позначити пункт, програма вважатиме символічне посилання звичайною текою і виконуватиме її рекурсивне сканування. Зауважте, що програма не перевірятиме, чи не є посилання «рекурсивним». Отже, якщо, наприклад, у теці міститься посилання на саму теку, виникне нескінченний цикл, після переповнення стека або пам'яті програма аварійно завершить роботу. Типово, пункт не позначено.</para
></listitem
></varlistentry>
   <varlistentry
><term
><guilabel
>Порівняння назв файлів з врахуванням регістру</guilabel
></term
><listitem
><para
>Типовим значенням є false у &Windows; і true у інших операційних системах.</para
></listitem
></varlistentry>
   <varlistentry
><term
><guilabel
>Режим порівняння файлів:</guilabel
></term
><listitem
><para>
<variablelist>
   <varlistentry
><term
><guilabel
>Двійкове порівняння</guilabel
></term
><listitem
><para
>Це типовий режим порівняння файлів. </para
></listitem
></varlistentry>
   <varlistentry
><term
><guilabel
>Повний аналіз</guilabel
></term
><listitem
><para
>За допомогою цього пункту можна наказати програмі виконувати повний аналіз всіх файлів і показувати статистичні дані (кількість розв'язаних і нерозв'язаних конфліктів, а також кількістю конфліктів у пробілах і конфліктів, не пов'язаних з пробілами) у відповідних стовпчиках. Виконання повного аналізу сповільнить процес порівняння, а також значно уповільнить порівняння файлів, які не є текстовими (вам слід вказати відповідні шаблони виключення файлів). </para
></listitem
></varlistentry>
   <varlistentry
><term
><guilabel
>Довіряти розміру і даті зміни (небезпечно)</guilabel
></term
><listitem
><para
>Якщо ви виконуєте порівняння великих тек за допомогою повільного мережевого з'єднання, ймовірно, швидше порівняти дати зміни файлів і довжину файлів окремо. Але подібне пришвидшення може призвести до певних неточностей. Будьте обережними з використанням цього пункту. Типово, цей пункт не позначено.</para
></listitem
></varlistentry>
   <varlistentry
><term
><guilabel
>Довіряти розміру (небезпечно)</guilabel
></term
><listitem
><para
>Призначення пункту подібне до пункту щодо довіри даті зміни. Програма не виконуватиме справжнього порівняння. Два файла вважатимуться однаковими, якщо вони мають однаковий розмір. Цей пункт буде корисним, якщо під час дії з копіювання файлів не було збережено дату зміни. Будьте обережними з використанням цього пункту. Типово, цей пункт не позначено.</para
></listitem
></varlistentry>
</variablelist
></para
></listitem
></varlistentry>

   <varlistentry
><term
><guilabel
>Синхронізувати теки</guilabel
></term
><listitem
><para
>Вмикає режим синхронізації у випадку, коли ви порівнюєте дві теки і не вказали явним чином теку призначення. У цьому режимі дії з об'єднання буде виконано таким чином, що після порівняння обидві початкові теки міститимуть однакові файли. Типово, цей пункт не буде позначено.</para
></listitem
></varlistentry>
   <varlistentry
><term
><guilabel
>Копіювати новіший, замість об'єднання (небезпечно)</guilabel
></term
><listitem
><para
>Замість об'єднання буде виконано дію з копіювання новішого варіанта на місце старішого. Цей спосіб може призвести до небезпечних наслідків, оскільки у такому випадку неявним чином вважається, що старіший файл не було змінено. Типово, цей пункт не позначено.</para
></listitem
></varlistentry>
   <varlistentry
><term
><guilabel
>Створювати резервні копії файлів (.orig)</guilabel
></term
><listitem
><para
>Якщо файл або цілу теку було замінено іншим або вилучено, до назви його початкової версії буде додано суфікс <literal role="extension"
>.orig</literal
>. Якщо файл резервної копії з суфіксом <literal role="extension"
>.orig</literal
> вже існуватиме, його буде перезаписано без створення резервної копії. Цей пункт стосується звичайного об'єднання окремих файлів, а не лише об'єднання тек. Типово, цей пункт позначено.</para
></listitem
></varlistentry>
</variablelist>
</sect1>

<sect1 id="other"
><title
>Інші функціональні можливості вікна об'єднання тек</title>
<sect2
><title
>Розділений/Повноекранний режим</title>
<para
>Зазвичай, перегляд списку об'єднання тек залишатиметься видимим під час порівняння або об'єднання окремого файла. За допомогою вказівника миші ви можете пересунути смужку роздільника, який відокремлює список файлів від областей відмінностей у тексті. Якщо ж такий варіант вас не влаштовує, ви можете зняти позначку з пункту «Розділений перегляд тексту і тек» меню «Тека». Після цього ви можете скористатися пунктом «Перемкнути перегляд» меню «Тека» для перемикання між списком і переглядом відмінностей у тексті, кожен з яких повністю використовуватиме площу вікна програми. </para>
</sect2>
<sect2
><title
>Порівняння або об'єднання до єдиного файла</title>
<para
>Ймовірно, ви надасте перевагу простому подвійному клацанню лівою кнопкою миші на позначці файла для його порівняння. Крім того, ви можете скористатися відповідним пунктом з меню <guimenu
>Тека</guimenu
>. Ви також можете безпосереднього наказати програмі виконати об'єднання окремого файла: достатньо вибрати цей файл і скористатися пунктом <guimenuitem
>Об'єднати поточний файл</guimenuitem
> з меню <guimenu
>Об'єднання</guimenu
>. Після зберігання результату стан відповідного пункту у списку буде змінено на «Виконано», програма не виконуватиме повторного об'єднання, якщо ви накажете їй виконати об'єднання цілих тек. </para
><para
>Але зауважте, що ці дані про стан буде втрачено, якщо ви накажете програмі повторно виконати сканування тек: меню <guimenu
>Тека</guimenu
>, пункт <guimenuitem
>Пересканувати</guimenuitem
> </para>
</sect2>
<sect2
><title
>Порівняння і об'єднання файлів з різними назвами</title>
<para
>Іноді у вас виникатиме потреба у порівнянні або об'єднанні файлів з різними назвами (наприклад поточного файла і його резервної копії у цій же теці). </para
><para
>Оберіть потрібний файл натисканням піктограми на стовпчику <guilabel
>A</guilabel
>, <guilabel
>B</guilabel
> або <guilabel
>C</guilabel
>. Перший з файлів, вибраних у такий спосіб буде позначено як <guilabel
>A</guilabel
>, другий і третій — <guilabel
>B</guilabel
> і <guilabel
>C</guilabel
>, незалежно від стовпчика, у якому їх було відкрито. Таким чином можна обирати не більше трьох файлів. </para
><para
>Скористайтеся пунктом <guimenuitem
>Порівняти явно вибрані файли</guimenuitem
> або <guimenuitem
>Об'єднати явно вибрані файли</guimenuitem
> з меню <guimenu
>Тека</guimenu
>. Для зручності ці пункти меню є і у контекстному меню кожного з файлів. Викликати контекстне меню можна за допомогою наведення вказівника миші на позначку файла з наступним клацанням правою кнопкою миші. </para
><para
>Порівняння або об'єднання файлів відбувається у одному вікні. Якщо цим методом скористатися для тек, програма відкриє нове вікно. </para
></sect2>
</sect1>
</chapter>

<chapter id="misc">
<title
>Різноманітні питання</title>
<sect1 id="networktransparency">
<title
>Прозорість у роботі з мережею через використання KIO</title>
<sect2
><title
>Підлеглі засоби KIO</title>
<para
>У бібліотеці KIO для Frameworks передбачено можливість прозорої роботи з мережею за допомогою підлеглих засобів вводу-виводу (KIO-slave). &kdiff3; використовує ці засоби для читання вхідних файлів і для сканування тек. Це означає, що ви можете вказувати файли і теки, що зберігаються локально або на віддалених комп'ютерах, зазначенням їх адреси URL. </para
><para
>Приклад: </para
><para>
<screen
><command
>kdiff3</command
> test.cpp  ftp://ftp.faraway.org/test.cpp
   <command
>kdiff3</command
> tar:/home/hacker/archive.tar.gz/каталог ./каталог
</screen>
</para>
<para
>Перший рядок призначено для порівняння локального файла з файлом, що зберігається на сервері &FTP;. Другий рядок призначено для порівняння теки з архівом локальної теки. </para
><para
>Серед інших цікавих підпорядкованих засобів вводу-виводу: </para>
<itemizedlist>
<listitem
><para
>Файли з WWW (http:),</para
></listitem>
<listitem
><para
>Файли з &FTP; (ftp:),</para
></listitem>
<listitem
><para
>Шифроване передавання файлів (fish:, sftp:),</para
></listitem>
<listitem
><para
>Ресурси &Windows; (smb:),</para
></listitem>
<listitem
><para
>Локальні файли (file:),</para
></listitem>
</itemizedlist>
<para
>Серед інших можливостей, які, ймовірно, є менш корисними: </para>
<itemizedlist>
<listitem
><para
>Сторінки Man (man:),</para
></listitem>
<listitem
><para
>Сторінки Info (info:),</para
></listitem>
</itemizedlist>
</sect2>

<sect2
><title
>Як записувати адреси &URL;</title>
<para
>Синтаксис адрес &URL; відрізняється від синтаксису шляхів локальних файлів і тек. Слід брати до уваги такі особливості: </para>
<itemizedlist>
<listitem
><para
>Шлях може бути відносним і містити позначення тек «.» або «..». Адреси ж &URL; завжди слід вказувати абсолютними, використовувати подібні позначення ієрархії тек у адресах не можна. </para
></listitem
><listitem
><para
>Спеціальні символи слід записувати «екранованими». («#»->«%23», пробіл->«%20» тощо) Наприклад, файл з назвою «/#foo#» має адресу URL  «file:/%23foo%23». </para
></listitem
><listitem
><para
>Якщо адреси URL не працюють у очікуваний спосіб, спробуйте спочатку відкрити сторінки за цими адресами у &konqueror;. </para
></listitem>
</itemizedlist>

</sect2>

<sect2
><title
>Можливості підпорядкованих засобів вводу-виводу (KIO-Slave)</title>
<para
>Прозорість роботи з мережею має певні недоліки: не всі ресурси мають однакові можливості. </para
><para
>Іноді причиною цього є файлова система на сервері, іноді — протокол. Ось короткий список обмежень: </para>
<itemizedlist>
<listitem
><para
>Іноді відсутня підтримка посилань. </para
></listitem
><listitem
><para
>Іноді програма не може визначити, куди вказує посилання: на файл чи на теку; програма завжди припускає, що на файл. (ftp:, sftp:). </para
></listitem
><listitem
><para
>Програма не завжди може визначити розмір файла. </para
></listitem
><listitem
><para
>Обмежена підтримка роботи з правами доступу. </para
></listitem
><listitem
><para
>У програмі не передбачено можливості зміни прав доступу або часу зміни таких файлів, отже права доступу копії можуть відрізнятися від початкового файла (див. пункт <guilabel
>Довіряти розміру (не безпечно)</guilabel
>). Зміна прав доступу або часу зміни можлива лише для локальних файлів. </para
></listitem>
</itemizedlist>
</sect2>
</sect1>

<sect1 id="git">
<title
>Використання &kdiff3; як інструмента перегляду різниць та об'єднання &git;</title>
<para
>&kdiff3; можна використовувати як інструмент перегляду різниць та об'єднання гілок у <ulink url="https://git-scm.com/"
>&git;</ulink
>. </para>
<para
>Достатньо додати вказані нижче рядки до вашого файла <filename
>gitconfig</filename
>. </para>
<programlisting
>[diff]
        tool = kdiff3
[difftool "kdiff3"]
        path = &lt;шлях до виконуваного файла kdiff3 у вашій системі>
[difftool]
        prompt = false
        keepBackup = false
        trustExitCode = false
[merge]
        tool = kdiff3
[mergetool]
        prompt = false
        keepBackup = false
        keepTemporaries = false
[mergetool "kdiff3"]
        path = &lt;шлях до виконуваного файла kdiff3 у вашій системі
>
</programlisting>
<para
>Для перегляду відмінностей між двома внесками скористайтеся такою командою: <userinput
>git difftool <replaceable
>перший_хеш</replaceable
> <replaceable
>другий_хеш</replaceable
> --tool=kdiff3 --cc <replaceable
>якийсь_файл_у_ієрархії_git</replaceable
></userinput
> </para>
<para
>Щоб об'єднати гілку за допомогою &kdiff3; скористайтеся командою <userinput
>git merge <replaceable
>назва_гілки</replaceable
> &amp;&amp; git mergetool --tool=kdiff3</userinput
> </para>
<para
>Після розв'язування конфліктів у <link linkend="synchronise_views"
>звичайний спосіб</link
> достатньо просто записати зміни до сховища, щоб досягти мети. </para>
</sect1>
</chapter>

<chapter id="faq">
<title
>Запитання і відповіді</title
>&reporting.bugs; &updating.documentation; <qandaset id="faqlist">

<qandaentry
><question
><para
>Чому програму названо «&kdiff3;»? </para
></question
><answer
><para
>Вже існували інструменти з назвами <application
>KDiff</application
> і <application
>KDiff2</application
> (тепер називається &kompare;). Крім того, &kdiff3; має означати, що програма може виконувати об'єднання подібно до інструменту <command
>diff3</command
> зі збірки інструментів Diff. </para
></answer
></qandaentry>

<qandaentry
><question
><para
>Чому автор випустив програму з ліцензією GPL? </para
></question
><answer
><para
>Автор почав користуватися GPL-програмами дуже давно і багато чому навчився, вивчаючи вихідні коди інших програм. Отже, він хотів би сказати «Дякую!» всім програмістам, які самі пишуть програми під цією ліцензією або мають намір їх написати. </para
></answer
></qandaentry>

<qandaentry
><question
><para
>Немає деяких кнопок і функцій. Що сталося? </para
></question
><answer
><para
>Ви зібрали програму з початкових кодів, але, ймовірно, не вказали належного префікса для встановлення. За типових умов програму буде встановлено до <filename class="directory"
>/usr/local</filename
>, але після цього система не зможе знайти файл ресурсів інтерфейсу користувача (тобто <filename
>kdiff3ui.rc</filename
>). Докладніші відомості щодо правильного префікса наведено у файлі <filename
>README</filename
>. </para
></answer
></qandaentry>

<qandaentry
><question
><para
>Часто рядки, які є подібними, але не однаковими, програма показує поряд один з одним, але іноді вона цього не робить. Чому? </para
></question
><answer
><para
>Спочатку, рядки, які відрізняються лише кількістю пробілів, вважатимуться «рівними», якщо ж у рядку буде знайдено хоча б один відмінний непробільний символ, вони вважатимуться «різними». Якщо однакові рядки розташовано поруч один з одним, насправді це випадковість, але, на щастя, ця випадковість трапляється досить часто. Див/ також <link linkend="manualdiffhelp"
>довідку з порівняння вручну</link
>. </para
></answer
></qandaentry>

<qandaentry
><question
><para
>Чому слід розв'язати всі конфлікти, перш ніж програма зможе зберегти результат об'єднання? </para
></question
><answer
><para
>Редактор запам'ятовує розташування початку і кінця кожного з однакових і різних фрагментів тексту у вікні результатів об'єднання. Це потрібно для того, щоб ви мали можливість вирішувати конфлікти вручну простим вибором джерела натисканням кнопки джерела (<guilabel
>A</guilabel
>, <guilabel
>B</guilabel
> або <guilabel
>C</guilabel
>). Дані щодо розташування буде втрачено після завершення роботи програми, а створення спеціального формату файлів, який би підтримував зберігання і відновлення всіх потрібних даних, є занадто складним завданням. </para
></answer
></qandaentry>

<qandaentry
><question
><para
>Як мені синхронізувати перегляди відмінностей і об'єднання так, щоб у всіх переглядах було показано один фрагмент тексту? </para
></question
><answer
><para
>Натисніть стовпчик резюме, розташований ліворуч від тексту. (<link linkend="synchronise_views"
>Див. також тут.</link
>) </para
></answer
></qandaentry>

<qandaentry
><question
><para
>Чому команда <userinput
>git difftool --dir-diff</userinput
> повідомляє про помилку щодо суміші посилань і звичайний файлів, якщо використовувати KDiff3 як інструмент для роботи з відмінностями? </para
></question
><answer
><para
>Це побіжний ефект роботи внутрішніх механізмів git. Якщо ви спробуєте порівняти попередню модифікацію із поточним робочим деревом, git, насправді, порівняє файли, які відповідають попередньому внеску із символічними посиланнями, які вказують на об'єкти у робочому дереві. У версії 1.9 KDiff3 типово увімкнено <guilabel
>Переходити за посиланнями на файли</guilabel
> і <guilabel
>Переходити за посиланнями на теки</guilabel
>. У попередніх версіях ці можливості було типово вимкнено. Це не мало значення, якщо було також вимкнено «Повний аналіз». Втім, якщо увімкнено <guilabel
>Повний аналіз</guilabel
>, KDiff3 спочатку намагається порівняти шлях, на який вказує порівняння, а не перейти за ним. До версії 1.8 отримане повідомлення про помилку ігнорувалося. Втім, з версії 1.8 програма почала повідомляти про помилку. </para
></answer
></qandaentry>

<qandaentry
><question
><para
>Чому у редакторі вікна об'єднання результатів не передбачено можливості скасування дій? </para
></question
><answer
><para
>А навіщо? Ви завжди можете відновити версію з одного з джерел (<guilabel
>A</guilabel
>, <guilabel
>B</guilabel
> або <guilabel
>C</guilabel
>) натисканням відповідної кнопки. Крім того, для значного редагування файлів краще скористатися спеціалізованим редактором. </para
></answer
></qandaentry>

<qandaentry
><question
><para
>Після вилучення певного фрагмента тексту несподівано з'явився напис «&lt;Немає рядка джерела&gt;», який неможливо вилучити. Що це означає і як мені вилучити напис? </para
></question
><answer
><para
>Редактор запам'ятовує розташування початку і кінця кожного з однакових і різних фрагментів тексту у вікні результатів об'єднання. «&lt;Немає рядка джерела&gt;» означає, що у відповідному фрагментів не залишилося нічого, навіть символу нового рядка. Подібна ситуаціям може виникнути або під час автоматичного об'єднання або під час редагування. Ніякої проблеми у появі відповідного рядка немає, оскільки його не буде у файлі, який буде збережено програмою. Якщо ви бажаєте повернути початковий вміст фрагмента, просто виберіть цей фрагмент за допомогою стовпчика резюме і натисніть відповідну кнопку джерела з належним вмістом (<guilabel
>A</guilabel
>/<guilabel
>B</guilabel
> або <guilabel
>C</guilabel
>). </para
></answer
></qandaentry>

<qandaentry
><question
><para
>Чому у &kdiff3; не підтримується підсвічування синтаксичних конструкцій? </para
></question
><answer
><para
>&kdiff3; вже використовує значну кількість кольорів для підсвічування відмінностей. Додаткове підсвічування лише заплутає перегляд. Для такого підсвічування скористайтеся іншим редактором. </para
></answer
></qandaentry>

<qandaentry
><question
><para
>Чи можна скористатися &kdiff3; для порівння файлів <application
>LibreOffice</application
>/<trademark class="registered"
>OpenOffice.org</trademark
>, <application
>&Microsoft; Word</application
>, <application
>&Microsoft; Excel</application
>, &PDF; тощо? </para
></question
><answer
><para
>Хоча &kdiff3; може аналізувати файли будь-яких типів, у таких випадках результат буде не зовсім тим, на який ви очікували. </para
><para
>&kdiff3; було створено для порівняння суто текстових файлів. <application
>LibreOffice</application
>/<trademark class="registered"
>OpenOffice.org</trademark
>, <application
>&Microsoft; Word</application
>, <application
>&Microsoft; Excel</application
> тощо зберігають у файлах багато даних щодо шрифтів, зображень, сторінок, кольорів тощо, про які &kdiff3; нічого не відомо. Отже &kdiff3; покаже вам вміст відповідного файл так, наче це простий текст, але у такому випадку текст може стати непридатними для читання або, принаймні, виглядатиме досить дивно. </para
><para
>Оскільки більшість сучасних програм зберігають вміст у форматі &XML;, ви можете виконати читання подібних файлів як файлів зі звичайним текстом. Якщо зміни не дуже значні, &kdiff3; зможе допомогти вам у них розібратися. </para
><para
>Найкращим розв'язанням цієї проблеми, якщо ви бажаєте порівняти лише текст (без вбудованих об'єктів, на зразок зображень), буде таке: скористайтеся пунктами <guimenuitem
>Вибрати все</guimenuitem
> і <guimenu
>Копіювати</guimenu
> меню відповідної програми, щоб скопіювати весь потрібний текст до буфера обміну даними, а потім вставте у &kdiff3; відповідний текст до будь-якої з областей порівняння (див. також <link linkend="selections"
>Вибір, копіювання і вставка</link
>.) </para
></answer
></qandaentry>

<qandaentry
><question
><para
>Куди подівся варіант показу тек <guimenuitem
>Показати лише відмінності</guimenuitem
>? </para
></question
><answer
><para
>Тепер у меню <guimenu
>Тека</guimenu
> декілька <link linkend="selectingvisiblefiles"
>варіантів показу</link
>. Якщо ви знімете позначку з пункту <guimenuitem
>Показати однакові файли</guimenuitem
>, ви отримаєте той варіант, який раніше можна було створити позначенням пункту <guimenuitem
>Показати лише відмінності</guimenuitem
>. </para
></answer
></qandaentry>

<qandaentry
><question
><para
>Як вибрати значний фрагмент даних у вікні вхідних даних відмінностей, адже гортання триває занадто довго? </para
></question
><answer
><para
>Розпочніть вибір у звичайний спосіб (натисніть і утримуйте ліву кнопку миші). Після цього скористайтеся навігаційними клавішами (тобто клавішами на зразок &PgUp;, &PgDn;), одночасно утримуючи натиснутою ліву кнопку миші. (Див. також <link linkend="selections"
>Вибір, копіювання і вставка</link
>.) </para
></answer
></qandaentry>

<qandaentry
><question
><para
>Тут досить багато відомостей, але немає відповіді на моє питання. </para
></question
><answer
><para
>Будь ласка, надішліть ваше питання автору. Він цінує кожен коментар користувача. </para
></answer
></qandaentry>

</qandaset>
</chapter>

<chapter id="credits">

<title
>Подяки і ліцензія</title>

<para
>&kdiff3; — інструмент для порівняння і об'єднання файлів та тек </para>
<para
>Авторські права на програму належать Joachim Eibl <email
>joachim.eibl at gmx.de</email
>, ©2002-2007 </para>
<para
>Декілька чудових ідей та звітів про помилки було надіслано колегами-програмістами та багатьма людьми з великої всесвітньої мережі. Дякую вам! </para>

<para
>Авторські права на документацію &copy; 2002-2007 Joachim Eibl <email
>joachim.eibl at gmx.de</email
> </para>

<para
>Авторські права на документацію належать Michael Reeves <email
>reeves.87 at gmail.com</email
>, 2017-2019 </para>

<para
>Переклад українською: Юрій Чорноіван <email
>yurchor@ukr.net</email
></para
> &underFDL; &underGPL; </chapter>

&documentation.index;
</book>

<!--
Local Variables:
mode: sgml
sgml-minimize-attributes:nil
sgml-general-insert-case:lower
sgml-indent-step:0
sgml-indent-data:nil
End:

vim:tabstop=2:shiftwidth=2:expandtab
-->
