如何在 macOS 上的 Sublime Text 3 上自动 运行 C++11?

How to Automatically Run C++11 on Sublime Text 3 on macOS?

我想使用 Sublime Text 3 构建系统自动 运行 c++:

当我手动设置构建系统时有效:

> Tools > Build System > C++11

我应该更改什么才能设置,

> Tools > Build System > Automatic 

和运行 C++11?

C++11.build-系统

{
    "cmd": ["g++", "-std=c++11", "-o", "${file_path}/${file_base_name}", "${file}"],
    "file_regex": "^(..[^:]*):([0-9]+):?([0-9]+)?:? (.*)$",
    "working_dir": "${file_path}",
    "selector": "source.c, source.c++",
    "quiet": true,
    "variants":
    [
        {
            "name": "Run",
            "cmd": ["bash", "-c", "g++ '${file}' -o '${file_path}/${file_base_name}' && '${file_path}/${file_base_name}'"]
        },
        {
            "name": "Build without C++11",
            "cmd": ["g++ '${file}' -o '${file_path}/${file_base_name}'"]
        }
    ]
}

测试

#include <stdio.h>

int main()
{
    printf("Hello World!\n");
}

输出(手动)

Hello World!

输出(自动)

[Finished in 0.1s]

我的猜测是 运行 使用

> Tools > Build System > C++ Single File 

C++ 单File.build-系统:

// {
//  "shell_cmd": "g++ \"${file}\" -o \"${file_path}/${file_base_name}\"",
//  "file_regex": "^(..[^:]*):([0-9]+):?([0-9]+)?:? (.*)$",
//  "working_dir": "${file_path}",
//  "selector": "source.c++",

//  "variants":
//  [
//      {
//          "name": "Run",
//          "shell_cmd": "g++ \"${file}\" -o \"${file_path}/${file_base_name}\" && \"${file_path}/${file_base_name}\""
//      }
//  ]
// }

{
    "cmd": ["g++", "-std=c++11", "-o", "${file_path}/${file_base_name}", "${file}"],
    "file_regex": "^(..[^:]*):([0-9]+):?([0-9]+)?:? (.*)$",
    "working_dir": "${file_path}",
    "selector": "source.c, source.c++",

    "variants":
    [
        {
            "name": "Run",
            "cmd": ["bash", "-c", "g++ '${file}' -o '${file_path}/${file_base_name}' && '${file_path}/${file_base_name}'"]
        },
    {
            "name": "Run with C++11",
            "cmd": ["bash", "-c", "g++ '${file}' -std=c++11 -o '${file_path}/${file_base_name}' && '${file_path}/${file_base_name}'"]
        },
        {
            "name": "Build without C++11",
            "cmd": ["g++ '${file}' -o '${file_path}/${file_base_name}'"]
        }
    ]
}

Sublime 根据使用的语法为 Automatic 选择构建系统,这与构建系统中的 selector 相关联。对于 C,这是 source.c,对于 C++,它是 source.c++,依此类推。

当您选择 Tools > Build 时,Sublime 会将当前文件的语法与它当前知道的所有构建系统进行匹配,并据此进行选择。这里可能会发生一些不同的事情:

  1. 没有构建系统与文件范围关联;当您执行构建时,没有构建被 selected 并且 No Build System 显示在状态栏中。在这种情况下,什么也不会发生。

  2. 只有一个构建与范围关联;该构建被选择并直接执行。

  3. 与该范围关联的构建不止一个。第一次发生这种情况时,Sublime 会用一个快速面板提示您,询问您要执行什么构建,然后执行该构建。只要您保持构建系统设置不变,未来的构建将继续自动 select 并使用该构建。

重要的是要注意,当您在构建系统中使用 variant 时,虽然只有一个 sublime-build 文件,但该文件定义了多个构建,因此在这种情况下,#以上 3 自动适用。

从上面的构建系统来看,它似乎应该可以正常工作,特别是如果在 Tools > Build System 菜单中手动 selecting 构建系统可以达到您的预期。

您的自定义构建系统启用了 quiet: true,这会阻止 Sublime 显示执行时间(以及构建失败的错误信息),但在自动构建的情况下,您上面的输出看起来像是在打印 [Finished].

由此我同意,在这种情况下,Sublime 选择的构建系统与您预期的不同,这可能确实是内部构建(尽管根据您上面的输出,您可能已经修改了它)。

由于您提供的构建在您手动执行时有效,我的最佳猜测是您遇到了上面的情况 3;与文件范围匹配的版本不止一个。

在这种情况下,使用 Tools > Build With... 将使 Sublime 再次提示您选择所需的构建。这样做并确保选择所需的构建可能会为您解决问题。