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

Sublimetext3 设置为“自动”时不显示自定义生成系统,sublimetext3,sublimetext,build-system,Sublimetext3,Sublimetext,Build System,我编写了一个自定义构建系统来编译和运行cpp文件,如下所示: { "cmd": [ "clang++", "-o", "$file_base_name.out", "$file", "&&", "./$file_base_name.out" ], "selector": "source.cpp", "quiet": true } 它没有显示在自动构建系

我编写了一个自定义构建系统来编译和运行cpp文件,如下所示:

{
    "cmd": [
        "clang++",
        "-o",
        "$file_base_name.out",
        "$file",
        "&&",
        "./$file_base_name.out"
    ],
    "selector": "source.cpp",
    "quiet": true
}
它没有显示在自动构建系统中,我认为这是由于选择器没有被识别。我需要更改什么?

实际上,您正在使用的范围选择器在这里不正确;C++文件的范围是源代码,C++而不是源代码。编辑文件时,可以使用菜单中的“工具”>“开发人员”>“显示作用域名称”或相关键查看当前光标位置的完整作用域。对于构建系统,范围弹出窗口中的第一行是您要使用的行

您的构建还有另一个问题,您在评论中提到,构建没有按预期工作。原因是您使用cmd执行构建,但使用shell构造&&

在生成系统中指定cmd时,提供字符串列表;第一项是要在这里执行的程序的名称,它是clang++,其余的项是要为正在执行的程序提供的参数

因此,在本例中,您要求Sublime直接执行clang++,您提供给它的参数之一是&,它假定是文件名。其目的是在程序成功编译时尝试运行该程序,但使用&&是shell的一个功能,例如bash或类似功能,而不是clang

您可以尝试将shell:true添加到您的构建中,这告诉Sublime它应该尝试通过系统shell执行cmd;它将所有内容作为一个整体传递给shell,shell知道如何处理&&

另一种选择是使用shell_cmd;在这种情况下,您将提供一个字符串,表示要输入终端的命令行。在这种情况下,当您执行构建时,升华会自动将值传递给shell以供执行

在您的情况下,这可能看起来像:

"shell_cmd": "clang++ -o \"${file_base_name}.out\" \"$file\" && \"./${file_base_name}.out\"",

除了作为单个字符串的值外,还需要注意的是,如果文件名可能包含空格,则需要将所有文件名参数用双引号括起来,以便shell能够正确处理问题。

它说:clang:error:没有这样的文件或目录:“&&&”,当我手动设置生成系统时,这在技术上是不应该发生的。谢谢!将选择器转换为源代码。C++运行。但我还是有问题。我使用cmd可以跨行分割命令。我包含shell:true,但是它说“Crang:错误:没有输入文件”{CMD:[CLAN+++,$file,-O,$FielyBaseNo.No.Ex.and /F.FielyBaseXNAME.OU],WorksIdir:$FILYPATH,选择器:Strut.C++,shell:true }第一个想法是确保您试图构建的文件存在于磁盘上,例如,如果您创建了一个全新的文件,并且从未保存它,那么它不会存在于磁盘上;在这种情况下,文件没有名称,$file扩展为空。如果不是这样,请尝试在我的答案中用shell_cmd替换cmd行,看看这是否有帮助。该文件确实存在。我现在很奇怪。我想我必须坚持使用shell\u cmd。我见过使用shell:true并不总是完全复制使用shell\u cmd所做的事情;我很确定这是Python的东西,因为Sublime只是使用一个标准的Python模块来生成子进程。