你在 user settings 里关掉了 format-on-save、把默认模型设成 Sonnet 4.6。一打开团队仓库,保存就自动格式化、模型变成了别的(gpt-5.5 或 Composer 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 会在每一行旁边标出当前生效的来源(Workspace、User 或 Default)。这一屏就能告诉你该改哪一层。然后去改那一层,而不是改你的 user settings。
先判断你属于哪一类
| 现象 | 最可能的层级 | 快速检查 |
|---|---|---|
| 保存就格式化 / 格式化器不对 | .vscode/settings.json(editor.formatOnSave、editor.defaultFormatter) | Settings UI 里这个键标着 Workspace |
| 缩进大小 / 空格 vs Tab 变了 | 仓库根的 .editorconfig | cat .editorconfig |
| AI 功能(Composer、Tab、Cmd+K)被禁用 | .vscode/settings.json 里的 cursor.* 键 | 在 Workspace Settings (JSON) 里搜 cursor. |
| Cursor AI 扩展变灰 | .vscode/extensions.json 的 unwantedRecommendations | 扩展面板显示 “Disabled (Workspace)“ |
| 聊天里模型 / 规则不对 | .cursor/rules/*.mdc 或 .cursorrules | ls -la .cursor/rules/ |
| 只有打开某一个仓库时设置才不一样 | 多根 .code-workspace | File -> 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:description、globs、alwaysApply)。它改变的是 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,里面有 recommendations 和 unwantedRecommendations。如果某个 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 会给每个设置标上 Workspace、User 或 Default,一眼看出是哪一层覆盖了你的值。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。最干净的方式是用个人的全局 gitignore(git 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 跨设备同步,换新机器时不会再踩同一个坑。