среда, 18 февраля 2015 г.

Своя подсветка синтаксиса в IDE Delphi. Пример

Мне очень нравятся Build Events в Delphi. Это когда с проектом можно связать некую команду (например, cmd-скрипт), которая будет выполняться перед сборкой (или после сборки) приложения. Будь то по F9, либо при внешней сборке с помощью MSBuild. Мне это нужно для актуализации автогенерируемого кода, используемого проектом.
На днях занимался оптимизацией Prebuild-события, постоянно правил свой cmd-скрипт, и мне очень быстро надоело переключаться между Delphi и Notepad++ (в котором редактировал скрипт). Немного покопавшись в ToolsApi, у меня получилось сделать подсветку синтаксиса для CMD/BAT-файлов.
Выглядит это так:
CMDHighlighter
Это в меню Tools \ Options. Как это выглядит в самом редакторе – см. ниже.
Пока сделал на скорую руку (осторожно, черновой код!), исходник доступен тут: https://github.com/delphinotes/Useful/tree/master/CMDHighlighter
Устанавливается так:
  1. Открываем CMDHighlighter.dproj.
  2. В опциях проекта указываем суффикс – в зависимости от версии Delphi (210 – это для Delphi XE7), см. последний столбец http://docwiki.embarcadero.com/RADStudio/XE7/en/Compiler_Versions
    PackageOptions
  3. В Project Manager’е делаем Install.
    Если не захочет устанавливаться, то можно удалить dproj-файл, открыть dpk-файл и сделать как в пункте 2.
  4. Подсветка установлена, теперь необходимо связать её с cmd-файлами. Рекомендую делать так:
    • File \ Close All
    • Tools \ Options –> Editor Options \ Source Options –> New…Ввести CMD/BAT, нажать OK
    • В поле Extensions ввести cmd;bat
    • Установить флажок Use syntax highlight и выбрать CMD/BAT Highlighter в комбобоксе:
      SourceOptions
    • Остальные флажки и значения – по вкусу.
А вот как выглядит кусочек моего Prebuild-скрипта:
Sample
Спасибо за внимание :)

3 коммент.:

Павел Алхимов комментирует...

Спасибо за привлечение внимания к этой теме.

aptemochka комментирует...

А не подскажите, что делает ваш пребилд-скрипт? А то вдруг, полезно, и другим пригодится :)

Николай Зверев комментирует...

Кстати, если IDE видит, что pas-файлы не менялись, то по F9 события не запускаются, но запускаются по Ctrl+F9.

aptemochka
Пребилд-скрипт делает следующее:
а) дёргает сборку основного res-файла (того, который *.res, где * - имя проекта). В основном это делается из-за version-info - в качестве номера сборки (BuildNumber) указывается порядковый номер ревизии из системы контроля версий. (Ну и на самом деле проектов несколько - version-info у всех собирается по единому шаблону. Если надо внести правку в version-info для всех приложений, то сейчас это делается в одном файле.)

б) make_xml подготавливает XML-документ (который собирается по кусочкам), check_xml проверяет валидность документа, xml_to_xmb переваривает xml из текстового формата в бинарный (для экономии размера, который потом линкуется в экзешник - make_app_res), затем по документу генерируется некий pas-код, на который могут ссылаться модули из проекта.

в) save_xml_changes просто генерит файл, в котором хранится timestamp изменения файлов-кусочков (из которых собирается XML-документ), а check_xml_changes по этому файлу определяет, были ли изменения хоть в одном из этих кусочков. Ибо если изменений не было, то можно сэкономить от 3х до 6ти секунд времени (столько сейчас занимает ветка NEEDMAKEXML, в зависимости от приложения), что бывает важно при частом F9.

г) check_and_make_mui дёргает утилиту, которая обновляет файлы со строковыми ресурсами (используемыми для смены языка интерфейса программы).

Если хоть в одном из пунктов происходит ошибка, то дёргается :error, который выводит в STDOUT строку вида:
file_name(line_no): error : error_message
когда Delphi получает такую строку, то сборка проваливается с выводом этой ошибки в окно Messages. Если в messages в эту строку кликнуть, то file_name открывается в IDE на строке line_no - очень удобно, чтобы понять из-за чего всё остановилось (ну и подробный output есть в подвкладке Output в окне Messages).

Отправить комментарий

.

.