加载中...
独立设置任务终端
第1节:MSYS2+GCC 安装与应用
第2节:安装配置 VSCODE,理解「配置」和「设置」的区别
第3节:C/C++简捷项目专用配置
第4节:让C/C++简捷项目支持多文件编译
第5节:备战大项目:CMake专项配置
第6节:集成 AI 助手——MarsCode
第7节:集成MSys2终端与三方库安装示例
第8节:安装 Git for Windows
第9节:Go 开发环境搭建(Windows)
第10节:3分钟集成UTF8编码终端
第11节:独立设置任务终端
课文封面

为 vscode 中的任务(Task)配置独立的终端程序,避免和上一节设置的默认嵌入终端冲突。

上一节课,我们在 “CMake 专项配置” 下,为 vs-code 的集成(Integrade)终端,设置了启动后自动切换编码,从而三分钟轻松实现 vs-code 集成终端自动采用 utf-8 编码,避免我们同样采用 utf-8 编码的 C++ 程序在 vs-code 集成终端中运行时,汉字变成乱码。

不过,这个设置,也会带一些问题。在说问题之前,我们先来吐槽一下 Windows 的一些设计……

1. Windows 控制台修改编码的糟糕设计

当时,我们为 vs-code 的集成(Integrade)终端,设置启动后自动切换编码的JSON项如下:

"Command Prompt (utf8)": { "path": [ "${env:windir}\\Sysnative\\cmd.exe", "${env:windir}\\System32\\cmd.exe" ], "args": [ "/k", "chcp 65001 >nul" ], "icon": "terminal-cmd", "overrideName": true },

其中最 重点 是参数 “args” 中的 “/k” 和 “chcp 65001 >nul”,它们和控制台程序一起,最终组成这么一行命令:

cmd.exe /k chcp 65001 >nul

该命令行先执行 cmd.exe ,然后由 cmd.exe 程序再执行 chcp 65001 >nul —— 确实能将控制台改为 65001 (utf-8)编码,但事实上,必须先启动控制台程序(cmd.exe),再由后者主动切换自身编码的设计,是 Windows 众多糟糕的设计中一个。

现在,假设,为了完成某事,我们需要在 cmd.exe 启动后,让它执行另一个指令,比说,启动 a.exe ,我们就得知道这个 cmd.exe 之前是不是已经需先执行一个指令了,比如刚刚提到的 chcp 65001 >nul ,如果有,就得用到连字符 & 来将两个指令“连”在一起。并且,由于第一个指令中带有空格,必须将双引号将所要执行的所有任务 “包” 起来……所以,最终修改目标是:

cmd.exe /k "chcp 65001 >nul & a.exe"

也就是说,想要在原来的基础上,再执行一个 “a.exe” 的人,不仅必须知道当前 cmd.exe 是否有既定要执行的指令,而且还需要去修改它(在合适位置插入一个 " )……

大家都是程序员,是不是都很熟悉一个设计原则:对修改封闭,对追加开放 ?上面的设计显然相反:仅仅是要追加一个功能,却不得不修改原有功能的实现……

那么一个好的控制台(终端),应该如何设置编码?
答:通常应设置为,控制台在启动时,从部(包括命令行)读入配置。类似 Linux / Unix ,它们会设计成: env="encoding=65001" & cmd.exe

2. 问题

问题就是:vs-code 也不喜欢 Windows 控制台的这种设计,并且拒绝为它擦屁股。

在 vs-code 中,我们可以方便地配置一些任务(Task),其中有很多任务需要在控制台下运行,而且,因为需要显示汉字,因此这个控制台又最好已经执行了 “chcp 65001” 的指令。假设我们要执行的任务是 echo 你好! ——显然,此时需要如下指令:

cmd.exe /k "chcp 65001 >nul & echo 你好"

然而,vs-code 完全拒绝做这个工作,它会直接再拼一个 “/k …”,于是得到:

cmd.exe /k chcp 65001 >nul /k echo 你好

这是一个 Windows 完全不认的命令行语法。

上一节,我们是在 CMake 专项配置下做的设置,而 vs-code 的 CMake 相关扩展,自行处理了程序的编译、构建、调试等任务,而无需我们自行配置任务,因此这个问题就被绕过去了。但是,在 vs-code中,管理任何一个稍微复杂一点的开发项目,自行配置任务就可能躲不过去。

以我为例,工作项目中,我喜欢 CMake 中的编译、构建、调试操作,都以任务的方式设置成和别的语言的项目相同。比如说,一个实际的大项目可能既有 C++ 程序要开发,也有 golang 程序要开发,二者都用 vs-code 管理,这时,若热键不一致,我就得随时在脑海里提醒自己:这是 CMake 项目,构建时需按下 F7 ,而这是 golang 项目,构建时需按下 Ctrl + Shift + B ……容易头秃。

3. 解决

解决办法倒是超级简单。

vs-code 允许我们为 “任务” ,单独设置需要的控制台(终端)程序(如果不单独设置,它走的就是上一节课我们设置的默认控制台)。

切换到 CMake 专项配置下,而后通过 Ctrl + , 打开配置,选择 “用户” 栏,再于 “搜索设置” 编辑栏内输入:Terminal Intergrated Automation Windows,找到对应标题的设置项,如下:

Terminal Intergrated Automation Windows

点击 “在 settings.json 中编辑”,将在编辑器中,进入 “terminal.integrated.automationProfile.windows” JSON 项,输入 “path” : “cmd.exe”,最终得到:

"terminal.integrated.automationProfile.windows": { "path": "cmd.exe" }

保存、关闭,然后你可以尝试在 CMake 项目里,手动添加一个 Shell 任务,它将直接使用 cmd.exe 加 /k 去执行,避免前面说的问题。