Cursor 配置与 VS Code workspace 设置冲突

切到某个仓库后 Cursor 的格式化 / AI 行为变了——是仓库 .vscode/settings.json 覆盖了你的用户设置。

你在 user settings 里关掉了 format-on-save、把模型默认设成 sonnet。换到团队仓库后保存自动格式化又被打开、模型变成 gpt-5-codex、Tab 补全连提示都不弹了。原因是 Cursor 继承 VS Code 的多层设置体系:user → workspace → folder,越靠近文件的层级覆盖越上层。仓库里的 .vscode/settings.json.cursor/ 配置会直接压住你个人的偏好。

要修,先搞清楚是哪一层覆盖了什么。

常见原因

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

团队为了统一风格 commit 了 .vscode/settings.json,里面可能有:

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

最后两条直接关掉了 Cursor 自己的功能。

如何判断:Cmd+Shift+P → “Preferences: Open Workspace Settings (JSON)“,看是不是有 cursor.* 开头的键。

2. 仓库根的 .cursor/ 配置

Cursor 自家专属配置可能放在 .cursor/settings.json.cursor/rules/。这层比 .vscode/ 更优先于 Cursor 功能。

如何判断ls -la <repo-root>/.cursor/

3. 多个 prettier / eslint 配置打架

仓库根有 .prettierrc,子目录有 .prettierrc.json,依赖里又装了带预设的 prettier-plugin-*。Cursor 选用的是离当前文件最近的那份。

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

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

仓库可以 commit .vscode/extensions.json,推荐安装哪些扩展。配套的”workspace 禁用扩展”会让某些扩展只在这个 workspace 里失效——Cursor 的 AI 扩展若被禁用,AI 全部失灵。

如何判断:扩展面板 → 看你的 Cursor 扩展是否在当前 workspace 显示 “Disabled (Workspace)“。

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

.code-workspace 文件可以挂多个仓库,每个仓库可以有自己 settings;最终生效顺序复杂,常常和你预期相反。

如何判断:File → Open Recent,看打开的是 .code-workspace 还是单个文件夹。

6. EditorConfig 反向覆盖

.editorconfig 里写 indent_size = 2 会无视你 user settings 的 4,且不会有提示。

如何判断:仓库根 cat .editorconfig

动手前先确认

  • 确认问题是否只在这个 workspace 里出现——换开另一个仓库测同一行为,区分是个人设置还是 workspace 覆盖。
  • 复现前先 commit 一次或开 branch,避免改 .vscode/settings.json 把团队配置弄乱。
  • 记下 Cursor 版本和当前模型;不同版本默认值不一样。

需要收集的信息

  • Cursor 版本、操作系统。
  • 仓库根的 .vscode/settings.json.cursor/settings.json.editorconfig.prettierrc* 全文。
  • Cmd+Shift+P → “Developer: Show Active File Path” + “Preferences: Settings (JSON) → User” 截图。
  • 一条最小复现:在哪个文件、做什么动作、期望/实际行为。

最短修复路径

按”先看清再决定改哪层”顺序。

Step 1:查清当前设置的来源

Cmd+Shift+P → “Preferences: Open Settings (UI)“,搜索可疑键名(如 editor.formatOnSave)。Cursor 会在每个设置旁边标”来自 Workspace / User / Default”。这一步直接定位是哪一层覆盖。

Step 2:读仓库的 .vscode/settings.json

cat .vscode/settings.json
cat .cursor/settings.json 2>/dev/null
cat .editorconfig 2>/dev/null

把所有覆盖列在一张表上:键名 → 仓库的值 → 你想要的值。

Step 3:决定改哪层

  • 你能 commit 到仓库:直接改 .vscode/settings.json,让团队都受益。
  • 不能改仓库(fork / 第三方 / 大公司 monorepo):在 user settings 里设 "settings.applicationScope": true 是不够的,VS Code 没有”user overrides workspace”机制。改用 folder-level 覆盖(Cmd+Shift+P → “Preferences: Open Folder Settings”),放在 <folder>/.vscode/settings.json加入 .gitignore
# .gitignore(个人补丁)
.vscode/settings.json.local

或用 [Settings Sync] 把不同 workspace 的差异同步起来。

Step 4:处理 AI 专属覆盖

仓库设了 "cursor.composer.shouldAllowCustomModes": false

  • 团队约定:保留仓库设置,理解为啥关。
  • 个人用:在 Cursor → Settings → Features 里手动重新开(这层是 application-scope,不被 workspace 覆盖)。

Step 5:处理扩展被禁用

扩展面板 → 找到 Cursor 扩展 → 右键 → “Enable (Workspace)“。若没有这个选项,说明仓库根用 unwantedRecommendations 主动禁用,需要在 .vscode/extensions.json 里删那一条。

Step 6:清理多 prettier 冲突

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

只保留一份在仓库根,其它移除或显式 extends。

怎么确认已经修好

  • 重启 Cursor 后再触发一次原操作,确认不是会话内的临时状态。
  • 切换到另一个仓库 / 另一台机器复现,区分是 Cursor 配置问题还是项目本身问题。
  • 让同事打开同一个仓库重试,确认不是只有你的本地缓存被修好。

如果还是没修好

  • 把复现路径缩到最小:单文件、单格式化动作、不开任何扩展。
  • 回滚最近一次 Cursor 升级或 .vscode/settings.json 改动。
  • 在 forum.cursor.com 搜 “workspace settings override”;附 Cursor 版本 + 完整 settings.json。
  • 抓 View → Output → Cursor 的日志,贴 Bug Reports 频道。

预防建议

  • 加入新项目时第一件事:cat .vscode/settings.json .cursor/settings.json .editorconfig
  • 团队文档里写一节”Cursor 推荐设置”,避免每人各自摸索。
  • .vscode/settings.json 拆成 commit 版(团队共享)和 .local 版(个人,gitignore)。
  • 给 AI 关键功能(composer / tab / cmd+k)建立”必须开”清单,加进 onboarding checklist。
  • 用 Cursor Sync 把你的 user settings 跨设备同步,避免新机器又踩坑。

相关阅读

标签: #排查 #Cursor #排查