让Sublime从两个类似的构建系统中进行选择

时间:2017-01-20 16:52:57

标签: python sublimetext2 sublimetext

我当前的设置是工具>构建系统>自动

我使用了两个构建系统:Python.sublime-buildPython64.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),原因可能就在这里。

2 个答案:

答案 0 :(得分:3)

通常,Sublime会根据您正在编辑的文件类型(例如python源文件)自动选择适当的构建系统。在Sublime Text 3中,还可以根据某个文件的存在(例如名为Makefile的文件)激活构建系统。

这些都不是这里介绍的用例的可行解决方案,第二个仅在Sublime Text 3而不是Sublime Text 2中提供。

有几种方法可以实现这一目标。我在这里提供了两组指令,一组用于Sublime Text 2,另一组用于Sublime Text 3,因此这是一个更广泛有用的答案。

选项#1 - 自定义构建目标

构建系统可以有一个名为target的可选参数,它指定了sublime为执行构建而应执行的命令。如果未指定,则默认为exec命令。构建文件的大多数内容实际上只是直接传递给exec命令本身的参数。

通过指定自定义目标,您可以向构建命令添加额外的逻辑,以便有权分析当前文件并采取适当的行动。

第一部分是提供将用于执行构建的自定义命令,可以使用一些简单的插件代码完成。这应该作为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的默认构建系统都反映了这一点。如果需要,Sublime Text 2版本也应该在Sublime Text 3中使用,只要你也使用适当的构建文件。

在任何一种情况下,custom命令都会检查文件的第一行,看看它应该执行哪两个python版本,在适当的构建系统中修改命令,然后调用{{1} }命令执行构建。

构建文件本身需要指定在任何一种情况下使用哪个版本的python解释器,如果未指定,则回退(由插件中的代码确定)为exec。 / p>

如果您使用Sublime Text 3并将构建文件放在python包中,您的构建菜单将包含两次User选项;一次用于内置版本,一次用于您自己的版本。在这种情况下,您可能需要确保选择正确的一个。

选项#2 - 使用密钥绑定

在Sublime的任何一个版本中都没有可以运行构建的命令,并且还指定要使用的构建系统(至少不是我能找到的文档系统)。这两个版本中的密钥绑定仍然可以实现,但在Sublime Text 3的情况下更容易。

Sublime Text 2 Key Bindings:

对于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 Key Bindings:

对于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

  • CTRL + B :Python 32(Sublime中的输出日志)
  • CTRL + SHIFT + B :Python 64(Sublime中的输出日志)
  • ALT + SHIFT + B :Python 32(在新的终端窗口中)
  • CTRL + SHIFT + ALT + B :Python 64(在新的终端窗口中)
  • CTRL + ALT + B :杀死当前的Python脚本

默认(Windows).sublime-keymap

combineReducers()

python_run.py

        var command = new Command[]
        {

            konten.DocumentSummary.ServiceCommands.EveryDocType,
            konten.DocumentSummary.ServiceCommands.EveryRefNbr,

            konten.DocumentSummary.Vendor,
            konten.Applications.ReferenceNbrDisplayRefNbr,
            konten.Applications.DocTypeDisplayDocType
        };

python64_run.py

同意[ { "keys": ["ctrl+alt+b"], "command": "exec", "args": {"kill": true} }, { "keys": ["alt+shift+b"], "command": "python_run" }, { "keys": ["ctrl+shift+alt+b"], "command": "python64_run" } ]

Python.sublime-构建

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)