设置为自动时不显示自定义生成系统
Custom Build System not displayed when set to Automatic
我写了一个自定义构建系统来编译和运行一个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 它应该尝试通过系统 shell 执行 cmd
;将所有内容作为一个整体传递给 shell,后者知道如何处理 &&
.
另一种选择是使用shell_cmd
;在这种情况下,您提供一个字符串来表示您将输入到终端的命令行。在这种情况下,当您执行构建时,Sublime 会自动将值传递给 shell 以供执行。
在你的情况下,这可能看起来像:
"shell_cmd": "clang++ -o \"${file_base_name}.out\" \"$file\" && \"./${file_base_name}.out\"",
除了值是单个字符串之外,还需要注意的是,如果您的文件名可能包含空格,您需要将所有文件名参数用双引号引起来,以便 shell 能够正确处理。
我写了一个自定义构建系统来编译和运行一个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 它应该尝试通过系统 shell 执行 cmd
;将所有内容作为一个整体传递给 shell,后者知道如何处理 &&
.
另一种选择是使用shell_cmd
;在这种情况下,您提供一个字符串来表示您将输入到终端的命令行。在这种情况下,当您执行构建时,Sublime 会自动将值传递给 shell 以供执行。
在你的情况下,这可能看起来像:
"shell_cmd": "clang++ -o \"${file_base_name}.out\" \"$file\" && \"./${file_base_name}.out\"",
除了值是单个字符串之外,还需要注意的是,如果您的文件名可能包含空格,您需要将所有文件名参数用双引号引起来,以便 shell 能够正确处理。