# Руководство пользователя &kdevelop;

## Что такое &kdevelop;?

&kdevelop; — современная интегрированная среда разработки (integrated development environment, IDE) для C++ (и других языков программирования), одно из многих приложений KDE. Она работает в &Linux; (даже если используется другое окружение рабочего стола, например, GNOME), но доступна и для большинства других вариантов &UNIX;, а также для Windows.

&kdevelop; предоставляет все возможности современных интегрированных сред разработки. Для работы с большими проектами и приложениями наиболее важным является то, что &kdevelop; понимает C++: программа анализирует всю базу кода и запоминает, элементом каких классов является каждая из функций, где заданы переменные и каковы их типы, а также многие другие параметры кода. Например, допустим, что в одном из заголовочных файлов проекта объявлен класс

    class Car {
      // ...
      public:
        std::string get_color () const;
    };

и дальше в программе есть код

    Car my_ride;
    // ...какие-то действия с этой переменной...
    std::string color = my_ride.ge

так как программа помнит о том, что `my_ride` в последней строке представляет собой переменную типа `Car`, она предложит дополнить `ge` как `get_color()`, так как эта функция является единственной функцией класса `Car`, название которой так начинается. Продолжать набирать текст не нужно — достаточно просто нажать клавишу «Ввод» для получения целого слова; это экономит время, позволяет избегать опечаток и не держать в голове точные названия сотен или тысяч функций и классов, из которых складываются большие проекты.

В качестве второго примера рассмотрим такой код:

    double foo ()
    {
      double var = my_func();
     return var * var;
    }
    double bar ()
    {
      double var = my_func();
      return var * var * var;
    }

Если навести указатель мыши на переменную `var` в функции `bar`, будут показаны все случаи использования этой переменной. При щелчке по ней будут показаны только случаи её использования в функции `bar`, так как &kdevelop; понимает, что переменная `var` в функции `foo` — это совсем другая переменная. Аналогичным образом, щелчок по имени переменной правой кнопкой мыши позволяет переименовать её; это действие затронет только переменную в функции `bar`, но не переменную с тем же именем в функции `foo`.

Возможности &kdevelop; не ограничиваются редактированием кода. Программа позволяет выделять исходный ход разными цветами и настраивать расстановку отступов, содержит интегрированный интерфейс к отладчику GNU gdb, показывает справку при наведении указателя мыши на функцию, поддерживает работу с различными средами сборки и компиляторами (например, с проектами на основе make и cmake), а также предоставляет многие другие возможности, о которых рассказывается в этом руководстве.

## Сеансы и проекты: основы &kdevelop;

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

### Терминология

В &kdevelop; предусмотрены сеансы и проекты. Сеанс содержит все проекты, которые как-либо связаны между собой. В приведённых далее примерах можно представить себя разработчиком как библиотеки, так и использующего её приложения. В роли библиотеки выступают библиотеки KDE, а в роли приложения — &kdevelop;. Другой пример: представьте себя разработчиком ядра &Linux;, который также работает и над драйвером устройства для &Linux;, который ещё не был добавлен в дерево ядра.

Если взять последний пример, то в &kdevelop; был бы сеанс с двумя проектами: ядром &Linux; и драйвером устройства. С этими проектами лучше работать в рамках одного сеанса (а не создавать два сеанса с одним проектом в каждом), потому что будет полезно видеть в &kdevelop; функции ядра и структуры данных при написании исходного кода для драйвера — например, чтобы имена функций и переменных ядра автоматически разворачивались или чтобы видеть справку по функциям ядра при работе над драйвером устройства.

Теперь представьте, что также ведёте разработку KDE. В этом случае потребовался бы второй сеанс, содержащий KDE в качестве проекта. В принципе, можно использовать для всего этого один сеанс, но в этом нет особого смысла: при работе над KDE не нужен доступ к функциям ядра или драйвера устройства, а при работе над ядром &Linux; не требуется автоматическое разворачивание имён классов KDE. Кроме того, сборка библиотек KDE не связана с пересборкой ядра &Linux; (с другой стороны, при сборке драйвера устройства было бы неплохо пересобрать и ядро &Linux;, если некоторые заголовочные файлы ядра изменились).

Кроме того, сеансы полезны, когда ведётся работа как над текущей разрабатываемой версией проекта, так и над его ветвью: в этом случае &kdevelop; не должна путать классы, относящиеся к основному проекту и к его ветви, поэтому потребуются два сеанса, с одинаковым набором проектов, но разными каталогами сохранения (в соответствии с разными ветками разработки).

### Настройка сеанса и импорт существующего проекта

Продолжим рассматривать пример с работой над ядром &Linux; и драйвером устройства — чтобы реализовать этот пример в своей системе, потребуется заменить названия библиотек и проектов. Чтобы создать новый сеанс, содержащие эти два проекта, воспользуйтесь пунктом меню Сеанс Начать новый сеанс (или, если &kdevelop; запускается впервые, просто воспользуйтесь создаваемым по умолчанию пустым сеансом).

Дальше требуется добавить в этот сеанс проекты, которые уже где-то существуют (о создании проектов с нуля рассказывается в другом разделе этого руководства). Фактически, это можно сделать двумя способами (в зависимости от того, находится ли уже проект на жёстком диске или же должен быть загружен с сервера).

#### Способ 1: импорт проекта с сервера системы управления версиями

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

- Выберите пункт меню Проект Получить проект для импорта проекта

- После этого будут доступны несколько способов создания нового проекта в текущем сеансе (в зависимости от того, откуда должны быть взяты файлы исходного кода): можно либо указать программе &kdevelop; на существующий каталог (смотрите «Способ 2» ниже), либо запросить у программы &kdevelop; получение исходного кода из репозитория.

- Если копия кода ещё не получена из хранилища системы управления версиями:

  - В диалоговом окне (под надписью Выбор источника) выберите подходящий вариант: Из файловой системы, Subversion, Git, GitHub или KDE

  - Укажите рабочий каталог как место назначения для файлов исходного кода

  - Укажите URL-адрес репозитория, откуда могут быть получены файлы исходного кода

  - Нажмите кнопку Получить. Процесс получения может занять много времени (это зависит от скорости соединения и размера проекта). К сожалению, в &kdevelop; 4.2.x панель хода выполнения неинформативна, но ход выполнения можно отслеживать, периодически проверяя вывод командной строки по команде

        du -sk /путь/к/проекту/&kdevelop;

    для оценки объёма уже загруженных данных.

Разработчикам известно о проблеме с панелью хода выполнения: &kdevelop;, ошибка 256832.

Также появляется сообщение об ошибке You need to specify a valid location for the project («Необходимо указать корректное расположение проекта»). На него можно не обращать внимания.

- Программа предлагает выбрать файл проекта &kdevelop; в этом каталоге. Так как такого файла, скорее всего, ещё нет, просто нажмите кнопку Далее

- Снова нажмите кнопку Далее

- Затем программа &kdevelop; предложит выбрать диспетчер проектов. Если в проекте используются стандартные файлы make &UNIX;, выберите нетиповой диспетчер проектов makefile

- После этого программа &kdevelop; приступит к синтаксическому анализу всего проекта. Этот процесс займёт довольно много времени, так как требуется проверить все файлы, проиндексировать классы и так далее. В нижней части главного окна есть панель хода выполнения, отображающая длительность процесса. (Если у процессора несколько ядер, можно ускорить обработку: выберите пункт меню Настройка Настроить &kdevelop;…, затем выберите в списке, расположенном в левой части окна, раздел Фоновый анализ кода и увеличьте количество потоков для выполнения синтаксического анализа в фоновом режиме.)

#### Способ 2: импорт проекта, который уже находится на жёстком диске

Либо, если проект, с которым планируется работать, уже находится на жёстком диске (например, был загружен как архив с FTP-сервера, был получен из системы управления версиями или был создан на этом компьютере и существует только на жёстком диске), выберите пункт меню Проект Открыть/импортировать проект... и в диалоговом окне укажите каталог, в котором расположен проект.

### Настройка приложения в качестве второго проекта

