设置 三层架构 与 settings.json
很多人改 VSCode 设置的方式是「打开 UI → 翻几页 → 点开关 → 关掉」。
高级玩家从来不这样——他们直接写 settings.json,
把项目特化的设置放进 .vscode/settings.json 给团队,
用 @modified 一眼看穿自己改过哪些。
今天讲清三层架构、JSON 派的胜利、团队共享的最佳实践。
思维导图
设置的三层架构
VSCode 的每一项设置都来自四个来源之一: 默认值(Default)、用户级(User)、工作区(Workspace)、文件夹(Folder)。 它们从下到上覆盖——越靠近你正在编辑的文件,优先级越高。 理解这条规则,你就再也不会问「为什么我改了设置没生效」。
配置文件实际位置
| 层级 | 文件位置(macOS / Linux / Windows) | 谁来管 |
|---|---|---|
| Default | VSCode 安装目录内部,只读 | VSCode / 扩展作者 |
| User | ~/Library/Application Support/Code/User/settings.json~/.config/Code/User/settings.json%APPDATA%\Code\User\settings.json | 你自己 · 通过 Sync 跨设备 |
| Workspace | <项目根>/.vscode/settings.json | 团队 · git commit 共享 |
| Folder | <multi-root 中某 folder>/.vscode/settings.json | 仅 multi-root workspace 才有 |
Code 路径替换成 Code - Insiders,两者完全独立真实场景:一个 fontSize 的旅行
# Layer 1 · Default "editor.fontSize": 12 # VSCode 出厂默认 # Layer 2 · User (你的全局偏好) # ~/Library/.../User/settings.json "editor.fontSize": 14 # 你眼睛舒服的字号 → 覆盖 Default # Layer 3 · Workspace (这个项目要求) # projectA/.vscode/settings.json "editor.fontSize": 16 # 团队 README 演示用大字号 → 覆盖 User # Layer 4 · Folder (multi-root 内的子 folder) # projectA/legacy-module/.vscode/settings.json "editor.fontSize": 13 # 旧模块代码密 → 覆盖 Workspace # 最终生效值:13(最上层)
个人偏好放 User
字号、主题、字体、行号样式——只跟你的眼睛/手指有关,跨项目恒定。
项目规范放 Workspace
缩进 2 还是 4、用 Prettier 还是 Biome、tabs 还是 spaces——影响 git diff 的设置全放这里。
Folder 谨慎使用
只在 multi-root workspace 才用。绝大多数项目用不到——避免"层级越多越混乱"。
JSON 派的胜利:抛弃 UI 设置
Settings UI 是给新手的「引导轮」,等你能直接读 JSON 就该把它扔掉。 理由很硬:所有真相都在 JSON 里, UI 只是 JSON 的一种渲染。
UI 与 JSON 的对比
| 维度 | Settings UI | settings.json(JSON) |
|---|---|---|
| 覆盖率 | 不完整 — 部分扩展设置只能 JSON 改 | 100% — 所有设置项 |
| 编辑效率 | 找一项要翻 3 层菜单 | ⌘F 搜键名秒到 |
| 批量修改 | 逐个点 | 复制粘贴一段就行 |
| 版本控制 | 无法 git diff | 可 commit、可 review |
| IntelliSense | 有描述但难索引 | 键名 / 枚举值 / 描述全提示 |
| 跨机器复制 | 逐条对照 | 整文件 scp 过去 |
| 查找已改过的 | 看每项灰色"已修改"标记 | JSON 里就是你写过的全部 |
打开 JSON 的三种方式
# 方式 A · 命令面板(推荐) ⌘⇧P → Preferences: Open User Settings (JSON) ⌘⇧P → Preferences: Open Workspace Settings (JSON) ⌘⇧P → Preferences: Open Folder Settings (JSON) # multi-root 才有 ⌘⇧P → Preferences: Open Default Settings (JSON) # 只读 · 看默认值 # 方式 B · 从 UI 切到 JSON # Settings UI 右上角有个「{ }」图标 → 直接跳到对应 JSON # 方式 C · 直接打开文件 $ code ~/Library/Application\ Support/Code/User/settings.json
JSON 编辑时的 IntelliSense
在 settings.json 里按 ⌘空格 触发补全,VSCode 会列出所有可用设置项 —— 包括每一个扩展贡献的设置。
光标停在键名上还会浮出文档说明。这是 UI 永远做不到的「全局可索引」。
// settings.json — 输入时享受 IntelliSense { "editor.fo| // ← 在此 ⌘空格,下拉列出: // editor.fontFamily // editor.fontLigatures // editor.fontSize // editor.fontVariations // editor.fontWeight // editor.formatOnPaste // editor.formatOnSave // editor.formatOnType // ... }
团队共享:.vscode/ 目录
.vscode/ 目录是项目级配置的官方约定位置。
把它 commit 进 git,新人 clone 仓库时就自动继承团队规范——
不用再写"请把 tab 改成 2 个空格"的 README。
.vscode/ 目录三件套
settings.json
项目特化的 VSCode 设置 — 缩进、格式化工具、行尾规范、文件排除等。今天的主角。
extensions.json
推荐扩展清单 — 新人 clone 后 VSCode 会弹窗提示"是否安装这些扩展"。降低新人门槛。
launch.json · tasks.json
调试配置 / 自定义任务 — 后续 Day 10 / Day 14 详讲,今天先知道它们也住这里。
团队 .vscode/settings.json 模板
// .vscode/settings.json — 通用前后端项目 { // === 缩进与格式 === "editor.tabSize": 2, "editor.insertSpaces": true, "editor.detectIndentation": false, "files.eol": "\n", "files.insertFinalNewline": true, "files.trimTrailingWhitespace": true, // === 格式化 === "editor.formatOnSave": true, "editor.defaultFormatter": "esbenp.prettier-vscode", "[python]": { "editor.defaultFormatter": "charliermarsh.ruff", "editor.tabSize": 4 }, "[go]": { "editor.defaultFormatter": "golang.go", "editor.insertSpaces": false // Go 用 tabs }, // === 隐藏噪声 === "files.exclude": { "**/.git": true, "**/node_modules": true, "**/__pycache__": true, "**/dist": true }, "search.exclude": { "**/node_modules": true, "**/dist": true, "**/coverage": true, "pnpm-lock.yaml": true }, // === TypeScript 项目特化 === "typescript.tsdk": "node_modules/typescript/lib", "typescript.preferences.importModuleSpecifier": "non-relative", // === ESLint / Prettier 自动修复 === "editor.codeActionsOnSave": { "source.fixAll.eslint": "explicit", "source.organizeImports": "explicit" } }
.vscode/extensions.json 推荐扩展
// .vscode/extensions.json { // 新人 clone 后会被提示"是否安装这些扩展" "recommendations": [ "esbenp.prettier-vscode", "dbaeumer.vscode-eslint", "editorconfig.editorconfig", "streetsidesoftware.code-spell-checker", "eamodio.gitlens" ], // 不推荐的扩展(可选)— 装了会弹警告 "unwantedRecommendations": [ "hookyqr.beautify", // 与 Prettier 冲突 "ms-vscode.vscode-typescript-tslint-plugin" // TSLint 已废弃 ] }
什么该 commit、什么该 ignore
| 文件 | 建议 | 原因 |
|---|---|---|
| .vscode/settings.json | ✓ commit | 团队代码规范 — 缩进/格式化/排除等 |
| .vscode/extensions.json | ✓ commit | 降低新人门槛 — 自动推荐必备插件 |
| .vscode/launch.json | ✓ commit | 调试配置共享 — 团队成员一键跑同样的调试 |
| .vscode/tasks.json | ✓ commit | 构建任务共享 — 同上 |
| .vscode/*.code-snippets | 视项目 commit | 项目专用 snippet 共享,个人用的放 User |
| .editorconfig | ✓ commit(项目根,不在 .vscode/) | 跨编辑器统一缩进 — Vim/JetBrains/Sublime 同时受益 |
.vscode/secrets.json配合 .editorconfig
团队成员用不同编辑器(Vim / JetBrains / Cursor)时,.vscode/settings.json 只覆盖 VSCode。
用 .editorconfig 做更基础的规范——它被几乎所有主流编辑器原生或插件支持。
# 项目根 .editorconfig root = true [*] indent_style = space indent_size = 2 end_of_line = lf charset = utf-8 trim_trailing_whitespace = true insert_final_newline = true [*.{py,go}] indent_size = 4 [Makefile] indent_style = tab
Settings UI 过滤器与必备调优
就算坚定走 JSON 派,Settings UI 顶部那个搜索框也值得花 5 分钟学—— 它支持@ 前缀过滤器,是查阅默认值、审视改过哪些、按语言/功能筛选的利器。
六个常用过滤器
@id:editor.fontSize。比模糊搜索更快定位到唯一项。@lang:python。给 Python / Go / TS 单独调设置时必用。@feature:debug。按调试、终端、Git 等功能视角浏览。@ext:esbenp.prettier-vscode。集中调一个扩展的所有配置。@tag:experimental · @tag:preview 看实验性设置。用户级 settings.json 必备调优 — 我的 10 项
// ~/Library/.../User/settings.json — 装好就调,受益 21 天 { // 1. 字号 + 行高 "editor.fontSize": 14, "editor.lineHeight": 1.6, // 2. 字体连字(→ ≠ <= 等组合字符) "editor.fontFamily": "JetBrains Mono, Menlo, monospace", "editor.fontLigatures": true, // 3. 关掉烦人的小地图 "editor.minimap.enabled": false, // 4. Tab 在最近编辑顺序而不是位置顺序中切换 "workbench.editor.enablePreview": false, // 单击打开就 pin,不再被覆盖 // 5. 自动保存(防丢工作) "files.autoSave": "onFocusChange", // 6. 终端字体跟编辑器一致 + 滚动行数加大 "terminal.integrated.fontFamily": "JetBrains Mono", "terminal.integrated.scrollback": 10000, // 7. 平滑光标移动(视觉舒适) "editor.cursorBlinking": "smooth", "editor.cursorSmoothCaretAnimation": "on", // 8. 文件树缩进加大 + 启用嵌套 "workbench.tree.indent": 16, "explorer.fileNesting.enabled": true, // 9. 不要每次问"是否信任此工作区" "security.workspace.trust.untrustedFiles": "open", // 10. Git 自动 fetch + 显示 inline blame "git.autofetch": true, "git.confirmSync": false }
动手练习
今天的三个 Lab 把今天的所有内容串起来—— 验证优先级、建立团队模板、审视个人 dotfile。
Lab 1 — 三层覆盖实验
用 fontSize 这个肉眼可见的设置,验证 User → Workspace 的覆盖关系。
# 1. 准备工作区 $ cd ~/vscode-day01 && code . # 2. 在 User settings.json 设置一个明显字号 ⌘⇧P → Preferences: Open User Settings (JSON) # 添加: "editor.fontSize": 14 # 3. 切到 Workspace 层覆盖 ⌘⇧P → Preferences: Open Workspace Settings (JSON) # 该命令会自动创建 .vscode/settings.json,添加: "editor.fontSize": 22 # 4. 观察:编辑器字号立刻变成 22 # 5. 验证 UI 显示 ⌘⇧P → Preferences: Open Settings (UI) # 搜 fontSize 看到右边显示「Modified in: Workspace」 # 6. 删掉 .vscode/settings.json 的 fontSize # 编辑器立刻回到 14(User 层)
预期观察:看到一项设置时,UI 会标注它的覆盖来源(User / Workspace / Default Override / 等)——这是排查"为什么改了不生效"的关键信号。
Lab 2 — 给项目建一份 .vscode/ 模板
把上面 §03 的模板真正落地到一个测试项目里。
# 1. 创建测试项目 $ mkdir ~/vscode-day03-team && cd ~/vscode-day03-team $ git init $ mkdir .vscode # 2. 创建 settings.json(拷上面模板的简化版) $ cat > .vscode/settings.json <<'EOF' { "editor.tabSize": 2, "editor.insertSpaces": true, "editor.formatOnSave": true, "files.eol": "\n", "files.insertFinalNewline": true, "files.trimTrailingWhitespace": true, "files.exclude": { "**/node_modules": true, "**/dist": true } } EOF # 3. 创建 extensions.json 推荐扩展 $ cat > .vscode/extensions.json <<'EOF' { "recommendations": [ "esbenp.prettier-vscode", "editorconfig.editorconfig", "streetsidesoftware.code-spell-checker" ] } EOF # 4. 创建 .editorconfig 兜底 $ cat > .editorconfig <<'EOF' root = true [*] indent_style = space indent_size = 2 end_of_line = lf charset = utf-8 trim_trailing_whitespace = true insert_final_newline = true EOF # 5. commit 后用 code . 打开 $ git add . && git commit -m "chore: add VSCode workspace config" $ code .
预期观察:VSCode 右下角应该弹一个 toast「This workspace has extension recommendations」——这就是 extensions.json 在工作。
Lab 3 — 审视你的 User settings
用 @modified 过滤器看看你自己改过多少项,理清「真正在用」和「忘了为什么改」。
- ⌘⇧P →
Preferences: Open Settings (UI) - 在顶部搜索框输入
@modified - 列表里会显示所有你偏离默认值的设置项
- 对每一项问自己:"我为什么改了它?"
- 能说出原因 → 保留
- 不记得 → 改回默认值(点右侧齿轮 → Reset Setting)
- 切到 JSON 视图(⌘⇧P →
Open User Settings (JSON)) - 把剩下的项按主题分组 + 加注释(参考 §04 的"必备调优 10 项"格式)
三个 Lab 串起的认知
层级架构(懂规则)→ 团队模板(共享规则)→ 个人审视(拥有规则)。从此以后改设置,你都会问:「该写在哪一层?」
附加挑战
把整理好的 User settings.json 放进 git 仓库(如 ~/.dotfiles/vscode/),用软链接连回 VSCode 配置目录。这是真正的"dotfile 工作流",Day 21 复盘时会回到这里。
常见疑问
Q1 我改了 settings.json 但设置没生效,是什么原因? +
按这个顺序排查:(1) JSON 语法错——多写了个逗号、缺少引号。VSCode 编辑 JSON 时左下角会显示 ⚠️,先把它修了。(2) 被上层覆盖了——Settings UI 搜该键,看右边是否标注 "Modified in: Workspace"。如果是,意味着 .vscode/settings.json 里有同样的键覆盖了你。(3) 键名写错——某些扩展的设置改名了,旧名失效。用 IntelliSense(⌘空格)确认键名存在。(4) 需要 Reload Window——少数设置需要重载窗口,命令面板搜 Reload Window。
Q2 UI 上看到设置被覆盖怎么显示?我怎么知道生效的是哪一层? +
Settings UI 里每个设置项右侧会显示来源标签:Modified in: User / Modified in: Workspace / Default / Default Override (extension) 等。鼠标悬浮蓝色的"Modified in"链接,可以直接跳到对应的 JSON 文件那一行。另一招:命令面板搜 Preferences: Configure Language Specific Settings,能更精细地看每种语言下的最终生效值。
Q3
团队成员用 Cursor / NeoVim,.vscode/settings.json 还有意义吗?
+
分两层考虑:(1) Cursor 完全兼容—— Cursor 基于 VSCode fork,会读取同一个 .vscode/settings.json。所以 VSCode 用户和 Cursor 用户共享一份配置毫无问题。(2) NeoVim / JetBrains 不读这个文件——但他们都支持 .editorconfig。最佳实践:把编辑器无关的规范(缩进、行尾、字符集)写进 .editorconfig;把 VSCode 特化的设置(如 editor.formatOnSave、files.exclude)写进 .vscode/settings.json。两者互补不冲突。
Q4 公司项目里 .vscode/ 应该全 commit 还是 gitignore? +
团队项目必须 commit——理由:(1) 新人 clone 后立即拿到统一规范;(2) Code review 时设置变更可见;(3) 不会出现"我本地能跑你本地不能跑"。例外:.vscode/secrets.json 等可能含密钥的文件单独 ignore;个人偏好(如字体、字号)不要写进 Workspace 层,而是放 User 层。反面教材:很多公司 .gitignore 直接写 .vscode/——结果新人各自摸索,团队规范靠口口相传,最后代码风格四分五裂。
Q5 怎么查某个设置的默认值是什么? +
三个方法:(1) 命令面板 → Preferences: Open Default Settings (JSON)——这是 VSCode 全部内置设置的只读 JSON 文档,左侧带描述、右侧带默认值,是最权威的「设置百科」。(2) Settings UI——搜任意设置,没改过的项默认就显示默认值。(3) 右键齿轮 → Reset Setting——任意时候把一项重置回默认值。提示:Default Settings 文件超长(数千项),用 ⌘F 搜键名最快;不知道键名就先在 UI 找到,再点 { } 跳 JSON。
复盘问题
- VSCode 设置的四层架构是什么?它们的优先级从低到高是什么顺序?
- User 层和 Workspace 层在物理文件位置上分别是什么?
- 为什么直接编辑 settings.json 比用 Settings UI 更高效?至少举出 3 个理由。
.vscode/settings.json和.editorconfig的分工是什么?为什么需要两份?@modified/@lang:python/@ext:esbenp.prettier-vscode三个过滤器分别在什么场景用?
今日检查清单
- 能在白板上画出 Default → User → Workspace → Folder 四层架构
- 知道自己 User
settings.json的物理路径 - 能熟练用 ⌘⇧P →
Open User Settings (JSON)直接进 JSON - 会用
@modified过滤器看自己改过哪些设置 - 完成 Lab 1:验证了 Workspace 覆盖 User 的现象
- 完成 Lab 2:给一个测试项目建立了
.vscode/settings.json+extensions.json+.editorconfig - 完成 Lab 3:整理了 User
settings.json,按主题分组并加了注释 - 能回答 Q/A 5 个常见疑问
推荐阅读
User and Workspace Settings
VSCode 官方对设置系统的完整说明。四层架构、JSON 与 UI 对照、过滤器用法都来自这里。
Default Settings JSON
命令面板 Open Default Settings (JSON) 打开的那个文件——VSCode 全部内置设置的索引,堪称「设置百科」。
EditorConfig.org
.editorconfig 规范官方网站。支持的编辑器列表 + 属性全集 + 实例。建议给每个新项目都加一份。
Day 04 预告
基础导航与选择 — 用键盘在文件里飞
明天进入编辑器内功阶段第一天。会拆解 VSCode 最核心的导航三件套(⌘P 文件 / ⌘T 符号 / ⌃G 行号)、行操作四件套(删行/复制行/上下移动/合并)、以及光标快速移动(按词/按括号/按符号定义)。这些是后续多光标、重构、调试的基础——值得花一天死练。