VSCode 的设置系统的粗浅理解
试图调整 VS Code 的 C/C++ 编译默认设置,结果却……
我需要一个默认的编译设置
众所周知,VSCode 的推荐或者说设计使用方法是对不同代码建立不同的工作区。这确实是对不同项目、不同语言的代码进行管理的优良方法。但是在学习的过程之中,不是所有情况都是非常理想的“我可以将所有的代码都井井有条的打在一个文件夹(工作区)中”的。学习中,QQ 上接收测试别人的代码、想临时测试某个功能是否如记忆一样等等情况,这样的代码,具有临时性或者独立性,我不希望将其和我固有的代码文件混淆在一起,又不希望记一个层层目录之下的草稿工作区分门别类。因此最理想的情况就是能在不打开特定工作区或文件夹的情况下对单个文件进行编译和调试。也就是一个全局的,或者说更通用的设置。
之前种种原因,对 VSCode 的设置理解停留在了一种一知半解的程度,借此机会,我希望能对此加深理解。
VSCode 中的设置的基本结构
优先级和工作区、文件夹
VSCode 的设置结构优先级由低到高是 “默认设置(不能更改)→ 用户设置 → 工作区设置 → 文件夹设置”。VSCode 会优先使用优先级高的设置,如果没有,就用优先级次高的设置。
知道写到这里我才注意到的一个事实是工作区(workspace)和文件夹(folder)是不一样的存在。我们可以认为一个“文件夹”是一个项目,一个工作区则是同类项目的集合点。例如所有的 Python 项目为一个工作区,而对其中的任意一个项目设置为单独的一个文件夹。Python 项目的共通性设置放于“工作区设置”中,而项目如果有特殊设置则放在“文件夹设置”里。
需要注意的是,如果只有一个文件夹,那么这个文件夹本身就是一个工作区。VSCode 会把这个文件夹设置显示为工作区设置,这也是为什么我会一开始没有发现这俩是不同概念的原因。
下面是工作区和文件夹在 VSCode 资源管理侧栏界面的对比,工作区会额外注明工作区二字。
设置文件的存储格式
所有这些设置,都是以 JSON 文件存储在电脑上的文件中的(尽管工作区文件不以.JSON
结尾)。JSON(JavaScript Object Notation) 是一种独立于 语言的轻量级数据交换格式,采用键和值的格式存储数据。 而VSCode 的每一项设置都是一对键和值。
其中,用户设置位于 VSCode 的数据目录下( C 盘 appData 文件夹下);工作区设置会是一个名为{名字.code-workspace
的文件(此文件不一定位于工作区文件夹内);如果是文件夹,则会存储于文件夹下自动生成的.vscode
文件夹下。
插件的设置
使用 VSCode 的时候,我们还会添加许多的插件,例如本文的初衷:在非工作区 / 文件夹环境下编译 C/C++ 程序就需要 MS 官方的 C/C++ 插件。这些插件的设置也会被写入到 Uersettings 文件中。因此,所有的插件和软件设置都是对同一个文件的内容的修改。既然目的是更改默认的编译软件,那么我们就是需要修改 Usersettings 文件即可.事情到这一步似乎离解决已经不远了。可是真的是这样吗?
结论
在设置中,我们找到了下面两个设置。第一个的设置具体还不是很懂,第二个则没有发挥作用(图中值为自己填的)。
所以很遗憾,事情没有以完美解决落幕。依然要选择编译和调试器如图:
不过,至少我搞清楚了为什么这里会有三个选项,在官方文档中提到,
The compilerPath search order is:
- First check for the Microsoft Visual C++ compiler
- Then look for g++ on Windows Subsystem for Linux (WSL)
- Then g++ for Mingw-w64.
因此,VSCode 会扫描到 mingw-w64 中的 cpp 和 g++ 两个程序,以及 VS 中带有的的 cl ,因此 VSCode 会有不知道用什么的疑问。但是 cl 被限制为只能在 VS 中使用,这也就导致了此选项实际上不能正常运行。目前的解决办法还得是选一遍,然后 VSCode 会在这一窗口中记住你的选择。
这一选项的原因可能是 VSCode 中的并没有选项能存储此默认设置,它会优先去寻找 launch.json
,找不到时,则会发出此疑问。
还没有理解的问题
- Q:既然 JSON 文件支持注释,那 JSON 和 JSONC(JSON with comments)有什么区别,为什么要创造 JSONC?VS Code 采用的是 JSON 还是 JSON with comments?