Следующий шаг — настроить другие проекты в том же сеансе. В примере выше в качестве второго проекта нужно добавить драйвер устройства; это можно сделать, выполнив точно такие же действия.

Если приложений или библиотек несколько, просто повторяйте эти действия для их добавления в сеанс.

### Создание проектов с нуля

Конечно, может понадобиться создать проект с нуля. Это можно сделать с помощью пункта меню Проект Создать из шаблона…; будет предложено выбрать шаблон. С &kdevelop; поставляются несколько шаблонов проектов, но можно получить и другие, установив программу KAppTemplate. Выберите в диалоговом окне тип проекта и язык программирования, укажите название и расположение проекта, а затем нажмите кнопку Далее.

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

Проект был создан, теперь можно попробовать собрать или установить его. Некоторые шаблоны содержат комментарии внутри кода или даже отдельный файл README — рекомендуется сначала ознакомиться с ними. После этого можно приступить к работе над проектом, добавляя нужные возможности.

## Работа с исходным кодом

При разработке большая часть времени (не считая отладку) уходит на изучение и написание исходного кода. Для этих задач в &kdevelop; предусмотрено множество способ анализа исходного кода и оптимизации его написания. Как более подробно рассказывается в последующих разделах, &kdevelop; — не просто редактор исходного кода; скорее, это система управления исходным кодом, которая может предоставлять различные данные, полученные на основе анализа общей совокупности всего кода в сеансе работы.

### Инструменты и представления

Для работы над проектами в &kdevelop; предусмотрены инструменты. Инструмент позволяет использовать определённое представление исходного кода или выполнить над ним какое-либо действие. Инструментам соответствуют кнопки по периметру окна (с вертикальным текстом вдоль левой и правой границ и горизонтальным текстом вдоль нижней границы). При нажатии такой кнопки внутри главного окна откроется дочернее окно — представление; если снова нажать кнопку, это дочернее окно исчезнет.

Чтобы убрать дочернее окно, также можно нажать кнопку x, расположенную в его правом верхнем углу

На изображении выше показан определённый набор инструментов, расположенных по левому и правому краям окна; инструмент Классы открыт с левой стороны, инструмент Фрагменты — с правой, а в середине находится редактор файлов исходного кода. На практике, скорее всего, большую часть времени будет открыт редактор и, возможно, инструмент Классы или Навигация по коду слева. Панели других инструментов, как правило, открываются на время использования и затем закрываются, чтобы оставить больше места для редактора.

При первом запуске &kdevelop; уже будет доступна кнопка инструмента Проекты. Нажмите её: откроется дочернее окно, в нижней части которого показаны добавленные в сеанс проекты, а в верхней — представление каталогов проектов в файловой системе.

В &kdevelop; есть много других инструментов. Не все из них изначально представлены кнопками по периметру. Чтобы добавить соответствующие кнопки, выберите пункт меню Окно Добавить панель…. Скорее всего, будут полезны следующие инструменты:

- Классы: полный перечень всех классов, определённых в одном из проектов или в сеансе, со всеми входящими в них функциями и переменными. Если щёлкнуть по любому члену класса, появится окно редактора исходного кода с местом объявления соответствующего элемента.

- Документы: список последних использовавшихся файлов, по типу (например, файлы исходного кода, файлы исправлений, текстовые документы).

- Навигация по коду: отображает информацию, которая определяется положением курсора в файле. Например, когда курсор находится на строке `#include`, будет показана информация о включаемом файле (например, данные об объявленных в нём классах); когда курсор находится на пустой строке в файле, будут показаны классы и функции, объявленные и определённые в текущем файле (все в виде ссылок: по щелчку будет выполняться переход к тому месту, где фактически находится соответствующее объявление или определение); когда курсор находится на определении функции, будет показано место объявления, и предоставлен список мест, в которых используется эта функция.

- Файловая система: позволяет просматривать файловую систему в виде дерева.

- Документация: позволяет выполнять поиск данных на man-страницах и в других справочных документах.

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

    for (typename Triangulation< dim>::active_cell_iterator cell
          = triangulation.begin_active();
       cell != triangulation.end();
       ++cell)

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

- Konsole: открывает внутри главного окна &kdevelop; окно командной строки, что позволяет при необходимости вводить команды (например, чтобы выполнить `./configure`).

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

Для многих программистов наиболее ценно экранное пространство по вертикали. Поэтому панели можно разместить по левому и правому краям окна: чтобы переместить панель, щёлкните по её заголовку правой кнопкой мыши и выберите новое положение.

### Изучение исходного кода

#### Локальная информация

&kdevelop; понимает исходный код и, следовательно, может предоставлять информацию о переменных или функциях в программе. Например, на следующем снимке показана работа с фрагментом кода, когда указатель мыши наведён на переменную `cell` в строке 1316 (если используется только клавиатура, то же самое можно сделать, некоторое время удерживая нажатой клавишу &Alt;):

&kdevelop; показывает подсказку с типом переменной (здесь: `DoFHandler<dim>active_cell_iterator`), местом объявления этой переменной (контейнер, которым в этом случае является окружающая функция `get_maximal_velocity`, так как это локальная переменная), её сущностью (это переменная, а не функция, класс или пространство имён) и строкой её объявления (в строке 1314, всего на несколько строк выше в коде).

В текущем контексте с элементом, на который наведён указатель мыши, не связана никакая документация. Если в рассматриваемом примере навести указатель мыши на элемент `get_this_mpi_process` в строке 1318, результат будет таким:

Здесь &kdevelop; показывает объявление из постороннего файла (`utilities.h`, который является частью совсем другого проекта того же сеанса) вместе с комментарием в формате Doxygen, сопровождающим это объявление.

Динамичность делает эти подсказки ещё полезнее: можно щёлкнуть по контейнеру для получения информации о контексте, в котором объявлена переменная (например, о пространстве имён `System`, в частности, месте его объявления, определении, использовании и документации), а также щёлкать по синим ссылкам для перемещения курсора на место объявления элемента (например, в `utilities.h`, строка 289) или получить список мест, где этот элемент используется в рамках текущего файла или всех проектов текущего сеанса. Последний вариант пригодится, когда нужно узнать, например, как определённая функция используется в объёмном коде.

Всплывающая подсказка со временем исчезает: чтобы открыть её снова, придётся опять удерживать нажатой клавишу &Alt; или наводить указатель мыши на фрагменты кода. Если данные должны отображаться постоянно, откройте панель инструмента Навигация по коду. В рассматриваемом примере курсор находится на той же функции, о которой говорилось ранее, а на панели инструмента слева показаны те же сведения, что и в ранее вызванной всплывающей подсказке:

При перемещении курсора вправо на панели слева появится другая информация. Более того, если нажать расположенную сверху справа кнопку Зафиксировать текущее представление, эта информация будет зафиксирована — она перестанет зависеть от перемещения курсора.

Такая контекстная информация доступна не только в редакторе исходного кода, но и во многих других местах &kdevelop;. Например, при удержании клавиши &Alt; нажатой в списке автоматического дополнения (например, при быстром открытии) также появится контекстная информация о текущем элементе.

#### Информация о файле

Следующий уровень — получить информацию обо всём файле исходного кода, над которым ведётся работа. Для этого поместите курсор в область текущего файла и посмотрите на данные, которые появятся на панели Навигация по коду:

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

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

#### Информация о проекте и сеансе

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

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

Глобальную информацию можно рассмотреть и под другим углом. Например, инструмент Документы позволяет увидеть, какие файлы или иные документы составляют проект:

#### Пояснение о выделении разными цветами

В KDevelop для выделения объектов в коде используется целая палитра цветов. Если знать, чему соответствуют разные цвета, можно быстро получить много информации вообще без чтения кода — исключительно на основе цвета. Правила выделения цветом таковы:

- Объекты типов Class / Struct, Enum (значения и тип), (глобальные) функции и участники классов выделяются разными цветами (классы — зелёным, перечисления — тёмно-красным, участники — тёмно-жёлтым или фиолетовым, (глобальные) функции — всегда фиолетовым).

- Все глобальные переменные выделяются тёмно-зелёным.

- Идентификаторы, представляющие собой определения других типов, выделяются сине-зелёным цветом.

