升华文本3构建系统:JSON中的反斜杠
我想用MinGW通过升华文本编译一个c程序。 我需要运行的命令是:升华文本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
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}”
\\
视为单个\
,将完整处理的字符串保留为echo“${file\u path}\${file\u base\u name}”
C:\Users\Me\Desktop\MyFile
(或您所拥有的),这正是您想要的\\\\
序列加倍,使它们成为\\\\\\
;然后JSON
处理器将在加载文件时将其转换为您当前拥有的内容,升华将按照您的预期处理
总的来说,这很棘手,但事实证明,在Windows上,您可以使用
/
作为路径分隔符,并且它的内部处理方式与其他方式相同,因此更快的解决方案是将\\
替换为/
,这将为您提供相同的工作解决方案,而不会让您感到困惑。uestion提到知道你需要使用“\”(这是正确的),但是你得到的输出并不能反映你这样做了。你能不能也包括你的构建系统实际包含的内容?@OdatNurd在帖子中添加了完整的代码。谢谢你的回答!我开始失去希望了