Lazarus IDE Tools/ru

From Free Pascal wiki

Deutsch (de) English (en) español (es) suomi (fi) français (fr) 日本語 (ja) 한국어 (ko) Nederlands (nl) português (pt) русский (ru) slovenčina (sk) 中文(中国大陆)‎ (zh_CN)


Lazarus IDE - это инструменты библиотеки Free Pascal для синтаксического анализа и редактирования, называемая "codetools"[(утилиты кода)].

Эти инструменты предоставляют такие функции, как "Переход к объявлению", "Завершение кода", "Извлечение", "Перемещение вставки" и исходники "Украшение Паскаля". Эти функции могут сэкономить много времени и продублировать работу. Они настраиваются, и каждая функция доступна с помощью ярлыков (см. Editor Options).

Поскольку они работают исключительно с источниками Pascal и понимают коды FPC, Delphi и Kylix, им не требуются компилированные модули или установленный компилятор Borland/Embarcadero. Код Delphi и FPC можно редактировать одновременно с несколькими версиями Delphi и FPC. Это упрощает перенос кода Delphi в FPC/Lazarus.


Contents

Горячие клавиши в IDE

Переход на объявление Ctrl+ЛКМ или Alt+ (Переход на объявление типа или переменной)
Переход на метод класса Ctrl+ Shift+ (Переход туда сюда между объявлением и телом метода)
Шаблоны кода Ctrl+J
Синхронная правка Ctrl+J (Пока текст выделен)
Завершение кода (Завершение класса) Ctrl+ Shift+C
Завершение идентификатора Ctrl+space
Завершение слова Ctrl+W
Подсказка для параметров Ctrl+ Shift+space
Последовательный поиск Ctrl+E

Переход между методом и его объявлением

Для перехода между телом процедуры (begin..end) и объявлением процедуры (procedure Name;) используйте Ctrl+ Shift+.

Для примера:

 interface
 
 procedure DoSomething; // Объявление процедуры
  
 implementation
  
 procedure DoSomething; // Тело процедуры 
 begin
 end;

Если курсор стоит на теле процедуры и Вы нажмёте Ctrl+ Shift+, то курсор перескочит на объявление, потом опять Ctrl+ Shift+ и курсор перескочит на тело процедуры, после 'begin'.

Это так же работает между методами-процедурами класса.

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

 interface
 
 procedure DoSomething(p: char); // Объявление процедуры
 
 implementation
   
 procedure DoSomething(p: string); // Тело процедуры
 begin
 end;

Переход с определения к телу процедуры будет позиционировать курсор на ключевое слово 'string'. Это можно использовать для переименования методов и / или изменения параметров.

Пример:
Вы переименовываете 'DoSomething' в 'MakeIt':

 interface
 
 procedure MakeIt; // Объявление процедуры
 
 implementation
 
 procedure DoSomething; // Тело процедуры
 begin
 end;

Тогда можно перейти от MakeIt к телу. IDE ищет подходящее тело и не находит, а, следовательно, ищет нечто похожее. Так как вы переименовали только одну процедуру есть ровно одно тело без определения (DoSomething) и будет переход к DoSomething, курсор встанет справа от "DoSomething". Тогда вы можете просто переименовать его прямо там. Это работает и для параметров.

Включаемые файлы

Включаемые файлы это файлы вставленные в исходный код с помощью директив компилятора

{$I filename}

или

{$INCLUDE filename}

. Lazarus и FPC используют эти вещи чтобы уменьшить избыточность и избежать нечитаемых {$IFDEF} конструкций при поддержке различных платформ.

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

Например: когда автозавершение кода добавляет новое тело метода за другим телом метода, он хранит их обоих в одном файле. Таким образом, вы можете помещать целые реализации классов в файлы include, как, например LCL [делает] для почти всех элементов управления.

Но [тут] есть ловушка для новичков: Если вы впервые откроете файл include и попробуете прыгнуть к методу или найди [его] объявление, вы получите сообщение об ошибке. IDE не знает, к какому модулю принадлежит файл include. Сначала вы должны открыть модуль.

Как только IDE проанализирует модуль, она [начнет] анализировать директивы include, и [затем] IDE запоминает эти взаимосвязи. Она сохраняет эту информацию при выходе и при сохранении проекта в ~/.lazarus/includelinks.xml. В следующий раз, когда вы откроете этот include-файл и перейдете [к объявлению] или найдете [его поиском], IDE будет открывать модуль изнутри [include-файла], и переход будет работать. Вы также можете указать подсказку IDE, поставив

 {%mainunit yourunit.pas}

наверху вашего yourinclude.inc.

Конечно, этот механизм имеет ограничения. Некоторые include-файлы включаются дважды или более. Например: lcl/include/winapih.inc.

Переходы с объявления процедуры/метода в этом include-файле к [их] телу зависят от ваших последних действий. Если вы работаете в lcl/lclintf.pp, среда IDE перейдет в winapi.inc. Если вы работаете в lcl/interfacebase.pp, тогда она перейдет в lcl/include/interfacebase.inc (или в один из других включенных файлов). Если вы работаете над обоими, то вы можете запутаться. ;)

