首页 > 解决方案 > 在 Sublime Text 构建系统中使用自定义变量

问题描述

我正在 macOS 上配置 Sublime Text (ST) 构建系统。我想创建一个构建系统变体,将构建产品输出到我的用户库中的一个文件夹,但我找不到解决这个目录的方法。

ST 构建系统文档提到了构建系统变量的可用性,但它们都不允许我处理我的主目录。

有没有办法在 ST 构建系统中使用自定义变量,以便我可以以某种方式推断主目录路径?

或者有没有办法使用 $HOME 环境变量?

我不想在构建系统中对主目录进行硬编码,因为我希望它可以被不同的用户使用。

标签: buildsublimetext3

解决方案


确实可以在构建中引入自定义变量,但这是一项有点复杂的任务,因为您必须编写一个 Sublime 插件来完成这项工作。

特别是,您可以在sublime-build名为的文件中包含一个键target,它告诉 Sublime 它应该执行什么内部命令才能执行构建。当此键不存在时(大多数情况下),它默认为exec内部命令,该命令负责大部分构建过程,包括捕获并在面板中显示输出,适当地注入错误幻象,等等上。

通过创建您自己的自定义WindowCommand实例并targetsublime-build文件中包含 a,Sublime 将执行您的命令而不是默认命令,这允许您按照您认为合适的方式解释变量。

如果您想走这条路,可以在此处获得此类构建系统的示例。简而言之,它是一个自定义命令,将变量展开,然后调用内部exec命令来实际完成工作。

综上所述,如果需要,您可以直接在命令中使用环境变量,因此,如果您的目标是在已知位置创建一个基于环境变量的文件夹,您可以完全不做任何更改。

这里要注意的是,在 MacOS 和 Linux 上,$shell 使用该字符来表示变量,但 Sublime 也使用$它来表示它自己的变量。因此,您需要执行一些“引用魔术”才能使事情正常进行。

如果您尝试使用例如$HOME展开到主目录,它将展开为一个空字符串。这是因为当 Sublime 准备执行构建时,它会扩展所有变量;它不知道其值的变量被替换为空字符串。这不是受支持的构建变量,因此它被认为是空的。

解决方案是“引用”美元符号;\$告诉 Sublime 不要特殊对待它;这允许它$通过最终运行 shell 的命令。

但是,如果您尝试这样做,您会在状态行中看到可怕的“无构建系统”错误,并且没有任何反应。原因是sublime-build文件是JSON,在JSON\$中是无效的转义序列;因此构建无法加载,Sublime 什么也不做。

解决方案是使用\\$;它被 JSON 加载器解释为一个带引号的斜杠,它在内部转换为\$,这使得 Sublime 将其转换为$并将其传递给命令。

这方面的一个示例是以下简单的构建系统,它在构建面板中显示您的主目录:

{
    "shell_cmd": "echo \\$HOME/",
}

推荐阅读