10 年 IDEA 用户的 Cursor 改造记:保住肌肉记忆,换来 AI 火力
写给那些"离不开 IDEA 的视网膜印象,又被 Cursor 的 Tab/Composer 反复种草"的人。
适用环境:macOS (Windows / Linux 仅路径不同)。
本文测试环境:macOS、Cursor 3.x、IntelliJ IDEA 2025.x、Extension Pack for Java。Cursor 与扩展更新较快,若界面名称有变化,以当前版本的 Settings / Command Palette 为准。
写在前面:为什么要把 Cursor 装成 IDEA
我用 IntelliJ IDEA 写 Java 整整 10 年。Cmd + N 找类、Double Shift 全局搜索、Cmd + B 跳定义、Ctrl + T 调出 Refactor 菜单 —— 这些不是快捷键,是肌肉记忆。Light 主题的关键字蓝、字符串绿、注释灰斜体,已经印在视网膜上,换一种配色我看错代码的概率会肉眼可见地上升。
但 Cursor 的 Tab 自动补全、Chat、Composer、Agent,用过一周就回不去了。让 IDEA 装上 AI 插件可以,但永远是"外挂";Cursor 是从第一天就把 LLM 当成一等公民来设计的。
矛盾点很清楚:我不想丢掉 10 年的肌肉记忆,也不想丢掉 Cursor 的 AI 火力。这篇文章就是这个矛盾的解决方案:把 Cursor 的"皮"调成 IDEA,再用 Cursor 的"魂"(AI 能力)。
一、目标效果清单
配置完成后应达到:
- 亮色主题:
IntelliJ IDEA New UI Light with Light Header - 字体:
Cousine for Powerline,13 号,行高 1.1 倍,关闭连字 - Java 语法色与 IDEA
Light配色方案一致 (关键字蓝、字符串绿、注释灰斜体等) import/package:import为蓝色,包名和类名为黑色- 左侧竖向 Activity Bar,JetBrains 文件图标 (红色 J)
- 资源管理器紧凑包路径:
java\com.alibaba.lazada... - 关闭括号彩虹色、Minimap、Java 语义高亮 (避免颜色被二次覆盖)
- 快捷键:IDEA 键位扩展 + 自定义
keybindings.json(格式化、跳转、导航等) - 调试器 Step Into 行为与 IDEA 一致(自动跳过标准库/框架层)
- 编辑器行为对齐:自动保存、文件末尾换行、Diff 视图显示空白差异
二、前置准备
2.1 安装字体 (与 IDEA 一致)
IDEA 中使用的是 Cousine for Powerline。
macOS 检查是否已安装:
fc-list | grep -i "Cousine for Powerline"
若未安装,可从 Nerd Fonts / Powerline 字体仓库 下载 Cousine 系列,安装到 ~/Library/Fonts/ 后重启 Cursor。
2.2 使用 Editor Window (重要)
Cursor 3.x 有 Agents Window 和 Editor Window 两种布局。
- 配置主题、Inline Diffs 等选项仅在 Editor Window 下完整可见
- 右上角切换到 Editor Window 后再改设置
2.3 打开 Cursor 用户配置
配置文件路径 (macOS):
~/Library/Application Support/Cursor/User/settings.json
打开方式:
Cmd + Shift + P→ 输入Preferences: Open User Settings (JSON)
三、安装扩展 (命令行)
在终端执行 (需已安装 cursor CLI):
# 主题 (必选)
cursor --install-extension compassak.intellij-idea-new-ui
# 文件图标 + Product 图标 (必选)
cursor --install-extension ardonplay.vscode-jetbrains-icon-theme
cursor --install-extension ardonplay.jetbrains-idea-product-icon-theme
# Java 项目树 (若未装 Java 扩展包可跳过,一般已有)
cursor --install-extension vscjava.vscode-java-pack
# IDEA 快捷键映射 (推荐)
cursor --install-extension k--kato.intellij-idea-keybindings
# Claude Code CLI 官方扩展 (可选,若你同时使用 Claude Code)
cursor --install-extension anthropic.claude-code
# 复制 Java 全限定名 (可选,配合后文 Shift+Cmd+C)
cursor --install-extension sandipchitale.vscode-fqn
# Cursor ↔ IDEA 互跳 (可选,需本机已装 IntelliJ IDEA)
cursor --install-extension qczone.switch2idea
安装后执行 Cmd + Shift + P → Developer: Reload Window。
若主题提示「未安装」,多半是
compassak.intellij-idea-new-ui扩展缺失,重新安装并 Reload。
四、UI 中的可选设置
4.1 Agent 改动确认方式 (Keep / 自动应用)
| 需求 | 操作 |
|---|---|
| 需要 Keep / Undo 审查 AI 改动 | Cursor Settings → Agents → Applying Changes → 开启 Inline Diffs |
| 信任当前工作区、希望减少确认步骤 | 关闭 Inline Diffs (即 Auto Keep 模式) |
弹窗里叫 Auto Keep,设置里叫 Inline Diffs。建议新项目、生产仓库、大范围重构时保留 Inline Diffs,先审查再应用;只有在可回滚的本地分支里,才考虑关闭确认。
4.2 切换颜色主题 (图形界面)
Cmd + K → Cmd + T → 选择 IntelliJ IDEA New UI Light with Light Header
五、快捷键配置 (keybindings)
5.1 基础键位:IntelliJ IDEA Keybindings 扩展
安装扩展后,大部分 IDEA 常用快捷键会自动生效 (如 Cmd + N 查找类、Cmd + Shift + N 查找文件、Alt + Enter 快速修复等)。
验证是否生效:
Cmd + Shift + P→ 输入Preferences: Open Keyboard Shortcuts- 右上角 … → Extension Keybindings,应能看到 IntelliJ IDEA Keybindings 条目
5.2 自定义覆盖 (与当前环境一致)
扩展无法覆盖所有习惯,建议在 keybindings.json 中追加下列配置。
配置文件路径 (macOS):
~/Library/Application Support/Cursor/User/keybindings.json
打开方式:
Cmd + Shift + P→ Preferences: Open Keyboard Shortcuts (JSON)
将以下内容完整粘贴到 keybindings.json (若已有其他绑定,合并数组即可;注意 JSON 逗号):
// Place your key bindings in this file to override the defaults
[
{
"key": "cmd+b",
"command": "-workbench.action.toggleSidebarVisibility"
},
{
"key": "cmd+b",
"command": "editor.action.revealDefinition",
"when": "editorHasDefinitionProvider && editorTextFocus && !isInEmbeddedEditor"
},
{
"key": "cmd+alt+l",
"command": "editor.action.formatDocument",
"when": "editorHasDocumentFormattingProvider && editorTextFocus && !editorReadonly && !inCompositeEditor"
},
{
"key": "shift+alt+f",
"command": "-editor.action.formatDocument",
"when": "editorHasDocumentFormattingProvider && editorTextFocus && !editorReadonly && !inCompositeEditor"
},
{
"key": "cmd+f12",
"command": "-editor.action.goToImplementation",
"when": "editorHasImplementationProvider && editorTextFocus"
},
{
"key": "alt+cmd+b",
"command": "-workbench.action.toggleAuxiliaryBar"
},
{
"key": "alt+cmd+b",
"command": "editor.action.goToImplementation"
},
{
"key": "shift+cmd+b",
"command": "-workbench.action.tasks.build",
"when": "taskCommandsRegistered"
},
{
"key": "shift+cmd+b",
"command": "workbench.action.toggleAuxiliaryBar"
},
{
"key": "cmd+]",
"command": "-editor.action.indentLines",
"when": "editorTextFocus && !editorReadonly"
},
{
"key": "cmd+[",
"command": "-editor.action.outdentLines",
"when": "editorTextFocus && !editorReadonly"
},
{
"key": "browserback",
"command": "-workbench.action.navigateBack",
"when": "canNavigateBack"
},
{
"key": "cmd+[",
"command": "workbench.action.navigateBack",
"when": "canNavigateBack"
},
{
"key": "cmd+]",
"command": "workbench.action.navigateForward",
"when": "canNavigateForward"
},
{
"key": "shift+cmd+c",
"command": "vscode-copy-fqn.copy-fqn"
},
{
"key": "shift+cmd+c",
"command": "-workbench.action.terminal.openNativeConsole",
"when": "!terminalFocus"
},
{
"key": "cmd+; shift+cmd+c",
"command": "-testing.coverageAtCursor",
"when": "editorTextFocus"
},
{
"key": "shift+cmd+c",
"command": "-extension.copyReference",
"when": "editorTextFocus"
},
{
"key": "shift+alt+cmd+c",
"command": "-copyRelativeFilePath",
"when": "!editorFocus"
},
{
"key": "cmd+r shift+alt+cmd+c",
"command": "-copyRelativeFilePath",
"when": "editorFocus"
},
{
"key": "shift+alt+cmd+c",
"command": "-java.view.package.copyRelativeFilePath",
"when": "focusedView == 'javaProjectExplorer' && java:serverMode == 'Standard'"
},
{
"key": "ctrl+shift+alt+cmd+c",
"command": "editor.action.pasteAs"
},
// ===== IDEA 肌肉记忆映射 =====
// Recent Files:IDEA Cmd+E -> 最近编辑器 (MRU) 选择器
{
"key": "cmd+e",
"command": "-actions.findWithSelection"
},
{
"key": "cmd+e",
"command": "workbench.action.showAllEditorsByMostRecentlyUsed"
},
// Refactor This:IDEA Ctrl+T -> 重构菜单
{
"key": "ctrl+t",
"command": "editor.action.refactor",
"when": "editorHasCodeActionsProvider && editorTextFocus && !editorReadonly"
},
// Find Usages:IDEA Alt+F7 -> References 视图(侧栏列出全部引用)
{
"key": "alt+f7",
"command": "references-view.findReferences",
"when": "editorHasReferenceProvider && editorTextFocus"
},
// Show Usages:IDEA Cmd+Alt+F7 -> Peek References(弹窗预览)
{
"key": "cmd+alt+f7",
"command": "editor.action.referenceSearch.trigger",
"when": "editorHasReferenceProvider && editorTextFocus && !inReferenceSearchEditor && !isInEmbeddedEditor"
},
// Run:IDEA Ctrl+R -> 运行(不调试)
{
"key": "ctrl+r",
"command": "workbench.action.debug.run",
"when": "!terminalFocus"
},
// Debug:IDEA Ctrl+D -> 开始调试
{
"key": "ctrl+d",
"command": "workbench.action.debug.start",
"when": "!terminalFocus && !inDebugMode"
},
// Run/Debug 配置面板:IDEA 选择运行配置 -> 选择并启动
{
"key": "ctrl+alt+r",
"command": "workbench.action.debug.selectandstart"
},
// Project Structure:IDEA Cmd+; -> 聚焦 Java Projects 视图
{
"key": "cmd+;",
"command": "javaProjectExplorer.focus"
}
]
vscode-copy-fqn.copy-fqn依赖扩展 Copy FQN (如sandipchitale.vscode-fqn)。若未安装,可删除shift+cmd+c两条或改为你自己的复制全限定名命令。
macOS 上
Ctrl + R/Ctrl + D不会和多光标冲突(多光标是Cmd + D),所以能忠实还原 IDEA 的 Run / Debug 键位;两者都带了!terminalFocus,终端里的Ctrl + R(反向搜索)/Ctrl + D(EOF)照常可用。
5.3 Switch2IDEA (可选)
若本机同时安装了 IntelliJ IDEA,可用 Switch2IDEA 在 Cursor 与 IDEA 间跳转:
| 快捷键 | 作用 |
|---|---|
Alt + Shift + O |
在 IDEA 中打开当前文件 (同光标位置) |
Alt + Shift + P |
在 IDEA 中打开当前项目 |
settings.json 中可配置 IDEA 路径 (按本机实际路径修改):
{
"switch2idea.ideaPath": "/Applications/IntelliJ IDEA.app/Contents/MacOS/idea"
}
5.4 IDEA 习惯 → Cursor 对应(肌肉记忆完整映射)
快捷键扩展 + 自定义 keybindings.json 共同覆盖了下表所有操作。带 ✅ 的是本文已映射或开箱即用的项;"详见第X节"指向本文对应章节。
| IDEA 操作 | IDEA 快捷键 | Cursor 对应 | 备注 |
|---|---|---|---|
| Search Everywhere | Double Shift |
Cmd + P(文件) / Cmd + Shift + P(命令) |
Cursor 没有合一的全局搜索,需要按场景分流 |
| Find Action | Cmd + Shift + A |
Cmd + Shift + P |
命令面板就是 Find Action |
| Recent Files | Cmd + E |
Cmd + E(最近文件 MRU 选择器) |
✅ 本文已映射 |
| Recent Locations | Cmd + Shift + E |
Cmd + Alt + - / Cmd + Alt + + |
即跳转历史 |
| Refactor This 菜单 | Ctrl + T |
Ctrl + T(重构菜单 editor.action.refactor) |
✅ 本文已映射;重型重构推荐直接让 Cursor Agent 做 |
| Rename | Shift + F6 |
F2 |
已被 IDEA Keybindings 扩展映射 |
| Extract Variable / Method | Cmd + Alt + V / M |
选中后 Ctrl + T → Refactor,或直接让 Composer 提取 |
详见第十一节 |
| Find Usages | Alt + F7 |
Alt + F7(References 视图列全部引用) |
✅ 本文已映射 |
| Show Usages | Cmd + Alt + F7 |
Cmd + Alt + F7(Peek References 弹窗) |
✅ 本文已映射 |
| Show Implementations | Cmd + Alt + B |
Alt + Cmd + B(本文已映射) |
✅ |
| Go to Type Declaration | Cmd + Shift + B |
Cmd + F12 |
|
| File Structure | Cmd + F12 |
Cmd + Shift + O(本文已映射) |
✅ |
| Reformat Code | Cmd + Alt + L |
Cmd + Alt + L(本文已映射) |
✅ |
| Optimize Imports | Ctrl + Alt + O |
保存时自动(java.saveActions.organizeImports,见第六节) |
✅ |
| Project Structure | Cmd + ; |
Cmd + ;(聚焦 Java Projects 视图) |
✅ 本文已映射;完整模块/JDK 管理见第十节 |
| Run | Ctrl + R |
Ctrl + R(运行,不调试) |
✅ 本文已映射 |
| Debug | Ctrl + D |
Ctrl + D(开始调试) |
✅ 本文已映射 |
| Run / Debug 配置面板 | 顶栏配置下拉 | Ctrl + Alt + R(选择并启动)+ .vscode/launch.json |
✅ 本文已映射;详见第十节 |
| Maven / Gradle 工具窗口 | 右侧工具窗口 | Java Projects 视图 + 命令面板 Java: ... |
远不如 IDEA 顺手,但够用 |
| Database Tool | 右侧 Database | 装 cweijan.vscode-database-client2 或保留 DataGrip |
不建议在 Cursor 里强求 |
| Git 工具窗口 | 左下 Git | 左侧 Source Control 面板 | VS Code 系传统强项,过渡无痛 |
Live Templates (psvm / sout / fori) |
直接键入触发 | 见第十节 Live Templates 替代方案 | 这是最难迁移的部分 |
Postfix Completion (.var / .sout) |
直接键入触发 | Java 扩展部分支持,更推荐让 Tab 接管 | 见第十一节 |
| Terminal | Alt + F12 |
Cmd + G / Alt + F12 |
✅ 本文已映射 |
| Copy Reference | Cmd + Alt + Shift + C |
Shift + Cmd + C |
✅ 本文已映射 |
迁移前两周可以把这张表单独保存,遇到肌肉记忆卡住时直接查。
六、settings.json 配置 (核心)
将下面 JSON 合并进 settings.json (若键已存在则覆盖为下列值)。
说明:
- 不含个人路径 (Maven、JDK 等),那些请保留你自己机器上的配置
editor.tokenColorCustomizations与workbench.colorCustomizations是还原 IDEA 语法色和界面的关键
{
"workbench.colorTheme": "IntelliJ IDEA New UI Light with Light Header",
"workbench.startupEditor": "none",
"terminal.integrated.sendKeybindingsToShell": true,
"vsicons.dontShowNewVersionMessage": true,
"terminal.integrated.enableMultiLinePasteWarning": "never",
"window.autoDetectColorScheme": false,
"explorer.confirmDelete": false,
"explorer.confirmPasteNative": false,
"workbench.iconTheme": "JetBrains Icon Theme 2023+ UI Light",
"workbench.productIconTheme": "JetBrains Idea Product Icon Theme",
"workbench.activityBar.orientation": "vertical",
"workbench.sideBar.location": "left",
"files.autoSave": "onFocusChange",
"files.insertFinalNewline": true,
"files.trimFinalNewlines": true,
"files.trimTrailingWhitespace": true,
"editor.formatOnSave": true,
"java.saveActions.organizeImports": true,
"editor.fontFamily": "Cousine for Powerline, Menlo, monospace",
"editor.fontSize": 13,
"editor.lineHeight": 1.1,
"editor.fontLigatures": false,
"editor.fontWeight": "normal",
"editor.bracketPairColorization.enabled": false,
"editor.guides.bracketPairs": false,
"editor.guides.highlightActiveIndentation": false,
"editor.minimap.enabled": false,
"editor.renderLineHighlight": "line",
"editor.occurrencesHighlight": "singleFile",
"editor.matchBrackets": "always",
"editor.smoothScrolling": true,
"editor.cursorBlinking": "smooth",
"editor.cursorSmoothCaretAnimation": "on",
"editor.stickyScroll.enabled": true,
"breadcrumbs.enabled": true,
"workbench.editor.showTabs": "multiple",
"workbench.editor.tabSizing": "shrink",
"terminal.integrated.fontFamily": "Cousine for Powerline, Menlo, monospace",
"terminal.integrated.fontSize": 13,
"terminal.integrated.lineHeight": 1.1,
"[java]": {
"editor.semanticHighlighting.enabled": false
},
"java.inlayHints.parameterNames.enabled": "none",
"java.inlayHints.parameterNames.suppressWhenSameName": true,
"indentRainbow.ignoreErrorLanguages": ["*"],
"indentRainbow.errorColor": "rgba(0,0,0,0)",
"explorer.compactFolders": true,
"explorer.sortOrder": "type",
"workbench.tree.indent": 12,
"workbench.tree.renderIndentGuides": "always",
"java.dependency.packagePresentation": "hierarchical",
"java.dependency.syncWithFolderExplorer": true,
"java.project.showEmptyPackages": false,
"java.project.explorer.showNonJavaResources": false,
"editor.tokenColorCustomizations": {
"[IntelliJ IDEA New UI Light with Light Header]": {
"textMateRules": [
{
"scope": ["comment", "comment.line", "comment.block", "punctuation.definition.comment"],
"settings": { "foreground": "#8C8C8C", "fontStyle": "italic" }
},
{
"scope": ["comment.block.documentation", "comment.line.documentation"],
"settings": { "foreground": "#8C8C8C", "fontStyle": "italic" }
},
{
"scope": [
"keyword",
"storage.type.primitive.java",
"storage.modifier.java",
"keyword.control.java",
"keyword.other.java"
],
"settings": { "foreground": "#0033B3", "fontStyle": "" }
},
{
"scope": ["keyword.other.import.java", "keyword.other.package.java"],
"settings": { "foreground": "#0033B3", "fontStyle": "" }
},
{
"scope": ["storage.modifier.import.java", "storage.modifier.package.java"],
"settings": { "foreground": "#080808", "fontStyle": "" }
},
{
"scope": [
"meta.import.java punctuation.separator.java",
"meta.package.java punctuation.separator.java",
"meta.import.java punctuation.terminator.java",
"meta.package.java punctuation.terminator.java"
],
"settings": { "foreground": "#080808", "fontStyle": "" }
},
{
"scope": ["string", "string.quoted.double.java", "string.quoted.single.java"],
"settings": { "foreground": "#067D17", "fontStyle": "" }
},
{
"scope": ["constant.numeric", "constant.numeric.java"],
"settings": { "foreground": "#1750EB", "fontStyle": "" }
},
{
"scope": ["constant.character.escape", "constant.character.escape.java"],
"settings": { "foreground": "#0037A6", "fontStyle": "" }
},
{
"scope": [
"variable.other.field.java",
"variable.other.object.property.java",
"variable.other.enummember.java"
],
"settings": { "foreground": "#871094", "fontStyle": "" }
},
{
"scope": ["variable.other.class.field.java"],
"settings": { "foreground": "#871094", "fontStyle": "italic" }
},
{
"scope": [
"meta.annotation",
"storage.type.annotation.java",
"punctuation.definition.annotation.java"
],
"settings": { "foreground": "#9E880D", "fontStyle": "" }
},
{
"scope": [
"entity.name.type",
"entity.name.type.class.java",
"entity.name.type.interface.java",
"entity.name.type.enum.java",
"storage.type.java"
],
"settings": { "foreground": "#000000", "fontStyle": "" }
},
{
"scope": [
"entity.name.function",
"entity.name.function.java",
"meta.method.java entity.name.function.java"
],
"settings": { "foreground": "#000000", "fontStyle": "" }
},
{
"scope": [
"variable",
"variable.other.java",
"variable.parameter.java",
"variable.other.definition.java"
],
"settings": { "foreground": "#000000", "fontStyle": "" }
}
]
}
},
"workbench.colorCustomizations": {
"[IntelliJ IDEA New UI Light with Light Header]": {
"editor.foreground": "#080808",
"editor.background": "#FFFFFF",
"editorLineNumber.foreground": "#ADADAD",
"editorLineNumber.activeForeground": "#080808",
"editorGutter.background": "#F2F2F2",
"editor.lineHighlightBackground": "#FCFAED",
"editor.selectionBackground": "#A6D2FF",
"sideBar.background": "#F7F8FA",
"sideBar.foreground": "#000000",
"sideBar.border": "#EBECF0",
"sideBarSectionHeader.background": "#F7F8FA",
"sideBarSectionHeader.border": "#EBECF0",
"tree.indentGuidesStroke": "#AEB3C2",
"list.activeSelectionBackground": "#CFDEFC",
"list.activeSelectionForeground": "#000000",
"list.inactiveSelectionBackground": "#DFDFDF",
"list.inactiveSelectionForeground": "#000000",
"list.hoverBackground": "#DFDFDF",
"list.hoverForeground": "#000000",
"list.focusBackground": "#DFDFDF",
"list.focusForeground": "#000000"
}
},
"workbench.editor.editorActionsLocation": "titleBar"
}
保存后再次 Reload Window。
不建议把
claudeCode.allowDangerouslySkipPermissions、claudeCode.initialPermissionMode: "bypassPermissions"放进通用配置。它们会绕过权限确认,只适合一次性、可回滚、隔离的本地沙箱;日常项目尤其是生产仓库应保留权限确认。
七、从 IDEA dotfiles 挖出的进阶设置
很多 IDEA 老用户的"舒适度"其实埋在 IDEA 自己的配置文件里:debugger.xml、find.xml、diff.xml、ide.general.xml、filetypes.xml、markdown.xml 等。把这份导出目录逐项翻译到 Cursor,能让一致性再上一截。下面这些都不是必须,但每一项都对应着 IDEA 里一个真实存在的"哎我习惯了"。
7.1 调试器 Step Filters(最值得做的一项)
打开 IDEA 的 debugger.xml,会看到一份长长的 step filter 列表:java.*、sun.*、com.sun.*、junit.*、org.junit.*、org.mockito.*、kotlin.* ……这是为什么 IDEA 里按 F7 (Step Into) 永远不会一头扎进 String.equals 或 JUnit 反射框架的原因。
Cursor 端的 Red Hat Java 调试器有完全对应的设置,但默认不开。把下面这段合并进 settings.json:
{
"java.debug.settings.stepping.skipClasses": [
"java.*",
"javax.*",
"jdk.internal.*",
"sun.*",
"com.sun.*",
"org.omg.*",
"junit.*",
"org.junit.*",
"com.intellij.rt.*",
"javassist.*",
"org.apache.webbeans.*",
"org.mockito.*",
"com.azul.*",
"kotlin.*",
"kotlinx.*"
],
"java.debug.settings.stepping.skipSynthetics": true,
"java.debug.settings.stepping.skipStaticInitializers": true,
"java.debug.settings.stepping.skipConstructors": false
}
设完之后 F11 (Cursor 的 Step Into) 的行为会和 IDEA 几乎一致。
7.2 搜索范围与文件 mask(find.xml)
IDEA 的 Find in Path 默认保留了一份 mask:*.java、*.kt、*.xml、*.css、*.html、*.jsp、*.properties、*.kts。Cursor 没有"默认 mask"概念,但可以靠 search.exclude + ignore 文件接近:
{
"search.exclude": {
"**/target": true,
"**/build": true,
"**/out": true,
"**/dist": true,
"**/node_modules": true,
"**/.idea": true,
"**/.gradle": true,
"**/*.class": true,
"**/*.jar": true
},
"search.useIgnoreFiles": true,
"search.useGlobalIgnoreFiles": true,
"search.smartCase": true
}
要按类型筛时,搜索框 files to include 里直接填 *.java,*.kt,*.xml,效果等价于 IDEA 的 File Mask。
7.3 Diff 视图:还原 IDEA 的高亮策略
IDEA 的 diff.xml 显示:SHOW_WHITESPACES=true、SHOW_INDENT_LINES=true、USE_SOFT_WRAPS=true、HIGHLIGHT_POLICY=BY_LINE。Cursor 对应:
{
"diffEditor.ignoreTrimWhitespace": false,
"diffEditor.renderSideBySide": true,
"diffEditor.renderIndicators": true,
"diffEditor.wordWrap": "on",
"diffEditor.renderMarginRevertIcon": true,
"scm.diffDecorations": "all",
"scm.diffDecorationsGutterAction": "diff"
}
diffEditor.ignoreTrimWhitespace: false 是 IDEA 的默认行为——空白差异照样标出来,对 review 缩进/换行特别重要。
7.4 关闭"退出确认"(ide.general.xml)
IDEA 配的是 confirmExit=false、confirmOpenNewProject2=0。Cursor 端:
{
"window.confirmBeforeClose": "never",
"window.openFoldersInNewWindow": "off",
"window.openFilesInNewWindow": "off",
"window.restoreWindows": "all"
}
7.5 文件类型关联(filetypes.xml)
IDEA 把 mcp.json 映射成 JSON5(允许注释和尾逗号)。Cursor 用 jsonc:
{
"files.associations": {
"mcp.json": "jsonc",
".cursorrules": "markdown",
".clauderc": "jsonc",
"*.cjs": "javascript",
"*.mjs": "javascript",
"*.http": "http"
}
}
7.6 Markdown + PlantUML 预览(markdown.xml)
IDEA 启用了 PlantUMLLanguageExtension,写 @startuml 块直接在 Markdown 预览里渲染。Cursor 没有内置,装扩展:
cursor --install-extension jebbs.plantuml
cursor --install-extension bierner.markdown-mermaid
settings.json 里:
{
"plantuml.render": "PlantUMLServer",
"plantuml.server": "https://www.plantuml.com/plantuml",
"plantuml.previewFileType": "svg",
"markdown.preview.fontFamily": "Cousine for Powerline, -apple-system, BlinkMacSystemFont, sans-serif",
"markdown.preview.fontSize": 14,
"markdown.preview.lineHeight": 1.6
}
7.7 Node.js 多版本解释器(nodejs.xml)
IDEA 的 nodejs.xml 记录了多个 Node 解释器路径(Homebrew node@22、/usr/local/bin/node、nvm 版本)。Cursor 端:
{
"npm.packageManager": "pnpm",
"eslint.nodePath": "/opt/homebrew/opt/node@22/bin",
"typescript.npm": "/opt/homebrew/bin/npm",
"terminal.integrated.env.osx": {
"PATH": "/opt/homebrew/opt/node@22/bin:${env:PATH}"
}
}
如果用 nvm,把 terminal.integrated.profiles.osx 里的默认 shell 加上 -l(login shell)让 nvm 自动加载。
7.8 IDEA Claude Code 插件 ↔ Cursor 原生快捷键的对齐
我在 IDEA 那边的 macOS copy.xml 里,已经把 ClaudeCodeGUI.SendFilePathToInputAction 映射到了 Cmd+I,ClaudeCodeGUI.ChatNewlineAction 映射到了 Cmd+Enter——这正是 Cursor 原生的 Composer/对话键位。也就是说:两边的 AI 入口已经在按同一个肌肉记忆走了,迁移 0 成本。
7.9 一键验证
把上面所有 JSON 合并进 settings.json,重启 Cursor 后跑一遍:
- 在测试方法里设断点 → F11 (Step Into) → 不会跳进
String.equals、Mockito.when等基础库 ✅ - 关闭 Cursor 时不再弹"确认退出"对话框 ✅
- 打开
mcp.json可以写带注释的 JSON,不报错 ✅ - 任意
.md文件里写@startuml块,右键Preview Current Diagram能出图 ✅ - 在 Diff 视图里能看到空白字符差异和缩进引导线 ✅
八、语法颜色对照表 (IDEA Light)
颜色值来自 IntelliJ 内置 Light 配色方案:
| 元素 | 颜色 | 字重 / 样式 |
|---|---|---|
| 默认文本 | #080808 | 正常 |
| 关键字 | #0033B3 | 正常 (非粗体) |
| 字符串 | #067D17 | 正常 |
| 数字 | #1750EB | 正常 |
| 注释 | #8C8C8C | 斜体 |
| 字段 | #871094 | 正常 |
| 静态字段 | #871094 | 斜体 |
| 注解 | #9E880D | 正常 |
| 类名 / 方法 / 变量 | #000000 | 正常 |
import 关键字 |
#0033B3 | 正常 |
| import 包路径与类名 | #080808 | 正常 |
九、侧边栏与 Java 包树
9.1 推荐视图
写 Java 时建议同时使用:
- 资源管理器 (Explorer):物理目录 + 紧凑包路径
- JAVA PROJECTS:按包层级展示 (更接近 IDEA Project 视图)
9.2 已启用的关键项
| 配置项 | 作用 |
|---|---|
explorer.compactFolders |
单链目录合并为 java\com.alibaba... |
java.dependency.packagePresentation: hierarchical |
Java Projects 按包层级 |
java.project.showEmptyPackages: false |
隐藏空包 |
workbench.tree.renderIndentGuides: always |
树形缩进引导线 |
9.3 无法 100% 复刻的部分及退路
下面是确实做不到的,以及"退而求其次"的方案:
| 做不到的 | 原因 | 退路 / Workaround |
|---|---|---|
| 包名棕褐色 / 类名黑色的资源管理器文字分色 | VS Code 资源管理器不支持按符号类型染色文字 | 用 material-icon-theme 或保留本文 JetBrains 图标主题,靠图标颜色而非文字颜色区分类型 |
| 包节点右侧的源码根小圆点 | VS Code 树控件不支持自定义角标 | Java Projects 视图本身有 Source Root 图标可识别 |
| IDEA 引擎级语法高亮 | Java 扩展是基于 TextMate + LSP,与 IDEA 自研引擎不同 | 用本文的 tokenColorCustomizations,配合关闭 semanticHighlighting 避免被二次覆盖 |
| Structure 视图中"按可见性折叠"等高级筛选 | Outline 视图功能阉割 | Cmd + Shift + O 唤起的 Quick Outline 加上类型过滤已能覆盖 80% 场景 |
| IDEA 的检查灯泡(Inspections)信息密度 | VS Code 的 Problems 面板更稀疏 | 让 Cursor Chat 直接对当前文件做 review,比传统 Inspections 更强 |
十、Java 项目工作流(IDEA 老兵的对照指南)
UI 装成 IDEA 之后,真正会被反复打脸的不是配色,而是日常 Java 工作流的差异。这一节给出最关键的几个场景。
10.1 Maven / Gradle 集成
- 装好
vscjava.vscode-java-pack后,左侧多出一个 MAVEN / GRADLE 面板,等价于 IDEA 右侧的 Maven 工具窗口。 - 常用动作:刷新依赖、运行任意 goal、查看依赖树,都能用,但搜索依赖坐标这种交互比 IDEA 慢半拍。
- 个人建议:依赖管理大动作(升级、排包)还是回 IDEA 干,Cursor 端只做读和小改。
10.2 Spring Boot 运行 / 调试
- 装
vmware.vscode-spring-boot-dashboard后会有一个 SPRING BOOT DASHBOARD,可以看到所有@SpringBootApplication、一键 Run/Debug。(原vscode-boot-dev-pack已拆包,建议单独安装 Dashboard 扩展。) - 调试 UI 在屏幕底部,断点、变量、调用栈都齐全,但Evaluate Expression 不如 IDEA 顺手(IDEA 的
Alt + F8仍然更成熟)。 .vscode/launch.json是 Run/Debug 配置的真身,建议从 IDEA 的 Run Configuration 里逐条迁移,写成可复用的 JSON。
10.3 JDK / 多模块项目
Cmd + Shift + P→Java: Configure Java Runtime是相当于 IDEA Project Structure 的入口。- 多 JDK 切换:在
settings.json里配置java.configuration.runtimes,示例:
{
"java.configuration.runtimes": [
{
"name": "JavaSE-17",
"path": "/Library/Java/JavaVirtualMachines/temurin-17.jdk/Contents/Home",
"default": true
},
{
"name": "JavaSE-21",
"path": "/Library/Java/JavaVirtualMachines/temurin-21.jdk/Contents/Home"
}
]
}
- 多模块项目:Cursor 自动识别根
pom.xml/settings.gradle,但模块依赖出问题时报错信息比 IDEA 差,必要时回 IDEA reimport 一次再回来。
10.4 Live Templates 替代方案
这是最难迁移的部分。IDEA 老用户敲 psvm、sout、fori 是潜意识动作。Cursor 端有三条路:
-
VS Code Snippets(推荐手动方案):
Cmd + Shift + P→Snippets: Configure Snippets→ 选java.json,把下面这份直接粘进去,常用 IDEA Live Template 就齐了。输入前缀后按Tab展开,Tab在占位符间跳转:配置文件路径 (macOS):
~/Library/Application Support/Cursor/User/snippets/java.json
{
"main method": {
"prefix": "psvm",
"body": ["public static void main(String[] args) {", "\t$0", "}"],
"description": "public static void main"
},
"println": {
"prefix": "sout",
"body": ["System.out.println($0);"],
"description": "System.out.println()"
},
"print": {
"prefix": "soutp",
"body": ["System.out.printf(\"$1%n\"$2);"],
"description": "System.out.printf()"
},
"println var": {
"prefix": "soutv",
"body": ["System.out.println(\"$1 = \" + $1);"],
"description": "print a variable name and value"
},
"err println": {
"prefix": "serr",
"body": ["System.err.println($0);"],
"description": "System.err.println()"
},
"for index": {
"prefix": "fori",
"body": ["for (int ${1:i} = 0; ${1:i} < ${2:n}; ${1:i}++) {", "\t$0", "}"],
"description": "indexed for loop"
},
"for each": {
"prefix": "iter",
"body": ["for (${1:Object} ${2:item} : ${3:collection}) {", "\t$0", "}"],
"description": "enhanced for loop"
},
"for array": {
"prefix": "itar",
"body": ["for (int ${1:i} = 0; ${1:i} < ${2:array}.length; ${1:i}++) {", "\t$3 ${4:item} = ${2:array}[${1:i}];", "\t$0", "}"],
"description": "iterate array"
},
"if null": {
"prefix": "ifn",
"body": ["if (${1:obj} == null) {", "\t$0", "}"],
"description": "if null"
},
"if not null": {
"prefix": "inn",
"body": ["if (${1:obj} != null) {", "\t$0", "}"],
"description": "if not null"
},
"public static final": {
"prefix": "psf",
"body": ["public static final $0"],
"description": "public static final"
},
"public static final int": {
"prefix": "psfi",
"body": ["public static final int ${1:NAME} = ${2:value};"],
"description": "public static final int"
},
"public static final String": {
"prefix": "psfs",
"body": ["public static final String ${1:NAME} = \"${2:value}\";"],
"description": "public static final String"
},
"throw exception": {
"prefix": "thr",
"body": ["throw new ${1:RuntimeException}($2);"],
"description": "throw new exception"
}
}
- 第三方扩展:搜
Java Snippets,社区有人移植了 IDEA 的常用模板。 - 直接让 Tab 接管(更推荐):在方法体里敲
main或注释// print loop variable,Cursor Tab 会直接补出完整代码,且能根据上下文(变量名、类型)智能填充。这一步切换之后,你会觉得 Live Templates 反而是过时的。
10.5 数据库 / HTTP Client
- IDEA 自带 Database Tool 和 HTTP Client,Cursor 没有等价物。
- 不建议在 Cursor 里强求:DataGrip 或独立的 TablePlus / Postman 更专业。
- 真要在编辑器里查数据库,可以装
cweijan.vscode-database-client2。
十一、装完 IDEA 皮之后:Cursor AI 能力怎么用
这是这套配置的真正价值。如果只把 Cursor 当成"长得像 IDEA 的 VS Code",那不如直接用 IDEA。
11.1 必须改掉的 IDEA 旧习惯
| 旧习惯 | 新做法 |
|---|---|
| 手动敲完整 if/for/方法体 | 让 Tab 接管:先写注释或函数签名,Tab 会补出完整实现 |
| 用 Live Template 生成模板代码 | 同上,AI 上下文感知比模板智能 |
| 用 Refactor 菜单逐项操作 | 告诉 Composer 你要什么:“把这个方法的 try/catch 提取成切面” |
读陌生代码靠 Cmd + B 一路点 |
打开 Chat 直接问:“这个 Service 的主流程是什么,从入口讲到 DB” |
| 写单测从空白开始 | 选中被测类 → Composer → “为这个类写 JUnit 5 测试,覆盖边界条件” |
| 看 stack trace 自己 debug | 把 stack trace 粘到 Chat,让它先定位嫌疑点 |
11.2 四种 AI 能力的使用边界
- Tab(行内补全):日常 80% 的"敲键盘"动作。写完前半行停 0.5 秒,看一眼,Tab 接受 / Esc 拒绝。
- Inline Edit(
Cmd + K):选中一小段代码做定点改造。“把这段 if-else 改成策略模式”、“加上日志”。 - Chat(
Cmd + L):问问题、读代码、做架构讨论,不直接改代码。 - Composer / Agent(
Cmd + I):跨文件的大改造、新增功能。会自己读相关文件、写多个文件、跑命令。
判断标准很简单:改动局限在一段 → Inline Edit;改动跨多个文件 → Composer;只是想理解 → Chat;正在敲键盘 → Tab。
11.3 IDEA 用户最该立刻试一次的三个场景
- 让 Composer 读懂一个陌生项目:
@Codebase 这个项目的入口在哪?主流程怎么走?—— 比沿着调用链逐层跳转更快。 - 让 Composer 写单元测试:选中一个 Service →
Cmd + I→ “写 JUnit 5 测试,mock 依赖” —— 先生成可运行骨架,再人工补边界。 - 让 Chat 解释报错:把异常栈完整粘进去 → “为什么报这个错?” —— 先让它缩小嫌疑范围,再自己验证。
试完这三个,你就会明白为什么"装个 IDEA 皮"是值得的——皮是 IDEA 的,魂是 AI 的。
十二、与 IDEA 的差距全景与成因分析
装了一身 IDEA 的皮,配了一身 IDEA 的键位之后,仍然有一些差距是"装"不出来的。这一节给出完整的差距地图,并说明每条差距背后的根本原因——这有助于你判断什么时候该退回 IDEA、什么时候应该接受 Cursor 的方式。
12.1 架构层面的根本差距

