升华文本3构建系统:JSON中的反斜杠

升华文本3构建系统:JSON中的反斜杠,json,sublimetext3,build-system,Json,Sublimetext3,Build System,我想用MinGW通过升华文本编译一个c程序。 我需要运行的命令是: gcc "${file}" -o "${file_path}\${file_base_name}.exe" (注意文件路径中的\号) 我需要将此字符串作为值写入JSON文件。因此,我尝试转换有问题的字符: " => \" \ => \\ ... “字符”没有问题,它转换正确-反斜杠行为怪异。 下面是我尝试通过Sublime编译时运行的命令: gcc C:\Users\omer\Desktop${file_base

我想用MinGW通过升华文本编译一个c程序。 我需要运行的命令是:

gcc "${file}" -o "${file_path}\${file_base_name}.exe"
(注意文件路径中的\号)

我需要将此字符串作为值写入JSON文件。因此,我尝试转换有问题的字符:

" => \"
\ => \\
...
“字符”没有问题,它转换正确-反斜杠行为怪异。 下面是我尝试通过Sublime编译时运行的命令:

gcc C:\Users\omer\Desktop${file_base_name}.c -o C:\Users\omer\Desktop${file_base_name}.exe
转换是否不正确?我缺少什么

编辑:这是完整的构建系统JSON

{
"shell_cmd": "gcc \"${file}\" -o \"${file_path}\\${file_base_name}.exe\"",
"file_regex": "^(..[^:]*):([0-9]+):?([0-9]+)?:? (.*)$",
"working_dir": "${file_path}",
"selector": "source.c",

"variants":
[
    {
        "name": "Run",
        "shell_cmd": "gcc \"${file}\" -o \"${file_path}\\${file_base_name}.exe\" && \"${file_path}\\${file_base_name}.exe\""
    }
]

}您的问题的简短回答是,您在这里有一些但不是所有必需的转义,因为您需要处理
JSON
转义字符和升华转义字符,因此您会被升华的一个特性所迷惑

我猜您是在Windows上,因为您使用了
\
作为路径分隔符;Windows还允许
/
用作路径分隔符,因此您可以通过将所有
\\
序列替换为
/
来解决问题(总体上看起来可能更干净)

下面是解释发生了什么(以及另一种解决问题的方法,它在视觉上更加混乱)的答案的较长版本


您确实正确,在
JSON
中,
\
字符是特殊的,并且引入了转义序列,因此为了在
JSON
字符串中包含一个文本
\
字符,您需要将其改为
\

但是,升华也支持自己的转义序列,因此在某些情况下,您需要在输入文件中使用比预期更多的转义字符,以获得所需的结果

sublime build
文件中,sublime将前缀为
$
的任何单词展开为变量,并用其值替换整个变量(例如,
$file
替换为当前文件的名称)。这也适用于前缀为
$
的任何序列,例如
$test
;在这种情况下,变量的值为空字符串,因此整个变量将替换为空字符串

此外,升华还将
\
字符在内部处理为“下一个字符不是特殊的”。因此,如果您需要在构建命令中的某个位置使用
$
字符(可能作为命令行参数或类似参数),您需要将其引用为
\$
,以告诉升华不要特别对待它

这是您在上面的输出中看到的;执行的命令包含文本
${file\u base\u name}
,因为升华看到字符串的方式告诉它不应该展开变量

下面的一些例子也许可以最好地说明原因:

"shell_cmd": "echo ${file}"
这将在生成输出中显示当前文件的名称

"shell_cmd": "echo \${file}
在这里,如果您尝试运行构建,什么也不会发生,但状态栏会显示
无构建系统
。其想法是告诉Sublime不要扩展变量,但实际上这是无效的
JSON
,因为当作为
JSON
数据处理时,
\$
不是有效的转义序列。因此,文件加载失败,因此没有要运行的构建系统

"shell_cmd": "echo \\${file}
当它被读取为
JSON
时,
\\
被替换为
\
,将字符串保留为升华将其视为
\${file}
。当它执行构建时,升华本身将
\$
替换为
$
,并且构建输出面板中的输出实际上是
${file}
(即没有扩展)

最后一个示例显示了在您的情况下发生的情况,
\\
告诉JSON加载程序,这应该是一个单一的
\
字符,这就是发生的情况。然而,升华随后将
\$
视为特殊字符

为了扩展文件路径和基本名称之间带有文本
\
的内容,您需要执行以下操作:

"shell_cmd": "echo ${file_path}\\\\${file_base_name}"
事件的顺序如下所示:

"shell_cmd": "echo ${file_path}\\\\${file_base_name}"
  • JSON
    加载器加载字符串并转换转义序列,因此每个
    \\
    都被转换为单个
    \
    ,使字符串保持升华为
    echo“${file\u path}\\\${file\u base\u name}”

  • 当Sublime执行构建时,它将
    \\
    视为单个
    \
    ,将完整处理的字符串保留为
    echo“${file\u path}\${file\u base\u name}”

  • 变量展开后,您将得到
    C:\Users\Me\Desktop\MyFile
    (或您所拥有的),这正是您想要的

  • 因此,解决问题的一种方法是将所有
    \\\\
    序列加倍,使它们成为
    \\\\\\
    ;然后
    JSON
    处理器将在加载文件时将其转换为您当前拥有的内容,升华将按照您的预期处理


    总的来说,这很棘手,但事实证明,在Windows上,您可以使用
    /
    作为路径分隔符,并且它的内部处理方式与其他方式相同,因此更快的解决方案是将
    \\
    替换为
    /
    ,这将为您提供相同的工作解决方案,而不会让您感到困惑。

    uestion提到知道你需要使用“\”(这是正确的),但是你得到的输出并不能反映你这样做了。你能不能也包括你的构建系统实际包含的内容?@OdatNurd在帖子中添加了完整的代码。谢谢你的回答!我开始失去希望了