由于您已经在使用自定义构建系统,因此您可以使用一些插件代码和对自定义构建系统的一些修改来完成类似的操作。
自定义构建系统允许一个名为的属性,该属性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
。