
把 Emacs 从零配置成一套能日常开发用的 IDE是很多人在接触 Emacs 之后第一个想完成的目标也是最容易失控的项目。Emacs 本身只是一个编辑器但通过包管理、模式系统、语言服务器协议LSP和外部工具它可以获得接近甚至超过商业 IDE 的能力。这篇文章不是让你照抄一份几百行的配置而是带你理解从编辑器到 IDE 需要补齐哪些能力再按照一条可验证的路径把补全、跳转、诊断、文件树、终端和 Git 操作逐个装进 Emacs。读完你可以得到一套能实际开发 Python 或 C/C 项目的配置并知道每个功能对应哪个按键、哪段配置、哪个日志。1. 为什么 Emacs 默认状态下不像 IDE1.1 编辑器和 IDE 的核心差异普通文本编辑器只解决一件事把字符高效地放进文件中。IDE 则是一整套开发环境它关心你正在写什么语言、这个符号在哪里定义、这行代码有没有语法错误、测试能不能跑起来、文件属于哪个项目。Emacs 默认状态更接近前者。它拥有强大的编辑能力但没有针对某种语言的语义感知。它不知道你光标下的函数来自哪个头文件也不知道项目里有没有编译错误。所谓“把 Emacs 变成 IDE”本质上不是安装某个神奇插件而是把 IDE 提供的这些能力用 Emacs 生态里的工具逐个补齐。1.2 从零到 IDE 需要补齐的六块能力可以把一个 IDE 拆成六个基础部件项目管理知道当前文件属于哪个项目能快速在项目内跳转文件。语言智能补全、跳转定义、查找引用、重命名符号通常由 LSP 语言服务器提供。静态诊断保存文件后立即看到语法错误、类型错误和 lint 警告。文件浏览左侧目录树、最近文件、缓冲区切换。集成终端在编辑器里执行编译、测试、运行命令。版本控制Git 状态、暂存、提交、冲突解决。这六块能力对应到 Emacs 生态中分别由 project.el、eglot 或 lsp-mode、flymake、treemacs、vterm、magit 等工具承担。1.3 先做技术选型再写配置Emacs 生态有一个特点同一个问题往往有多个方案。补全前端有 company 和 corfuLSP 客户端有 eglot 和 lsp-mode目录树有 treemacs、neotree 和 dirvish。新手最常犯的错误是每个方案都装一遍最后配置互相冲突。这篇文章采用一套相对轻量、依赖少、维护成本低的组合use-package 管理配置straight.el 管理包安装vertico orderless consult corfu 负责补全和搜索eglot 负责 LSPflymake 负责诊断treemacs 负责文件树vterm 负责终端magit 负责 Git。能力工具备注配置加载use-packageEmacs 29 已内置也可手动安装包安装straight.el可复现按 git 配置管理包补全前端corfu轻量负责编辑器内补全弹窗搜索与 minibuffervertico orderless consult提升命令补全和搜索体验语言智能eglot内置 LSP 客户端配置简单诊断flymakeEmacs 内置eglot 默认集成文件树treemacs可选习惯 Netrw 也可以不装终端vterm需要编译原生模块GitmagitEmacs 里最成熟的 Git 接口选型不是越多越好。如果某样工具你的工作流中完全不需要就暂时不装。下面每一节都会说明“为什么需要它”以及“什么时候可以跳过”。2. 环境准备与最小初始化2.1 版本选择Emacs 29 是更合适的起点建议从 Emacs 29 开始。原因不是版本越新越好而是 Emacs 29 在默认发行版里已经内置了 use-package、eglot、tree-sitter 支持减少了大量手动配置。Emacs 28 虽然也可以用但 use-package 和 eglot 需要额外安装到本地起步阶段会多出不少细节。如果你使用的是发行版自带老版本比如某些 Linux 稳定版还在用 Emacs 26建议通过官方源码编译或第三方仓库安装新版本。老版本不是不能配置成 IDE而是很多新生态包已经放弃对旧版本的支持排错时会遇到额外的兼容问题。2.2 安装 Emacs 的常见方式macOS 上推荐 Homebrewbrew install --cask emacsLinux 上优先使用发行版仓库或者使用 nix 等更现代的包管理方式sudo apt install emacsWindows 上可以到 GNU 官方镜像下载原生安装包也可以使用 MSYS2、WSL 等方式。这里不展开但要注意Windows 原生 Emacs 在 vterm 编译、文件路径、LSP 语言服务器的 PATH 处理上会比 macOS 和 Linux 多一些问题。安装完成后在终端运行emacs --version确认版本号。这步很容易被忽略但版本号直接决定了后面可以依赖哪些内置功能。2.3 目录结构与 init.el 的加载顺序Emacs 启动时会加载配置目录下的 init.el。默认位置是~/.emacs.d/init.el。不要同时使用~/.emacs文件和~/.emacs.d/init.el两个配置同时存在会互相干扰而且新手很难意识到自己改的配置到底被哪一处覆盖了。推荐的最小结构不是一开始就拆分几十个文件而是先保持一个 init.el等配置量变大之后再按功能拆分。~/.emacs.d/ |-- init.el |-- straight/ # straight.el 自动创建 |-- elpa/ # 如果使用 package.el则自动创建 |-- auto-save-list/ |-- recentf/init.el 的加载顺序会影响一切。比如你需要先配置package-archives再安装包先设置exec-path再启动 LSP。常见的启动失败往往是某个包在配置文件中被先加载了但是依赖的路径或变量还没准备好。2.4 最小基础配置编码、备份、界面第一版配置不要贪多先保证 Emacs 启动稳定、中文不乱码、备份文件不散落在一堆项目目录里。;; -*- lexical-binding: t; -*- ;; 统一编码 (setq locale-coding-system utf-8) (set-terminal-coding-system utf-8) (set-keyboard-coding-system utf-8) (set-language-environment UTF-8) ;; 关闭备份文件散落在项目目录里 (setq backup-directory-alist ((.* . ~/.emacs.d/backups/))) (setq auto-save-file-name-transforms ((.* ~/.emacs.d/auto-save-list/ t))) ;; 基础界面 (setq inhibit-startup-message t) (scroll-bar-mode -1) (tool-bar-mode -1) (menu-bar-mode -1) (setq-default cursor-type bar) ;; 显示行号编程时很有用 (global-display-line-numbers-mode 1) ;; 括号匹配 (electric-pair-mode 1) (show-paren-mode 1) ;; 保存文件时去掉行尾空格但保留空白行的末尾 (add-hook before-save-hook delete-trailing-whitespace)这段配置解决的是“能不能舒服地开始写代码”的问题。inhibit-startup-message关掉启动欢迎页tool-bar-mode和menu-bar-mode是为了界面更像编辑器而不像老式 GUI 程序。行号是编辑器的基本需求括号匹配在写 Lisp、Python、C 时都非常有用。注意从这里开始每次修改 init.el 后都要先检查括号是否正确。最直接的办法是M-x check-parens如果有括号不匹配Emacs 会停在错误位置。不要等到重启后加载报错再回来查。3. 用 use-package 管理配置用 straight.el 管理包3.1 为什么不用裸 package.elEmacs 内置的 package.el 可以安装包但没有声明式管理。你在一台新机器上恢复环境时需要手动M-x list-packages逐个安装。更麻烦的是不同机器上安装的包版本可能不同今天能用的配置下周就可能因为包升级而失效。use-package 把“包安装 配置 延迟加载 按键绑定”写在同一段代码里。它在启动时先声明需要时再加载能明显降低启动时间。straight.el 则把每个包都当作 git 仓库来 clone并锁定具体 commit配置可以完全复现。3.2 安装 straight.el 并接入 use-package在 init.el 最顶部加入以下内容(defvar bootstrap-version) (let ((bootstrap-file (expand-file-name straight/repos/straight.el/bootstrap.el user-emacs-directory)) (bootstrap-version 6)) (unless (file-exists-p bootstrap-file) (with-current-buffer (url-retrieve-synchronously https://raw.githubusercontent.com/radian-software/straight.el/develop/install.el) (goto-char (point-max)) (eval-print-last-sexp))) (load bootstrap-file nil nomessage)) (straight-use-package use-package) (setq straight-use-package-by-default t)这段代码的作用是如果本地不存在 straight.el就从 GitHub 拉取安装脚本并执行然后加载 straight最后把 use-package 接入 straight并设置所有use-package默认走 straight 安装。如果你不想引入 straight.el也可以回到 package.el 路线(require package) (setq package-archives ((gnu . https://elpa.gnu.org/packages/) (melpa . https://melpa.org/packages/))) (package-initialize)package.el 路线在 Emacs 29 上够用但环境复现能力弱一些。这里以 straight.el 为主路线。3.3 验证包系统是否工作配置完成后重启 Emacs然后执行M-x straight-check-all这个命令会检查所有已安装包的 git 状态。如果出现报错通常是因为网络无法访问 GitHub或者 straight.el 安装脚本没有写完。另一个验证方式是C-h v straight--version能够看到版本号说明 straight 核心加载成功。3.4 分层管理 init.el先跑通再拆文件第一版配置不要急着拆成 modules。use-package声明块本身已经是模块化的每个包一段代码。当 init.el 超过 300 行时再按功能拆分文件比如init-ui.el、init-editing.el、init-lsp.el然后在 init.el 里用require或load引入。拆分的好处不是“好看”而是你在排查某个功能时能直接定位到对应文件。坏处是加载顺序更容易出问题所以拆分时要避免在两个文件之间循环依赖。4. 装上 IDE 的“眼睛”主题、模式行、启动页与字体4.1 主题让代码有清晰的高亮层次默认 Emacs 主题在终端里看起来平淡在 GUI 下也偏旧。安装一个现代主题能显著改变使用意愿。推荐使用 doom-themes它提供 doom-one、doom-dracula、doom-tokyo-night 等大量主题。(use-package doom-themes :ensure t :config (setq doom-themes-enable-bold t doom-themes-enable-italic t) (load-theme doom-one t))主题只是个人偏好但有一点要注意某些主题会覆盖default字体、标题字号、region 颜色如果后面发现某种语法高亮颜色不对先切回deftheme默认主题判断是不是主题本身的影响。4.2 模式行用 doom-modeline 替代默认 mode-line默认 mode-line 信息有限而且显示方式偏旧。doom-modeline 能显示当前分支、文件修改状态、LSP 状态、编译状态等信息更像 IDE 底部的状态栏。(use-package doom-modeline :ensure t :init (doom-modeline-mode 1))doom-modeline 依赖 nerd-icons 或 all-the-icons 字体。启动后如果看到方框或乱码说明字体没安装需要执行对应包的安装字体命令。4.3 启动页用 dashboard 展示最近文件IDE 打开时通常会有欢迎页显示最近项目、最近文件。dashboard 就是给 Emacs 补上这个功能。(use-package dashboard :ensure t :config (dashboard-setup-startup-hook) (setq dashboard-center-content t dashboard-show-shortcuts nil dashboard-items ((recents . 8) (projects . 5))))这段配置让 Emacs 启动后直接显示最近文件和项目列表按快捷键即可进入节省不少时间。4.4 中文字体与英文字体混排Emacs 默认中文字体如果不对中文会变成方块或显示成难看的旧宋体。推荐在 GUI 环境下设置英文字体和中文字体(when (display-graphic-p) (set-face-attribute default nil :font JetBrainsMono Nerd Font :height 140) (dolist (charset (kana han cjk-misc bopomofo)) (set-fontset-font t charset (font-spec :family PingFang SC :height 140))))这里的字体名和行高要结合自己系统里的字体调整。没有安装 Nerd Font 时可以先使用系统常见等宽字体比如 Source Code Pro 或等距更纱黑体。字体不显示时优先确认字体是否安装再确认 Emacs 是否以 GUI 模式启动。5. 补全、搜索与 minibuffer 增强5.1 vertico让 minibuffer 垂直显示候选执行M-x时默认候选列表是横向或混排的信息不直观。vertico 让候选命令垂直排列并且可以上下选择。(use-package vertico :ensure t :init (vertico-mode))M-x后输入子串候选会实时过滤。vertico 是当前比较流行的一段命令补全基础它不负责过滤策略和额外信息后面配合 orderless 和 marginalia。5.2 orderless灵活的命令过滤策略默认的补全过滤是“开头匹配”比如输入reba能匹配rebase但无法匹配balance-remote这种中间出现关键词的情况。orderless 把输入按空格分割成多个子串每个子串可以出现在候选的不同位置。(use-package orderless :ensure t :init (setq completion-styles (orderless basic) completion-category-overrides ((file (styles basic partial-completion)))))文件名的补全不建议用 orderless否则路径补全会比较难以预测所以上面把 file 类型单独指定为 basic。5.3 consult 和 marginalia增强搜索和候选信息consult 提供了consult-line、consult-buffer、consult-grep等高阶命令。比如C-s搜索当前缓冲区时不是简单跳转而是能实时预览匹配位置。(use-package consult :ensure t :bind ((C-s . consult-line) (C-x b . consult-buffer) (M-y . consult-yank-pop) (C-x p f . project-find-file)))marginalia 则是在 minibuffer 候选后面显示额外信息比如函数所在文件、变量值、命令描述帮助你在选择时猜出候选含义。(use-package marginalia :ensure t :init (marginalia-mode))5.4 corfu编辑器内的补全弹窗补全命令有了还需要在代码输入时触发补全弹窗。corfu 是轻量补全前端使用 corfu 后输入代码时会弹出候选列表。(use-package corfu :ensure t :init (global-corfu-mode) :config (setq corfu-auto t corfu-auto-delay 0.1 corfu-cycle t corfu-preselect-first t))这里的两个关键参数是corfu-auto和corfu-auto-delay开启自动补全延迟 0.1 秒后弹出候选。不要在高延迟环境中把延迟调得太小否则输入时弹窗抖动反而影响体验。5.5 补全键位速查按键功能M-x执行命令vertico 增强候选显示C-s在当前缓冲区搜索consult-line 实时预览C-x b切换缓冲区显示文件信息C-x p f在项目内查找文件C-M-i手动触发补全弹窗可用 TAB 绑定这一套组合装完后Emacs 的 minibuffer 已经非常接近 IDE 里的全局搜索体验。接下来的重点是语言能力本身。6. 接入 LSP补全、跳转、诊断6.1 Eglot 还是 lsp-modeEmacs 里有两大 LSP 客户端eglot 和 lsp-mode。lsp-mode 功能更丰富支持多服务器聚合、自定义渲染、丰富的调试界面但配置项多、学习成本高。eglot 是 Emacs 29 内置的客户端默认集成 flymake配置简单适合绝大多数个人项目。对于从零到 IDE 的路径推荐先用 eglot。它能满足常见的补全、跳转、诊断需求而且因为内置少了一层依赖。等真正遇到 lsp-mode 才能解决的问题比如复杂的多根项目、多语言混合工作区时再切换。6.2 配置 eglot 并绑定语言服务器eglot 本身不包含语言服务器。它只是一个客户端实际语言能力由语言服务器提供。下面以 Python 和 C/C 为例。(use-package eglot :ensure nil :hook ((python-mode . eglot-ensure) (c-mode . eglot-ensure) (c-mode . eglot-ensure))):ensure nil表示不通过包系统安装直接使用内置版本。eglot-ensure会在进入对应模式时自动启动连接。注意如果语言服务器二进制不在 PATH 中eglot 会启动失败日志里能看到具体错误。为了更明确地指定服务器可以修改eglot-server-programs(add-to-list eglot-server-programs (python-mode . (basedpyright-langserver --stdio))) (add-to-list eglot-server-programs (c-mode . (clangd))) (add-to-list eglot-server-programs (c-mode . (clangd)))这里的 basepyright、clangd 都需要提前安装到系统里。安装方式不属于 Emacs 问题但要注意版本。比如 clangd 版本太旧时可能不支持新标准里的某些语法。6.3 在真实项目中验证补全、跳转和诊断安装完语言服务器后需要一个真实项目来验证。以 Python 项目为例mkdir -p ~/projects/emo-demo cd ~/projects/emo-demo python3 -m venv .venv source .venv/bin/activate pip install basedpyright # 根据实际安装方式调整然后在 Emacs 中打开这个项目下的 Python 文件检查底部状态栏是否出现 eglot 连接标记或者执行M-x eglot手动启动连接。如果连接成功M-x eglot-events-buffer会显示与语言服务器之间的 JSON-RPC 消息。验证跳转定义把光标放在某个函数调用上按键M-. ;; xref-find-definitions M-? ;; xref-find-references验证诊断故意写一行类型错误比如把函数参数传成字符串保存文件后查看flymake-show-project-diagnosticsM-x flymake-show-project-diagnostics这时能看到错误列表和 IDE 的 Problems 面板效果一致。6.4 从 GUI 启动 Emacs 时找不到语言服务器这是一个非常常见的坑。从终端启动 EmacsPATH 是 shell 的完整 PATH语言服务器能找到。但从 macOS 的 Launchpad 或者图标启动 Emacs 时PATH 可能只有/usr/bin:/binpyright-langserver或clangd会找不到。标准解决方案是安装 exec-path-from-shell(use-package exec-path-from-shell :ensure t :if (memq window-system (mac ns x)) :config (exec-path-from-shell-initialize))它会在 Emacs 启动时从 shell 中读取 PATH。注意如果你用 zsh并且 zshrc 中设置了复杂的 PATH 逻辑要确认 exec-path-from-shell 能拿到正确结果。注意LSP 报错时不要先怀疑配置先确认语言服务器本身能不能在终端运行。which clangd、which basedpyright-langserver能一步定位问题。6.5 eglot 常见状态和日志问题日志或现象处理方式语言服务器找不到eglot 启动失败*Warnings*或消息区显示文件不存在确认 PATH或使用 exec-path-from-shell连接成功但无诊断语言服务器未对当前文件启用 lint检查服务器配置或查看 eglot-events-buffer跳转无效xref 报”no known definition”确认代码已保存确认服务器索引完成补全不触发corfu 没有 popup先手动 M-x eglot确认连接成功7. 工程化功能文件树、终端、Git 与编辑增强7.1 treemacs文件树IDE 左边一般有目录树。treemacs 是目前维护较活跃的方案支持 git 状态图标、项目根目录识别。(use-package treemacs :ensure t :defer t :bind ((C-x t . treemacs) (C-x t t . treemacs-find-file)) :config (setq treemacs-width 32 treemacs-project-follow-mode t))treemacs-find-file会在文件树中定位当前文件很适合在大型项目中快速确认文件位置。如果你不想安装文件树Emacs 默认的dired配合project-find-file其实也可以只是视觉上没有目录树直观。目录树是个人习惯不是必需品。7.2 vterm真正可用的终端Emacs 自带term和eshell但很多现代终端工具需要原生终端仿真vterm 是基于 libvterm 的原生终端模拟器性能和兼容性更好。(use-package vterm :ensure t :commands vterm :bind ((C-c t . vterm)))vterm 需要编译原生模块。第一次安装时如果出现编译失败通常是缺少 cmake、libtool 等依赖。安装依赖后重新执行包安装即可。在 vterm 中运行python、make、git体验已经接近系统终端。这样就不用来回切换窗口。7.3 magitGit 操作magit 是 Emacs 里的 Git 客户端也是许多人留在 Emacs 的重要原因。它用专用状态缓冲区展示工作区状态按s暂存、按c c提交、按P p推送。(use-package magit :ensure t :bind ((C-x g . magit-status)))打开一个项目文件按C-x g可以看到当前仓库的修改列表。这个界面比命令行git status更直观。如果你不习惯可以继续用命令行Magit 不是必须的但它能很好的替代 IDE 的 Git 面板。7.4 多光标和编辑增强在 IDE 里很常见的“同时编辑多处”Emacs 中可以用 multiple-cursors也可以用原生的 iedit。(use-package multiple-cursors :ensure t :bind ((C- . mc/mark-next-like-this) (C- . mc/mark-previous-like-this) (C-c m- . mc/mark-all-like-this)))对于更精细的重命名场景可以把光标放在某个变量名上使用 iedit 进入模式所有同名标识符会同时高亮并可编辑。(use-package iedit :ensure t :bind ((C-; . iedit-mode)))注意multiple-cursors 和 iedit 同时使用时要留意主键冲突。建议只保留一个作为日常习惯另一个作为备用。7.5 括号、折叠和撤销树括号匹配已经在基础配置中开启。代码折叠可以用内置的 hs-minor-mode或者用 origami。(use-package origami :ensure t :defer t :bind ((C-c f . origami-toggle-node) (C-c F . origami-toggle-all-nodes)))撤销树方面Emacs 默认undo是线性撤销容易丢失中间状态。vundo 把撤销历史变成树形结构可以回到任意分支。(use-package vundo :ensure t :bind ((C-x u . vundo)))7.6 常用按键速查表按键功能对应 IDE 功能C-x p f项目内查找文件CtrlP 类快速打开C-s当前缓冲区搜索CtrlFM-x eglot启动 LSP 连接语言服务启动M-.跳转到定义F12 或 CmdClickM-?查找引用ShiftF12C-x gMagit 状态Git 面板C-c tvterm 终端集成终端C-x ttreemacs 文件树资源管理器这些按键不需要一次记住。实际编码时先记住C-x p f查找文件、M-.跳转定义、C-x g查看 Git 状态三个最常用操作足够支撑日常开发。8. 常见问题排查与配置维护建议8.1 启动慢先找出哪个包占用了时间配置了很多包之后启动时间会明显变长。先测量当前启动时间M-x emacs-init-time会显示类似0.56s的结果。如果超过 2 秒需要排查。use-package 的:init和:config关键字容易被搞混:init在包加载前执行只放轻量设置:config在包加载后执行可以放重配置。默认所有包都在启动时加载的话启动自然会慢。不要使用:defer欺骗自己:defer t只是延迟加载但如果某个功能你每次启动后都要用它仍然会加载。常见的优化是(use-package magit :ensure t :defer t :bind ((C-x g . magit-status))):bind配合:defer只有按下C-x g时才加载 magit。这才是真正的按需加载。8.2 补全弹窗不出现补全不弹出的排查顺序确认当前缓冲区是否处于对应主模式。比如 Python 文件必须是python-mode如果不是执行M-x python-mode。确认 eglot 是否已连接。M-x eglot或查看模式行是否出现 “eglot” 字样。确认语言服务器是否有补全能力。可以用终端直接测试服务器是否能启动。手动触发补全C-M-i。如果手动能触发而自动不触发检查 corfu 的corfu-auto是否打开。常见问题是 corfu 已安装但global-corfu-mode没有启用。:init中的global-corfu-mode在配置加载后执行不要写在:config里否则可能因为加载顺序导致 mode 状态未生效。8.3 LSP 连接不上或频繁断开先看诊断缓冲区M-x eglot-events-buffer M-x eglot-stderr-buffer如果 stderr 里出现 “command not found” 或 “No such file or directory”基本上是 PATH 问题。如果出现 “unknown option”可能是语言服务器版本与 eglot 传入的参数不兼容。如果频繁断开检查网络代理或防火墙是否拦截了语言服务器与远程仓库之间的通信。8.4 中文乱码和字体方块中文乱码通常不是 Emacs 配置问题而是系统字体缺失或字体配置未生效。确认顺序GUI 下检查M-x describe-font。确认中文字体名称是否正确比如 PingFang SC、Noto Sans CJK SC。如果用终端 Emacs终端本身必须支持中文字体渲染。如果是 nerd-icons 显示方框说明图标字体未安装需要运行 all-the-icons 或 nerd-icons 的字体安装命令。8.5 配置是一份资产要用 Git 管理把~/.emacs.d初始化为 Git 仓库是配置维护里性价比最高的一步。cd ~/.emacs.d git init git add init.el git commit -m init emacs config注意straight 下载的包目录不需要提交因为 straight 会根据锁文件重新安装。可以在~/.emacs.d/.gitignore中忽略straight/ elpa/ auto-save-list/ backups/这样一份配置就能在多台机器复现clone 后启动 Emacsstraight 会自动按配置安装所有包。版本升级要小步进行不要一次性升级所有包否则出现破坏性变更时很难定位。注意真正要提交的是配置文件和 lockfile不是包目录。straight.el 会记录每个包的 commit hash这是环境可复现的关键。8.6 从零到 IDE 的发布前检查清单这套清单适用于每次改完配置、打算进入连续开发前基础启动后emacs-init-time小于 1 秒无*Warnings*报错。编码C-h v default-input-method确认正常中文输入不卡顿。补全在 Python/C 文件中输入代码弹窗能自动出现标题和符号正确。LSPeglot-events-buffer有消息记录flymake-show-project-diagnostics能看到诊断。搜索C-x p f能在项目内找到文件consult-line能实时预览搜索词。GitC-x g能打开当前仓库状态能完成一次暂存和提交。终端C-c t能打开 vterm并能运行 make、git、python 等命令。文件树C-x t能展示项目目录并定位当前文件。每一条都验证通过Emacs 才真正从一个编辑器变成了你可以长期使用的 IDE 环境。接下来要做的事情不是继续添加更多包而是用这套配置写至少一到两周的真实代码。遇到不顺手的地方记录操作步骤和期望结果再精准地增加一个小配置。配置是慢慢养出来的不是一次性抄出来的。把这段过程走完你就完成了真正的 “Zero to IDE” 之旅。