IDEA 是一个自研引擎的 IDE:从 UI 到 PSI(Program Structure Interface)到 Inspections 到 Refactoring,整条链路是 JetBrains 自己写的、深度耦合的。这就是为什么 IDEA 的 Java 重构能"知道"一个方法在跨模块的 Spring XML 配置里被引用,并安全改写;为什么 Alt + Enter 的快速修复菜单信息密度明显高于 VS Code 系编辑器。
Cursor 本质是 VS Code 内核 + 扩展的架构。语义信息来自外部 LSP 进程(Eclipse JDT.LS 等),语法染色是 TextMate 正则(浅层模式匹配),调试走 DAP 协议。优势是 AI 层从第一天就是一等公民,但代价是任何"深语义"操作都受限于 LSP / DAP 协议能提供什么。
这一条架构差距是绝大多数其它差距的源头。 下一张图会把可见差距和它逐一连起来。
12.2 可见差距 → 根本原因映射

每条差距背后都有一个具体的实现原因:
| 差距 | 根本原因 | 是否可缓解 |
|---|---|---|
| Inspections 信息密度低 | 无自研 PSI 引擎,只能用 LSP 暴露的诊断 | 部分缓解:让 Cursor Chat 对当前文件直接做 review |
| 重构选项粗糙 | LSP code action 是基于文本/位置的,而非语义级 AST 改写 |
部分缓解:跨文件大重构交给 Composer 做(AI 能读懂语义) |
| Evaluate Expression 生硬 | DAP 协议只能传字符串求值,缺少 IDEA 专有的 EvaluateContext API |
无法弥补:建议回 IDEA 干 |
| Maven/Gradle 依赖搜索慢 | Cursor 的产品重心不在完整 JetBrains 子工具链 | 无法弥补:依赖升级回 IDEA 干 |
| 无 Database / HTTP Client | Cursor 没有内置同等级专用工具窗口 | 用 DataGrip / Postman 等独立工具 |
| 资源管理器无文字分色 | VS Code 原生 Tree 控件不支持按符号染色文字(只支持图标) | 无法弥补:靠图标颜色区分 |
| Live Templates 无对等物 | 模板引擎依赖 PSI 上下文,Snippet 只是字符串替换 | 替代方案:用 Tab 接管(AI 上下文感知比模板更智能) |
注意右边一列:有些差距可以靠 AI 直接绕过(Cursor 反而更强),有些是真没法弥补——这是判断"该回 IDEA 还是留在 Cursor"的关键信号。
12.3 场景胜负全景

