我当前的设置是工具>构建系统>自动
我使用了两个构建系统:Python.sublime-build
和Python64.sublime-build
。
当且仅当.py文件以#python64
开头时,如何使Sublime使用后者?
(这样我就不必手动切换 Sublime的工具>构建系统> Python 64 和 Sublime的工具>构建系统> Python )
,或者,如何制作:
CTRL + B 使用Python(32位)
CTRL + SHIFT + B 使用Python(64位)
(它们都应该在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),原因可能就在这里。
答案 0 :(得分:3)
通常,Sublime会根据您正在编辑的文件类型(例如python源文件)自动选择适当的构建系统。在Sublime Text 3中,还可以根据某个文件的存在(例如名为Makefile
的文件)激活构建系统。
这些都不是这里介绍的用例的可行解决方案,第二个仅在Sublime Text 3而不是Sublime Text 2中提供。
有几种方法可以实现这一目标。我在这里提供了两组指令,一组用于Sublime Text 2,另一组用于Sublime Text 3,因此这是一个更广泛有用的答案。
构建系统可以有一个名为target
的可选参数,它指定了sublime为执行构建而应执行的命令。如果未指定,则默认为exec
命令。构建文件的大多数内容实际上只是直接传递给exec
命令本身的参数。
通过指定自定义目标,您可以向构建命令添加额外的逻辑,以便有权分析当前文件并采取适当的行动。
第一部分是提供将用于执行构建的自定义命令,可以使用一些简单的插件代码完成。这应该作为python文件保存在User
包中(例如Packages\User\python_build.py
)。
第二部分是修改你正在使用的构建系统,以便利用新命令来完成我们想要它做的事情。单个构建文件将以两种方式使用。您可以为此Python.sublime-build
命名,并将其作为Packages\Python\Python.sublime-build
中现有版本的覆盖或Packages\User\Python.sublime-build
的用户包的启用。
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))
{
"target": "python_build",
"python32": "python",
"python64": "c:/python27-64/python",
"cmd": ["python", "-u", "$file"],
"file_regex": "^[ ]*File \"(...*?)\", line ([0-9]*)",
"selector": "source.python"
}
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))
{
"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的默认构建系统都反映了这一点。如果需要,Sublime Text 2版本也应该在Sublime Text 3中使用,只要你也使用适当的构建文件。
在任何一种情况下,custom命令都会检查文件的第一行,看看它应该执行哪两个python版本,在适当的构建系统中修改命令,然后调用{{1} }命令执行构建。
构建文件本身需要指定在任何一种情况下使用哪个版本的python解释器,如果未指定,则回退(由插件中的代码确定)为exec
。 / p>
如果您使用Sublime Text 3并将构建文件放在python
包中,您的构建菜单将包含两次User
选项;一次用于内置版本,一次用于您自己的版本。在这种情况下,您可能需要确保选择正确的一个。
在Sublime的任何一个版本中都没有可以运行构建的命令,并且还指定要使用的构建系统(至少不是我能找到的文档系统)。这两个版本中的密钥绑定仍然可以实现,但在Sublime Text 3的情况下更容易。
对于Sublime Text 2,命令Python
将使用当前选定的构建系统执行构建,build
可用于交换构建系统。
要通过一键按下来执行此操作,您需要安装ChainOfCommand插件,它允许您将多个命令链接在一起。安装该软件包后,您可以设置以下密钥绑定:
set_build_system
第一个将构建系统更改为python,然后运行构建,而第二个将其更改为Python64。根据需要修改构建文件的路径(例如,如果您在{
"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"]
]}
}
包中存储了其中一个或两个)。
这有点次优,因为它使 Ctrl + B 键始终尝试构建python,即使这不合适。
我没有主动使用Sublime Text 2,因此我不确定如何使这些绑定仅针对python文件。我尝试过的几件可以在Sublime Text 2中使用的东西在这里不起作用。
对于Sublime Text 3,这有点容易。此版本支持构建系统中的变体,并且可以告诉User
命令执行当前所选构建的变体。
要使其正常工作,您需要一个类似于以下版本的构建系统。这是标准Sublime Text 3 python构建文件的修改版本,它删除build
变体以支持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\"",
}
]
}
现在构建系统有一个变体,因此常规{
"keys": ["ctrl+shift+b"],
"command": "build", "args": {"variant": "Python64"},
"context": [
{ "key": "selector", "operator": "equal", "operand": "source.python"},
]
},
构建将使用32位版本而Python
将使用64位版本。
此处的键绑定设置为仅在python文件中运行,因为在Sublime Text 3中,此键序列用于提示您使用当前构建的变体。
对于某些初始设置,一旦启用此键绑定,您应该打开一个python文件并从菜单中选择Python - Python64
,然后选择Tools > Build > Build With...
以告诉Sublime您要使用Python
构建。
从现在开始,当您编辑python文件时, Ctrl + B 将执行主构建,即32位python,并且 Ctrl + Shift + B 将执行使用64位版本的变体。
答案 1 :(得分:1)
除了OdatNurd的优秀答案之外,以下是我使用的键盘地图和variants。
combineReducers()
var command = new Command[]
{
konten.DocumentSummary.ServiceCommands.EveryDocType,
konten.DocumentSummary.ServiceCommands.EveryRefNbr,
konten.DocumentSummary.Vendor,
konten.Applications.ReferenceNbrDisplayRefNbr,
konten.Applications.DocTypeDisplayDocType
};
同意[
{ "keys": ["ctrl+alt+b"], "command": "exec", "args": {"kill": true} },
{ "keys": ["alt+shift+b"], "command": "python_run" },
{ "keys": ["ctrl+shift+alt+b"], "command": "python64_run" }
]
import sublime
import sublime_plugin
import subprocess
class PythonRunCommand(sublime_plugin.WindowCommand):
def run(self):
command = 'cmd /k "C:\Python27\python.exe" %s' % sublime.active_window().active_view().file_name()
subprocess.Popen(command)