Шаблоны кода

Шаблоны кода преобразуют идентификатор в текст, или фрагмент кода.


По умолчанию горячие клавиши для шаблонов кода Ctrl+J. Вы можете ввести идентификатор, нажать Ctrl+J и идентификатор заменится на текст определенный для этого идентификатора. Шаблоны кода можно задать в Environment -> Editor Options -> CodeTools.

Пример: Введите идентификатор 'classf', поставьте курсор справа от 'f' и нажмите Ctrl+J. Идентификатор 'classf' будет заменен на

 T = class(T)
 private
 
 public
   constructor Create;
   destructor Destroy; override;
 end;

и курсор будет находится за 'T'.

Вы можете посмотреть список шаблонов установив курсор на пустое место (не на идентификатор) и нажав Ctrl+J. Список шаблонов кода появится. Используйте стрелки, или введите несколько символов чтобы выбрать нужный шаблон. Enter создаст выделенный шаблон, а Escape закроет список шаблонов.

Больше всего времени экономит шаблон 'b'+Ctrl+J для begin..end.

Подсказка для параметров

Подсказка для параметров позволяет посмотреть список параметров для процедур и функций. Жирным шрифтом выделяется текущий параметр.

Например:

  Canvas.FillRect();

Поместите курсор внутри скобок и нажмите Ctrl+ Shift+space. Появится подсказка с параметрами процедуры FillRect.

Parameterhints1.png

Начиная с версии 0.9.31, справа от каждой декларации имеется кнопка, вставляющая отсутствующие параметры. Это скопирует имена параметров из выбранного объявления в позицию курсора.

Parameterhints2.png

Подсказка: используйте Автозавершение объявления переменной, чтобы объявить переменные.

Note-icon.png

Примечание: Имя ярлычка - "Show code context"[("Показать контекст кода")].

Последовательный поиск

Последовательный поиск изменяет строку состояния редактора исходного кода. Введите несколько символов, и редактор тут же будет их искать, выделяя все вхождения в тексте. Для вызова поиска, нажмите: Ctrl+e.

  • Например, нажмите e произведёт поиск и выделение всех букв «е» в коде.
  • Затем, нажав t будет произведён поиск и выделение всех вхождений «et» и так далее.
  • Вы можете использовать быстрый переход между найденными позициями в тексте нужной строки. Для быстрого перехода вниз по тексту, используйте F3 (или Ctrl+e во время поиска). Для быстрого перехода вверх по тексту, используйте Shift+F3.
  • ← Backspace удаляет последний символ
  • Enter останавливает поиск без добавления новой строки в редакторе.
  • Вы можете возобновить последний поиск, нажав Ctrl+e во второй раз, сразу же после начала последовательного поиска используя Ctrl+e. т.е. когда строка поиска пуста.
  • Вставка Ctrl+V добавит строку из буфера обмена к текущему искомому тексту. (так же как в lazarus 0.9.27 r19824).

Пример использования последовательного поиска для поиска слова

  • Поместите курсор на нужное слово, не выделяя его
  • Нажмите Ctrl+C. Редактор исходного кода выделит слово и скопирует его в буфер обмена.
  • Нажмите Ctrl+E для начала последовательного поиска
  • Нажмите Ctrl+V для поиска идентификатора (так же, как в 0.9.27)
  • Используйте F3 и Shift+F3 для быстрого перехода к следующему / предыдущему найденному участку текста.
  • Используйте любую клавишу (например курсор влево или вправо), чтобы закончить поиск

Синхронная правка

Синхронная правка позволяет редактировать все места присутствия слова в тексте одновременно (синхронно). Вы просто изменяете, слово в одном месте и все остальные вхождения слова в тексте изменяются автоматически.

Синхронная правка влияет на все слова в выделенной области текста. Пример использования:

  • Выделите блок текста
  • Нажмите Ctrl+J или воспользуйтесь соответствующим значком. (Это работает только, если есть какие-либо слова, которые встречаются более одного раза в выделенном тексте.)
  • Используйте клавишу Tab для выделения слова, которое вы хотите изменить. (если было выделено несколько разных слов более одного раза)
  • Измените слово
  • Нажмите Esc для окончание работы с синхронной правкой

См. анимированный пример здесь

Note-icon.png

Примечание: Ctrl+J также используется для редактирования шаблона. [Это сочетание клавиш] переключает свое значение, если вы выберете какой-то текст.

Поиск следующего / предыдущего вхождения слова

Обе функции можно найти в контекстном меню редактора исходного кода

  • Редактор кода / контекстное меню / Найти / Найти следующее вхождение слова
  • Редактор кода / контекстное меню / Найти / Найти предыдущее вхождение слова

Вы можете назначить данным пунктам сочетания клавиш в окне настройки редактора исходного кода. Для этого выберите меню "Сервис->Параметры" и в левой части появившегося окна выберите "Редактор->Комбинации клавиш".

Автозавершение Кода

Автозавершение кода можно найти в меню IDE Edit -> Complete Code, а так же используя сочетания клавиш: Ctrl+ Shift+C.

