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"],
}
]
}
请注意,在变体中,我们覆盖了解释器参数的内容;如果需要,您也可以覆盖默认解释器。