Sublime Text – Tools > Build System > New Build System · GitHub

Описание

Кроссплатформенный плагин, позволяющий открывать из Sublime Text любой терминал, который лично Вы считаете наиболее предпочтительным. В Windows по умолчанию запускается PowerShell. После установки плагина доступны 3 варианта запуска:

Вызываются две команды:

  • open_terminal — открывает терминал в папке, где лежит файл, вкладка с которым была открыта, когда запускали терминал.
  • open_terminal_project_folder — возможно, работает некорректно. Актуальное поведение:
    • Если Вы запустили команду, из файла, который находится в верхней папке Вашего сайдбара или её подпапках, терминал запустится в этой верхней папке. Например, мой сайдбар:
      Сайдбар
      Когда я запускаю open_terminal_project_folder, например, из файла E:КиролайнаSashaFolderSashaFile.txt, терминал откроется в E:Киролайна.
    • Но когда Вы запускаете команду из файла, не имеющего отношения к верхней папке Вашего сайдбара — в моём случае E:Киролайна, — поведение команды open_terminal_project_folder аналогично поведению open_terminal.

Вступление

Итогом ранее написанной статьи

была возможность вызова в Sublime Text 2 различных build-вариантов выбранной Build System (на примере Ant) c использованием назначенных сочетаний клавиш для них. (сейчас бы я использовал в теме того поста еще и слово «настройка»)

Что мне не нравилось в этом подходе:

  1. У различных Build System могли быть совершенно разные имена их вариантов, а сочетания клавиш уже явно были привязаны к конкретным именам вариантов, которых могло и не быть в другой Build System. Моим допущением было то, что большинству разработчиков не приходится часто переключаться между несколькими Build System, и в основном разработчик работает с одной Build System. И если захочет разработчик, то изменит сочетания клавиш заново. Но согласитесь, это немного напрягает. И об этом нужно помнить. И в продолжение, также
  2. Нужно помнить все назначенные вами сочетания клавиш. Понятно, что есть основные «F7», «Ctrl B», «Ctrl Shift B» — но для каждого вашего варианта будет еще одно сочетание. Это значит, что нужно либо переопределить сочетание клавиш, которое уже имеется, либо отыскать незадействованное, которое было бы удобно и для пальцев и для мозга. Я пробовал найти удобные незанятые, но остановился на переопределении. И это тоже удручает, так как потенциально может лишить вас первоначальных возможностей данных сочетаний при их переопределении. А также ограничить в последующем, когда вам понадобятся новые комбинации клавиш для новых плагинов, а удобные уже задествованы для вызовов разных build-вариантов.

И тут я попробовал отписанный мне в комментариях плагин ProjectBuild для Sublime Text 2 от snegovikufa. Что мне очень-очень понравилось, так это выпадающая панель со списком команд. Выбрав элемент из представленного списка, можно было запустить соответствующую команду.

Все настройки этого плагина хранились в отдельном файле, доступ к которому был из меню самого Sublime Text 2, там можно было перечислить список именований и соответствующих им команд. Проще говоря, этот плагин мог быть настроен для запуска «сторонней программы» непосредственно из интерфейса Sublime Text 2.

И в частности его можно было использовать для запуска Ant c именами необходимых целей. Я в лоб прикрутил ProjectBuild к своему «AntProjectBuilder.sublime-build». Таким образом, это решило вторую проблему. Назначаем одно сочетание клавиш (да хоть тоже «Ctrl Shift B»), оно формирует панель плагина ProjectBuild в интерфейсе Sublime Text 2, где можно выбрать и запустить нужную команду в соответствии с конфигурацией ProjectBuild.

Но плагин работал так, что вызывая «стороннюю программу» хотя и не блокировал интерфейс самого 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.

Описание

Плагин выводит результаты Build System во внешнюю консоль, а не встроенную Sublime Text. Это может понадобиться по ряду причин.

Npm

Плагин, благодаря которому можно запускать многие команды npm — пакетного менеджера Node.js.

