如何在 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 会将当前文件的语法与它当前知道的所有构建系统进行匹配,并据此进行选择。这里可能会发生一些不同的事情:
没有构建系统与文件范围关联;当您执行构建时,没有构建被 selected 并且 No Build System
显示在状态栏中。在这种情况下,什么也不会发生。
只有一个构建与范围关联;该构建被选择并直接执行。
与该范围关联的构建不止一个。第一次发生这种情况时,Sublime 会用一个快速面板提示您,询问您要执行什么构建,然后执行该构建。只要您保持构建系统设置不变,未来的构建将继续自动 select 并使用该构建。
重要的是要注意,当您在构建系统中使用 variant
时,虽然只有一个 sublime-build
文件,但该文件定义了多个构建,因此在这种情况下,#以上 3 自动适用。
从上面的构建系统来看,它似乎应该可以正常工作,特别是如果在 Tools > Build System
菜单中手动 selecting 构建系统可以达到您的预期。
您的自定义构建系统启用了 quiet: true
,这会阻止 Sublime 显示执行时间(以及构建失败的错误信息),但在自动构建的情况下,您上面的输出看起来像是在打印 [Finished]
.
由此我同意,在这种情况下,Sublime 选择的构建系统与您预期的不同,这可能确实是内部构建(尽管根据您上面的输出,您可能已经修改了它)。
由于您提供的构建在您手动执行时有效,我的最佳猜测是您遇到了上面的情况 3;与文件范围匹配的版本不止一个。
在这种情况下,使用 Tools > Build With...
将使 Sublime 再次提示您选择所需的构建。这样做并确保选择所需的构建可能会为您解决问题。
我想使用 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 会将当前文件的语法与它当前知道的所有构建系统进行匹配,并据此进行选择。这里可能会发生一些不同的事情:
没有构建系统与文件范围关联;当您执行构建时,没有构建被 selected 并且
No Build System
显示在状态栏中。在这种情况下,什么也不会发生。只有一个构建与范围关联;该构建被选择并直接执行。
与该范围关联的构建不止一个。第一次发生这种情况时,Sublime 会用一个快速面板提示您,询问您要执行什么构建,然后执行该构建。只要您保持构建系统设置不变,未来的构建将继续自动 select 并使用该构建。
重要的是要注意,当您在构建系统中使用 variant
时,虽然只有一个 sublime-build
文件,但该文件定义了多个构建,因此在这种情况下,#以上 3 自动适用。
从上面的构建系统来看,它似乎应该可以正常工作,特别是如果在 Tools > Build System
菜单中手动 selecting 构建系统可以达到您的预期。
您的自定义构建系统启用了 quiet: true
,这会阻止 Sublime 显示执行时间(以及构建失败的错误信息),但在自动构建的情况下,您上面的输出看起来像是在打印 [Finished]
.
由此我同意,在这种情况下,Sublime 选择的构建系统与您预期的不同,这可能确实是内部构建(尽管根据您上面的输出,您可能已经修改了它)。
由于您提供的构建在您手动执行时有效,我的最佳猜测是您遇到了上面的情况 3;与文件范围匹配的版本不止一个。
在这种情况下,使用 Tools > Build With...
将使 Sublime 再次提示您选择所需的构建。这样做并确保选择所需的构建可能会为您解决问题。