我需要运行另一个编译器,具体取决于要与之一起使用的应用程序的版本是该应用程序的版本。
源文件始终存储在包含版本号的路径中。
所以文件%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)
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
文件,但是您需要进行的更改是:
您需要使用target
表示我们的命令应该是要执行的命令
您应该(但不需要)设置cancel
键,以告诉Sublime如果您选择cancel build命令,如何取消您的构建;这个命令告诉Sublime执行与开始构建时相同的app_build
命令,但给它一个额外的参数来表明应终止构建。
要从文件路径访问版本号的任何地方,请使用符号\\${version:DEFAULT}
。
需要以这种方式指定变量(即,前面有两个\\
字符),因为Sublime将自动尝试扩展exec
在调用命令之前识别的构建系统键中的任何变量。
由于命令被调用时,我们尚未设置version
变量的值,这将使Sublime假定该值为空字符串,从而将其从字符串中删除并阻止我们进行操作。以检测它的存在。
为了使Sublime保留变量不变,您需要使用\$
表示法表示不应将其视为特殊的$
字符; Sublime会将\$
转换为$
,并将其传递给我们的命令。在sublime-build
文件中,您需要使用\\$
,因为\$
不是有效的JSON字符转义。
:DEFAULT
部分是可选的;如果未设置version
变量,它将用作扩展文本。在上面的示例中,将其设置为100
,但实际上,您可以将其设置为9
或11
。如果命令无法确定要使用的版本,则不会设置该变量,因此您可以使用它来设置在这种情况下要使用的默认版本(如果这对您的用例有意义)。
build systems in Sublime Text上的该视频系列总体上提供了有关构建系统如何工作的更多信息,其中包括一些有关自定义构建目标及其工作方式的视频,包括有关将我们归类为ExecCommand
的高级自定义目标的更多信息。在这里做(免责声明:我是作者)。