如何创建Sublime Text 3构建系统读取shebang



我如何在Sublime Text 3中创建一个构建系统,其中"cmd"被替换为shebang,如果它存在?

更具体地说,是否有一种方法可以改变Python构建系统以使用shebang中指定的Python版本,并在没有shebang时使用默认版本?

Sublime构建系统有一个名为target的选项,它指定要调用WindowCommand来执行构建。默认情况下,这是内部exec命令。您可以创建自己的命令来检查文件中的shebang,并使用该解释器或其他默认解释器。

例如(警告:我不是非常精通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的新命令,该命令收集给定的参数,在触发构建的窗口的当前活动视图中检查文件,以查看第一行是否为shebang,然后综合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"],
        }
    ]
}

注意,在这个变体中,我们重写了解释器的参数;如果需要,您也可以在那里重写默认解释器。

我认为使用标准.sublime-build文件做到这一点的唯一方法是将您的文件传递给另一个脚本,然后解析shebang并将其传递给正确的Python版本。

或者,您可以指定构建变体,但是您将不得不手动选择所需的构建变体。

My python.sublime-build

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

在windows中,我使用py启动器根据shebang

检测版本。

相关内容

  • 没有找到相关文章

最新更新