我当前的设置是“工具”>“构建系统”>“自动”。
我使用两个构建系统:Python.sublime-build
和Python64.sublime-build
。
当且仅当.py文件以#python64
开头时,如何使Sublime使用后者?
(这样我就不必在Sublime的工具>构建系统> Python 64和Sublime的工具>构建系统> Python之间进行手动切换)。
或替代方法:
(它们都应在Sublime的底部构建输出面板中显示输出)。
# Python.sublime-build
{
"cmd": ["python", "-u", "$file"],
"file_regex": "^[ ]*File \"(...*?)\", line ([0-9]*)",
"selector": "source.python"
}
# Python64.sublime-build
{
"cmd": ["c:\\python27-64\\python", "-u", "$file"],
"file_regex": "^[ ]*File \"(...*?)\", line ([0-9]*)"
}
PS:我使用Windows,并且我需要两个版本的Python(32和64),原因可能不在这里。
最佳答案
通常,Sublime会根据您正在编辑的文件(例如python源文件)的类型自动选择合适的构建系统。在Sublime Text 3中,还可以基于某个文件(例如,名为Makefile
的文件)的存在来激活构建系统。
这两种方法都不是此处提出的用例的可行解决方案,第二种方法仅在Sublime Text 3中可用,而在Sublime Text 2中不可用。
有两种方法可以实现此目的。我在这里提供了两组指令,一组用于Sublime Text 2,一组用于Sublime Text 3,因此这是一个更广泛有用的答案。
选项#1-自定义构建目标
构建系统可以具有一个名为target
的可选参数,该参数指定执行sublime以执行构建的命令。如果未指定,则默认为exec
命令。实际上,构建文件的大多数内容只是直接传递给exec
命令本身的参数。
通过指定自定义目标,可以向build命令添加额外的逻辑,以便可以分析当前文件并采取适当的措施。
这的第一部分是提供定制命令,该命令将用于执行构建,可以通过一些简单的插件代码来完成。这应该以python文件的形式保存在User
包中(例如Packages\User\python_build.py
)。
第二部分是修改您正在使用的构建系统,以利用新命令来执行我们想要的操作。单个构建文件将同时使用。您将命名此Python.sublime-build
并启用它,以替代Packages\Python\Python.sublime-build
中现有的构建,或在您的用户包中将其作为Packages\User\Python.sublime-build
启用。
Sublime Text 2插件:
import sublime, sublime_plugin
class PythonBuildCommand(sublime_plugin.WindowCommand):
def detect_version(self, filename, python32, python64):
with open(filename, 'r') as handle:
line = handle.readline ()
return python64 if (line.startswith ("#") and "64" in line) else python32
def execArgs(self, sourceArgs):
current_file = self.window.active_view ().file_name ()
args = dict (sourceArgs)
python32 = args.pop ("python32", "python")
python64 = args.pop ("python64", "python")
selected = self.detect_version (current_file, python32, python64)
if "cmd" in args:
args["cmd"][0] = selected
return args
def run(self, **kwargs):
self.window.run_command ("exec", self.execArgs (kwargs))
Sublime Text 2构建文件:{
"target": "python_build",
"python32": "python",
"python64": "c:/python27-64/python",
"cmd": ["python", "-u", "$file"],
"file_regex": "^[ ]*File \"(...*?)\", line ([0-9]*)",
"selector": "source.python"
}
Sublime Text 3插件:import sublime, sublime_plugin
class PythonBuildCommand(sublime_plugin.WindowCommand):
def detect_version(self, filename, python32, python64):
with open(filename, 'r') as handle:
line = handle.readline ()
return python64 if (line.startswith ("#") and "64" in line) else python32
def execArgs(self, sourceArgs):
current_file = self.window.active_view ().file_name ()
args = dict (sourceArgs)
python32 = args.pop ("python32", "python")
python64 = args.pop ("python64", "python")
selected = self.detect_version (current_file, python32, python64)
if "shell_cmd" in args:
args["shell_cmd"] = args["shell_cmd"].replace ("python", selected)
return args
def run(self, **kwargs):
self.window.run_command ("exec", self.execArgs (kwargs))
Sublime Text 3构建文件:{
"target": "python_build",
"shell_cmd": "python -u \"$file\"",
"file_regex": "^[ ]*File \"(...*?)\", line ([0-9]*)",
"selector": "source.python",
"python32": "python",
"python64": "c:/python27-64/python",
"env": {"PYTHONIOENCODING": "utf-8"},
"variants":
[
{
"name": "Syntax Check",
"shell_cmd": "python -m py_compile \"${file}\"",
}
]
}
请注意,在两个版本的代码中,插件代码几乎都是相同的。 Sublime Text 3支持
shell_cmd
和cmd
来指定可执行文件,并且每个版本中Python的默认构建系统都反射(reflect)了这一点。如果需要,只要您也使用适当的构建文件,Sublime Text 2版本也可以在Sublime Text 3中使用。在这两种情况下,定制命令都会检查文件的第一行,以查看应执行两个版本的python中的哪个版本,并在构建系统中适本地修改该命令,然后调用
exec
命令来执行构建。无论哪种情况,构建文件本身都需要指定要使用哪个版本的python解释器,如果未指定,则两者的后备时间(由插件中的代码确定)均为
python
。如果您正在使用Sublime Text 3并将生成文件放置在
User
包中,则生成菜单将两次包含Python
选项;一次用于内置版本,一次用于您自己的版本。在这种情况下,您可能需要确保选择正确的一个。选项#2-使用按键绑定(bind)
在任一版本的Sublime中都没有命令可以运行构建,也没有指定要使用的构建系统(至少没有我可以找到的有文档记录的系统)。尽管在Sublime Text 3的情况下要容易一些,但在两个版本中都可以通过键绑定(bind)来实现。
Sublime Text 2按键绑定(bind):
对于Sublime Text 2,命令
build
将使用当前选择的构建系统执行构建,并且set_build_system
可用于交换构建系统。为了通过一次按键即可完成此操作,您需要安装ChainOfCommand插件,该插件可将多个命令链接在一起。安装该软件包后,您可以设置以下按键绑定(bind):
{
"keys": ["ctrl+b"],
"command": "chain", "args": {"commands": [
["set_build_system", {"file": "Packages/Python/Python.sublime-build"}],
["build"]
]}
},
{
"keys": ["ctrl+shift+b"],
"command": "chain", "args": {"commands": [
["set_build_system", {"file": "Packages/Python/Python64.sublime-build"}],
["build"]
]}
}
其中第一个将构建系统更改为python,然后运行该构建,而第二个将其更改为Python64。适本地修改构建文件的路径(例如,如果您在User
包中存储了一个或两个)。这有点次优,因为它使Ctrl + B键始终尝试构建python,即使这样做不合适。
我没有积极地使用Sublime Text 2,所以我不确定您将如何使这些绑定(bind)仅针对python文件。我尝试过的一些可在Sublime Text 2中使用的功能在这里不起作用。
Sublime Text 3按键绑定(bind):
对于Sublime Text 3,这要容易一些。该版本支持构建系统中的变体,并且可以告诉
build
命令执行当前所选构建的变体。要使此工作正常进行,您需要一个看起来类似于以下版本的单一构建系统。这是标准Sublime Text 3 python构建文件的修改版本,该版本删除了
Syntax Check
变体,而使用了Python64
版本。可以根据需要进行修改。{
"shell_cmd": "python -u \"$file\"",
"file_regex": "^[ ]*File \"(...*?)\", line ([0-9]*)",
"selector": "source.python",
"env": {"PYTHONIOENCODING": "utf-8"},
"variants":
[
{
"name": "Python64",
"shell_cmd": "c:/python27-64/python -u \"$file\"",
}
]
}
完成此操作后,添加以下按键绑定(bind):{
"keys": ["ctrl+shift+b"],
"command": "build", "args": {"variant": "Python64"},
"context": [
{ "key": "selector", "operator": "equal", "operand": "source.python"},
]
},
现在,构建系统具有一个变体,因此常规Python
构建将使用32位版本,而Python - Python64
将使用64位版本。此处的键绑定(bind)设置为仅在python文件中运行,因为在Sublime Text 3中,此键序列用于提示您输入要使用的当前版本的变体。
对于某些初始设置,启用此键绑定(bind)后,您应该打开一个python文件并从菜单中选择
Tools > Build > Build With...
,然后选择Python
以告知Sublime您要使用Python
构建。从现在开始,在编辑python文件时,Ctrl + B将执行主版本,即32位python,而Ctrl + Shift + B将执行使用64位版本的变体。
关于python - 让Sublime在两个类似的构建系统中进行选择,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41768673/