- Все объявления и определения объектов выделяются полужирным.

- Если доступ к участнику класса осуществляется из контекста его определения (базового или производного класса), он выделяется жёлтым цветом, а в ином случае — фиолетовым.

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

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

- Идентификаторы, для которых &kdevelop; не удалось найти соответствующие объявления, выделяются белым цветом. Иногда причиной может быть отсутствие инструкций `#include`.

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

### Перемещение между фрагментами кода

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

Многие из способов перемещения по коду доступны в меню Навигация главного окна &kdevelop;.

#### Локальное перемещение

Возможности &kdevelop; гораздо шире, чем у простого редактора, но программа также является редактором исходного кода. Конечно, можно перемещать курсор в тексте с помощью клавиш со стрелками. Также можно использовать клавиши PageUp и PageDown, как и все остальные команды, которые применяются в обычном текстовом редакторе.

#### Перемещение по области файла и режим структуры

В &kdevelop; предусмотрено много способов перемещения по исходному коду на уровне области файла. Например:

- Структура: получить структуру текущего файла можно как минимум тремя разными способами:

  - Щёлкните по текстовому полю Структура в правой верней части части главного окна или нажмите комбинацию клавиш &Alt;&Ctrl;N для вызова раскрывающегося меню со списком всех объявлений функций и классов:

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

  - Поместите курсор в область файла (то есть вне объявлений или определений функций или классов), когда открыта панель Навигация по коду:

    Это также позволит получить структуру текущего файла и выбрать место для перехода.

  - Наведите указатель мыши на вкладку одного из открытых файлов. При этом также будет показана структура соответствующего файла.

- Файлы исходного кода организованы в виде списка объявлений или определений функций. При нажатии комбинаций клавиш &Alt;&Ctrl;PgUp и &Alt;&Ctrl;PgDown выполняется переход, соответственно, к предыдущему или следующему определению функции в этом файле.

#### Перемещение по области проекта и сеанса: семантическое перемещение

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

- Как говорилось в разделе Изучение исходного кода, подсказку со сведениями об отдельном пространстве имён, классе, функции или переменной можно вызвать путём наведения указателя мыши на соответствующий элемент или нажатия и удерживания клавиши &Alt;. Пример: Если щёлкнуть по ссылке на объявление элемента или развернуть список случаев использования, будет можно перейти к соответствующими местам в коде. Аналогичный результат можно получить с помощью инструмента Навигация по коду, описание которого также приводилось ранее.

- Чтобы быстро переходить к объявлению элемента, не щёлкая по ссылкам во всплывающей подсказке, можно временно включить Режим навигации по коду: нажмите и удерживайте клавишу &Alt; или &Ctrl;. В этом режиме для перехода к объявлению элемента достаточно щёлкнуть по этому элементу прямо в редакторе.

- Быстрый переход: различные способы быстрого перехода, предусмотренные в &kdevelop;, позволяют переходить к другим файлам или расположениям. Доступны четыре варианта:

  - Быстрый переход к классам (пункт меню Навигация Быстрый переход к классам или комбинация клавиш &Alt;&Ctrl;C): позволяет получить список всех классов в этом сеансе. Начните набирать имя (или часть имени) класса, чтобы в списке остались только соответствующие введённому тексту пункты. Когда список станет достаточно коротким, выберите элемент с помощью клавиш со стрелками «вверх» и «вниз», и программа &kdevelop; откроет то место в коде, где объявлен этот класс.

  - Быстрый переход к функциям (пункт меню Навигация Быстрый переход к функциям или комбинация клавиш &Alt;&Ctrl;M): позволяет получить список всех функций(-членов), являющихся частью проектов в текущем сеансе. Выбор из списка осуществляется приведённым ранее способом. Обратите внимание, что в списке могут встречаться как объявления, так и определения функций.

  - Быстрый переход к файлам (пункт меню Навигация Быстрый переход к файлам или комбинация клавиш &Alt;&Ctrl;O): позволяет получить список всех файлов, которые являются частью проектов в текущем сеансе. Выбор из списка осуществляется приведённым ранее способом.

  - Универсальный быстрый переход (пункт меню Навигация Быстрый переход или комбинация клавиш &Alt;&Ctrl;Q): универсальный вариант на тот случай, когда не удаётся вспомнить комбинации клавиш для выполнения перечисленных ранее специализированных команд. Позволяет получить объединённый список всех файлов, функций, классов и других элементов, в котором можно выбрать нужный пункт.

- Перейти к объявлению/определению: при реализации функции(-члена) часто бывает нужно вернуться к месту объявления функции (например, для обеспечения соответствия списка аргументов функции в декларации и в определении или для обновления документации). Чтобы это сделать, наведите указатель мыши на имя функции и выберите пункт меню Навигация Перейти к объявлению (или нажмите комбинацию клавиш &Ctrl;.). Вернуться обратно можно несколькими способами:

  - Выберите пункт меню Навигация Перейти к определению (или нажмите комбинацию клавиш &Ctrl;,).

  - Выберите пункт меню Навигация Предыдущий контекст (или нажмите комбинацию клавиш Meta стрелка «влево»), как описано далее.

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

- Переключение между объявлением и определением: в рассматриваемом выше примере для перехода к объявлению текущей функций необходимо сначала навести указатель мыши на имя функции. Чтобы исключить этот шаг, можно выбрать пункт меню Навигация Перейти к объявлению/определению (или нажать комбинацию клавиш &Shift;&Ctrl;C) для перехода к объявлению функции, внутри которой сейчас находится курсор. При повторном выборе этого пункта меня выполняется возврат к месту определения функции.

- Предыдущее или следующее обращение: поместите курсор на имя локальной переменной и выберите пункт меню Навигация Следующее обращение (или нажмите комбинацию клавиш Meta&Shift;стрелка «вправо») для перехода к месту следующего обращения к этой переменной в коде. (Обратите внимание, что программа не просто выполняет поиск следующего вхождения имени переменной, но и учитывает, что переменные с тем же именем, но в других областях, представляют собой другие переменные.) То же самое относится и к обращениям к функциям. При выборе пункта меню Навигация Предыдущее обращение (или нажатии комбинации клавиш Meta&Shift;стрелка «влево») выполняется переход к предыдущему обращению к элементу.

Для просмотра списка всех случаев использования имени, циклический переход по которому осуществляется с помощью этих команд, поместите курсор на это имя, а затем откройте панель Навигация по коду или нажмите и удерживайте клавишу &Alt;. Более подробные сведения об этом приёме содержатся в разделе Изучение исходного кода.

