我编写了一个自定义构建系统来编译和运行 cpp 文件,如下所示:
{
"cmd": [
"clang++",
"-o",
"$file_base_name.out",
"$file",
"&&",
"./$file_base_name.out"
],
"selector": "source.cpp",
"quiet": true
}
它没有显示在自动构建系统中,我认为这是由于无法识别selector
。我需要更改什么?
事实上,您使用的scope
选择器在这里不正确; C++文件的scope
是source.c++
而不是source.cpp
。在编辑文件时,可以使用菜单中的Tools > Developer > Show Scope Name
(或关联的键(查看当前光标位置的完整范围。对于构建系统,范围弹出窗口中的第一行是要使用的行。
您的构建还有另一个问题(您在评论中提到了(,即构建无法按预期工作。原因是您使用cmd
来执行构建,但您使用的是 shell 构造(&&
(。
在生成系统中指定cmd
时,需要提供字符串列表;第一项是要执行的程序的名称(此处为clang++
(,其余项是要提供给正在执行的程序的参数。
所以在这种情况下,你要求Sublime直接执行clang++
,你提供给它的参数之一是&&
,它假定它是一个文件的名称。目的是在程序成功编译时尝试运行程序,但使用&&
是 shell 的功能(例如bash
之类的(而不是clang
.
您可以尝试将"shell": true
添加到您的构建中,它告诉Sublime它应该尝试通过系统外壳执行cmd
;这会将所有内容作为一个整体传递给shell,shell确实知道如何处理&&
。
另一种选择是改用shell_cmd
;在这种情况下,您提供一个字符串来表示您将输入到终端中的命令行。在这种情况下,当您执行构建时,Sublime 会自动将值传递给 shell 执行。
在您的情况下,这可能如下所示:
"shell_cmd": "clang++ -o "${file_base_name}.out" "$file" && "./${file_base_name}.out"",
除了值是单个字符串之外,还必须注意,如果您的文件名可能包含空格,则需要将所有文件名参数括在双引号中,以便 shell 正确处理事情。