Панель выбора build-вариантов Build System в Sublime Text 2. (или как изобретался велосипед) / Хабр
Идея и реализация: жмем в SublimeText2 сочетание клавиш, получаем панель со списком build-вариантов, автоматически сформированным по файлу выбранной Build System, выбираем нужный вариант и наблюдаем как непосредственно в интерфейсе Sublime Text 2 отображается процесс сборки проекта.
Сразу скажу, что здесь я делюсь своим бесценным опытом совместной разработки плагина ProjectBuild для Sublime Text 2, потому что в результате только опыт и был получен, поскольку, как оказалось, необходимости в реализации данного плагина не было, и весь этот процесс оказался изобретением велосипеда. Печально, но опыт все же бесценен. Повествование будет таким, что о «велосипеде» будет сказано только в конце.
Вступление
Итогом ранее написанной статьи «Автоматизация сборки проекта в Sublime Text 2 c использованием Ant» была возможность вызова в Sublime Text 2 различных build-вариантов выбранной Build System (на примере Ant) c использованием назначенных сочетаний клавиш для них. (сейчас бы я использовал в теме того поста еще и слово «настройка»)
Что мне не нравилось в этом подходе:
- У различных Build System могли быть совершенно разные имена их вариантов, а сочетания клавиш уже явно были привязаны к конкретным именам вариантов, которых могло и не быть в другой Build System. Моим допущением было то, что большинству разработчиков не приходится часто переключаться между несколькими Build System, и в основном разработчик работает с одной Build System. И если захочет разработчик, то изменит сочетания клавиш заново. Но согласитесь, это немного напрягает. И об этом нужно помнить. И в продолжение, также
И это тоже удручает, так как потенциально может лишить вас первоначальных возможностей данных сочетаний при их переопределении. А также ограничить в последующем, когда вам понадобятся новые комбинации клавиш для новых плагинов, а удобные уже задествованы для вызовов разных build-вариантов.
И тут я попробовал отписанный мне в комментариях плагин ProjectBuild для Sublime Text 2 от snegovikufa. Что мне очень-очень понравилось, так это выпадающая панель со списком команд. Выбрав элемент из представленного списка, можно было запустить соответствующую команду. Все настройки этого плагина хранились в отдельном файле, доступ к которому был из меню самого Sublime Text 2, там можно было перечислить список именований и соответствующих им команд. Проще говоря, этот плагин мог быть настроен для запуска «сторонней программы» непосредственно из интерфейса Sublime Text 2. И в частности его можно было использовать для запуска Ant c именами необходимых целей. Я в лоб прикрутил ProjectBuild к своему «AntProjectBuilder.
Но плагин работал так, что вызывая «стороннюю программу» хотя и не блокировал интерфейс самого Sublime Text 2, но не оставлял следов об успешности или неуспешности вызова. Например, у меня вызывалась командная строка, в ней отрабатывал Ant, и она пропадала. В консоли самого Sublime Text 2 следов не оставалось. А этого удалось добиться только с блокировкой интерфейса Sublime Text 2. То есть вызвали команду, интерфес Sublime Text 2 подвисал, а отработав этот процесс выплевывал весь свой output в консоль Sublime Text 2. Весь процесс «по ходу» наблюдать не удавалось.
И при таком использовании, когда ProjectBuild должен реализовывать функционал именно build-механизма Sublime Text 2, не решалась первая проблема — явного указания вариантов, причем так же существовало излишнее конфигурирование. Приходилось конфигурировать ProjectBuild для того, чтоб сформировать список вариантов для панели, хотя этот список вариантов уже есть непосредственно в самом «*.sublime-build» файле выбранной Build System. Я связался с snegovikufa, он быстро ввел меня в курс дела, как работать с GitHub, и я приступил к изменению плагина.
Оффтоп о процессе переделки плагина ProjectBuild
GitHub
Mеня очень порадовала эта система «учета кода» (конечно же я утрирую), я никогда ранее не работал c git, но на то, чтоб разобраться с ней ушло менее получаса, тем более, что есть исчерпывающее руководство по git как для Linux, так и для Windows пользователей на самом GitHub. Я написал рабочий код, snegovikufa его качественно переработал на предмет нотации Python, и так далее, поправляя друг друга и списываяь, получили результат, вылизанный рабочий итог сейчас в dev ветке Вещь! Мое первое впечатление, совместная разработка и git (GitHub в частности) — созданы друг для друга.
API Sublime Text 2 и Python
Есть официальная и неофициальная документации. Вначале казалось, что возможности API у Sublime Text 2 не так уж и велики, но их вполне хватило. Чего не хватило, реализовалось на Python. Как сказал ранее, я не знаю Python, но для разработки задуманного функционала плагина больших знаний и не потребовалось. Да и snegovikufa оперативно поправил потенциально непонятные для третьих лиц моменты. Единственное, что я хотел ради интереса найти, но так и не смог, так это список всех возможных ключей и значений Settings, которые существуют у Sublime Text 2 по умолчанию, хотя может плохо искал.
По формату файла «*.sublime-workspace» в документации сказано, что это формат JSON, но было выяснено, что при json-парсинге этого файла может вылетать ошибка. Дело в том, что json-ключ в его данных может быть пустым, но это было проигнорировано плагином ProjectBuild так:
... json.load (f, strict = False)
Еще у Sublime Text 2 в «*. sublime-build» файле может быть задействована переменная с «$project_path», и мне совершенно не понятно, почему разработчики Sublime Text 2 не предусмотрели ее (и других) использование в путях у сочетаний клавиш, где, например, вызываются «сторонние» для Sublime программы. Может это в целях безопасности, чтоб какой-нибудь плагин по сработавшему сочетанию клавиш что-нибудь не упёр что-то «себе» из проекта, но все же.
Итоговый код плагина
Спойлер
import sublime import sublime_plugin import json import sys import os class ProjectBuildCommand (sublime_plugin.TextCommand) : def run (self, edit = None) : # Save file if dirty if self.view.is_dirty () : self.view.run_command ('save') ############################################ # # Определяем файл .sublime-workspace # он должен быть размещен в одной из корневых директорий # проекта и должен быть единственным # workspace_file = None root_folders = self.view.window ().folders () for dir_ in root_folders : for dir_item in os.listdir (dir_) : if dir_item.endswith ('.sublime-workspace') : if workspace_file == None : workspace_file = os.path.join (os.path.normpath(dir_), dir_item) else : self.showError ( 'Must be only one ".sublime-workspace" file in project root folder.\n' 'Plugin found %s and %s files.' % (workspace_file, os.path.join (dir_, dir_item))) return if workspace_file == None : self.showError ( 'There are no ".sublime-workspace" file in any root folder of project.') return self.debug(workspace_file) # ############################################ ############################################ # # Получаем относительный путь до файла текущей Build System # with open (workspace_file) as f : try: workspace_json_data = json. load (f, strict = False) except Exception, e: self.showError ( 'File .sublime-workspace is empty or has incorrect json data') return if not 'build_system' in workspace_json_data : self.showError ( 'There are no "build_system" value in %s file.\n' 'Choose Build System and save project.' % workspace_file) return build_filename = workspace_json_data['build_system'] self.debug(build_filename) # ############################################ ############################################ # # Определяем наличие файла текущей Build System # по полному пути до него # build_filename_fullpath = os.path.normpath( os.path.join(os.path.dirname(sublime.packages_path()),build_filename)) if not(os.path.isfile(build_filename_fullpath)): self.showError ( 'Plugin could not find Build System file: "%s".
' % build_filename_fullpath) return self.debug(build_filename_fullpath) # ############################################ ############################################ # # Загружаем JSON данные # with open (build_filename_fullpath) as f : try: json_data = json.load (f) except Exception, e: self.showError ( 'File %s is empty or has incorrect json data' % build_filename_fullpath) return # ############################################ ############################################ # # Формируем словарь build-вариантов текущей Build System # build_variants = [] if "cmd" in json_data: build_variants.append (['Default', " ".join (json_data["cmd"])]) for variant in json_data.get ("variants", {}) : build_variants. append ( [variant['name'], " ".join (variant['cmd'])]) # ############################################ ############################################ # # Демонстрируем панель вариантов. # def run (selected) : if (selected >= 0) : self.execute_variant (build_variants[selected][0]) names = [name for name, args in build_variants] self.view.window ().show_quick_panel (names, run) # ############################################ def execute_variant (self, variant_name) : self.view.window ().run_command ("build", {"variant": variant_name}) def showError (self, err) : # демонстрируем сообщение об ошибке через Sublime API # иногда не срабатывало, хотя оно и должно было появляться sublime.error_message ('ProjectBuild:\n\n%s' % err) def debug (self, message) : # change True to False or vice versa if (False): print message
Выводы
Теперь для ProjectBuild не нужен конфиг. Вам достаточно выбрать необходимую Build System (стандартную систему или вашу собственную, как моя «AntProjectBuilder.sublime-build»). Сохранить проект в Sublime Text 2 таким образом, чтоб в одной из корневых его папок лежал файл манифеста проекта «*.sublime-workspace». Плагином ProjectBuild отслеживается наличие этого файла и его уникальность, так как сведения о текущей Build System берутся именно из него. При изменении Build System в Sublime Text 2 не забудте сохранить проект, чтоб указанный выше файл обновился. Нажимаем назначенное для ProjectBuild сочетание клавиш и видим панель со списком build-вариантов. Список формируется автоматически по существующему в «*.sublime-build» файле описанию вариантов выбранной в Sublime Text 2 системы Build System.
Указанные в самом начале статьи проблемы были успешно решены: задействовано одно сочетание клавиш и оно работает с build-механизмом непосредственно самого Sublime Text 2 и в его интерфейсе без жесткой привязки и явного именования вызываемых build-вариантов.
У плагина осталось пространство для доработки, например, сейчас игнорируется платформо-срецифичные опции, которые могут быть указаны в файле Build System, но лично мне пока и так вполне достаточно, да и необходимо мне именно то, что он сейчас и реализует.
На самом деле сложно сказать, чей вклад больше, да и важно ли это, если в итоге плагин ProjectBuild стал тем, чем, наверно, и должен был быть. И что уж греха таить, я испытываю неописуемое чувство гордости, что вот не было такого в интерфейсе и функционале Sublime Text 2, а теперь такое есть, и что это написано отчасти мной. (тут я еще не знал о «велосипеде», о, горе мне, горе)
Прежний вариант ProjectBuild будет скорее всего переделан в плагин OneHotkey по группировке команд в одно сочетание клавиш, не обязательно build команд, а просто команд запуска «сторонних» для Sublime Text 2 программ и т.п. и там уже пригодится файл настроек, который был раньше у ProjectBuild и оказался для него лишним, так как содержал для build-механизма избыточную информацию.
Обещанный велосипед
Все острова давным давно открыты… Как оказалось, уже изначально в Sublime Text 2 уже есть возможность вызова панели выбора вариантов текущей Build System, вам необходимо просто добавить сочетание клавиш:
{ "keys": ["f8"], "command": "show_overlay", "args": {"overlay": "command_palette", "text": "Build: "} }
И эта панель, как не печально было бы об этом говорить, удобнее, так как не привязывает вас с файлу «*.sublime-workspace» и демонстрирует назначенные сочетания клавиш для каждого варианта, если таковые уже имеются. Однако она не поддерживает их сортировку, а плагин можно доработать на предмет упорядочивания вариантов (хотя может опять я чего не ведаю).
Наверно, все что можно выжать из этого всего, так это вернуться обратно к OneHotkey.
Спасибо за внимание.
Sublime Text — Системы сборки
ВНИМАНИЕ! Эта документация относится к старой, неподдерживаемой версии. возвышенного текста. Пожалуйста, ознакомьтесь с текущими документами.
Sublime Text может запускать программы сборки, такие как make, либо при нажатии клавиши (по умолчанию F7), либо при сохранении файла.
Используемую систему сборки можно выбрать в меню Инструменты/Система сборки. Если проект открыт, выбранная система сборки будет запомнена для проекта.
Добавление новой системы сборки 9(…*?):([0-9]*):?([0-9]*) showWhenFinished true рабочий каталог $ProjectDir
Здесь есть четыре интересующих ключа: ‘build’, ‘lineNumberRegex’, ‘showWhenFinished’, ‘workingDir’. Их значение таково:
- build : Это системная команда для запуска. В приведенном выше примере это просто «сделать». Это то же самое, что открыть командную строку и ввести «make». Это единственный необходимый ключ.
- lineNumberRegex : используется для сопоставления вывода команды сборки с ошибками сборки, что позволяет нажать F4, чтобы перейти к следующей ошибке сборки.
Регулярное выражение должно иметь от одного до трех захватов: первый дает имя файла, второй номер строки и третий столбец. lineNumberRegex является необязательным.
- showWhenFinished : если true, то к выходным данным сборки будет добавлена строка, аналогичная
[Завершено за 1,029 секунды]
. Если не указано, по умолчанию используется значение true. - workingDir : Если указано, текущий каталог будет изменен на этот перед запуском команды. Предполагается, что имена файлов, определенные с помощью lineNumberRegex, относятся к этому каталогу.
Другой, еще более простой пример:
build "C:\Program Files\SomeApp\SomeApp.exe" "$File"
Это запустит SomeApp.exe с текущим файлом в качестве аргумента командной строки.
Подстановка переменных
В приведенных выше примерах вы могли заметить использование нескольких переменных: $ProjectDir в первом примере и $File во втором. Полный их список:
- $File : Полный путь к текущему файлу, например,
C:\Files\Chapter1.
txt
- $FileDir : Каталог текущего файла, например,
C:\Files
- $FileName : Часть имени текущего файла, например,
Chapter1.txt
- $FileExt : Часть расширения текущего файла, например,
txt
- $BaseName : часть имени текущего файла, например,
Document
- $ProjectDir : Каталог текущего проекта, например,
C:\Files
- $ProjectName : Имя текущего проекта, например,
Книга
дляC:\Files\Book.sublime-project
С этими переменными можно использовать форматирование в стиле фрагмента, например:
${ProjectName:Default}
Это выдаст имя текущего проекта, если он есть, иначе По умолчанию
.
${Файл/\.php/\.txt/}
Это выдаст имя текущего файла, заменив .
на php
.txt
.
Устранение неполадок
После нажатия F7 вы можете увидеть команду, которая фактически была запущена, взглянув на консоль (через View/Console).
Если вы получаете сообщение об ошибке, например, 'make' не распознается как внутренняя или внешняя команда, исполняемая программа или пакетный файл
, попробуйте запустить ту же команду в командной строке и убедитесь, что она там работает.
Системы сборки — неофициальная документация Sublime Text
Предупреждение
Разработка Sublime Text перешла к версии 3.
В результате, эта ветка для Sublime Text 2
больше не будет обновляться .
Пожалуйста, выберите последняя ветка
на панели внизу слева
и рассмотрите возможность обновления Sublime Text.
Системы сборки позволяют запускать файлы через внешние программы, не покидая Sublime Text и посмотрите, что они генерируют.
Системы сборки состоят из одной или трех частей:
- данных конфигурации в формате JSON (содержимое файла .
sublime-build )
- опционально, команда Sublime Text, управляющая процессом сборки
- опционально внешний исполняемый файл (скрипт, бинарный файл)
По сути, файлы .sublime-build являются данными конфигурации для внешнего программы, а также для команды Sublime Text (только что упомянутой). В них вы укажите переключатели, параметры и информацию о среде, которую вы хотите пересылать.
Затем команда Sublime Text получает данные, хранящиеся в .sublime-build файл. На этом этапе он может делать все, что ему нужно, чтобы построить файлы. К
по умолчанию системы сборки будут использовать exec 9Команда 0029 реализована
Пакеты/По умолчанию/exec.py
. Как объяснено ниже, вы можете переопределить это
команда.
Наконец, внешней программой может быть сценарий оболочки, который вы создали для обработки
ваши файлы, или известной утилитой типа сделать
или аккуратным
. Обычно эти
исполняемые файлы получат пути к файлам или каталогам вместе с
переключатели и параметры для запуска.
Обратите внимание, что системы сборки могут, но не обязаны вызывать внешние программы; действительный система сборки может быть реализована полностью на Python в Sublime Text команда. 9[ ]*Файл \"(...*?)\", строка ([0-9]*)", "селектор": "source.python" }
Параметры
Параметры для системы сборки
Эти параметры являются стандартными для всех систем сборки.
-
цель
Дополнительно. Команда Sublime Text для запуска. По умолчанию
exec
. (Пакеты/по умолчанию/exec.py
). Эта команда получает полный данные конфигурации, указанные в файле .build-system (как**kwargs
).Используется для переопределения системной команды сборки по умолчанию. Обратите внимание, что если вы выберете чтобы переопределить команду по умолчанию для систем сборки, вы можете добавить произвольный переменные в файле .
sublime-build .
-
селектор
- Дополнительно. Используется, когда Инструменты | Система сборки | Автоматический устанавливается равным
true
. Sublime Text использует этот селектор области, чтобы найти подходящую систему сборки. для активного просмотра. -
окна
,osx
иlinux
Дополнительно. Разрешить указание специфичных для ОС параметров, которые будут переопределять настройки по умолчанию. Каждый из них принимает набор произвольных опций.
См. Опции для конкретных платформ.
-
варианты
Дополнительно. Список словарей опций для переопределения основного билда опции системы. Названия вариантов будут отображаться в палитре команд для удобства. доступ, если селектор системы сборки соответствует активному файлу.
См. Варианты.
-
имя
- Действительно только внутри варианта (см.
варианты
name
is Run , вариант появится под Инструменты | Построить меню System и привязать кCtrl+Shift+B
.
Произвольные параметры
Из-за настройки цели
система сборки может содержать буквально любой параметр
(ключ), который не является одним из вариантов, уже перечисленных выше.
Обратите внимание, что все приведенные ниже параметры взяты из реализации по умолчанию exec
(см. команду exec). Если вы измените параметр target
, на них больше нельзя будет полагаться.
-
команда
Массив, содержащий команду для запуска и требуемые аргументы. Если вы не укажите абсолютный путь, внешняя программа будет искаться в вашем
PATH
, одна из переменных окружения вашей системы.В Windows отключены графические интерфейсы.
-
file_regex
- Дополнительно.
Регулярное выражение (в стиле Perl) для захвата выходных данных об ошибках
команда
. Подробнее см. в следующем разделе. -
line_regex
- Дополнительно. Если
file_regex
не совпадает в текущей строке, ноline_regex
существует и соответствует текущей строке, тогда пройдите назад через буфер, пока строка, соответствующаяфайловому регулярному выражению
, не будет найдено, и используйте эти два совпадения, чтобы определить файл и строку для перехода. -
рабочий_каталог
- Дополнительно. Каталог для изменения текущего каталога перед запуском
команда
. Исходный текущий каталог впоследствии восстанавливается. -
кодирование
- Дополнительно. Выходная кодировка
cmd
. Должна быть допустимая кодировка Python. По умолчаниюutf-8
. -
обл.
Дополнительно. Словарь переменных окружения для объединения с текущим процесс», прежде чем передать их на
команда
.Используйте этот элемент, например, для добавления или изменения переменных среды без изменения настроек вашей системы.
-
корпус
- Дополнительно. Если
true
,cmd
будет запущен через оболочку (cmd.exe
,bash
...). -
путь
Дополнительно. Эта строка заменит текущий процесс
PATH
. перед вызовомcmd
. старыйЗначение PATH
будет восстановлено после что.Используйте этот параметр, чтобы добавить каталоги в
PATH
без необходимости изменения настройки вашей системы.
Захват вывода ошибок с помощью
file_regex
Параметр file_regex
использует регулярное выражение в стиле Perl для захвата
четырем полям информации об ошибках из вывода программы сборки, а именно: имя файла , номер строки , номер столбца и сообщение об ошибке . Использовать
группы в шаблоне для захвата этой информации. Поле имени файла и
поле номер строки обязательно.
Когда информация об ошибке собрана, вы можете перейти к экземплярам ошибок в
файлы проекта с F4
и Shift+F4
. При наличии захваченного сообщение об ошибке будет отображаться в строке состояния.
Опции для конкретных платформ
Окна В этом случае Вот надуманный пример системы сборки с вариантами С учетом этих настроек Системы сборки расширяют следующие переменные в файлах .sublime-build : С этими переменными можно использовать свойства фрагментов. Например: Это выдаст имя текущего проекта, если он есть, иначе Это выдаст полный путь к текущему файлу, заменив .php на .txt . См. также Выберите нужную систему сборки из Инструменты | Создайте систему и выберите Инструменты | Создайте или нажмите Системы сборки будут искать исполняемые файлы в вашем В некоторых операционных системах значение Чтобы решить эту проблему, убедитесь, что вы установили нужный Кроме того, вы можете использовать ключ пути 9*\\[javac\\] (.+):([0-9]+):() (.*)$",
"working_dir": "${project_path:${папка}}",
"селектор": "source.java",
"окна": {
"команда": ["ant.bat"]
}
}
и
будут выполняться для всех платформ, кроме Windows,
где вместо будет использоваться ant.bat
. Варианты
{
"селектор": "source.python",
"команда": ["дата"],
"варианты": [
{ "name": "Список файлов Python",
"команда": ["ls -l *.py"],
"скорлупа": правда
},
{ "name": "Количество слов (текущий файл)",
"cmd": ["туалет", "$ файл"]
},
{ "имя": "Бежать",
"cmd": ["питон", "-u", "$ файл"]
}
]
}
Ctrl+B
запустит команду date , Ctrl+Shift+B
запустит интерпретатор Python и остальные варианты
появится в палитре команд как Сборка: имя
всякий раз, когда система сборки была активной. Системные переменные сборки
$file_path
Каталог текущего файла, т.е. г., C:\Files . $файл
Полный путь к текущему файлу, т.е. г., C:\Files\Chapter1.txt . $file_name
Часть имени текущего файла, т.е. г., Chapter1.txt . $file_extension
Часть расширения текущего файла, например. г., тхт . $file_base_name
Только часть имени текущего файла, т.е. г., Документ . Пакеты $
Полный путь к папке Packages . $проект
Полный путь к текущему файлу проекта. $project_path
Каталог текущего файла проекта. $project_name
Часть имени текущего файла проекта. $project_extension
Часть расширения текущего файла проекта. $project_base_name
Только часть имени текущего файла проекта. Заполнители для переменных
${имя_проекта:по умолчанию}
По умолчанию
. ${файл/\.php/\.txt/}
Запуск систем сборки
F7
. Устранение неполадок систем сборки
PATH
, если вы не
указать абсолютный путь к исполняемому файлу. Поэтому ваш ПУТЬ
переменная должна быть правильно установлена. PATH
зависит от терминала.
окно в графическое приложение. Таким образом, даже если команда, которую вы используете в
ваша система сборки работает в командной строке, она может не работать из Sublime Text.
Это связано с профилями пользователей в оболочках. ПУТЬ
, чтобы
графические приложения, такие как Sublime Text, могут его найти. См. ссылки ниже для
Дополнительная информация.
в файлах .sublime-build для
переопределить PATH
, используемый для поиска исполняемого файла, указанного в cmd
.