由于您已经在使用自定义构建系统,因此您可以使用一些插件代码和对自定义构建系统的一些修改来完成类似的操作。
自定义构建系统允许一个名为target 的属性,它指定要执行的命令以运行构建。如果您不提供此功能(大多数构建系统不提供),则默认为 exec 命令。您可以创建自己的自定义命令来为您执行扩展。
作为一个简单的示例,请参阅以下 python 源代码,您可以将其另存为 custom_build.py 之类的内容到您的 User 包中。这实现了一个名为my_custom_build 的新命令。执行此命令时,它将通过扩展变量来转换其参数,然后使用它们执行默认的exec 命令。
import sublime, sublime_plugin
# List of variable names we want to support
custom_var_list = ["proj_var_1"]
class MyCustomBuildCommand(sublime_plugin.WindowCommand):
def createExecDict(self, sourceDict):
global custom_var_list
# Get the project specific settings
project_data = self.window.project_data ()
project_settings = (project_data or {}).get ("settings", {})
# Get the view specific settings
view_settings = self.window.active_view ().settings ()
# Variables to expand; start with defaults, then add ours.
variables = self.window.extract_variables ()
for custom_var in custom_var_list:
variables[custom_var] = view_settings.get (custom_var,
project_settings.get (custom_var, ""))
# Create arguments to return by expanding variables in the
# arguments given.
args = sublime.expand_variables (sourceDict, variables)
# Rename the command paramter to what exec expects.
args["cmd"] = args.pop ("command", [])
return args
def run(self, **kwargs):
self.window.run_command ("exec", self.createExecDict (kwargs))
具体来说,它首先在当前视图中指定的设置中查找变量,如果在那里找不到,则在项目特定设置中查找。任何仍未找到的变量默认为空字符串。
您需要指定自定义构建系统,例如:
{
"target": "my_custom_build",
"command": ["build.sh", "${proj_var_1}"],
"working_dir": "${project_path:${folder}}",
"shell": false
}
请注意,现在有一个target 字段指定应执行自定义命令以代替exec。另请注意,我们没有将命令行指定为cmd,而是将其指定为command。
这是因为 Sublime 似乎在运行您的自定义命令之前预先扩展了构建系统中已知键的值。结果,它会尝试扩展cmd 键中的变量,导致${proj_var_1} 在我们的命令甚至看到它之前就被扩展为一个空字符串,这将它剥离给我们。
为了解决这个问题,我们将密钥的名称更改为 Sublime 将单独保留的名称,然后在代码中将其换回。
如上所述,上面的代码将尝试扩展它在构建系统中任何地方看到的任何变量,但它只需要特别注意以这种方式保护cmd 键。例如,如果您想在 working_dir 键中使用自定义变量,您需要做类似的事情。