写给那些"离不开 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 / packageimport 为蓝色,包名和类名为黑色
  • 左侧竖向 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 + KCmd + 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.tokenColorCustomizationsworkbench.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.allowDangerouslySkipPermissionsclaudeCode.initialPermissionMode: "bypassPermissions" 放进通用配置。它们会绕过权限确认,只适合一次性、可回滚、隔离的本地沙箱;日常项目尤其是生产仓库应保留权限确认。

七、从 IDEA dotfiles 挖出的进阶设置

很多 IDEA 老用户的"舒适度"其实埋在 IDEA 自己的配置文件里:debugger.xmlfind.xmldiff.xmlide.general.xmlfiletypes.xmlmarkdown.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=trueSHOW_INDENT_LINES=trueUSE_SOFT_WRAPS=trueHIGHLIGHT_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=falseconfirmOpenNewProject2=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+IClaudeCodeGUI.ChatNewlineAction 映射到了 Cmd+Enter——这正是 Cursor 原生的 Composer/对话键位。也就是说:两边的 AI 入口已经在按同一个肌肉记忆走了,迁移 0 成本。

7.9 一键验证

把上面所有 JSON 合并进 settings.json,重启 Cursor 后跑一遍:

  • 在测试方法里设断点 → F11 (Step Into) → 不会跳进 String.equalsMockito.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 时建议同时使用:

  1. 资源管理器 (Explorer):物理目录 + 紧凑包路径
  2. 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 + PJava: 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 老用户敲 psvmsoutfori 是潜意识动作。Cursor 端有三条路:

  1. VS Code Snippets(推荐手动方案)Cmd + Shift + PSnippets: 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"
    }
}
  1. 第三方扩展:搜 Java Snippets,社区有人移植了 IDEA 的常用模板。
  2. 直接让 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 用户最该立刻试一次的三个场景

  1. 让 Composer 读懂一个陌生项目@Codebase 这个项目的入口在哪?主流程怎么走? —— 比沿着调用链逐层跳转更快。
  2. 让 Composer 写单元测试:选中一个 Service → Cmd + I → “写 JUnit 5 测试,mock 依赖” —— 先生成可运行骨架,再人工补边界。
  3. 让 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)吃到底。

十三、验证步骤

  1. 打开任意 .java 文件
  2. 检查 import com.xxx.Yyy;import 为蓝,后面为黑
  3. 检查关键字 public class:蓝色;类名黑色
  4. 左侧应看到紧凑路径:src/main/java/com/alibaba/...
  5. 文件图标为 JetBrains 红色 J
  6. 主题名无黄色警告「主题未知或未安装」
  7. Cmd + B 可跳转定义;Cmd + Alt + L 可格式化 Java 文件;Cmd + [ / Cmd + ] 可后退/前进导航
  8. 失焦切换窗口后文件自动保存(不再需要手动 Cmd + S
  9. 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.enabledfalse

Q3:在 Agents Window 里找不到 Applying Changes

切换到 Editor Window 后再打开 Cursor Settings。

Q4:颜色与 IDEA 仍有细微差别

属于正常现象。可尝试关闭后重新打开 editor.semanticHighlighting,或对比 IDEA 的 Settings → Editor → Color Scheme → Light 微调 textMateRules

Q5:新机器一键恢复

按顺序执行:

  1. 第二节:确认字体已安装
  2. 第三节:安装扩展 (含 IDEA Keybindings、Claude Code 等;PlantUML 见 7.6)
  3. 第五节:配置 keybindings.json(含 IDEA 肌肉记忆映射)
  4. 第六节:合并 settings.json(含 autoSave、lineHeight、formatOnSave、organize imports)
  5. 第七节:合并调试器 Step Filters、Diff 视图、文件关联等进阶设置
  6. 第十节 10.4:粘贴 Java snippets 到 snippets/java.json
  7. 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 的老兵。

最终效果

在这里插入图片描述

在这里插入图片描述

Logo

欢迎加入DeepSeek 技术社区。在这里,你可以找到志同道合的朋友,共同探索AI技术的奥秘。

更多推荐