我编写了一个自定义生成系统来编译和运行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_cmd
;在这种情况下,您将提供一个字符串,代表您要输入到终端的命令行。在这种情况下,当您执行构建时,Sublime会自动将该值传递给Shell以执行。
在您的情况下,可能看起来像:
"shell_cmd": "clang++ -o \"${file_base_name}.out\" \"$file\" && \"./${file_base_name}.out\"",
除了作为单个字符串的值之外,还必须注意,如果文件名可能包含空格,则需要将所有文件名参数都用双引号引起来,以便外壳程序能够正确处理。