Системы сборки Sublime имеют параметр с именем target
, который указывает WindowCommand
, который должен вызываться для выполнения сборки. По умолчанию это внутренняя команда exec
. Вы можете создать свою собственную команду, которая проверит файл на наличие шебанга и в противном случае будет использовать этот интерпретатор или какое-либо значение по умолчанию.
Например (предостережение: я не очень хорошо разбираюсь в Python, поэтому это, вероятно, довольно уродливо):
import sublime, sublime_plugin
class ShebangerCommand(sublime_plugin.WindowCommand):
def parseShebang (self, filename):
with open(filename, 'r') as handle:
shebang = handle.readline ().strip ().split (' ', 1)[0]
if shebang.startswith ("#!"):
return shebang[2:]
return None
def createExecDict(self, sourceDict):
current_file = self.window.active_view ().file_name()
args = dict (sourceDict)
interpreter = args.pop ("interpreter_default", "python")
exec_args = args.pop ("interpreter_args", ["-u"])
shebang = self.parseShebang (current_file)
args["shell_cmd"] = "{} {} \"{}\"".format (shebang or interpreter,
" ".join (exec_args),
current_file)
return args
def run(self, **kwargs):
self.window.run_command ("exec", self.createExecDict (kwargs))
Вы должны сохранить это в Packages/User
как файл Python (например, shebanger.py
).
Это создает новую команду с именем shebanger
, которая собирает переданные ей аргументы, проверяет файл в текущем активном представлении окна, в котором запускается сборка, чтобы определить, является ли первая строка шебангом, а затем синтезирует аргументы, необходимые для exec
команду и запускает ее.
Поскольку система сборки Python по умолчанию предполагает, что она создает текущий файл и передает -u
в качестве аргумента, эта команда также воспроизводит это. Обратите внимание, однако, что этот код не на 100% правильный, потому что любые аргументы в строке shebang будут проигнорированы, но вы поняли общую идею.
При использовании вы должны изменить файл Python.sublime-build
по умолчанию, чтобы он выглядел следующим образом:
{
// WindowCommand to execute for this build
"target": "shebanger",
// Use this when there is no shebang
"interpreter_default": "python",
// Args to pass to the interpreter
"interpreter_args": ["-u"],
"file_regex": "^[ ]*File \"(...*?)\", line ([0-9]*)",
"selector": "source.python",
"env": {"PYTHONIOENCODING": "utf-8"},
"variants":
[
{
"name": "Syntax Check",
"interpreter_args": ["-m py_compile"],
}
]
}
Обратите внимание, что в этом варианте мы переопределяем аргументы интерпретатора; вы также можете переопределить интерпретатор по умолчанию, если хотите.
person
OdatNurd
schedule
21.09.2016