Cursor 配置与 VS Code workspace 设置冲突

切到团队仓库后 Cursor 的格式化或 AI 行为突然变了?是仓库的 .vscode/settings.json 覆盖了你的用户设置。本文教你定位是哪一层生效。

你在 user settings 里关掉了 format-on-save、把默认模型设成 Sonnet 4.6。一打开团队仓库,保存就自动格式化、模型变成了别的(gpt-5.5Composer 2.5)、Tab 补全连提示都不弹了。其实什么都没坏。Cursor 基于 VS Code,继承了它的多层设置体系:Default -> User -> Workspace -> Folder,越靠近文件的层级优先级越高。仓库里 commit 进来的 .vscode/settings.json(以及 .cursor/ 配置)会悄悄压住你个人的偏好。

最快的修法: 打开出问题的文件,按 Cmd+Shift+P(Windows/Linux 是 Ctrl+Shift+P)-> Preferences: Open Settings (UI),搜索那个不对劲的键(比如 editor.formatOnSave)。Cursor 会在每一行旁边标出当前生效的来源(WorkspaceUserDefault)。这一屏就能告诉你该改哪一层。然后去改那一层,而不是改你的 user settings。

先判断你属于哪一类

现象最可能的层级快速检查
保存就格式化 / 格式化器不对.vscode/settings.jsoneditor.formatOnSaveeditor.defaultFormatterSettings UI 里这个键标着 Workspace
缩进大小 / 空格 vs Tab 变了仓库根的 .editorconfigcat .editorconfig
AI 功能(Composer、Tab、Cmd+K)被禁用.vscode/settings.json 里的 cursor.*在 Workspace Settings (JSON) 里搜 cursor.
Cursor AI 扩展变灰.vscode/extensions.jsonunwantedRecommendations扩展面板显示 “Disabled (Workspace)“
聊天里模型 / 规则不对.cursor/rules/*.mdc.cursorrulesls -la .cursor/rules/
只有打开某一个仓库时设置才不一样多根 .code-workspaceFile -> Open Recent:你打开的是 .code-workspace 吗?

常见原因

1. 仓库 .vscode/settings.json 覆盖了格式化和 AI 设置

团队为了统一风格 commit 了 .vscode/settings.json,里面既可能有编辑器键,也可能有 Cursor 专属键,例如:

{
  "editor.formatOnSave": true,
  "editor.defaultFormatter": "esbenp.prettier-vscode",
  "cursor.cpp.disabledLanguages": ["markdown"],
  "cursor.general.enableTab": false
}

最后两条在这个 workspace 里直接关掉了 Cursor 自己的功能。Cursor 的 cursor.* 键就是从 VS Code 同样的 .vscode/settings.json 各层级里读取的——它没有一个单独的项目级设置文件来放这些键(详见原因 2)。

如何判断Cmd+Shift+P -> Preferences: Open Workspace Settings (JSON),看有没有 cursor.* 开头的键,以及 editor.formatOnSave / editor.defaultFormatter

2. 仓库根的 .cursor/ 目录

这一点是大多数教程讲错的地方。截至 2026 年 6 月,.cursor/没有一个用来放编辑器或 AI 偏好的通用 .cursor/settings.json。根据 Cursor 官方文档,这个目录里放的是:

  • .cursor/rules/*.mdc —— 项目规则(Markdown + frontmatter:descriptionglobsalwaysApply)。它改变的是 AI 在这个仓库里写代码的方式。
  • .cursor/mcp.json —— 项目级的 MCP server 配置。

所以如果 AI 只在某个仓库里行为怪异(代码风格、框架假设、拒绝某些改动),要去看 rules,而不是去找一个并不存在的 settings 文件。仓库根如果有老式的单个 .cursorrules 文件,目前仍然有效。

如何判断ls -la .cursor/rules/,以及 cat .cursorrules 2>/dev/null

3. 多个 Prettier / ESLint 配置打架

仓库根有 .prettierrc,子目录里又有 .prettierrc.json,依赖里还装了带预设的插件。格式化器会选用离当前文件最近的那份配置,于是同一个项目里两个文件可能被格式化成不同样子。

如何判断:在一个出问题的文件里 Cmd+Shift+P -> Format Document With...,看默认格式化器是谁。

4. Workspace 的扩展启用 / 禁用清单

仓库可以 commit .vscode/extensions.json,里面有 recommendationsunwantedRecommendations。如果某个 Cursor 或 AI 扩展被列进 unwantedRecommendations,它在这个 workspace 就会显示为禁用,相关功能随之失灵。

如何判断:打开扩展面板,看那个扩展是不是显示 “Disabled (Workspace)“。

5. 多根 workspace(multi-root)优先级混乱

.code-workspace 文件可以挂多个文件夹,每个文件夹有自己的 .vscode/settings.json,外加 .code-workspace 文件本身顶层的一个 settings 块。生效顺序并不直观:.code-workspace 里的 settings 对所有文件夹都生效,而每个文件夹自己的 settings 只在该文件夹内生效。

如何判断:File -> Open Recent,看你打开的是 .code-workspace 文件还是单个文件夹。如果是 workspace 文件,直接去看它的 settings 块。

6. EditorConfig 静默覆盖

.editorconfig 里写 indent_size = 2,会盖掉你 user setting 里的 4,且界面上没有任何提示。VS Code 通过内置支持遵循 EditorConfig,对它覆盖的那些键(缩进、行尾、字符集)会直接生效。

如何判断:仓库根 cat .editorconfig

动手前先确认

  • 确认问题确实只在这个 workspace 里出现:换开另一个仓库(或一个空文件夹)测同一个动作。如果在那边正常,那原因就在本仓库的配置里,而不是你的安装。
  • .vscode/settings.json 前先开 branch 或 commit 一次,避免把团队配置弄乱。
  • 记下你的 Cursor 版本(Cmd+Shift+P -> About)和当前模型;不同版本默认值会变,Cursor 3.x 在某些面板里默认用自家的 Composer 2.5 模型。

需要收集的信息

  • Cursor 版本、操作系统。
  • 仓库根的 .vscode/settings.json.editorconfig.prettierrc* 全文,以及 ls -la .cursor/rules/
  • Cmd+Shift+P -> Developer: Open Settings (JSON) 看你的 User 层(方便对比 User 和 Workspace)。
  • 一条最小复现:在哪个文件、做什么动作、期望 / 实际行为分别是什么。

最短修复路径

按”先看清,再决定改哪一层”的顺序来。

Step 1:查清当前生效值的来源

Cmd+Shift+P -> Preferences: Open Settings (UI),搜索可疑键名(如 editor.formatOnSave)。Cursor 会给每个设置标上 WorkspaceUserDefault,一眼看出是哪一层覆盖了你的值。Cursor 自家的键,在同一个 UI 里搜 cursor. 即可。

Step 2:读仓库的覆盖项

cat .vscode/settings.json
ls -la .cursor/rules/ 2>/dev/null
cat .cursorrules 2>/dev/null
cat .editorconfig 2>/dev/null

把所有覆盖列成一张表:键名 -> 仓库的值 -> 你想要的值。这就是你的修复清单。

Step 3:决定改哪一层

  • 你能 commit 到仓库:直接改 .vscode/settings.json,让整个团队都用上修正后、达成共识的值。对于真正应该共享的偏好(格式化器、行尾),这才是正确的改法。

  • 你不能改仓库(fork、第三方 vendored 依赖、配置策略很严的大型 monorepo):VS Code 里没有”user 盖过 workspace”这种机制——workspace 层永远高于 user。可行的做法是:

    • 本地改 .vscode/settings.json 的值,但别把它提交进 git。最干净的方式是用个人的全局 gitignoregit config --global core.excludesfile ~/.gitignore_global,然后在里面加 .vscode/settings.json),这样你的本地改动在任何仓库里都不会被 stage。
    • 或者用你自己放在仓库外的 .code-workspace 文件来打开项目,把个人覆盖写进它顶层的 settings 块。

    注意:并不存在内置的 .vscode/settings.json.local 合并功能——VS Code 不会去读这样一个 .local 旁路文件。别指望它。

Step 4:处理 AI 专属覆盖

如果仓库设了比如 "cursor.general.enableTab": false,或用某个 cursor.* 键禁掉了 Composer:

  • 团队约定:保留它,理解团队为什么关。
  • 个人使用:把它改回来。application-scope 的 AI 开关在 Cursor Settings -> Features,以及 Cursor Settings -> Models(补全和 Composer 各自的默认模型)里。这里标为 application-scope 的设置不会被 workspace 覆盖;而写在 .vscode/settings.json 里、scope 为 workspace 的 cursor.* 键则会被覆盖——所以先用 Step 1 看清你在跟哪个 scope 较劲。

Step 5:重新启用被禁用的扩展

扩展面板 -> 找到那个扩展 -> 右键 -> Enable (Workspace)。如果没有这个选项,说明仓库用 .vscode/extensions.json 里的 unwantedRecommendations 主动屏蔽了它——删掉那一条(团队同意的话再 commit)。

Step 6:清理 Prettier 冲突

# 找出所有 Prettier 配置
find . -name ".prettierrc*" -not -path "./node_modules/*"
find . -name "prettier.config.*" -not -path "./node_modules/*"

只在仓库根保留一份配置,其余删掉,或让它们显式 extends 根配置。然后再跑一次 Format Document With...,确认默认格式化器已经对了。

怎么确认已经修好

  • 重新打开 Settings UI,确认这个键现在显示的是你想要的 scope(比如你删掉了 workspace 覆盖后它显示 User,或是修正后的 Workspace 值)。
  • 重启 Cursor 再触发一次原操作,排除是会话内的临时状态。
  • 切到另一个仓库(或另一台机器)复现,区分是 Cursor 配置问题还是本项目的状态问题。
  • 让同事打开同一个仓库重试,确认不是只有你的本地缓存被修好。

如果还是没修好

  • 把复现路径缩到最小:单文件、单格式化动作、关掉所有扩展(Cmd+Shift+P -> Extensions: Disable All Installed Extensions)。
  • 回滚最近一次 Cursor 升级,或最近一次 .vscode/settings.json 改动,再测一遍。
  • forum.cursor.com 搜 “workspace settings override”;附上你的 Cursor 版本和完整 .vscode/settings.json
  • View -> Output -> Cursor 的日志,贴到论坛的 Bug Reports 区。

预防建议

  • 加入任何新仓库的第一件事:cat .vscode/settings.json .editorconfig,以及 ls -la .cursor/rules/
  • 团队文档里写一节”Cursor 推荐设置”,省得每个人各自摸索。
  • 只把真正需要共享的键(格式化器、行尾、缩进)commit 进 .vscode/settings.json。个人偏好(主题、字体、AI 默认)放在 User settings 里,配合全局 gitignore,保证它们不会漏进仓库。
  • 给 AI 关键功能(Composer、Tab、Cmd+K)维护一份”必须开”清单,加进 onboarding checklist。
  • 打开 Cursor Sync(或 VS Code Settings Sync),让你的 user settings 跨设备同步,换新机器时不会再踩同一个坑。

相关阅读

标签: #排查 #Cursor #排查