把以上拆解到 13 个真实场景,分成三个色块:
- 红色(IDEA 仍然胜出):5 个场景,全部和"深语义 / 重型工具"相关——重型重构、Evaluate Expression、依赖搜索、Database、Inspections。
- 黄色(基本打平):3 个场景——日常编辑、Git、Run/Build。装好皮 + 键位映射之后,这一类完全感觉不到差别,这也是为什么"装 IDEA 皮"是值得的。
- 绿色(Cursor 更有优势):5 个场景,全部和 AI 增益相关——写新代码、读陌生代码、写单测/脚手架、跨语言、Stack Trace 解读。
12.4 怎么用这张地图做决策
- 看到红色场景:别在 Cursor 里硬刚,直接
Alt + Shift + P回 IDEA(见 5.3 Switch2IDEA),10 秒就能切过去。 - 看到黄色场景:选你顺手的 IDE 即可,本配置已经让 Cursor 接管这一类无障碍。
- 看到绿色场景:需要主动调整 IDEA 老习惯(见上一节 11.1 那张表),否则只是换了界面,AI 带来的效率提升不会充分发挥。
一句话总结这一节:架构决定上限,AI 决定增量。这套"IDEA 皮 + Cursor 魂"的方案,是在已知架构差距的前提下,把可弥补的部分(皮)做满,把不可弥补的部分(重型 IDE 工作)退回 IDEA,把增量部分(AI)吃到底。
十三、验证步骤
- 打开任意
.java文件 - 检查
import com.xxx.Yyy;:import为蓝,后面为黑 - 检查关键字
public class:蓝色;类名黑色 - 左侧应看到紧凑路径:
src/main/java/com/alibaba/... - 文件图标为 JetBrains 红色 J
- 主题名无黄色警告「主题未知或未安装」
Cmd + B可跳转定义;Cmd + Alt + L可格式化 Java 文件;Cmd + [/Cmd + ]可后退/前进导航- 失焦切换窗口后文件自动保存(不再需要手动
Cmd + S) Cmd + I能唤起 Composer;Cmd + L能唤起 Chat —— AI 能力可用,才算真正配好
十四、常见问题
Q1:主题显示「未知或未安装」
cursor --install-extension compassak.intellij-idea-new-ui
然后 Reload Window。
Q2:import 整行都是蓝色
确认 settings.json 中有 storage.modifier.import.java → #080808 的规则,且 [java].editor.semanticHighlighting.enabled 为 false。
Q3:在 Agents Window 里找不到 Applying Changes
切换到 Editor Window 后再打开 Cursor Settings。
Q4:颜色与 IDEA 仍有细微差别
属于正常现象。可尝试关闭后重新打开 editor.semanticHighlighting,或对比 IDEA 的 Settings → Editor → Color Scheme → Light 微调 textMateRules。
Q5:新机器一键恢复
按顺序执行:
- 第二节:确认字体已安装
- 第三节:安装扩展 (含 IDEA Keybindings、Claude Code 等;PlantUML 见 7.6)
- 第五节:配置
keybindings.json(含 IDEA 肌肉记忆映射) - 第六节:合并
settings.json(含 autoSave、lineHeight、formatOnSave、organize imports) - 第七节:合并调试器 Step Filters、Diff 视图、文件关联等进阶设置
- 第十节 10.4:粘贴 Java snippets 到
snippets/java.json - Reload Window
十五、参考:IDEA 侧对应配置
从 IDEA 导出设置 (File → Manage IDE Settings → Export Settings) 时,与本文相关的项:
| IDEA 配置 | 值 |
|---|---|
| Color Scheme | Light |
| UI Theme | ExperimentalLightWithLightHeader |
| Font | Cousine for Powerline, Size 13, Line spacing 1.1 |
| Enable ligatures | 关闭 |
| Keymap | macOS (或你 IDEA 中实际使用的键位方案) |
| Debugger Step Filters | java.* / sun.* / junit.* / kotlin.* 等(见第七节) |
| Save Actions | Strip trailing spaces / Ensure newline at EOF / Optimize imports |
IDEA 键位可导出:File → Manage IDE Settings → Export Settings,勾选 Keymaps。
写在最后:一个月后的真实体验
这套配置我用了一个多月,给一个诚实的结论。
仍需回 IDEA 的部分
- 重型重构:跨模块的方法提取、接口拆分,IDEA 的
Ctrl + T菜单仍然更稳更准。 - 调试体验:
Alt + F8的 Evaluate Expression、运行时改变量值,这些 Cursor 调试器有但更生硬。 - Maven / Gradle 的依赖搜索:IDEA 的依赖搜索框就是顺手,VS Code 的对应交互慢一拍。
- Database / HTTP Client:直接放弃,回 DataGrip / 独立工具。
Cursor 更顺手的部分
- 写新代码的速度:Tab + Composer 之后,重复输入明显减少,从想法到可运行代码的链路更短。
- 读陌生代码:
@Codebase一问,通常比沿着调用链逐层跳转更省时间。 - 写单测 / 写文档 / 写脚手架:这些"枯燥但必要"的工作适合交给 AI 先生成初稿,再人工 review。
- 跨语言项目:同一个仓库里同时有 Java/TypeScript/Python,Cursor 的统一体验比来回切换多个 JetBrains IDE 更轻。
谁该这么折腾
- ✅ 重 Java 项目 + 想要 AI 火力的 IDEA 老用户
- ✅ 多语言项目,IDEA / WebStorm / PyCharm 来回切的人
- ❌ 纯 Java 单一项目、对 AI 没有强需求的人 —— 老老实实用 IDEA + Copilot 即可
- ❌ 没用过 IDEA 的人 —— 直接用 Cursor 默认 UI,没必要为别人的肌肉记忆买单
一句话总结
我把 Cursor 装成了 IDEA 的样子,是为了在 Cursor 里继续做一个 10 年的 Java 老兵;
但我留在 Cursor 里,是因为我不想再做 10 年那个手动敲psvm的老兵。
最终效果


更多推荐


所有评论(0)