SublimeText 3基于文件路径的构建系统

问题描述 投票:0回答:1

我需要运行另一个编译器,具体取决于要与之一起使用的应用程序的版本是该应用程序的版本。

源文件始终存储在包含版本号的路径中。

所以文件%APPDATA%\App\9\Settings\Source.file需要运行

%ProgramFiles%\App\9\Compiler.exe "%APPDATA%\App\9\Settings\Source.file"

%APPDATA%\App\11\Settings\Source.file需要运行

%ProgramFiles%\App\11\Compiler.exe "%APPDATA%\App\11\Settings\Source.file"

我已经尝试按照此处的高级示例进行操作:https://www.sublimetext.com/docs/3/build_systems.html#advanced_example

但是python确实不是我的事,而且我似乎无法运行任何东西

基本工作原理,但我无法指定版本:

    {
        "cmd": ["c:\\Program Files\\App\\10\\compile.exe", "$file"],
        "selector": "source.app",
        "file_patterns": "*.ext"
    }

但这不是:

        {
        "target": "app_build", 
        "selector": "source.app",
        "file_patterns": "*.ext"
    }

。py文件

    import sublime
    import sublime_plugin

    class AppBuildCommand(sublime_plugin.WindowCommand):

        def run (self):

            vars = self.window.extract_variables()
            compiler = vars['file_path']

            compiler = compiler.split("\\")

            compiler_path = "c:\\Program Files\\App\\" + compiler[compiler.index("App")+1] + "\\Compiler.exe"

            file = vars['file']

            self.window.run_command (compiler + " \"" + file + "\"")

也尝试没有成功:

    args = []
    args.append(compiler)
    args.append(file)

    self.window.run_command("cmd", args)
python sublimetext3 build-system
1个回答
0
投票

run_command()方法用于执行内部Sublime命令(即,您将要绑定到键或从菜单触发的东西),因此对您不起作用的部分原因是您试图让Sublime运行命令,而不是让它执行外部程序。

构建系统通常由exec命令执行;如果您没有在target文件中提供它,则它实际上是sublime-build键的默认值。 exec负责使用Sublime为其提供的参数来启动外部进程,捕获其输出并将其显示在窗口底部的输出面板中。

为了定制执行的内容,您需要实现自己的WindowCommand并使用target键告诉Sublime运行它,但是该命令负责执行exec会执行的操作,即包括启动外部过程并捕获输出。

文档中列出的示例使用subprocess.Popen()执行此任务,并且必须跟踪该任务是否正在运行以将其关闭,等等。>>

一种简单的实现方法是将您的命令创建为Sublime通常用于运行构建的命令的子类,以便您可以自定义构建的开始方式,但让现有代码处理所有细节。

这种命令的示例将类似于以下内容:

import sublime
import sublime_plugin

import os

from Default.exec import ExecCommand


class AppBuildCommand(ExecCommand):
    def run(self, **kwargs):
        # Get the list of variables known to build systems
        variables = self.window.extract_variables()

        # Is there a file path? There won't be if the file hasn't been saved
        # yet.
        if "file_path" in variables:
            # Pull out the file path, split it into parts, and use the segment
            # after the "App" segment as the value of a new variable named
            # version.
            file_path = variables["file_path"].upper().split(os.sep)
            if "APP" in file_path:
                variables["version"] = file_path[file_path.index("APP") + 1]

        # Expand any remaining variables in our arguments and then execute the
        # build.
        kwargs = sublime.expand_variables(kwargs, variables)
        super().run(**kwargs)

使用此命令进行构建的sublime-build文件的示例为:

{
    "target": "app_build",
    "cancel": {"kill": true},

    "cmd": ["c:\\Program Files\\App\\\\${version:100}\\compile.exe", "$file"],

    "selector": "source.app",
    "file_patterns": ["*.ext"]
}

该命令本身检查App段之后的段的当前文件路径(此处不区分大小写,以防万一),并使用该路径来创建名为version的新构建系统变量。如果尚未保存文件(因此在磁盘上没有名称),或者其中没有名为App的路径段,则不会创建该变量。

最后两行扩展尚未扩展的所有变量,然后告诉exec命令执行构建。

sublime-build文件在任何方面都可以是普通的sublime-build文件,但是您需要进行的更改是:

  1. 您需要使用target表示我们的命令应该是要执行的命令

  2. 您应该(但不需要)设置cancel键,以告诉Sublime如果您选择cancel build命令,如何取消您的构建;这个命令告诉Sublime执行与开始构建时相同的app_build命令,但给它一个额外的参数来表明应终止构建。

  3. 要从文件路径访问版本号的任何地方,请使用符号\\${version:DEFAULT}

  4. 需要以这种方式指定变量(即,前面有两个\\字符),因为Sublime将自动尝试扩展exec在调用命令之前识别的构建系统键中的任何变量。

由于命令被调用时,我们尚未设置version变量的值,这将使Sublime假定该值为空字符串,从而将其从字符串中删除并阻止我们进行操作。以检测它的存在。

为了使Sublime保留变量不变,您需要使用\$表示法表示不应将其视为特殊的$字符; Sublime会将\$转换为$,并将其传递给我们的命令。在sublime-build文件中,您需要使用\\$,因为\$不是有效的JSON字符转义。

:DEFAULT部分是可选的;如果未设置version变量,它将用作扩展文本。在上面的示例中,将其设置为100,但实际上,您可以将其设置为911。如果命令无法确定要使用的版本,则不会设置该变量,因此您可以使用它来设置在这种情况下要使用的默认版本(如果这对您的用例有意义)。

build systems in Sublime Text上的该视频系列总体上提供了有关构建系统如何工作的更多信息,其中包括一些有关自定义构建目标及其工作方式的视频,包括有关将我们归类为ExecCommand的高级自定义目标的更多信息。在这里做(免责声明:我是作者)。

© www.soinside.com 2019 - 2024. All rights reserved.