设置为自动时不显示自定义生成系统

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++ 文件的 scopesource.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 能够正确处理。