SublimePTY

Страница плагина. Разработка давно прекращена.

Для запуска отдельных команд

Для Sublime Text пишут плагины, облегчающие запуск только отдельных команд только для определённых инструментов программирования. Например, команды Git проще запускать с помощью плагинов Git, SideBar Git и Easygit (Не загружайте Easygit через Package Control, он не будет работать!

Оценка

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

Установка и настройка

Устанавливаем плагин Suricate → в файл Default.suricate-profile добавляем следующий код:

//  Запустить Git Bash
"git-bash": {
    "call": "Suricate.lib.process.spawn",
    "args.windows": {
        "cmd": ["C:\Program Files\Git\git-bash.exe"],
        "working_dir": "${file_path}"
    },
    "caption": "Git Bash",
    "keys": ["<c> super keypad3"],
},

Ctrl Shift P → Suricate: Git Bash → должен открыться Git Bash в директории с тем файлом, который был у Вас открыт, когда запускали Git Bash из Sublime Text.

SublimeREPL

Позволяет запускать REPL консоль для многих языков программирования во вкладке Sublime Text. В примере этого ответа написано, как настроить SublimeREPL для PowerShell.

Запуск любого предпочтительного терминала

Для примера возьмём, как запустить Git Bash из Sublime Text.

Настройка

Вы можете указывать параметры запуска Вашего терминала. Положим, хотите всегда запускать консольный эмулятор cmder только из директории E:SashaSublime.

Для упрощения работы с настройками Sublime Text скачиваем плагин Preferences Editor. Ctrl Shift P → Edit Preferences: Edit Settings… → Terminal → terminal → в открывшуюся quick panel вставляете путь к исполняемому файлу cmder.exe вместе с именем файла, например, E:

ChocolateytoolscmderCmder.exe → Enter. Далее Ctrl Shift P → Edit Preferences: Edit Settings… → Terminal → parameters → между квадратными скобками вставляем “/START”, “E:\SashaSublime” → Enter.

Теперь после запуска любой из команд — open_terminal либо open_terminal_project_folder должен открыться Cmder.exe в папке E:SashaSublime.

Также предусмотрена возможность одним шорткатом запускать один терминал со своими параметрами, вторым хоткеем запускать другой терминал с другими параметрами и т. д. Читаем здесь.

Параметры и их значения

Как выглядит конфигурационный файл Suricate:

Установка

Как настроить плагин для отправки скопированного текста на ConEmu в режиме PowerShell.

Terminality

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

Запуск из Sublime Text внешних терминалов

Достоинства и недостатки относятся уже к вызываемым в Sublime Text терминалам, а не самому Sublime Text.

Настройка

Задаём системную переменную PATH, указав в качестве значения путь к файлу ConEmu.exe, для меня это C:Program FilesConEmu.

Запускаем ConEmu → Super Alt P → Startup → задаём параметру Specifed named task значение {Shells::PowerShell}:

Установка и настройка

Помимо самого SublimeREPL устанавливаем также плагины Suricate и PowerShell для настройки команды SublimeREPL и подсветки синтаксиса соответственно.
Инструкция по настройке команд в Suricate.

Ctrl Shift P → SublimeREPL: PowerShell → если у Вас русская версия операционной системы, может вылезти всплывающее окно с примерно следующей ошибкой:

ConEmu

Для лучшей, по мнению пользователей англоязычного Stack Overflow, консоли для Windows есть свой плагин. См. также плагин для Cmder — немного изменённого ConEmu.

:/>  Что означает клавиша fn на ноутбуке

Достоинства

  • Не нужно выходить из Sublime Text, чтобы запускать команды,
  • Достаточно многофункциональный плагин,
  • Удобнее осуществлять навигацию по output, если тот большой, во вкладке, нежели в консоли.

Настройка

После установки плагина достаточно добавить в файл Build System одну дополнительную строку:

"target": "console_exec"

Пример для Python. Tools → Builds System → New Build System… → вставляем следующий код и сохраняем файл, например, под именем SashaPythonExec.sublime-build:

{
    "cmd": ["python", "-u", "$file"],
    "file_regex": "^[ ]*File "(...*?)", line ([0-9]*)",
    "selector": "source.python",
    "target": "console_exec"
}

Как создавать и настроить автоматический выбор Build System, подробно рассмотрено по дополнительным ссылкам.

Во вкладке со скриптом на Python Ctrl Shift P → Build With: SashaPythonExec → смотрим результат.

Поиск плагинов

Если описанные в обзоре плагины не удовлетворяют Вашим задачам, помимо обычного поиска в Google порекомендовал бы осуществить поиск примерно по следующим ключевым словам и меткам на сайте Package Control:

Advanced example

The following example shows a custom target command,
with the ability to cancel a build and navigate results.

A target for a build system should be a
sublime.WindowCommand.
This will provide the instance variable of self.window
to allow interaction with the current project, window and active view.

Please note that the following example is somewhat
simplistic in its implementation, and it won’t handle
many common edge cases.

Api sublime text 2 и python

Есть

документации. Вначале казалось, что возможности API у Sublime Text 2 не так уж и велик

и

, но их вполне хватило. Чего не хватило, реализовалось на Python. Как сказал ранее, я не знаю Python, но для разработки задуманного функционала плагина больш

и

х знаний и не потребовалось. Да и

оперативно поправил потенциально непонятные для третьих лиц моменты. Единственное, что я хотел ради интереса найти, но так и не смог, так это список всех возможных ключей и значений 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 программы.

Build files for specific programming languages

I also thought that while we were looking at build files, it would be useful to demonstrate how these can be used to build/compile with some popular programming languages. These may differ to those included with Sublime by default, but are useful for reference:

Ruby (using RVM):

Build variables:

In addition, Sublime supports variable substitutions in build files such as $file_path (for the path to the current file) and more. These include:

  • $file_path – the directory of the current file being viewed
  • $file_name – only the name portion of the current file (extension included)
  • $file_base_name – the name portion of the current file (extension excluded)
  • $project_path – the directory path to the current project
  • $project_name – the name portion of the current project

A complete list of substitutions supported is also available.

Cancelling a build


An in-process build can be cancelled via:

Example: commit, push and upload to ftp

deployment.sh:

Exec target options

The default target of exec is used by the
majority of build systems. It provides the following options to
control what program to execute, and how to display the results.

“cmd”array of strings

The executable to run, plus any arguments to pass to it.
Shell constructs such as piping and redirection are not
supported – see
shell_cmd.

May use variables.

Example:
["my_command","-d","$file"]

“shell_cmd”string

A shell command to execute. Unlike the
cmd option, this does allow
piping and redirection. Will use bash on Mac
and Linux machine, and cmd.exe on Windows.

May use variables.

Example:
"my_command "$file" | other_command"

“working_dir”string

The directory to execute the
cmd or
shell_cmd within.

May use variables.

Example:
"$file_path"

“file_regex”string

A regular expression to run on the build output to match file information. The matched file information is used to enable result navigation. The regex should capture 2, 3 or 4 groups.

The capture groups should be:

  1. filename
  2. line number
  3. column number
  4. message

Example:
"^s*(\S[^:]*)\((\d ):(\d )\): ([^\n] )"

“line_regex”string

A regular expression to run on the build output to match line information. The matched file information is used to enable result navigation. The regex should capture 1, 2 or 3 groups.

The groups should capture:

  1. line number
  2. column number
  3. error message

This regular expression is only necessary when some results contain strictly a line number, line and column numbers, or line and column numbers with a message. When such a match is made, the file_regex option will be used to search backwards to find the appropriate file name.

Example:
"^s*line (\d ) col (\d ): ([^\n] )"

“encoding”string

The encoding of the build system output. Uses Python codec names. Defaults to "utf-8".

Example:
"iso-8859-1"

“env”object

Environment variable values to use when running the cmd or shell_cmd.

“quiet”boolean

Reduces the amount of output about the build system invocation.

Example:
true

“word_wrap”boolean

Turns on word wrapping in the build system output panel.

Example:
true

“syntax”string

The syntax file to use to highlight the build system output panel.

Example:
"Packages/JavaScript/JSON.sublime-syntax"

Github

Mеня очень порадовала эта система «учета кода» (конечно же я утрирую), я никогда ранее не работал c git, но на то, чтоб разобраться с ней ушло менее получаса, тем более, что есть исчерпывающее руководство по git как для Linux, так и для Windows пользователей на самом GitHub. Я написал рабочий код,

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

Вещь! Мое первое впечатление, совместная разработка и git (GitHub в частности) — созданы друг для друга.

Grouping build tasks

Some developers also like to group together tasks within an external bash script (or equivalent). For example, here’s a simple git-ftp deploy script you can use with Sublime to commit and push your latest changes with git and then upload your latest files to FTP.

How to edit sublime text build settings?

edited

My original answer works, but there’s a much better way of doing this, by creating your own build system. This use case is exactly why the feature is there.

Go to ToolsBuild SystemNew Build System… (all the way at the bottom) and enter the contents below. Save as C 11 Single File.sublime-build, and it will now be accessible in the build system menu. Select it, hit CtrlB to build, and then hit CtrlShiftB to run the resulting program.

{
    "cmd": ["g  ", "-std=gnu  11", "${file}", "-o", "${file_path}/${file_base_name}"],
    "file_regex": "^(..[^:]*):([0-9] ):?([0-9] )?:? (.*)$",
    "working_dir": "${file_path}",
    "selector": "source.c, source.c  ",

    "variants":
    [
        {
            "name": "Run",
            "cmd": ["${file_path}/${file_base_name}"]
        }
    ]
}

If you need to edit it in the future, the file is in the User folder of Packages:

Keys supported include:

  • cmd – An array containing a command to run and its desired arguments and flags. Note that Sublime will search your PATH for any tools listed unless an absolute path has been used to point to them.
  • selector – An optional string used to locate the best builder to use for the current file scope. This is only relevant if Tools/Build System/Automatic is true.
  • path – An optional string that replaces your current process’s PATH before calling the commands listed.
  • working_dir – An optional string defining a directory to switch the current directory to prior to calling any commands.
  • shell – An optional boolean that defines whether commands should be run through the shell (e.g bash).
  • file_regex – An optional regular expression used to capture error output from commands.
:/>  Windows не может найти printmanagement.msc в Windows 10 - Okzu

For a comprehensive list of keys supported in Sublime build scripts, see the unofficial docs.

Linux

If installing from a tarball, the sublime_text executable should be symlinked to subl, with a command such as:

sudo ln -s /opt/sublime_text/sublime_text /usr/local/bin/subl

Running a build


A build can be run by one of the following methods:

Setup

Some operating systems and installation methods will require a configuration change to make subl available on the PATH.

Sublime text 3 c build system to run c executable within sublime text or in a terminal emulator in cases that the program need input from standard input. this build system works on linux, windows and macos

Sublime text 3 C build system to run C executable within sublime text or in a terminal emulator in cases that the program need input from standard input. This build system works on Linux, Windows and MacOS

{
“shell_cmd”: “g -std=c 11 -Wall “${file}” -o “${file_path}/${file_base_name}” && “${file_path}/${file_base_name}””,
“file_regex”: “^(..[^:]*):([0-9] ):?([0-9] )?:? (.*)$”,
“working_dir”: “${file_path}”,
“selector”: “source.c , source.cpp, source.cc, source.cxx”,
“variants”:
[
{
“name”: “Run in Terminal”,
“linux”: {
“shell_cmd”: “g -std=c 11 -Wall “${file}” -o “${file_path}/${file_base_name}” && xterm -e ‘${file_path}/${file_base_name} && echo && echo Press ENTER to continue && read line && exit'”,
// “shell_cmd”: “g -std=c 11 -Wall “${file}” -o “${file_path}/${file_base_name}” && gnome-terminal -e ‘bash -c “${file_path}/${file_base_name}&& echo && echo Press ENTER to continue && read line && exit”‘”, // for gnome-terminal
// “shell_cmd”: “g -std=c 11 -Wall “${file}” -o “${file_path}/${file_base_name}” && xterm -e ‘${file_path}/${file_base_name}; bash'”, // for xterm
// “shell_cmd”: “g -std=c 11 -Wall “${file}” -o “${file_path}/${file_base_name}” && xterm -hold -e ${file_path}/${file_base_name}”, // for xterm
// “shell_cmd”: “g -std=c 11 -Wall “${file}” -o “${file_path}/${file_base_name}” && konsole –hold -e ${file_path}/./${file_base_name}”, // for konsole
},
“windows”:{
“shell_cmd”: “g -std=c 11 -Wall “${file}” -o “${file_path}/${file_base_name}” && start cmd /k $file_base_name “
// “shell_cmd”: “g -std=c 11 -Wall “${file}” -o “${file_path}/${file_base_name}” && start “$file_base_name” call $file_base_name”
},
“osx”:{
“shell_cmd”: “g -std=c 11 -Wall “${file}” -o “${file_path}/${file_base_name}” && xterm -e ‘${file_path}/${file_base_name} && echo && echo Press ENTER to continue && read line && exit'”,
},
“shell”: true,
},
]
}

Sublime text 3, автоматический выбор build system?

Можно задать горячие клавиши для тех builds (далее также «билдов» и т. п.), которыми пользуетесь.

1. Собственные builds

PreferencesKey Bindings - User. Если прежде не использовали собственные хоткеи, вставляем такой код:

[{ "keys": ["ctrl alt b"], "command": "build", "args": {"build_system": "Packages/User/SashaIsMyIdol.sublime-build", "variant": "" }]

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

[
// Clickable URL — открыть URL, на которую наведён курсор
    { "keys": ["alt enter"], "command": "open_url_under_cursor" },
// Открыть PowerShell
    { "keys": ["ctrl 7, ctrl t"], "command": "open_terminal" },
// Наш Build
    { "keys": ["ctrl alt b"], "command": "build", "args": {"build_system": "Packages/User/SashaIsMyIdol.sublime-build", "variant": "" }
]

keys

— произвольный, но незанятый шорткат,

build_system

— путь к файлу Вашего билда с расширением

.sublime-build

, начиная с папки

Packages

.

Нажимаем горячие клавиши, — в примере это Ctrl Alt B, → build должен запуститься.

2. Builds по умолчанию

Принцип тот же: задать горячие клавиши в файле Key Bindings - User. Нужно ещё узнать, где лежат файлы билдов.

Положим, мы работаем с Ruby. Ctrl Shift PPackageResourceViewer: Open Resource (благодаря fuzzy-поиску достаточно ввести prv) → RubyRuby.sublime-build. В title страницы смотрим путь к файлу билда, его и вписываем:

{ "keys": ["ctrl 7, ctrl b"], "command": "build", "args": {"build_system": "Packages/Ruby/Ruby.sublime-build", "variant": "" }},

Аналогичным образом находим пути к builds для остальных языков программирования: для Python это

Packages/Python/Python.sublime-build

, у плюсов

Packages/C /C Single File.sublime-build

.

3. Альтернативный вариант

Сначала у меня не срабатывал из-за опечатки автора книги Sublime Text Power User.

Делаем так, чтобы когда у нас были открыты файлы для Python, например, с расширением .py, запускался бы Build Python, файлы для C , например, с расширением .ex — соответственно, для C . В файле вашего билда с расширением .sublime-build необходимо добавить параметр selector, значением которого будет являться общая для вашего языка разметки/программирования или инструмента программирования часть т. н. «области видимости» (scope). Как получить области видимости, подробно расписано тут. Нам нужно только то, что до первого пробела; допустим, если мы получили

source.python meta.function.python entity.name.function.python

, необходимо будет подставить только

source.python

. Пример билда для Python:

{
    "cmd": ["python", "-u", "$file"],
    "file_regex": "^[ ]*File

quot;(...*?)

quot;, line ([0-9]*)",
    "selector": "source.python"
}

Для C :

{
	    "cmd": ["g  ", "$file", "-o", "$file_base_name", "-I/usr/local/include"],
	    "selector": "source.c  ",
	    "windows": {
	       "cmd": ["cl", "/Fo${file_path}", "/O2", "$file"]
	    }
	}

Спасибо.

Targeting platforms:

Sublime build files also support specifying configuration data for specific platforms (namely, OS X, Windows and Linux). Targeting a platform can easily be done by specifying another element in our config with the name of the platform. e.g

{
    "cmd": ...
    ...

    "windows":
    {
        "cmd":  ...
    },

    "osx":
    {
            "cmd": ...
    },

    "linux":
    {
            "cmd": ...
    }
}

Troubleshooting

After pressing F7, you can see the command that was actually run by taking a look in the Console (via View/Console).

If you’re getting an error like ‘make’ is not recognized as an internal or external command, operable program or batch file, try running same command in a command prompt and ensuring it works there.

Usage

Build systems include the following functionality:

  • Automatic selection of a build system based on file type
  • Remembering the last used build system
  • Navigation of build system results
  • Ability to cancel a build

Windows

Обещанный велосипед

Все острова давным давно открыты… Как оказалось, уже изначально в Sublime Text 2 уже есть возможность вызова панели выбора вариантов текущей Build System, вам необходимо просто добавить сочетание клавиш:

Общая оценка

Все решения хорошие, пользуюсь ими, но полностью внешние терминалы они не заменяют.

Протестировано на

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

По причине того, что использую Windows, не рассмотрены такие решения, как Tint и fish-shell. Если не упомянул что-то ещё, можете добавить.

:/>  CHCP – просмотр или изменение кодовой страницы.

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

В данном обзоре встроенная консоль Windows называется «консолью» или «внешней консолью» в зависимости от контекста. Согласно автору программы ConEmu называть её cmd.exeне совсем корректно:

В Windows есть встроенный терминал (или “консольное окно”) которое часто ошибочно называют “cmd.exe”. Нажмите Win R и запустите, например, “powershell.exe”. Среди запущенных процессов не будет “cmd.exe”. В разных версиях Windows консольное окно создают разные процессы, в актуальных – это “conhost.exe”.

  Не ‘cmd.exe’, а просто ‘консоль’!

Navigating results


Build systems allow navigation of files specified in the build output.
Typically this is used to jump to the location of errors. Navigation
can be performed via:

Conclusions

Sublime build systems are awesome and can help you avoid the need to manually switch between your editor and external build tools regularly. As you’ve hopefully now learned, putting together your own custom build systems is a straight-forward process and I’d recommend trying it out if Sublime happens to be your editor of choice.

(Technically reviewed by Sindre Sorhus)

Send to Shell

В Sublime Text существуют плагины, отправляющие во внешний терминал выделенный или скопированный текст, как SendText и SendREPL. Тот же принцип действия у плагина Send to Shell, отправляющего скопированный текст в IPython — интерактивную оболочку для Python, составляющую Jupyter.

Выводы

Теперь для ProjectBuild не нужен конфиг. Вам достаточно выбрать необходимую Build System (стандартную систему или вашу собственную, как моя «AntProjectBuilder.sublime-build»). Сохранить проект в Sublime Text 2 таким образом, чтоб в одной из корневых его папок лежал файл манифеста проекта “*.sublime-workspace”.

Плагином ProjectBuild отслеживается наличие этого файла и его уникальность, так как сведения о текущей Build System берутся именно из него. При изменении Build System в Sublime Text 2 не забудте сохранить проект, чтоб указанный выше файл обновился. Нажимаем назначенное для ProjectBuild сочетание клавиш и видим панель со списком build-вариантов.

Указанные в самом начале статьи проблемы были успешно решены: задействовано одно сочетание клавиш и оно работает с build-механизмом непосредственно самого Sublime Text 2 и в его интерфейсе без жесткой привязки и явного именования вызываемых build-вариантов.

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

На самом деле сложно сказать, чей вклад больше, да и важно ли это, если в итоге плагин ProjectBuild стал тем, чем, наверно, и должен был быть. И что уж греха таить, я испытываю неописуемое чувство гордости, что вот не было такого в интерфейсе и функционале Sublime Text 2, а теперь такое есть, и что это написано отчасти мной. (тут я еще не знал о «велосипеде», о, горе мне, горе)

Прежний вариант ProjectBuild будет скорее всего переделан в плагин OneHotkey по группировке команд в одно сочетание клавиш, не обязательно build команд, а просто команд запуска «сторонних» для Sublime Text 2 программ и т.п. и там уже пригодится файл настроек, который был раньше у ProjectBuild и оказался для него лишним, так как содержал для build-механизма избыточную информацию.

Build files for popular front-end tools

To help you get started, I’ve written a collection of “.sublime-build” files for some of the front-end tools I’m aware web developers are using these days below.

Most of these will function fine without the need to specify path, but if you run into an issue with paths, try including it to your config (e.g “path”: “/usr/local/bin”).

grunt:

{
    "cmd": ["grunt", "--no-color"],
    "selector": ["source.js", "source.less", "source.json"]
}

Node Build Script:

{
    "cmd": ["h5bp", "--no-color"],
    "selector": ["source.js", "source.less", "source.json"]
}

CoffeeScript:

{
    "cmd": ["coffee","-c", "$file"],
    "selector" : "source.coffee"
}

SASS:

{
    "cmd": ["sass", "--watch", ".:."],
    "working_dir": "$file_path",
    "selector": ["source.scss", "source.sass"]
}

Whilst a more verbose version with automatic minification and watch config could be written:

{
    "cmd": ["sass", "--watch", "sass:stylesheets", "--style", "compressed"],
    "working_dir": "$project_path",
    "selector": ["source.scss", "source.sass"]
}

LESS:

{
    "cmd": ["lessc", "-x", "$file", "$file_path/$file_base_name.css", "--verbose"],
    "shell" : true,
    "selector": "source.css.less"
}

Stylus:

{
    "cmd": ["stylus", "$file"],
    "file_regex": ".",
    "selector": "source.stylus"
}

(a more comprehensive version of this can be found in the LESS-build-sublime project.)

Jade:

{
   "cmd": ["cmd", "/c", "jade", "$file"],
   "selector": "source.jade"
}

r.js (RequireJS Optimizer):

{
    "cmd": ["node", "r.js", "-o", "app.build.js"],
    "working_dir": "$project_path",
    "selector": "source.js"
}

UglifyJS:

{
   "cmd": [ "node", "uglifyjs", "-o", "${file_path}/${file_base_name}.min.js", "$file"],
   "selector": "source.js"
}

Node (just passing in directly):

{
     "cmd": ["node", "$file"],
     "file_regex": "^[ ]*File 

quot;(...*?)

quot;, line ([0-9]*)",
"selector": "source.js"
}

Pandoc (Markdown to HTML):

{
    "cmd": ["pandoc", "-S", "-s", "-f", "markdown", "-t", "html", "-o", "$file_base_name.html", "$file"],
    "selector": "text.html.markdown"
}

(and when it’s released, Yeoman):

{
     "cmd": ["yeoman", "build", "--no-color"],
     "selector": ["source.js", "source.scss", "source.sass", "source.html"]
}

JSHint:

Итоговый код плагина

Спойлер

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:nn%s' % err)
        
    def debug (self, message) :
        # change True to False or vice versa
        if (False): print message

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