diff --git a/CHANGELOG.md b/CHANGELOG.md
index 7b38386..37f1e44 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,11 @@
# 更新日志 Change Log
+## \[3.1.2\]
+*2021.9.10*
+
+- 添加 CLI 中丢失的 `--compile-arg` 选项;
+- CLI 中增加新手模式 `-n`。
+
## \[3.1.1\]
*2021.9.9*
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 7fb5f8e..a48a269 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -1,6 +1,6 @@
cmake_minimum_required(VERSION 3.18.0)
-project(vscch3 VERSION 3.1.1)
+project(vscch3 VERSION 3.1.2)
set(CMAKE_CXX_STANDARD 20)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
diff --git a/mac_user_guide.md b/mac_user_guide.md
new file mode 100644
index 0000000..c4648f8
--- /dev/null
+++ b/mac_user_guide.md
@@ -0,0 +1,31 @@
+# VSCodeConfigHelper Mac 用户指南
+
+## 下载工具
+
+前往[工具主页](https://vscch3.vercel.app)下载此工具;然后,解压它;得到一个 `VSCodeConfigHelper_v3.x.x_mac` 文件夹。
+
+[启动终端应用程序](https://support.apple.com/zh-cn/guide/terminal/apd5265185d-f365-44cb-8b09-71a064a42125/mac)。键入 `cd `(cd空格),然后将刚才的文件夹拖入终端内,最后按下回车 return。(即输入了以下命令:
+```shell
+cd /Users/.../Downloads/VSCodeConfigHelper_v3.x.x_mac
+```
+。或者,如果你启用了在文件夹内打开终端的服务,你可以直接在该文件夹下打开终端。)
+
+## 首次设置
+
+在终端中键入 `./vscch` 并按回车。第一次启动时会提示因安全原因无法运行。此时打开苹果图标,定位到“系统偏好设置”-“安全性与隐私”,在“通用”选项卡的下方对 `vscch` 程序点击“仍然允许”。
+
+再次尝试启动工具,键入以下命令并按回车:
+```shell
+./vscch -n -w ~/Desktop/Cpp
+```
+注意这里 `-w` 后面是你要配置的工作区文件夹路径,这里使用了 `~/Desktop/Cpp`,即桌面下的 `Cpp` 文件夹。`-n` 选项表明启用新手模式。关于新手模式以及更多选项可通过 `./vscch -h` 查看。
+
+> 若使用新手模式,为了更好的体验,建议在终端的菜单栏中定位到“终端”-“偏好设置”-“Shell”,将“当Shell退出时”设置为“关闭窗口”。
+
+如果工具显示 `未安装 Xcode Command Line Tools,将进行安装` 的提示,则按照屏幕说明操作。安装 Xcode Command Line Tools 需要几分钟到数十分钟不等。安装完成后,再次执行上述命令来继续配置。
+
+## 配置完成
+
+工具配置完成后,若为新手模式(或带有 `--open-vscode` 选项),则工具会自动启动 VS Code 并打开工作区文件夹。尝试在该文件夹下编译、运行或调试 C++。
+
+**注意** Mac 并不支持内置终端。换而言之,不论是否启用 `--external-console` 进行配置,运行和调试时都会弹出终端窗口。但 `--external-console` 会使用更加美观的暂停脚本。若不使用 `--external-console`,则“当Shell退出时”不能设置为“关闭窗口”:否则运行时无法观察到程序输出结果。
\ No newline at end of file
diff --git a/src/cli.cpp b/src/cli.cpp
index c043062..82f48c2 100644
--- a/src/cli.cpp
+++ b/src/cli.cpp
@@ -200,6 +200,7 @@ void init(int argc, char** argv) {
ADD_OPTION_C("install-chinese", ShouldInstallL10n, "为 VS Code 安装中文语言包");
ADD_OPTION_C("offline-cpptools", OfflineInstallCCpp, "离线安装 C/C++ 扩展");
ADD_OPTION_C("uninstall-extensions", ShouldUninstallExtensions, "卸载多余的 VS Code 扩展");
+ ADD_OPTION_C("compile-arg,a", CompileArgs, "指定编译选项");
// ADD_OPTION_C("generate-test", GenerateTestFile, "");
#ifdef WINDOWS
ADD_OPTION_C("apply-nonascii-check", ApplyNonAsciiCheck,
@@ -222,12 +223,20 @@ void init(int argc, char** argv) {
// other options that cannot be parsed directly
std::string languageText;
- std::string modeText;
+ bool newbieMode;
// clang-format off
configOpt.add_options()
("language", po::value(&languageText)->default_value("c++"), "指定配置目标语言。可为 c++ 或 c")
("generate-test", "强制生成测试文件")
("no-generate-test", "不生成测试文件")
+ ("newbie-mode,n", po::bool_switch(&newbieMode)->default_value(false), "启用新手模式。这相当于以下选项:"
+ "--assume-yes --verbose --external-terminal --install-chinese"
+ " --offline-cpptools --uninstall-extensions --open-vscode"
+ " -a-Wall -a-Wextra"
+#ifdef WINDOWS
+ " --apply-nonascii-check"
+#endif
+ )
;
// clang-format on
@@ -246,10 +255,26 @@ void init(int argc, char** argv) {
options.UseGui = true;
}
#endif
+ if (newbieMode) {
+ options.AssumeYes = true;
+ options.UseExternalTerminal = true;
+ options.ShouldInstallL10n = true;
+ options.OfflineInstallCCpp = true;
+ options.ShouldUninstallExtensions = true;
+ options.OpenVscodeAfterConfig = true;
+ options.CompileArgs = {"-Wall", "-Wextra"};
+#ifdef WINDOWS
+ options.ApplyNonAsciiCheck = true;
+ if (Native::isGbkCp()) {
+ options.CompileArgs.emplace_back("-fexec-charset=GBK");
+ }
+#endif
+ }
preprocessOptions(allOpts);
if (parseError) {
LOG_ERR("命令行参数存在错误:", *parseError);
+ std::exit(1);
}
Native::checkSystemVersion();
diff --git a/src/generator.cpp b/src/generator.cpp
index edb5b81..e971372 100644
--- a/src/generator.cpp
+++ b/src/generator.cpp
@@ -440,7 +440,13 @@ std::string Generator::generateTestFile() {
}
LOG_INF("正在生成测试文件 ", filepath, "...");
const std::string compileHotkeyComment{
- "按下 "s + (options.UseExternalTerminal ? "F6" : "Ctrl + F5") + " 编译运行。"};
+ "按下 "s + (options.UseExternalTerminal ? "F6" :
+#ifdef MACOS
+ "⌃ F5"
+#else
+ "Ctrl + F5"
+#endif
+ ) + " 编译运行。"};
const std::string compileResultComment{"按下 "s +
(options.UseExternalTerminal
? "F6 后,您将在弹出的"
@@ -460,7 +466,13 @@ std::string Generator::generateTestFile() {
oss << '\n';
oss << c(compileHotkeyComment) << '\n';
oss << c("按下 F5 编译调试。") << '\n';
- oss << c("按下 Ctrl + Shift + B 编译,但不运行。") << '\n';
+ oss << c("按下 "
+#ifdef MACOS
+ "⌘ ⇧ B"
+#else
+ "Ctrl + Shift + B"
+#endif
+ " 编译,但不运行。") << '\n';
if (isCpp) {
oss << R"(
#include