Как создать систему сборки Sublime Text 3, которая читает shebang

Как я могу создать систему сборки в Sublime Text 3, где "cmd" заменяется шебангом, если он существует?

В частности, есть ли способ изменить систему сборки Python, чтобы использовать версию Python, указанную в шебанге, и использовать значение по умолчанию, если шебанга нет?


person Tony Mottaz    schedule 21.09.2016    source источник


Ответы (3)


Системы сборки 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
comment
Это выглядит весьма многообещающе — я дам вам знать, как все пойдет. Благодарю вас! - person Tony Mottaz; 26.09.2016

Если вы думаете, что единственный способ сделать это с помощью стандартного файла .sublime-build — это передать ваш файл другому сценарию, который затем анализирует шебанг и передает его правильной версии Python.

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

person idleberg    schedule 21.09.2016

Моя python.sublime-сборка

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

В Windows я использовал пусковую установку py для определения версий в соответствии с shebang

person Smart Manoj    schedule 23.01.2017