Для Делфистов: В Delphi, это называется "автозавершение кода"(code completion) - специальная функция, показывающая список идентификаторов, в текущей позиции исходного кода ((Ctrl+Пробел). В Lazarus это называется "автозавершение идентификаторов"(Identifier completion).

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

Какая из этих функций будет использована, зависит от позиции курсора в редакторе кода.

Автозавершение кода можно найти в меню IDE Edit -> Complete Code, [а также вызвать] стандартным сочетанием клавиш Ctrl+ Shift+C.

Автозавершение класса

Наиболее мощная функция завершения кода является "Автозавершение класса". Вы пишете скелет класса, добавляя в него методы и свойства. Автозавершение кода автоматически завершит их объявления, добавив нужные переменные, тело для реализации метода или свойства, определит способ доступа к ним а так же поля класса.

Например: создайте класс (для быстроты можете использовать шаблоны кода):

 TExample = class(TObject)
 public
   constructor Create;
   destructor Destroy; override;
 end;

Поместите курсор где-то внутри класса и нажмите Ctrl+ Shift+C. Это позволит создать скелет для реализации методов и поместит курсор внутри тела метода:

 { TExample }
 
 constructor TExample.Create;
 begin
   |
 end;
 
 destructor TExample.Destroy;
 begin
   inherited Destroy;
 end;
Note-icon.png

Примечание: символом '|' обозначена позиция курсора в коде.

Подсказка: Вы можете переключаться между методом и его телом, используя клавиши Ctrl+ Shift+.

Вы можете увидеть, что IDE добавило вызов 'inherited Destroy'. Это происходит, когда в объявлении метода используется ключевое слово 'override'.

Теперь добавьте метод DoSomething:

 TExample = class(TObject)
 public
   constructor Create;
   procedure DoSomething(i: integer);
   destructor Destroy; override;
 end;

Нажмите Ctrl+ Shift+C и IDE завершит его, добавив:

 procedure TExample.DoSomething(i: integer);
 begin
   |
 end;

Вы можете определить поведение вставки кода в Environment > Codetools Options -> Code Creation.

Завершение свойств
Добавьте свойство AnInteger:

 TExample = class(TObject)
 public
   constructor Create;
   procedure DoSomething(i: integer);
   destructor Destroy; override;
   property AnInteger: Integer;
 end;

Нажмите Ctrl+Shift+C и вы получите:

 procedure TExample.SetAnInteger(const AValue: integer);
 begin
   |if FAnInteger=AValue then exit;
   FAnInteger:=AValue;
 end;

Функция автозавершения кода добавила поля класса и метод, используемые при обращении к свойству. Нажмите Ctrl+ Shift+ для просмотра определения класса:

 TExample = class(TObject)
 private
   FAnInteger: integer;
   procedure SetAnInteger(const AValue: integer);
 public
   constructor Create;
   procedure DoSomething(i: integer);
   destructor Destroy; override;
   property AnInteger: integer read FAnInteger write SetAnInteger;
 end;

Свойство было изменено. Добавлены ключевые слова Read и Write. Класс получил новый раздел 'private' с полем 'FAnInteger' и методом 'SetAnInteger'. Это общий стиль Delphi, использовать в названиях полей букву 'F' (Field). И в методах на запись слово 'Set'. Данные настройки можно изменить в Environment > Codetools Options -> Code Creation.

Создание свойства только для чтения:

 property PropName: PropType read;

Будет расширено до:

 property PropName: PropType read FPropName;

Создание свойства только для записи:

  property PropName: PropType write;

Будет расширено до:

 property PropName: PropType write SetPropName;

Создание свойства только для чтения с указанием метода:

 property PropName: PropType read GetPropName;

Будет добавлена функция GetPropName:

 function GetpropName: PropType;

Создание свойства с ключевым словом stored:

 property PropName: PropType stored;

Будет расширено до:

 property PropName: PropType read FPropName write SetPropName stored PropNameIsStored;

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

Подсказка: Автозавершение идентификатора также распознает неполные свойства и [взамен] предлагает имена по умолчанию. Например:

property PropName: PropType read |;

Поместите курсор сразу за ключевым словом read и нажмите Ctrl+Space для автозавершения идентификатора. Он предоставит вам переменную FPropName и процедуру SetPropName.

Автозавершение предварительно объявленной процедуры

"Автозавершение предварительно объявленной процедуры" является частью автозавершения кода и добавляет отсутствующее тело процедуры. Оно вызывается, когда курсор находится в объявлении заданной процедуры.

Например: Добавьте новую процедуру в раздел интерфейса:

 procedure DoSomething;

Поместите в нее курсор и нажмите Ctrl+ Shift+C для автозавершения кода. Он будет создан в разделе реализации:

 procedure DoSomething;
 begin
   |
 end;

Подсказка: вы можете быстро перемещаться между объявлением процедуры и ее телом с помощью Ctrl+ Shift+.

Новое тело процедуры будет добавлено перед методами класса. Если в интерфейсе уже есть некоторые процедуры, IDE попытается сохранить [их] порядок. Например:

  procedure Proc1;
  procedure Proc2; // новая процедура
  procedure Proc3;

Если тела Proc1 и Proc3 уже существуют, то тело Proc2 будет вставлено между телами Proc1 и Proc3. Такое поведение можно настроить в Environment > Codetools Options -> Code Creation.

Несколько процедур:

 procedure Proc1_Old; // тело [процедуры уже] существует
 procedure Proc2_New; // тело [процедуры еще] не существует
 procedure Proc3_New; //  "
 procedure Proc4_New; //  "
 procedure Proc5_Old; // тело [процедуры уже] существует

Автозавершение кода добавит тела всех 3 процедур(Proc2_New, Proc3_New, Proc4_New).

Почему это называется "Автозавершение предварительно объявленной процедуры"?

Потому что это работает не только для процедур, определенных в интерфейсе, но и для процедур[, определенных] с помощью "предварительно объявленного" модификатора. И потому что утилиты кода обрабатывают процедуры в интерфейсе как имеющие неявный "предварительно объявленный" модификатор.

Автозавершение назначенных процедур обработки событий

"Автозавершение назначенных процедур обработки событий" является частью автозавершения кода и завершает единственный оператор Event:=|. Он вызывается, когда курсор находится за назначенным событием.

Например: В методе, скажем, событие FormCreate, добавьте строку 'OnPaint:=':

procedure TForm1.Form1Create(Sender: TObject);
begin
  OnPaint:=|
end;

'|' - это курсор, и его не следует вводить. Затем нажмите Ctrl+ Shift+C для завершения кода. Оператор будет завершен

OnPaint:=@Form1Paint;

Новый метод Form1Paint будет добавлен в класс TForm1. Затем запустится автозавершение класса, и вы получите:

procedure TForm1.Form1Paint(Sender: TObject);
begin
  |
end;

Это работает так же, как добавление методов в инспекторе объектов.

Note-icon.png

Примечание: Вы должны поместить курсор сразу после оператора присваивания ':='. Если вы поместите курсор на идентификатор (например, OnPaint), то автозавершение кода вызовет «Автозавершение локальной переменной», что не удастся, поскольку OnPaint уже определен.

Подсказка:

  • Вы можете выбрать видимость по умолчанию для нового метода в разделе Tools / Options / Codetools / Class Completion / Default (начиная с версии 1.8)
  • Вы можете определить имя нового метода самостоятельно. Например:
  OnPaint:=@ThePaintMethod;


Начиная с 0.9.31 Lazarus автозавершает параметры процедуры. Например

procedure TForm1.FormCreate(Sender: TObject);
var
  List: TList;
begin
  List:=TList.Create;
  List.Sort(@MySortFunction|);
end;

Поместите курсор на 'MySortFunction' и нажмите Ctrl+ Shift+C для автозавершения кода. Вы получите новую процедуру:

function MySortFunction(Item1, Item2: Pointer): Integer;
begin
  |
end;

procedure TForm1.FormCreate(Sender: TObject);
var
  List: TList;
begin
  List:=TList.Create;
  List.Sort(@MySortFunction);
end;

Автозавершение объявления переменной

"Автозавершение объявления переменной" является частью завершения кода и добавляет определение локальной переменной для [оператора] Identifier:=Term [(Идентификатор:=Выражение)]. Он вызывается, когда курсор находится на идентификаторе присвоения или параметра.

Например:

procedure TForm1.Form1Create(Sender: TObject);
begin
  i:=3;
end;

Поместите курсор на 'i' или сразу за ним. Затем нажмите Ctrl+ Shift+C для автозавершения кода, и вы получите:

procedure TForm1.Form1Create(Sender: TObject);
var
  i: Integer;
begin
  i:=3;
end;

Утилиты кода сначала проверяют код [на наличие объявления] идентификатора 'i', и если [таковой не найден], то добавляют объявление 'var i: integer;'. Тип идентификатора угадывается из выражения[, расположенного] справа от оператора присвоения ':='. Числа, такие как 3, по умолчанию [будут иметь тип] Integer.

Другой пример:

type
  TWhere = (Behind, Middle, InFront);
 
  procedure TForm1.Form1Create(Sender: TObject);
  var
    a: array[TWhere] of char;
  begin
    for Where:=Low(a) to High(a) do writeln(a[Where]);
  end;

Поместите курсор на 'Where' и нажмите Ctrl+ Shift+C для автозавершения кода. Вы получите:

  procedure TForm1.Form1Create(Sender: TObject);
  var
    a: array[TWhere] of char;
    Where: TWhere;
  begin
    for Where:=Low(a) to High(a) do writeln(a[Where]);
  end;

Начиная с 0.9.11 Lazarus также автозавершает параметры. Например

  procedure TForm1.FormPaint(Sender: TObject);
  begin
    with Canvas do begin
      Line(x1,y1,x2,y2);
    end;
  end;

Поместите курсор на 'x1' и нажмите Ctrl+ Shift+C для автозавершения кода. Вы получите:

  procedure TForm1.FormPaint(Sender: TObject);
  var
    x1: integer;
  begin
    with Canvas do begin
      Line(x1,y1,x2,y2);
    end;
  end;

Начиная с 0.9.31 Lazarus автозавершает параметры указателя. Например

  procedure TForm1.FormCreate(Sender: TObject);
  begin
    CreateIconIndirect(@IconInfo);
  end;

Поместите курсор в 'IconInfo' и нажмите Ctrl+ Shift+C для автозавершения кода. Вы получите:

  procedure TForm1.FormCreate(Sender: TObject);
  var
    IconInfo: TIconInfo;
  begin
    CreateIconIndirect(@IconInfo);
  end;

Во всех приведенных выше примерах вы можете использовать Ctrl+ Shift+X, чтобы отобразить диалоговое окно создания кода, в котором вы можете установить дополнительные параметры.

Автозавершение объявления вызываемой процедуры

[Механизм] автозавершение кода может создать [тело] новой процедуры из места ее объявления.

Допустим, вы просто написали объявление "DoSomething(Width);"

procedure SomeProcedure;
var
  Width: integer;
begin
  Width:=3;
  DoSomething(Width);
end;

Поместите курсор над идентификатором "DoSomething" и нажмите Ctrl+ Shift+C, чтобы получить:

procedure DoSomething(aWidth: LongInt);
begin

end;

procedure SomeProcedure;
var
  Width: integer;
begin
  Width:=3;
  DoSomething(Width);
end;

Это еще не создает функции или методы.

Автозавершение предшествующего объявления класса

"Автозавершение предшествующего объявления класса" является частью Code Completion [(Автозавершения кода), который] добавляет объявление для текущего тела метода в private [разделе интерфейсной части модуля]. Он вызывается, когда курсор находится в теле метода, еще не определенном в классе. Эта функция доступна с Lazarus 0.9.21.

Например:

  procedure TForm1.DoSomething(Sender: TObject);
  begin
  end;

Метод DoSomething еще не объявлен в TForm1. Нажмите Ctrl+ Shift+C, и в IDE будет добавлена "procedure DoSomething(Sender: TObject);" в private-разделе TForm1.

Для дельфийцев: Автозавершение класса работает в Lazarus всегда одним способом: от класса интерфейсного [раздела модуля] к [разделу] реализации или наоборот, от класса в [разделе] реализации к [разделу] интерфейса. Delphi всегда вызывает оба направления. Недостаток способа Delphi заключается в том, что при опечатке легко создать новый метод, не заметив [этого].



Прим.перев. 09:08, 30 October 2018 (CET): Очевидно имеется ввиду следующее: в Lazarus'е достаточно чуть изменить название метода (справедливо и для параметров) в интерфейсной части модуля и нажать Ctrl+ Shift+C, и механизм Code Completion автоматически внесет правки в название уже имеющегося тела метода в разделе implementation. То же справедливо и для случая, когда меняется название метода (справедливо и для параметров) в разделе implementation, а затем вызывается Code Completion - в разделе interface будут внесены соответствующие правки.

В Delphi, если тело метода уже существует, то изменение имени метода в разделе interface приведет к созданию тела метода в разделе implementation с измененным именем в дополнению к уже имеющемуся со старым именем. Это, естественно, вызовет ошибку при компиляции проекта.


Комментарии и автозавершение кода

Автозавершение кода пытается сохранять комментарии, принадлежащие [завершаемому коду]. Например:

  FList: TList; // список TComponent
  FInt: integer;

При вставке новой переменной между FList и FInd комментарий сохраняется в строке FList. То же самое верно для

  FList: TList; { список TComponent
    Это комментарий по нескольким строкам, начиная
    со строки FList, поэтому codetools предполагает, что он принадлежит
    к линии FLIst и не будет [терять с ним]
    связь. Код добавляется за комментарием.}
  FInt: integer;

Если комментарий начинается со следующей строки, он будет обрабатываться так, как если бы он принадлежал коду ниже. Например:

  FList: TList; // список TComponent
    { Этот комментарий относится к приведенному ниже операнду.
      Новый код вставлен над этим комментарием и
      позади комментария [для] FList.}
  FInt: integer;

Обновление метода

Обычно автозавершение класса добавляет все отсутствующие тела методов. (Начиная с 0.9.27). Но если именно один метод отличается между [объявлением в] классе и теле, то тело метода обновляется. Например: у вас есть метод DoSomething.

  public
    procedure DoSomething;
  end;

procedure TForm.DoSomething;
begin
end;

Теперь добавляем параметр:

  public
    procedure DoSomething(i: integer);
  end;

и вызываем автозавершение кода (Ctrl+ Shift+C). Тело метода будет обновлено, а новый параметр будет скопирован:

procedure TForm.DoSomething(i: integer);
begin
end;

Рефакторинг [реорганизация кода]

Инверсия присвоения

Аннотация
 : "Invert Assignments" [("Инверсия присвоения")] берет некоторые выбранные инструкции pascal и инвертирует все операнды из этого кода. Этот инструмент полезен для преобразования кода "save" в "load" и обратную операцию.

Например:

procedure DoSomething;
begin
  AValueStudio:= BValueStudio;
  AValueAppartment :=BValueAppartment;
  AValueHouse:=BValueHouse;
end;

Выделите строки с назначением (между началом и концом) и сделайте инвертирование назначений. Все назначения будут инвертированы, а идентификация будет добавлена автоматически. Например:

Результат:

procedure DoSomething;
begin
  BValueStudio     := AValueStudio;
  BValueAppartment := AValueAppartment;
  BValueHouse      := AValueHouse;
end;



Прим.перев. 14:37, 1 November 2018 (CET): По умолчанию шоткаты для данной операции отсутствуют. Их легко определить самим, вызвав меню Tools --> Options --> Editor --> Key Mappings --> CodeTools Command --> Invert Assignment


Заключить выделение [в какую-либо конструкцию]

Выберите текст и вызовите [эту команду (ПКМ --> Enclose Selection) или Ctrl+ Shift+N]. Появится диалоговое окно, в котором вы можете выбрать, следует ли включить выделение в try..finally или многие другие общие блоки.

Переименование идентификатора

Поместите курсор на идентификатор и вызовите [эту команду (ПКМ --> Rename Identifier) или F2]. Появится диалоговое окно, в котором вы можете настроить область поиска и новое имя.

  • Это переименует все вхождения и только те, которые фактически используют это объявление. Это означает, что он не переименовывает объявления с тем же именем.
  • И это сначала проверит конфликты имен.
  • Ограничения: Это работает только с исходниками pascal, но не переименовывает файлы, не поддерживает ни файлы lfm/lrs, ни файлы lazdoc.

Поиски ссылок на идентификатор

Поместите курсор на идентификатор и вызовите [эту процедуру (ПКМ --> Find --> Find Identifier References) или Ctrl+ Shift+I]. Появится диалоговое окно, в котором вы можете настроить область поиска. Затем IDE будет искать все вхождения и только те, которые фактически используют это объявление. Это означает, что эта [процедура] не отображает другие объявления с таким же именем.

Показ абстрактных методов

Эта функция перечисляет и автоматически завершает виртуальные, абстрактные методы, которые необходимо реализовать. Поместите курсор на объявление класса и вызовите [эту функцию (ПКМ --> Refactoring --> Abstract Methods)]. Если отсутствуют абстрактные методы, появится диалоговое окно с их перечислением. Выберите методы для реализации, и среда IDE создаст заглушки метода. Начиная с [версии] 1.3 Lazarus также добавляет недостающие методы интерфейса класса.

Извлечение процедуры

См. Extract Procedure.

Поиск объявлений

Поместите курсор на идентификатор и выполните 'Find Declaration' [("Найти объявление")]. Тогда это запустит поиск объявления этого идентификатора, откроет файл и перейдет к нему. Если курсор уже находится в объявлении, он перейдет к предыдущему объявлению с тем же именем. Это позволяет находить переназначения и переопределения.

Каждое найденное объявление устанавливает точку перехода. Это означает, что вы прыгнете с найденного объявления [к следующему найденному] объявлению и легко вернетесь [назад] с помощью Search -> Jump back.

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

Свойство Visible сначала определяется в TControl (controls.pp), затем переопределяется в TCustomForm и, наконец, переопределяется в TForm. Вызов поиска объявления для [свойства] Visible сначала приведет вас к Visible в TForm. Затем вы снова можете вызвать Find Declaration [("Поиск объявления")], чтобы перейти к [свойству] Visible в TCustomForm, и снова, [чтобы] перейти к [свойству] Visible в TControl.

То же самое верно и для таких типов, как TColor. Для компилятора это просто [тип] 'longint'. Но в исходниках он определяется как

TGraphicsColor = -$7FFFFFFF-1..$7FFFFFFF;
TColor = TGraphicsColor;

И то же самое [справедливо] для forward defined classes [("предшествующего определения классов")]: например, в TControl, есть private-переменная

FHostDockSite: TWinControl;

Поиск объявления в TWinControl перескочит в предшествующее определение

TWinControl = class;

А вызов его снова переведет к реальной реализации

TWinControl = class(TControl)

Таким образом вы можете отслеживать каждый идентификатор и находить каждую [его] перегрузку.

Подсказки

  • перейти назад Ctrl+H.
  • местоположениям через меню: View -> "jump history"
  • для 5-кнопочной мыши добавьте две дополнительные кнопки для перемещения вперед/назад между посещенными точками
используя advanced mouse options, кнопки можно переназначить.

Автозавершение идентификатора

"Identifier Completion" [("автозавершение идентификатора")] вызывается [комбинацией клавиш] Ctrl+space. Это отображает все идентификаторы в области видимости. Например:

procedure TForm1.FormCreate(Sender: TObject);
begin
  |
end;

Поместите курсор между begin и end и нажмите Ctrl+space. IDE/Утилиты кода теперь будут анализировать весь доступный код и представлять список всех найденных идентификаторов. Утилиты кода кэшируют результаты, поэтому повторное использование этого кода будет намного быстрее.

Note-icon.png

Примечание: для Дельфийцев: в Дельфи это называется Автозавершение кода.

Некоторые идентификаторы, такие как 'Write', 'ReadLn', 'Low', 'SetLength', 'Self', 'Result', 'Copy' встроены в компилятор и не определены нигде в исходниках. В автозавершении идентификатора также есть много таких вещей. Если вы обнаружите, что хоть один отсутствует, просто создайте запрос функции в багтрекере.

Автозавершение идентификатора не автозавершает все ключевые слова. Поэтому вы не можете использовать его для автозавершения [ключевого слова] 'repe' до 'repeat'. Для этого используйте Ctrl+W Автозавершение слова или Ctrl+J Шаблоны кода. Начиная с версии 0.9.27 автозавершение идентификатора автозавершает некоторые ключевые слова.

Автозавершение идентификатора показывает даже те идентификаторы, которые несовместимы.

Сопоставление только первой части слова

Вы можете вызвать автозавершение идентификатора только по первым нескольким символам в слове. Поместите курсор внутри слова. Для поиска идентификаторов будут использоваться только символы слева от курсора. Например:

procedure TForm1.FormCreate(Sender: TObject);
begin
  Ca|ption
end;

Во [всплывающем] поле будут показаны только идентификаторы, начинающиеся с 'Ca' (| указывает позицию курсора).

Клавиши

  • Буква или цифра: добавьте символ в редактор исходного кода и текущий префикс. Это обновит список.
  • Backspace: удалит последний символ из исходного редактора и префикса. Обновляет список.
  • Return: заменяет целое слово под курсором на выбранный идентификатор и закрывает всплывающее окно.
  • Shift+Return: как Return, но заменяет только префикс (левая часть) слова под курсором.
  • Up/Down: перемещает выделение
  • Escape: закрывает всплывающее окно без изменений
  • Tab: завершает префикс для следующего выбора. Например: текущий префикс 'But', а завершение идентификатора показывает только 'Button1' и 'Button1Click'. Тогда нажатие Tab завершит префикс 'Button1'.
  • Else: как Return и добавляет символ в редактор исходного кода

Методы

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

TMainForm = class(TForm)
protected
  mous|
end;

Завершение MouseDown дает:

TMainForm = class(TForm)
protected
  procedure MouseDown(Button: TMouseButton; Shift: TShiftState; X,
         Y: Integer); override;
end;

Свойства

property MyInt: integer read |;

Автозавершение идентификатора покажет FMyInt и GetMyInt.

property MyInt: integer write |;

Автозавершение идентификатора покажет FMyInt и SetMyInt.

Секции Uses / Имена модулей

В разделах uses автозавершение идентификатора будет отображать имена файлов всех модулей в пути поиска. Они все будут отображаться строчными буквами (например, avl_tree), потому что большинство модулей имеют имена файлов в нижнем регистре. По автозавершении они вставляются в том регистре, [в каком модуль назван] (например, AVL_Tree).

Операторы

procedure TMainForm.Button1Click(Sender: TObject);
begin
  ModalRe|;
end;

будет выглядеть так:

procedure TMainForm.Button1Click(Sender: TObject);
begin
  ModalResult:=|;
end;

Иконки в окне автозавершения

В Lazarus 1.9+ существует опция для отображения значков вместо "типов", для строк в окне автозавершения. На рисунке показаны эти значки:

ide completion icons.png



Прим.перев. 21:20, 6 November 2018 (CET): По умолчанию показ иконок отключен. Чтобы включить их, необходимо в меню Tools --> Options --> Codetools --> Identifier Completion (Сервис --> Параметры --> Code tools --> Завершение идентификаторов) в разделе Appearance (Внешний вид) отметить галочкой чекбокс "Icons in code completion box" ("Значки в окне автозавершения кода").

icon in code completion.png


Автозавершение слова

Word Completion [(автозавершение слова)] вызывается [сочетанием клавиш] Ctrl+W. Оно отображает все слова всех открытых в настоящее время редакторов и поэтому может использоваться в не паскалевских исходниках, в комментариях и ключевых словах.

В противном случае это работает так же, как и автозавершение идентификатора.

Словарь Модулей / Идентификатор (Cody)

Это диалоговое окно позволяет вам искать идентификаторы в других модулях. Модули не должны использоваться вашим кодом.

Эта функция является частью пакета "Cody". Чтобы активировать функцию, установите пакет.

Переход в директиву Include

"Goto Include Directive" [(переход в директиву Include)] в меню поиска IDE переходит к выражению {$I filename}, в котором используется текущий файл include.

Публикация проекта

Создает копию всего проекта. Если вы хотите отправить кому-то только исходники и параметры компилятора вашего кода, эта функция является вашим другом.

Обычный каталог проекта содержит много информации. Большинство из них не нужно публиковать: файл .lpi может содержать информацию о сеансе (например, позицию каретки и закладки закрытых блоков), а каталог проекта содержит много файлов .ppu, .o и исполняемый файл. Чтобы создать файл lpi только с базовой информацией, [а также создать] только исходники со всеми подкаталогами, используйте [опцию] "Publish Project" [(опубликовать проект)].

Note-icon.png

Примечание: Начиная с версии 0.9.13, есть новая [опция в ] Project Option, которая позволяет хранить информацию о сеансе в [другом] файле отдельно от обычного файла .lpi. Этот новый файл заканчивается расширением .lps и содержит только информацию о сеансе, что значительно упрощает ваш файл .lpi.

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

Советы по комментариям

В нескольких местах IDE показывает подсказки для идентификатора. Например, при перемещении мыши по идентификатору в редакторе исходного кода и ожидании нескольких секунд. Когда IDE показывает подсказку для идентификатора, она ищет объявление его и всех его предков, [а также] ищет комментарии и файлы fpdoc. Существует много стилей кодирования и много стилей комментариев. Чтобы поддерживать многие общие стили комментариев, среда IDE использует следующий [механизм] эвристики:

Комментарии, показанные в подсказке

Комментарии перед объявлением без пустой строки и не начинающиеся со знака <:

var
  {Комментарий}
  Identifier: integer;

Комментарии с знаком < принадлежит к предыдущему идентификатору.

Комментарии за идентификатором в одной строке:

var 
  identifier, // Комментарий
  other,

Комментарии позади определения в той же строке:

var
  identifier: 
    char; // Комментарий

Пример для знака <:

const
  a = 1;
  //< комментарий для a
  b = 2;
  // комментарий для c
  c = 3;

Поддерживаются все три типа комментариев:

  {Комментарий}(*Комментарий*)//Комментарий
  c = 1;

Комментарии, не показываемые в подсказке

Комментарии, начинающиеся с $ или %, игнорируются. Например, //% Hiddden, //$ Hidden, (*$ Hidden*).

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

type
  { TMyClass }
  
  TMyClass = class

Комментарии заголовка класса создаются при завершении класса. Вы можете отключить эту [опцию] в Options / Codetools / Class completion / Header comment for class (Параметры / Code tools / Завершение классов / Комментарий перед заголовком класса). Если вы хотите показать комментарий заголовка в подсказке, просто удалите пустую строку.

Следующий комментарий будет показан для GL_TRUE, но не для GL_FALSE:

  // Boolean
  GL_TRUE                           = 1;
  GL_FALSE                          = 0;

Быстрые исправления

Быстрые исправления - это пункты меню для конкретных сообщений компилятора. Они помогают быстро решить проблему. Выберите сообщение в окне «Сообщения» и щелкните правой кнопкой мыши или щелкните правой кнопкой мыши в редакторе исходного кода на значке слева.

  • Unit not found [модуль не найден]: удалите из раздела uses
  • Unit not found [модуль не найден]: найдите модуль в загруженных пакетах и разрешите автоматическое добавление зависимости пакета
  • Constructing a class "$1" with abstract method "$2" [Создание класса "$1" с абстрактным методом "$2"]: показ диалогового окна для переопределения всех абстрактных методов
  • Local variable "$1" not used [Локальная переменная "$1" не используется]: удалите определение
  • Circular unit reference between $1 and $2 [циркулярная ссылка модуля между $1 и $2]: показывает диалоговое окно зависимостей с полным путем между двумя модулями
  • Identifier not found [Идентификатор не найден]: поиск через браузер кода
  • Identifier not found [Идентификатор не найден]: поиск через словарь Cody (нужен пакет Cody)
  • Identifier not found [Идентификатор не найден]: добавьте локальную переменную
  • Recompiling $1, checksum changed for $2 [Перекомпиляция $1, контрольная сумма изменена для $2]: показать диалог с путями поиска и другой информацией
  • IDE warning: other sources path of package %s contains directory... [Предупреждение IDE: другие пути исходников пакета %s содержит каталог ...:]: откройте пакет
  • any hint, note, warning [любые подсказки, примечания, предупреждения]: добавьте директиву IDE {%H-}
  • any hint, note, warning [любые подсказки, примечания, предупреждения]: добавьте директиву компилятора {$warn id off} (начиная с 1.7)
  • any hint, note, warning [любые подсказки, примечания, предупреждения]: добавьте опцию компилятора -vm<messageid>
  • Local variable "i" does not seem to be initialized [Локальная переменная "i", похоже, не инициализирована]: вставьте присвоение (начиная с 1.5)
  • Inherited method is hidden [Унаследованный метод скрыт]: добавьте модификатор override, overload, или reintroduce (начиная с 1.9)

Контур

Этот параметр находится в диалоговом окне Options --> Editor --> Display --> Markup and Matches --> Outline (global) [Параметры --> Редактор --> Отображение --> Подсветка и соответствия --> Отображать контур блока(глобально)].

Он выделяет ключевые слова Pascal вместе со своими операторными(begin-end) скобками. Это позволяет видеть вложенность больших блоков.

Например, для такого тела процедуры:

  with ADockObject do
  begin
    if DropAlign = alNone then
    begin
      if DropOnControl <> nil then
        DropAlign := DropOnControl.GetDockEdge(DropOnControl.ScreenToClient(DragPos))
      else
        DropAlign := Control.GetDockEdge(DragTargetPos);
    end;
    PositionDockRect(Control, DropOnControl, DropAlign, FDockRect);
  end;

он подсвечивает:

  • внешний with-do-begin-end оранжевым
  • следующий if-then-begin-end зеленым
  • внутренний if-then-else голубым

ide outline.png