Sublimetext3 设置依赖于项目的生成系统变量

Sublimetext3 设置依赖于项目的生成系统变量,sublimetext3,sublime-build,Sublimetext3,Sublime Build,我已经编写了一个构建系统,它调用bash或批构建脚本。现在,我在任何新项目中复制并粘贴构建脚本,并更改与项目相关的属性 为了避免每次都要修改脚本(或者只使用一个全局设置的脚本),我希望能够在sublime项目设置中设置一些变量,并在构建系统中获取它们,然后将它们作为参数发送到脚本 无需定义每个项目的构建系统,这是否可行 如果相关,这里有一些简化的构建脚本 #!/bin/bash exe=some_defined_exe mkdir -p build cd build cmake .. make

我已经编写了一个构建系统,它调用bash或批构建脚本。现在,我在任何新项目中复制并粘贴构建脚本,并更改与项目相关的属性

为了避免每次都要修改脚本(或者只使用一个全局设置的脚本),我希望能够在sublime项目设置中设置一些变量,并在构建系统中获取它们,然后将它们作为参数发送到脚本

无需定义每个项目的构建系统,这是否可行

如果相关,这里有一些简化的构建脚本

#!/bin/bash
exe=some_defined_exe

mkdir -p build
cd build
cmake ..
make -j4 
make install
cd ../bin
$exe
cd ..
并建立系统

{
    "cmd": ["build.sh"],
    "working_dir": "${project_path:${folder}}",
    "shell": false,
}
我希望他们像这样

#!/bin/bash
exe=$1

mkdir -p build
cd build
cmake ..
make -j4 
make install
cd ../bin
$exe
cd ..


由于您已经在使用自定义构建系统,您可以使用一些插件代码和对自定义构建系统的一些修改来实现类似的功能

自定义生成系统允许名为
target
的属性,该属性指定要执行以运行生成的命令。如果不提供此选项(大多数生成系统不提供),则默认为
exec
命令。您可以创建自己的自定义命令来执行扩展

作为一个简单的示例,请参阅以下python源代码,您可以将其保存为
custom_build.py
之类的东西,保存在
User
包中。这将实现一个名为
my\u custom\u build
的新命令。执行此命令时,它将通过展开变量,然后使用变量执行默认的
exec
命令来转换参数

导入升华,升华插件
#我们希望支持的变量名列表
自定义变量列表=[“项目变量1”]
类MyCustomBuildCommand(升华插件.WindowCommand):
def createExecDict(self,sourceDict):
全局自定义变量列表
#获取项目特定的设置
project\u data=self.window.project\u data()
项目设置=(项目数据或{}).get(“设置”,{})
#获取视图特定的设置
视图设置=self.window.active\u视图().settings()
#要扩展的变量;从默认值开始,然后添加我们的。
变量=self.window.extract\u变量()
对于自定义变量列表中的自定义变量:
变量[自定义变量]=查看设置.get(自定义变量,
project_settings.get(自定义_变量,“”)
#通过在中展开变量来创建要返回的参数
#给出的论点。
args=sublime.expand_变量(sourceDict,变量)
#将命令参数重命名为exec期望的值。
args[“cmd”]=args.pop(“命令”,[])
返回参数
def运行(自身,**kwargs):
self.window.run_命令(“exec”,self.createExecDict(kwargs))
具体来说,它首先在当前视图中指定的设置中查找变量,如果在当前视图中找不到变量,则在项目特定的设置中查找。仍然找不到任何变量,默认为空字符串

您需要指定自定义生成系统,例如:

{
“目标”:“我的自定义构建”,
“命令”:[“build.sh”,“${proj_var_1}”],
“工作目录”:“${project\u path:${folder}}”,
“壳”:假
}
请注意,现在有一个
target
字段指定应该执行自定义命令来代替
exec
。还要注意的是,我们没有将命令行指定为
cmd
,而是将其指定为
command

这是因为Sublime似乎在运行自定义命令之前预先扩展构建系统中已知键的值。因此,它将尝试展开
cmd
键中的变量,导致
${proj_var_1}
在我们的命令看到它之前展开为空字符串,这会将它从我们身上剥离

为了解决这个问题,我们将密钥的名称更改为Sublime将不使用的名称,然后在代码中将其交换回来


如上所述,上面的代码将尝试扩展它在构建系统中任何地方看到的任何变量,但它只需要特别注意以这种方式保护
cmd
键。例如,如果希望在
工作目录
键中使用自定义变量,则需要执行类似的操作

这是不可能的,除非您创建标准生成系统背后的程序
exec.py
的修改版本。
{
    "cmd": ["build.sh", "${some_project_defined_variable}"],
    "working_dir": "${project_path:${folder}}",
    "shell": false,
}