- Список контекстов: в веб-браузерах предусмотрена возможность перемещения вперёд и назад по списку недавно посещённых веб-страниц. В &kdevelop; есть похожая возможность, только вместо веб-страниц используются контексты. Контекст — это текущее расположение курсора. Он меняется, когда для перемещения из этого расположения используется что-либо, кроме команд курсора (например, щелчок по месту, указанному в подсказке, на панели Навигация по коду, выбор одного из пунктов меню Навигация или использование любой другой команды перехода. С помощью пунктов меню Навигация Предыдущий контекст (Meta стрелка «влево») и Навигация Следующий контекст (Meta стрелка «вправо») можно перемещаться по списку посещённых контекстов так же, как это делается в браузере при использовании кнопок назад и вперёд для перехода к предыдущей или следующей посещённой веб-странице.

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

  При двойном щелчке по элементу (или использовании соответствующего пункта контекстного меню, которое доступно по щелчку правой кнопкой мыши) выполняется переход к объявлению этого элемента. Другие инструменты предоставляют схожие возможности; например, инструмент Проекты позволяет получить список файлов, которые являются частью сеанса:

  Открытие файла, опять-таки, выполняется по двойному щелчку.

### Написание исходного кода

Так как &kdevelop; понимает исходный код проектов, программа может помочь при написании нового кода. Далее приводится обзор некоторых таких возможностей.

#### Автодополнение

Возможно, автодополнение — это самая полезная возможность при написании нового кода. Рассмотрим, например, такой фрагмент кода:

    class Car {
      // ...
      public:
        std::string get_color () const;
    };
    void foo()
    {
      Car my_ride;
      // ...какие-то действия с этой переменной...
      std::string color = my_ride.ge

Так как программа помнит о том, что `my_ride` в последней строке представляет собой переменную типа `Car`, она автоматически предложит дополнить имя функции-члена `ge` как `get_color()`. Фактически, требуется только продолжать набирать текст, пока не останется только одно совпадение, а затем нажать клавишу «Ввод»:

Обратите внимание, что можно щёлкнуть по подсказке, чтобы увидеть больше сведений о функции, а не только тип данных, которые она возвращает, и то, является ли она открытой:

Автодополнение позволяет сэкономить много времени на наборе текста, когда в проекте используются длинные имена переменных и функций; более того, оно предотвращает опечатки (и возникающие в этой связи ошибки компиляции) и помогает вспоминать точные имена функций. Например, если имена всех функций получения начинаются с `get_`, то возможность автодополнения представит список вариантов имён этих функций только после ввода первых четырёх символов. Скорее всего, при просмотре этого списка получится вспомнить нужное имя. Обратите внимание, что автодополнение будет работать даже в том случае, если класс `Car` и переменная `my_ride` объявлены не в том файле, в котором в данный момент выполняется написание кода. &kdevelop; просто должно быть известно, что эти классы и переменные связаны, то есть файлы, в которых установлены эти связи, должны быть частью проекта, над которым сейчас ведётся работа.

Программе &kdevelop; не всегда удаётся определить, когда пользователю требуется дополнение кода. Если всплывающая подсказка с вариантами автодополнения не появилась автоматически, воспользуйтесь комбинацией клавиш &Ctrl;Пробел для открытия списка вариантов вручную. В целом, для того, чтобы возможность автодополнения работала, &kdevelop; необходимо выполнять синтаксический анализ файлов исходного кода. После запуска &kdevelop; выполняет такую обработку всех файлов, которые являются частью проектов текущего сеанса, в фоновом режиме, а также при приостановке набора текста пользователем (длительность паузы можно настроить).

&kdevelop; выполняет обработку только тех файлов, которые являются файлами исходного кода (определяется типом MIME файла). Этот тип задаётся при первом сохранении файла; следовательно, если создать новый файл и начать писать в нём код, обработка этого файла для использования данных в целях автодополнения не будет выполнена. Чтобы она выполнялась, необходимо сохранить файл.

Как было сказано ранее, чтобы автодополнение работало, &kdevelop; необходимо искать объявления в заголовочных файлах. Программа выполняет поиск по ряду стандартных путей. Если заголовочный файл не удастся найти автоматически, соответствующий пункт в списке будет подчёркнут красной линией. Следует щёлкнуть по этому пункту правой кнопкой мыши и явным образом сообщить &kdevelop;, где следует искать файл и данные, которые в нём хранятся.

О настройке автодополнения рассказывается в этом разделе данного руководства.

#### Добавление новых классов и реализация функций-членов

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

После завершения работы вспомогательной программы файлы будут созданы и открыты в редакторе. В заголовочном файле уже есть защита от повторного включения, а новый класс содержит все выбранные функции-члены. Следующие два шага — задокументировать класс и его функции-члены и реализовать их. Средства документирования классов и функций рассматриваются далее. Чтобы реализовать уже добавленные специальные функции, просто перейдите на вкладку bus.cpp, которая уже содержит каркас функций:

Чтобы добавить новые функции-члены, вернитесь на вкладку bus.h и добавьте имя функции. Например, добавим это:

Обратите внимание, что реализация уже началась. Однако согласно многим стилям программирования функция должна быть реализована не в заголовочном файле, а в соответствующем файле .cpp. Чтобы сделать это, разместите курсор на имени функции и выберите пункт меню Код Переместить в код или воспользуйтесь комбинацией клавиш &Ctrl;&Alt;S. Код, расположенный в фигурных скобках, будет удалён из заголовочного файла (он будет заменён на точку с запятой, так как необходимо завершить объявление функции) и перемещён в файл исходного кода:

Ввод кода начат. Переменная `students` должна, вероятно, быть переменной-членом класса `Bus`, но она ещё не добавлена в этот класс. &kdevelop; подчёркивает эту переменную, чтобы указать на то, что среде ещё ничего не известно о ней. Эту проблему просто решить; при щелчке по имени переменной появится следующая подсказка:

(Тот же результат можно получить с помощью пункта контекстного меню Решить: Объявить как.) Давайте выберем 3 - private unsigned int (с помощью мыши или комбинации клавиш &Alt;3) и посмотрим, что будет добавлено в заголовочный файл:

Следует учитывать, что &kdevelop; извлекает тип переменной, которая будет объявлена, из выражения, используемого для её инициализации. Например, если бы добавление было записано следующим неоднозначным образом, программа бы предложила объявить переменную как тип `double`:

И последнее: при использовании пункта меню Код Переместить в код новая функция-член не всегда появляется там, где это нужно. Например, её может потребоваться отметить маркером `inline` и поместить в конце заголовочного файла. В таком случае напишите объявление и начните писать объявление этой функции так:

&kdevelop; автоматически предлагает все возможные варианты дополнения. При выборе одной из двух записей `add_students` получится следующий код, в котором уже будет полностью заполнен список аргументов:

В рассматриваемом примере принятие одного из вариантов, предлагаемых средством автоматического дополнения, позволяет получить корректную подпись, но, к сожалению, удаляет уже записанный маркер `inline`. Об этой ошибке уже известно разработчикам: &kdevelop;, ошибка 274245.

#### Документирование объявлений

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

В &kdevelop; предусмотрена поддержка комментариев в этом формате. Возможно создать структуру из комментариев, документирующих класс или функцию-член. Например, допустим, что уже был написан такой код:

    class Car {
      public:
        std::string get_color () const;
    };

Теперь нужно добавить документацию как для класса, так и для функции-члена. Чтобы это сделать, переместите курсор на первую строку и выберите пункт меню Код Документировать объявление или воспользуйтесь комбинацией клавиш &Alt;&Shift;D. &kdevelop; сделает следующее:

Курсор уже находится в серой области для ввода краткого описания (после ключевого слова Doxygen `@brief`) этого класса. Затем к этому комментарию можно продолжить добавлять документацию с более подробным обзором назначения класса:

Пока редактирование выполняется в тексте комментария, он выделяется зелёным цветом (выделение цветом исчезает, когда курсор перемещается за пределы комментария). По достижении конца строки нажмите клавишу «Ввод», и программа &kdevelop; автоматически добавит новую строку, которая начинается со звёздочки, и поместит в неё курсор с отступом в один символ.

Теперь задокументируем функцию-член. Снова поместите курсор на строке объявления и выберите пункт меню Код Документировать объявление или воспользуйтесь комбинацией клавиш &Alt;&Shift;D:

Программа &kdevelop; снова автоматически создаст каркас комментария, содержащий документацию по самой функции, а также тип данных, которые она возвращает. В данном случае имя функции понятно само по себе, но зачастую смысл аргументов функции не так очевиден и требует отдельного документирования. Например, рассмотрим немного более интересную функцию и комментарий, который автоматически создаёт &kdevelop;:

В этом примере в предложенном комментарии уже содержатся все поля Doxygen для отдельных параметров.

#### Переименование переменных, функций и классов

Иногда требуется переименовать функцию, класс или переменную. Например, имеется следующий код:

Затем становится понятно, что имя `remove_students` не очень удачное и лучше было бы его заменить, скажем, на `throw_out_students`. Можно воспользоваться возможностью поиска и замены, но возникают две проблемы:

- Функция может использоваться в нескольких файлах.

- Нужно переименовать только эту функцию, а не те функции, которые имеют такое же имя, но объявлены в других классах или пространствах имён.

Обе эти проблемы можно решить, если переместить курсор на одно из вхождений имени функции и выбрать пункт меню Код Переименовать объявление (или щелкнуть по имени правой кнопкой мыши и выбрать в контекстном меню пункт Переименовать Bus::remove_students).

#### Фрагменты кода

Во многих проектах есть фрагменты, которые часто используются в исходном коде. Например: цикл для всех инструкций (при написании компилятора), проверка корректности введённых пользователем данных и открытие окна с сообщением об ошибке в случае их некорректности (при написании интерфейса пользователя); в проекте автора этих строк это был бы код наподобие

    for (typename Triangulation::active_cell_iterator
           cell = triangulation.begin_active();
         cell != triangulation.end(); ++cell)
      ... какие-то действия с ячейкой ...

Чтобы не набирать подобный текст снова и снова (и не допускать сопутствующие опечатки), можно воспользоваться инструментом Фрагменты &kdevelop;. Откройте панель этого инструмента (обратитесь к разделу Инструменты и представления, если соответствующей кнопки ещё нет по периметру окна). Затем нажмите кнопку Создать комплект — она позволяет создать именованный набор фрагментов исходного кода определённого вида (например, набор фрагментов кода C++) — и создайте пустой комплект. После этого нажмите кнопку для добавления фрагмента. Появится такое диалоговое окно:

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

Чтобы использовать определённый таким образом фрагмент, при редактировании кода можно просто ввести имя фрагмента так же, как имя любой другой функции или переменной. Это имя будет доступным для автодополнения, поэтому для фрагмента можно спокойно использовать длинное подробное имя (как в примере выше). При принятии варианта дополнения (для этого достаточно нажать клавишу «Ввод») уже введённая часть названия фрагмента будет заменена его полным названием и снабжена надлежащим отступом:

Обратите внимание, что для работы этой возможности не требуется открывать или делать видимой панель Фрагменты: она нужна только для определения новых фрагментов. Ещё один (но менее удобный) способ развернуть фрагмент — просто щёлкнуть по нему на соответствующей панели.

Фрагменты предоставляют и многие другие возможности. Полное описание этих возможностей доступно в подробной документации по инструменту «Фрагменты».

### Режимы и рабочие наборы

Посмотрите на правый верхний угол главного окна &kdevelop;: как показано на изображении, в &kdevelop; предусмотрены три режима: Код (об этом режиме рассказывается в текущей главе о работе с исходным кодом), Отладка (смотрите раздел Отладка программ) и Рецензирование (смотрите раздел Работа с системами управления версиями).

Для каждого режима предусмотрен собственный набор инструментов, кнопки которых расположены по периметру окна, а также собственный рабочий набор из открытых в текущий момент файлов и документов. Более того, каждый такой рабочий набор связан с текущим сеансом (пример такой взаимосвязи показан выше). Обратите внимание, что файлы в рабочем наборе относятся к одному и тому же сеансу, но могут быть из разных входящих в этот сеанс проектов.

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

Если навести указатель мыши на значок рабочего набора, появится всплывающая подсказка с перечнем файлов, которые сейчас открыты в этом рабочем наборе (в примере: файлы `step-32.cc` и `step-1.cc`). Нажатие кнопки с красным знаком «минус» приводит к закрытию вкладки с соответствующим файлом. Нажатие кнопки с соответствующим названием позволяет закрыть сразу весь рабочий набор (то есть закрыть все открытые в текущий момент файлы); в этом случае файлы сохраняются перед закрытием, а затем открывается новый, ещё пустой набор. Пример:

Обратите внимание на два значка слева от трёх вкладок режимов (сердечко и символ слева от него). Каждый из них представляет сохранённый рабочий набор (в дополнение к текущему открытому рабочему набору). Если навести указатель мыши на символ сердца, будет показано примерно следующее:

На изображении показан соответствующий рабочий набор, содержащий два файла и названия соответствующих проектов: `Makefile` и `changes.h`. При нажатии кнопки Загрузить текущий рабочий набор будет сохранён и закрыт (в рассматриваемом примере он состоит из файлов `tria.h` и `tria.cc`), а вместо него будет открыт выбранный рабочий набор. Также можно удалить рабочий набор без возможности восстановления (он будет удалён из списка сохранённых рабочих наборов).

### Некоторые полезные комбинации клавиш

Редактор &kdevelop; поддерживает стандартные комбинации клавиш для всех обычных действий редактирования. Кроме того, поддерживаются и другие комбинации клавиш, связанные с рядом более сложных действий по редактированию исходного кода. Следующие комбинации клавиш часто оказываются особенно полезными:

Переход по коду
&Ctrl;&Alt;O | Быстрый переход к файлу: введите часть имени файла и выберите нужный файл в каталогах проектов текущего сеанса; этот файл будет открыт
&Ctrl;&Alt;C | Быстрый переход к классу: введите часть имени класса и выберите нужный класс среди совпадающих имён; курсор перейдёт к объявлению класса
&Ctrl;&Alt;M | Быстрый переход к функции: введите часть имени функции(-члена) и выберите нужную функцию среди совпадающих имён (обратите внимание, что в списке будут показаны как объявления, так и определения); курсор перейдёт к выбранному пункту
&Ctrl;&Alt;Q | Универсальный быстрый переход: введите любой текст (имя файла, имя класса, имя функции) и получите список всех совпадений
&Ctrl;&Alt;N | Структура: получить список всех действий, которые выполняются в файле (например, объявлений классов и определений функций)
&Ctrl;, | Перейти к определению функции, если курсор в данный момент находится в месте объявления функции
&Ctrl;. | Перейти к объявлению функции или переменной, если курсор в данный момент находится в месте определения функции
&Ctrl;&Alt;PageDown | Перейти к следующей функции
&Ctrl;&Alt;PageUp | Перейти к предыдущей функции
&Ctrl;G | Перейти к строке

Поиск и замена
&Ctrl;F | Найти
F3 | Найти далее
&Ctrl;R | Заменить
&Ctrl;&Alt;F | Поиск и замена в нескольких файлах

Прочее
&Ctrl;_ | Свернуть один уровень: скрыть этот блок (например, если требуется изучить общую картину внутри функции)
&Ctrl;+ | Развернуть один уровень: отменить свёртывание
&Ctrl;D | Раскомментировать выбранный текст или текущую строку
&Ctrl;&Shift;D | Закомментировать выбранный текст или текущую строку
&Alt;&Shift;D | Задокументировать текущую функцию. Если курсор находится на объявлении функции или класса, то при нажатии этой комбинации клавиш будет создан комментарий в формате Doxygen, уже содержащий перечень всех параметров, возвращаемых значений и так далее.
&Ctrl;T | Поменять местами текущий и предыдущий символы
&Ctrl;K | Удалить текущую строку (примечание: это действие не совпадает по результату сдействием «удалить отсюда до конца строки» в emacs)

## Генерация кода с помощью шаблонов

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

### Создание нового класса

Создавать код по шаблону чаще всего требуется, вероятно, при написании нового класса. Чтобы создать новый класс в уже созданном проекте, щёлкните правой кнопкой мыши по папке проекта и выберите в контекстном меню пункт Создать из шаблона…. То же диалоговое окно можно открыть с помощью пункта меню Файл Создать из шаблона…, но у использования папки проекта есть преимущество — будет установлен базовый URL-адрес для выходных файлов. В представлении выбора категории выберите `Класс`, а в двух других представлениях — нужные язык программирования и шаблон. После выбора шаблона класса следует указать другие характеристики нового класса.

Сначала необходимо указать идентификатор нового класса. Это может быть как просто имя (например, `Bus`), так и полный идентификатор с пространствами имён (например, `Transportation::Bus`). В последнем случае &kdevelop; выполнит синтаксический анализ идентификатора и корректно отделит пространства имён от самого имени. На той же самой странице можно добавить базовые классы для нового класса. Как можно было заметить, в некоторых шаблонах уже сделан выбор базового класса; этот класс можно удалить и/или добавить другие. Здесь необходимо указать полную инструкцию наследования. Она зависит от языка: `public QObject` для C++, `extends SomeClass` для PHP или просто имя класса для Python.

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

При нажатии кнопки Далее появляется страница, на которой можно добавить в класс методы. В зависимости от того, какой шаблон выбран, методы могут быть реализованы в новом классе как переменные-члены или быть созданы свойствами с функциями установки и получения значений. В языках программирования, где необходимо объявлять типы переменных (например, в C++), потребуется указать как тип, так и имя члена, например: `int number` или `QString name`. В других языках можно не указывать тип, но рекомендуется всё равно сделать это (возможно, такое указание будет полезно для дальнейшей работы с шаблоном).

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

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

Если выбрать шаблон `Qt Object`, отметить некоторые из стандартных методов и добавить две переменные-члена, вывод будет выглядеть так, как показано на следующем изображении.

Как можно видеть, данные-элементы преобразованы в свойства Qt с функциями доступа и макросами Q_PROPERTY. Аргументы для функций присваивания даже передаются константными ссылками (когда это возможно). Кроме того, объявлен закрытый класс и создан закрытый указатель с Q_DECLARE_PRIVATE. Всё это выполнено шаблоном; если выбрать на первом этапе другой шаблон, результат может быть совсем другим.

### Создание нового модульного теста

Хотя на большинстве платформ тестирования каждый тест должен быть отдельным классом, в &kdevelop; предусмотрен способ упростить создание модульных тестов. Чтобы создать новый тест, щёлкните по папке проекта правой кнопкой мыши и выберите в контекстном меню пункт Создать из шаблона.... На странице выбора шаблона укажите `Тест` в качестве категории, а затем выберите нужные язык программирования и шаблон и нажмите кнопку Далее.

Будет предложено указать имя теста и список тестовых случаев. Тестовые случаи указываются по именам. На некоторых платформах тестирования (например, PyUnit and PHPUnit) имена тестовых случаев должны начинаться со специального префикса. В &kdevelop; добавление этого префикса выполняется шаблоном, поэтому его не нужно указывать при перечислении имён. Нажмите кнопку Далее и укажите условия лицензирования и выходные расположения для создаваемых файлов. После этого тест будет создан.

Созданные таким образом модульные тесты не будут автоматически добавлены к какой-либо цели. Если используется CTest или какая-либо другая платформа тестирования, обязательно добавьте новые файлы к цели.

### Другие файлы

Несмотря на то, что при создании кода на основе шаблонов больше внимания уделяется созданию классов и модульных тестов, такую методику можно применять для создания файлов кода любого типа. Например, можно воспользоваться шаблоном для создания модуля поиска CMake или файла .desktop. Для этого просто выберите пункт Создать из шаблона…, а затем укажите нужные категорию и шаблон. Если шаблон не относится к категориям `Класс` или `Тест`, будет возможно выбрать только условия лицензирования, значения дополнительных параметров шаблона и расположения выходных файлов. Как и в случае классов и тестов, после завершения работы вспомогательной программы соответствующие файлы будут созданы и открыты в редакторе.

### Управление шаблонами

С помощью вспомогательной программы (Файл Создать из шаблона) также можно загрузить дополнительные шаблоны файлов: нажмите кнопку Получить другие шаблоны…. Появится окно получения новых данных, с помощью которого можно установить дополнительные шаблоны, а также обновить или удалить их. Также имеется модуль настройки шаблонов (Настройка Настроить &kdevelop;…Шаблоны). С помощью этого модуля можно управлять как шаблонами файлов (их описание приводится выше), так и шаблонами проектов (используются для создания новых проектов).

Конечно же, если ни один из доступных шаблонов не подходит для проекта, можно создать свой собственный. Проще всего сделать это путём копирования и изменения существующего шаблона, опираясь на краткое практическое руководство и более подробный документ с техническими условиями. Чтобы скопировать установленный шаблон, откройте диспетчер шаблонов (Настройка Настроить KDevelop...Шаблоны), выберите нужный шаблон и нажмите кнопку Скопировать шаблон. Выберите папку для сохранения содержимого шаблона и нажмите кнопку OK. Затем можно отредактировать шаблон, открыв его файлы в этой папке и изменив их. После завершения редактирования можно импортировать новый шаблон в &kdevelop;: откройте диспетчер шаблонов, перейдите на соответствующую вкладку (либо Шаблоны проектов, либо Шаблоны файлов) и нажмите кнопку Загрузить шаблон из файла. Откройте файл описания шаблона, то есть файл с суффиксом `.kdevtemplate` или `.desktop`. &kdevelop; сожмёт файлы в архив шаблона и выполнит его импорт.

Когда копируется существующий шаблон, необходимо переименовать копию перед импортом. Если этого не сделать, старый шаблон будет перезаписан или в списке окажутся два шаблона с одинаковыми именами. Чтобы переименовать шаблон, переименуйте файл описания так, чтобы его имя было уникальным (но при этом сохраните суффикс), и измените запись `Name` в файле описания.

Если требуется создать шаблон с нуля, можно начать с образца шаблона класса C++: создайте новый проект и выберите проект `Шаблон класса C++` в категории `KDevelop`.

## Сборка (компиляция) проектов с нестандартными Makefile

Во многих проектах описание способа сборки файлов кода (и определения тех файлов, которые следует повторно собрать после внесения изменений в код) выполняется с помощью файлов Makefile, обработку которых осуществляет программа make (см., например, GNU make). В простых проектах несложно создать такой файл самостоятельно. В больших проектах создание таких файлов часто выполняется с помощью инструментов GNU autotools (autoconf, autoheader, automake). В этом разделе предполагается, что файл Makefile проекта уже создан и просто нужно указать &kdevelop;, каким образом следует взаимодействовать с этим файлом.

На момент написания этого раздела руководства &kdevelop; 4.x не поддерживает работу с инструментами GNU autotools. Если они используются в проекте, потребуется запустить `./configure` или подобный сценарий вручную из командной строки. Если следует сделать это внутри &kdevelop;, откройте панель Konsole (при необходимости добавив её по периметру главного окна: Окно Добавить панель…) и в появившемся командном окне укажите команду `./configure`.

Сначала необходимо указать &kdevelop; на цели сборки в файлах Makefile. Это можно сделать двумя способами: выбрать отдельные цели Makefile или выбрать набор целей, которые требуется собирать часто. Для применения обоих способов следует открыть панель Проекты (нажмите кнопку Проекты; если такой кнопки ещё нет по периметру окна, добавьте её согласно приведённым выше инструкциям). Панель Проекты состоит из двух частей. В верхней части (Проекты) приводится список всех проектов, пункты каталогов можно разворачивать. В нижней части (Последовательность сборки) находятся те проекты, которые будут собраны при выборе пункта меню Проект Собрать выделенное или нажатии клавиши F8; эта часть будет более подробно рассмотрена далее.

### Сборка отдельных целей Makefile

В верхней части панели проекта разверните список для одного из проектов (например, того, для которого следует выполнить сборку одной из целей Makefile). В списке будут видны значки каталогов этого проекта, файлов в каталоге верхнего уровня этого проекта, а также целей Makefile, которые удалось определить &kdevelop;. На изображении эти категории показаны справа. Обратите внимание, что &kdevelop; в некоторой мере понимает синтаксис Makefile и, следовательно, может предлагать заданные в этом файле Makefile цели (такое понимание имеет свои границы: не будут показаны сборные или неявные цели).

Чтобы собрать какую-либо из целей в списке, щёлкните по ней правой кнопкой мыши и выберите в контекстном меню пункт Собрать. Выполнение этих действий, например, для цели clean приведёт к выполнению команды make clean. Сообщения о выполнении действий будут показаны в дочернем окне Сборка. (Это окно соответствует инструменту Собрать, поэтому его можно закрыть и затем снова открыть с помощью кнопки Собрать на панели инструментов главного окна. Оно показано в нижней правой части изображения.)

### Выбор набора целей Makefile для регулярной сборки

Щёлкать правой кнопкой мыши по отдельным целям Makefile быстро становится утомительным. Намного проще было бы создать для одного или нескольких проектов отдельные цели, которые постоянно собираются в ходе разработки. Для этого в среде реализована «сборка обозначенных целей»: это набор целей Makefile, которые собираются одна за другой при нажатии кнопки Собрать выделенное в расположенном в верхней части окна ряду кнопок, выборе пункта меню Проект Собрать выделенное или использовании функциональной клавиши F8.

Список выбранных целей Makefile отображается в нижней части панели Проекты.

По умолчанию выбираются все проекты, но это поведение можно изменить. Например, если в списке проектов их три (базовая библиотека L и два приложения, A и B), но в данное время ведётся работа только над проектом A, то можно удалить проект B из списка: выделите соответствующий пункт списка и нажмите кнопку . Скорее всего, будет нужно, чтобы библиотека L собиралась перед проектом A. Изменить порядок пунктов списка можно с помощью кнопок, расположенных справа от списка. Также можно добавить в список определённую цель Makefile, щёлкнув по ней правой кнопкой мыши и выбрав в контекстном меню пункт Добавить в комплект сборки (или просто выделив её и нажав кнопку , расположенную прямо над списком выбранных целей).

&kdevelop; позволяет указать, что следует делать при сборке выделенных целей. Выберите пункт меню Проект Настроить проект.... Появившееся диалоговое окно позволяет, например, выбрать количество заданий, которые make может выполнять одновременно (если у процессора компьютера, например, 8 ядер, то в соответствующем поле уместно будет указать значение «8»). В диалоговом окне Цель сборки по умолчанию — это цель Makefile, используемая для всех целей в наборе.

### Работа с сообщениями об ошибках

Если во время компиляции будет обнаружена ошибка, просто щёлкните по строке с ошибкой. Курсор будет переведен в строку (и, если указано, позицию в строке), где была обнаружена ошибка. В зависимости от типа ошибки &kdevelop; может также предложить несколько вариантов действий для её исправления (например, если была обнаружена неизвестная переменная, будет предложено объявить её).

## Запуск программ в &kdevelop;

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

### Настройка конфигураций запуска в &kdevelop;

Чтобы выполнить такую настройку, выберите пункт меню Выполнение Настроить конфигурации запуска…, выберите тот проект, для которого следует добавить конфигурацию запуска, и нажмите кнопку . Затем укажите имя исполняемого файла и путь к каталогу, из которого следует запустить программу. Если запуск исполняемого файла зависит от результатов сборки этого файла и/или других библиотек, можно добавить их в список, расположенный в нижней части окна: выберите в раскрывающемся меню пункт Собрать, нажмите кнопку , расположенную справа от поля для ввода текста, и выберите цель сборки. В примере выше выбрана цель все из проекта `1.deal.II` и `step-32` из проекта `1.step-32`, чтобы обеспечить сборку базовой библиотеки и программы на её основе перед фактическим выполнением программы. В этом разделе настройки также можно настроить запуск отладки: щёлкните по значку Отладка и укажите исполняемый файл программы отладки; если это системный отладчик по умолчанию (например, gdb в &Linux;), этот шаг не нужен.

Теперь можно попробовать запустить программу: выберите в главном меню &kdevelop; пункт Выполнение Выполнить запуск (или воспользуйтесь комбинацией клавиш &Shift;F9), и программа будет запущена в отдельном дочернем окне &kdevelop;. На приведённом выше изображении показан результат: новое дочернее окно инструмента Выполнение, в нижней части которого отображается вывод запущенной программы (в рассматриваемом примере — программы `step-32`).

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

### Некоторые полезные комбинации клавиш

Запуск программы
F8 | Собрать (вызвать make)
&Shift;F9 | Запустить
&Alt;F9 | Запустить программу в отладчике. Перед таким запуском следует установить точки останова (достаточно щёлкнуть правой кнопкой мыши по соответствующей строке кода и выбрать нужный пункт контекстного меню).

## Отладка программ в &kdevelop;

### Запуск программы в отладчике

После настройки запуска программы (смотрите раздел Запуск программ) также можно запустить её в отладчике: выберите пункт меню Выполнение Начать отладку или воспользуйтесь комбинацией клавиш &Alt;F9. Результат будет аналогичен запуску gdb с указанием исполняемого файла, заданного в конфигурации запуска, и последующей команды `Run`. Это означает, что если программа где-либо вызовет `abort()` (например, в случае сбоя проверочного утверждения) или если произойдёт ошибка сегментации, то отладчик остановится. С другой стороны, если программа отработает до конца (как правильно, так и неправильно), то сам отладчик не остановится, пока программа не завершит работу. В таком случае потребуется до запуска отладки установить точки останова на всех строках кода, где должен останавливаться отладчик. Чтобы это сделать, установите курсор на такую строку и выберите пункт меню Выполнение Поставить или убрать точку останова или щёлкните по строке правой кнопкой мыши и выберите в контекстном меню пункт Поставить или убрать точку останова.

Запуск программы в отладчике переведёт &kdevelop; в другой режим: все кнопки инструментов, расположенные по периметру главного окна, будут заменены на кнопки отладки, а не редактирования. Понять, в каком режиме ведётся работа, можно по верхней правой части окна: там расположены вкладки Рецензирование, Отладка и Код. С помощью щелчков по этим вкладкам выполняется переключение между тремя режимами; для каждого режима предусмотрен свой набор панелей (их перечень настраивается так же, как настраивались инструменты режима Код в разделе Инструменты и представления).

Когда отладчик остановится (в точке останова или точке, где вызывается `abort()`), будет можно ознакомиться с различными сведениями об отлаживаемой программе. Например, на изображении выше в нижней части окна открыта панель Стек (приблизительный эквивалент команд backtrace и info threads gdb), на которой слева показаны различные потоки, которые в настоящее время запущены в программе (в примере их всего 8), а справа — как выполнение дошло до текущей точки остановки (в примере: `main()` вызвала `run()`; список был бы длиннее, если бы остановка произошла в функции, вызванной самой `run()`). Слева показаны локальные переменные, в том числе текущий объект (объект, на который указывает переменная `this`).

После остановки доступны несколько вариантов действий: можно выполнить текущую строку (F10, команда next gdb), перейти в функции (F11, команда step gdb) или выполнить инструкции до конца функции (F12, команда finish gdb). На каждом из этапов выполнения &kdevelop; обновляет значения показанных слева переменных. Также можно навести указатель мыши на элемент в коде (например, на переменную); &kdevelop; отобразит текущее значение и предложит остановить выполнение программы при следующем изменении значения этой переменной. Если пользователь умеет работать с gdb, также можно нажать кнопку инструмента GDB, расположенную в нижней части окна, и ввести нужные команды gdb, например, чтобы изменить значение переменной (в текущей версии среды не предусмотрено другого способа сделать это).

### Подключение отладчика к выполняющемуся процессу

Иногда требуется выполнить отладку уже запущенной программы. Одним из таких случаев является отладка параллельно запущенных с помощью MPI программ или отладка длительно выполняемого фонового процесса. Выполнить такую отладку можно с помощью пункта менюВыполнение Подключиться к процессу; будет открыто окно, похожее на приведённое выше. Потребуется выбрать приложение, которое соответствует текущему открытому проекту в &kdevelop;. В рассматриваемом случае такой программой будет step-32.

Список программ часто оказывается очень длинным. Работу с ним можно упростить с помощью раскрывающегося меню в верхней правой части окна. Значение по умолчанию — Пользовательские процессы, то есть все программы, запущенные всеми пользователями, которые сейчас работают в системе (если используется личный настольный компьютер или ноутбук, скорее всего, пользователь будет только один, не считая пользователя root и различные учётные записи служб); но в список не входят процессы, запущенные пользователем root. Список можно ограничить, выбрав вариант Ваши процессы (в этом случае из списка будут удалены все программы, запущенные другими пользователями). Или ещё лучше: выберите вариант Только программы для удаления из списка многочисленных процессов, формально выполняемых от имени пользователя, но не запущенных пользователем собственноручно (например, диспетчер окон, фоновые задачи и так далее), для которых вряд ли требуется отладка.

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

### Некоторые полезные комбинации клавиш

Отладка
F10 | Шаг с обходом (next в gdb)
F11 | Шаг с заходом (step в gdb)
F12 | Шаг с выходом (finish в gdb)

## Работа с системами управления версиями

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

Во-первых, если каталог, в котором расположен проект, находится под управлением такой системы, программа &kdevelop; автоматически определит это. Другими словами: при настройке проекта не требуется указывать &kdevelop;, что необходимо получить код из репозитория; достаточно указать программе тот каталог, в котором хранится ранее полученная копия кода. Если такой каталог имеется, откройте панель Проекты:

- Если данные в каталоге устарели, их можно обновить из репозитория: щёлкните по названию проекта правой кнопкой мыши, перейдите в меню Subversion и выберите пункт Обновить. Все относящиеся к этому проекту файлы будут обновлены.

- Если при обновлении нужно ограничиться отдельными подкаталогами или файлами, разверните дерево проекта до нужного уровня и щёлкните по подкаталогу или файлу правой кнопкой мыши, а затем повторите приведённые выше действия.

- Если в один или несколько файлов были внесены изменения, разверните дерево проекта до каталога с этими файлами и щёлкните по нему правой кнопкой мыши. В появившемся контекстном меню будет доступен пункт Subversion, который содержит различные варианты действий. Выберите среди них Сравнить с base для просмотра различий между изменённой версией файла и той его версией, которая ранее была получена из репозитория (версия base). В результате будут показаны различия (diff) для всех файлов в этом каталоге.

- Если был изменён только один файл, для него также можно вызвать меню Subversion: просто щёлкните правой кнопкой мыши по соответствующему файлу в представлении проекта. Ещё проще: щёлкните правой кнопкой мыши в представлении Редактор, где открыт этот файл.

- Если требуется отправить в репозиторий один или несколько изменённых файлов, щёлкните правой кнопкой мыши по отдельному файлу, по подкаталогу или по всему проекту и выберите в контекстном меню пункт Subversion Зафиксировать. После выбора этого пункта среда будет переведена в режим Рецензирование, третий режим, пункт которого находится рядом с пунктами режимов Код и Отладка в правом верхнем углу главного окна &kdevelop;. На изображении справа показано окно в этом режиме. В режимеРецензирование в верхней части окна показаны различия в файлах всего подкаталога или проекта, все изменённые файлы с различиями обозначаются цветом (см. различные вкладки в этой части окна). По умолчанию все изменённые файлы будут добавлены в набор изменений, который будет передан в репозиторий, но можно отменить выбор некоторых файлов, если внесённые в них изменения не относятся к тем изменениям, которые следует отправить. В рассматриваемом примере не будут отправлены `step-32.cc` и `step-32.prm`; поскольку изменения в этих файлах не связаны с другими изменениями в проекте, в этот раз они не будут отправлены в хранилище (их можно будет отправить позже отдельной фиксацией). После просмотра изменений можно ввести сообщение фиксации в поле ввода текста и нажать кнопку Фиксировать, расположенную справа, чтобы отправить изменения в репозиторий.

- Как и в случае просмотра различий, если нужно отправить один файл, можно просто щёлкнуть правой кнопкой мыши в представлении редактора и выбрать в контекстном меню пункт Subversion Зафиксировать.

## Настройка &kdevelop;

Иногда требуется изменить стандартный внешний вид или поведение &kdevelop; (например, если пользователь привык к другим комбинациям клавиш или если для проекта требуется другой стиль расстановки отступов в исходном коде). В следующих разделах приводится краткое описание способов настройки &kdevelop;.

### Настройка редактора

Можно настроить несколько полезных параметров во встроенном редакторе и других компонентах &kdevelop;. Одна из общих вещей — включение нумерации строк с помощью пункта меню Редактор Внешний вид Показывать номера строк; это облегчает сопоставление сообщений об ошибках компиляции или сообщений отладки с местами в коде. В том же подменю можно включить параметр Показывать метки — это столбец слева от кода, в котором &kdevelop; отображает метки (например, метку точку останова на текущей строке).

### Настройка расстановки отступов в коде

У многих программистов есть предпочитаемый стиль форматирования кода. Кроме того, во многих проектах есть собственные правила расстановки отступов. Вероятно, параметры &kdevelop; не будут соответствовать такому стилю и правилам. Но можно выполнить настройку: выберите пункт меню Настройка Настроить &kdevelop;… и выберите в левой части окна раздел Преобразователь форматирования. Можно выбрать один из предустановленных общепринятых стилей расстановки отступов или задать свой собственный (для этого следует добавить новый стиль и отредактировать его). Вероятно, не удастся в точности воссоздать тот стиль, который раньше использовался для отступов в исходных файлах проекта, но получится приблизиться к нему, указав соответствующие параметры для нового стиля; на двух приведённых далее изображениях показан такой пример.

В &kdevelop; 4.2.2 возможно создать новый стиль для определённого типа MIME (например, для заголовочных файлов C++), но этот стиль не будет представлен в списке доступных вариантов для других типов MIME (например, для файлов исходного кода C++), хотя было бы удобно использовать один и тот же стиль для обоих типов файлов. Следовательно, потребуется задать стиль дважды: один раз для заголовочных файлов и один раз для файлов исходного кода. Разработчикам известно об этой проблеме: &kdevelop;, ошибка 272335.

### Настройка комбинаций клавиш

В &kdevelop; почти безграничный список комбинаций клавиш (некоторые из них перечислены в разделах «Некоторые полезные комбинации клавиш» нескольких глав этого руководства). Эти комбинации можно изменить в соответствии с потребностями пользователя с помощью пункта меню Настройка Комбинации клавиш…. В верхней части диалогового окна можно указать слово для поиска, чтобы отображались только соответствующие ему команды; затем можно будет изменить связанные с ними комбинации клавиш.

Одним из двух полезных изменений будет установка для команды Выровнять клавиши (многие люди обычно не вводят символы табуляции вручную, предпочитая форматирование кода редактором; если внести такое изменение, после нажатия клавиши &kdevelop; будет добавлять отступы, убирать отступы или выравнивать код. Второе изменение — назначить команде Поставить или убрать точку останова комбинацию клавиш &Ctrl;B, поскольку эту операцию требуется выполнять довольно часто.

### Настройка автодополнения кода

О возможностях дополнения кода рассказывается в этом разделе руководства, посвящённом написанию исходного кода. В &kdevelop; автоматическое дополнение выполняется из двух источников: текстового редактора и движка синтаксического анализа. Текстовый редактор (&kate;) является компонентом окружения KDE и предоставляет возможности автодополнения на основе других частей того же самого документа. Такое автоматическое дополнение можно узнать по значку на панели подсказки, расположенному перед соответствующим вариантом:

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

С другой стороны, собственное автодополнение &kdevelop; предоставляет гораздо более широкие возможности благодаря учёту семантической информации о контексте. Например, при вводе кода `object.` программа предлагает только те функции-члены, которые используются в соответствующем объекте, и так далее. Пример:

Информация о контексте поступает от различных модулей поддержки языков программирования, которыми можно воспользоваться после сохранения файла (среда определит язык программирования по типу сохранённого файла).

Автодополнение &kdevelop; работает по мере набора кода пользователем (почти во всех местах, где может потребоваться дополнить код). Настройку автодополнения можно выполнить с помощью пункта меню Настройка Настроить &kdevelop;…Поддержка языков. Параметр Вызывать автоматически должен быть включён по умолчанию. Если это не так, обязательно установите соответствующий флажок.

В &kdevelop; предусмотрено два способа показа вариантов дополнения: Минимальное автоматическое дополнение отображает базовую информацию во всплывающих подсказках (то есть пространство имён, класс, функцию или переменную). Такое дополнение похоже на дополнение в &kate; (за исключением значков).

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

При использовании как минимального, так и полного режимов &kdevelop; также выводит наверх и выделяет зелёным цветом все пункты дополнения, которые соответствуют текущему ожидаемому типу (наилучшие соответствия).

В диалоге настройки доступны три варианта уровня дополнения:

- Всегда минимальное дополнение: никогда не показывать Полное дополнение

- Минимальное автоматическое дополнение: показывать Полное дополнение только при активации автодополнения вручную (то есть при использовании комбинации клавиш &Ctrl;Пробел)

- Всегда полное дополнение: всегда показывать Полное дополнение

## Авторские права и лицензия

Авторские права на документацию указаны в журнале страницы KDevelop4/Manual пользовательской базы знаний KDE.

Олеся Герасименкоtranslation-team@basealt.ru

&underFDL;
&documentation.index;