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

标签 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),原因可能不在这里。

    最佳答案

    通常,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_cmdcmd来指定可执行文件,并且每个版本中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/

    相关文章:

    python - 如何在matplotlib中获取多行x轴标签?

    amazon-web-services - 使用 SublimeText SFTP 上传到 EC2 CentOS 实例

    python - 正则表达式适用于 Sublime Text 搜索,但不适用于 Python 脚本

    autocomplete - 如何使 SublimeText 版本 4 的自动完成功能像版本 3 一样?

    keyboard-shortcuts - Sublime Text 3 : how to bind a shortcut to a specific file extension?

    python - 基于元素函数将 1d numpy 数组映射到 2d 数组

    python - YouTube Analytics API - 内容所有者按 channel 分组的总观看次数

    python - 如何删除 __repr__ 返回上的 []

    Sublime Text 2 中用于递增数字的正则表达式

    sublimetext3 - SublimeLinter是否具有用于发出更明显警告的设置或插件?