ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

从零配置 Emacs 为 IDE:LSP、use-package 与高效开发环境搭建

从零配置 Emacs 为 IDE:LSP、use-package 与高效开发环境搭建 先回答一个很多人问过的问题Emacs 到底还算不算 IDE如果只看默认状态它确实不算打开后就是一块空白画布加一堆让人懵掉的快捷键。但真正用过一段时间后你会发现它的定位比 IDE 更底层——它是一个可以按你的工作方式重新组装的环境而 IDE 只是这种组装方式中的一种而已。这篇文章要聊的是“Emacs Zero to IDE Journey”也就是从零开始把一个默认的 Emacs 配置成适合日常开发的 IDE 环境。我会跳过那些“Emacs 是编辑器还是操作系统”的争论直接讲清楚环境搭建、包管理、LSP 接入、项目管理、终端集成和调试配置。如果你之前尝试过 Emacs 但被配置劝退或者刚准备入门这篇文章应该能帮你省下不少折腾时间。1. 为什么还要从零学 Emacs先厘清几个误区在开始配置之前有必要先聊清楚一个核心问题当 VS Code、JetBrains 系 IDE 已经做得越来越完善时为什么还会有人主动去折腾 Emacs我的判断是Emacs 解决的不是“开箱即用”的问题而是“高度可定制”和“长期积累”的问题。IDE 的定位是“装完就能写代码”Emacs 的定位更像是“装完只是开始之后它会慢慢变成你自己的开发环境”。这两者没有孰优孰劣只有适不适合。常见误区有三个。第一个误区是“Emacs 学习成本太高”。实际上Emacs 的入门门槛主要来自快捷键和概念体系而不是功能复杂。只要理解几个核心概念——buffer、window、major mode、minor mode——后面的配置路径会清晰很多。第二个误区是“Emacs 写代码不如 IDE”。这句话放在十年前有一定道理但现在 Emacs 通过 LSPLanguage Server Protocol模式和 Tree-sitter 语法树支持补全、跳转、错误提示、重构这些能力已经和现代 IDE 站在同一水平线上。真正拉开差距的反而是终端工作流、远程开发和文本操作效率。第三个误区是“必须记住所有快捷键”。没有任何人需要记住所有快捷键。实际开发中高频使用的可能只有二十个左右其余通过菜单、查询命令和自定义绑定逐步积累。把这个心理负担放下Emacs 的上手速度会快很多。这篇文章的实操部分会以配置一个“能真正写代码”的 Emacs 环境为目标而不是搞一个装了几百个包却不知道干什么用的花哨配置。2. Emacs 的核心概念理解这几个词配置就成功了一半如果你刚接触 Emacs先不要急着复制别人的配置。先把下面这几个概念弄清楚否则后面的配置逻辑会非常混乱。2.1 Buffer、Window、FrameBuffer 是 Emacs 中最基本的概念它代表一段文本或一个内容区域。打开一个文件会创建对应的 buffer但 buffer 不一定是文件比如*scratch*是没有关联文件的临时缓冲区*Messages*是消息日志缓冲区。Window 是显示 buffer 的区域。一个 Emacs 窗口内可以分成多个 window同时展示多个 buffer。这个“window”和操作系统里的窗口不是一回事。Frame 才是操作系统层面的窗口。一个 frame 内可以再分多个 window。这个抽象模型的意思是文件内容不在窗口里而是在 buffer 里窗口只是视图。所以你在 Emacs 中可以随时切换显示哪个 buffer而不需要重新打开文件。2.2 Point 和 MarkPoint 是光标位置在 Emacs 里它被认为是“字符与字符之间的一个位置”而不是某个字符本身。Mark 是之前标记过的位置。把 Point 和 Mark 组合起来就定义了一个“区域”region也就是一段连续文本。这两个概念直接支撑了 Emacs 的批量操作选择一段区域、执行命令、然后该命令只作用于这段区域。这和常规编辑器中“选中后再操作”是一个逻辑只不过 Emacs 把底层模型公开出来了。2.3 Major Mode 和 Minor Mode这是理解“Emacs 如何成为 IDE”的关键。Major Mode 决定当前 buffer 的主要行为。打开.py文件Emacs 会自动进入python-mode打开.go文件会进入go-mode。每个 major mode 负责语法高亮、缩进规则、注释格式和本语言相关的命令。Minor Mode 是附加功能模块可以在多个 major mode 上叠加。比如flymake-mode提供实时语法检查which-key-mode在你输入快捷键时弹出按键提示。多个 minor mode 可以同时开启这和 major mode 一一对应的关系完全不同。理解这一层后你再看 Emacs 配置就会发现所谓“把 Emacs 变成 IDE”本质上就是选对 major mode再叠加足够的 minor mode 和外部工具集成。2.4 快捷键的表示方式Emacs 的快捷键写法非常直观C-x C-f表示先按 Ctrlx再按 Ctrlf。M-x表示按 Altx或者 Escx取决于你的终端配置通常是执行命令的入口。C-c C-c这类组合在具体模式中往往绑定“执行当前 buffer”的命令。如果你在一个终端里使用 EmacsAlt 键可能需要配置才能生效后面会专门讲。2.5 配置文件 init.elEmacs 的启动配置统一放在init.el里路径通常在~/.emacs.d/init.el。这个文件在 Emacs 启动时会自动加载控制包管理、主题、快捷键和各类功能开关。几乎所有 Emacs 定制都能在这个文件里找到落点。理解了以上概念接下来就可以动手安装和配置了。3. 环境准备安装 Emacs 与包管理器3.1 在各平台安装 EmacsEmacs 的安装方式因操作系统而异以下给出常见平台的安装方法版本以各自仓库实际提供为准。建议选择较新的稳定版因为新版本对 Tree-sitter 和原生补全的支持更好。LinuxDebian/Ubuntu 系sudo apt update sudo apt install emacsLinuxFedora/RHEL 系sudo dnf install emacsmacOSbrew install emacs --with-native-comp这里提一下--with-native-comp它启用了 Emacs 28 的原生编译支持能让部分功能运行更快。如果安装失败去掉这个参数安装普通版本也没问题。WindowsWindows 上的 Emacs 支持一直没有 macOS/Linux 上顺畅但日常使用已经可行。推荐到 GNU 官网下载预编译的 Windows 版本解压后直接运行bin/runemacs.exe。需要注意终端环境建议使用 Windows Terminal Git Bash 或者 WSL否则部分依赖进程管理的包可能行为异常。安装完成后在终端输入emacs --version能输出版本号就说明安装成功。3.2 配置包管理器Emacs 自带的包管理器是package.el默认源是 GNU ELPA。为了获得更多第三方包还需要加上 MELPA 源。创建一个最小配置;; 文件路径~/.emacs.d/init.el (require package) (setq package-archives ((gnu . https://elpa.gnu.org/packages/) (melpa . https://melpa.org/packages/))) (package-initialize)然后启动 Emacs执行M-x package-refresh-contents这个命令会拉取最新的包列表。之后就可以用M-x package-install来安装包了。不过在实际使用中不建议手动一个个安装包。更规范的做法是通过use-package来声明式管理配置这也是目前 Emacs 社区的主流实践。4. 用 use-package 构建声明式配置use-package是 Emacs 生态里非常重要的配置管理工具。它不是一个功能型插件而是一个“组织插件”的工具。简单说use-package让你在init.el里用一段简洁的声明式代码来安装、配置和延迟加载一个包。它解决的核心问题是当你的配置越来越多时怎么保持清晰、可复用、启动速度快。一个典型的 use-package 写法(use-package company :ensure t :hook (prog-mode . company-mode) :config (setq company-minimum-prefix-length 1))这段代码做了三件事:ensure t表示如果这个包还没安装自动从包源安装。:hook表示在prog-mode编程语言模式启动时自动开启company-mode补全界面。:config里的代码在包加载后执行这里设置了补全触发的字符长度为 1。要在init.el里使用use-package需要先安装它(require package) (setq package-archives ((gnu . https://elpa.gnu.org/packages/) (melpa . https://melpa.org/packages/))) (package-initialize) (unless (package-installed-p use-package) (package-refresh-contents) (package-install use-package)) (require use-package) (setq use-package-always-ensure t)use-package-always-ensure t意味着后面所有use-package声明的包如果没有安装都会自动安装。配置量大的时候特别方便。但要注意use-package-always-ensure t也不适合所有场景因为它会在启动时尝试检查网络源。如果处于离线环境需要调整策略。后面最佳实践部分会提到。5. 把 Emacs 配置成 IDE 的核心步骤现在进入真正的主题用 Emacs 完成日常开发。这一节会逐步配置出代码补全、语法检查、文件树、终端、Git 和调试能力。5.1 代码补全与语言支持LSP 方案现代 IDE 的补全和跳转能力大多来自语言服务器。Emacs 对接语言服务器的方式是lsp-mode它支持大量语言包括 Python、Go、Java、TypeScript、Rust 等。安装配置(use-package lsp-mode :ensure t :commands (lsp lsp-deferred) :hook ((python-mode . lsp-deferred) (go-mode . lsp-deferred) (typescript-mode . lsp-deferred)) :config (setq lsp-idle-delay 0.3) (setq lsp-headerline-breadcrumb-enable t))这里的关键是lsp-deferred它表示等到 buffer 真正需要 LSP 服务时再启动语言服务器而不是打开文件立刻启动这样能明显减少启动延迟。常见的语言服务器示例Pythonpyright或python-lsp-serverGogoplsTypeScript / JavaScripttypescript-language-serverRustrust-analyzerJavajdtls通常手动配置较多语言服务器本身不是 Emacs 包而是需要安装在系统中的独立程序。安装方式通常有两种直接用系统包管理器安装或者用语言自带的包管理工具安装。例如 Python 的pyright可以用npm install -g pyright或pip install pyrightGo 的gopls可以用go install golang.org/x/tools/goplslatest具体安装方式会随版本更新变化建议以语言服务器官方文档为准。装好之后确保该程序在你的PATH环境变量里Emacs 的 LSP 模式才能定位到它。启动语言服务器后常见的操作M-x lsp-describe-session查看当前 LSP 会话连接了哪些服务器。M-x lsp-find-definition跳转到定义处。M-x lsp-find-references查找引用。M-x lsp-rename批量重命名符号。M-x lsp-format-buffer按语言服务器规则格式化整个文件。如果不想用lsp-modeEmacs 也有内置的eglot它从 Emacs 29 开始内置不需要安装第三方包。配置更简单(use-package eglot :ensure nil :hook ((python-mode . eglot-ensure) (go-mode . eglot-ensure)))eglot和lsp-mode的区别在于eglot更轻量配置更少适合快速上手lsp-mode功能更多扩展性更强适合重度定制。建议新手先试eglot觉得不够再切换到lsp-mode。5.2 语法树与高亮Tree-sitterTree-sitter 是一个增量解析库它让编辑器能按语法树精确理解代码结构从而实现更准确的高亮、缩进和代码块识别。Emacs 29 开始内置了 Tree-sitter 支持。启用方式很简单在安装对应的语法定义包后打开文件时会自动使用基于 Tree-sitter 的 major mode。文件打开后可以执行M-x treesit-font-lock-level来调整高亮详细程度。要启用 Tree-sitter需要在use-package中声明对应的语法源。比如对 C 语言(use-package treesit :ensure nil :config (setq treesit-font-lock-level 4))实际使用中如果你安装的 Emacs 版本内置 Tree-sitter大部分主流语言的语法定义都可以在打开的瞬间自动安装。如果遇到语法包缺失可以执行M-x treesit-install-language-grammar手动安装。Tree-sitter 带来的最直观变化是高亮更准确和缩进更智能。这让 Emacs 在写复杂嵌套代码时更接近 IDE 的体验。5.3 文件树与项目管理IDE 里最常见的侧边文件树在 Emacs 中通常用treemacs或neotree实现。推荐treemacs功能更丰富。(use-package treemacs :ensure t :defer t :config (setq treemacs-width 30))常用按键M-x treemacs打开/关闭文件树。M-x treemacs-find-file在文件树中定位当前文件。M-x treemacs-projectile在项目视图中操作。如果你需要一个更纯粹的项目导航方案可以不加文件树直接使用project.elEmacs 内置(use-package project :ensure nil :config (setq project-switch-commands ((project-find-file Find file) (project-find-dir Find directory) (project-vc-dir VC dir))))M-x project-find-file会在当前项目范围内查找文件配合模糊匹配效率不低。对于不习惯侧边栏的开发者这个方案可能更顺手。5.4 终端集成在 Emacs 里使用终端是常见需求可以用vterm获得接近原生终端的体验。(use-package vterm :ensure t :commands (vterm) :config (setq vterm-shell /bin/bash))启动方式M-x vterm打开一个新的终端 buffer。C-c C-k关闭终端 buffer。在 vterm 中C-c C-c可以将当前按键直接发送到终端而不是由 Emacs 处理。vterm依赖系统的 libvterm 库。在 Ubuntu 上需要先安装sudo apt install libvterm-devmacOS 上brew install libvterm如果你的平台安装有问题也可以使用term或ansi-term虽然体验略有差距但不需要额外的系统依赖。5.5 Git 集成MagitEmacs 生态里最受欢迎的 Git 集成工具是 Magit。它把 Git 操作变成了一个可视化状态面板而不是一串命令行记忆。安装(use-package magit :ensure t :bind ((C-c g . magit-status)))使用流程在项目内执行M-x magit-status会打开一个 Git 状态 buffer展示当前分支、未暂存改动、未跟踪文件等。在状态界面按s暂存文件按u取消暂存按c c提交按P推送按F拉取。在 diff 区域按d d可以查看详细差异。Magit 的交互方式非常直观熟练后大部分日常 Git 操作甚至不需要切到终端。一个实用的配置是把 Magit 绑定到快捷键上(global-set-key (kbd C-c g) #magit-status)5.6 调试器集成IDE 里最让人离不开的功能之一是图形化调试。Emacs 里没有统一的调试器前端而是按语言接入不同的调试包。如果是 C / C可以用gdb-miEmacs 内置支持(use-package gdb-mi :ensure nil :commands (gdb))启动M-x gdb然后输入调试程序路径比如gdb -imi ./hello在 gdb-mi 模式下C-x C-a C-b添加断点C-x C-a C-n单步执行C-x C-a C-r继续运行。调试信息会分屏显示。对于 Python 或其他语言dap-mode是更通用的选择但它配置比较复杂而且依赖语言服务器支持。建议先从gdb-mi或语言自带的调试器开始确认自己真的需要图形化调试后再研究dap-mode。5.7 模糊查找从一个文件跳到任意文件IDE 中的CtrlP快速打开文件能力在 Emacs 中由verticoorderless这两个包实现。它们组合起来形成一个极快的文件搜索和命令查找界面。(use-package vertico :ensure t :init (vertico-mode) :config (setq vertico-count 15)) (use-package orderless :ensure t :init (setq completion-styles (orderless basic)))安装后C-x C-f打开文件时就可以用空格分隔多个关键词来模糊匹配。比如输入src util conf会匹配路径中同时包含这些片段的文件。6. 一个可直接使用的 init.el 示例下面提供一个基础但完整的init.el覆盖了前面提到的所有核心能力。直接把这个文件放到~/.emacs.d/init.el启动 Emacs 后会自动安装所需包。;; 文件路径~/.emacs.d/init.el ;; Emacs 零基础到 IDE 的基础配置 ;; 1. 包管理器设置 (require package) (setq package-archives ((gnu . https://elpa.gnu.org/packages/) (melpa . https://melpa.org/packages/))) (package-initialize) (unless (package-installed-p use-package) (package-refresh-contents) (package-install use-package)) (require use-package) (setq use-package-always-ensure t) ;; 2. 界面基础设置 (setq inhibit-startup-message t) (setq-default tab-width 4) (setq make-backup-files nil) (setq auto-save-default nil) (global-display-line-numbers-mode 1) (tool-bar-mode -1) (menu-bar-mode -1) (scroll-bar-mode -1) (setq-default indent-tabs-mode nil) ;; 3. 代码补全 (use-package company :ensure t :hook (prog-mode . company-mode) :config (setq company-minimum-prefix-length 1) (setq company-idle-delay 0.1)) ;; 4. 模糊查找 (use-package vertico :ensure t :init (vertico-mode) :config (setq vertico-count 15)) (use-package orderless :ensure t :init (setq completion-styles (orderless basic))) ;; 5. LSP 语言服务 (use-package lsp-mode :ensure t :commands (lsp lsp-deferred) :hook ((python-mode . lsp-deferred) (go-mode . lsp-deferred) (typescript-mode . lsp-deferred)) :config (setq lsp-idle-delay 0.3) (setq lsp-headerline-breadcrumb-enable t)) ;; 6. 语法高亮增强Tree-sitter (use-package treesit :ensure nil :config (setq treesit-font-lock-level 4)) ;; 7. 文件树 (use-package treemacs :ensure t :defer t :config (setq treemacs-width 30)) ;; 8. 终端 (use-package vterm :ensure t :commands (vterm) :config (setq vterm-shell /bin/bash)) ;; 9. Git 集成 (use-package magit :ensure t :bind ((C-c g . magit-status))) ;; 10. 常用快捷键提示 (use-package which-key :ensure t :init (which-key-mode 1))这个配置适合 Python、Go、TypeScript 开发日常使用。如果你的主力语言不同可以修改lsp-mode的:hook部分或者直接删掉不需要的语言挂钩。7. 运行与验证怎么确认配置生效配置文件放好后启动 Emacs正常情况下会看到包源刷新和安装过程。如果一切顺利启动后不再显示欢迎页左侧有行号右下角不再有工具栏。可以按以下顺序逐项验证环境是否正常验证包是否安装成功M-x package-list-packages在打开的列表里搜索company、lsp-mode、magit等包如果状态是installed说明安装成功。验证补全是否生效打开一个 Python 文件emacs test.py在文件里输入几行代码比如import os os.getcwd()输入os.后应该会弹出补全候选。验证 LSP 是否启动打开 Python 文件后执行M-x lsp-describe-session如果能看到当前 buffer 连接到了pyright或你配置的语言服务器说明 LSP 正常。验证快捷键绑定在任意 buffer 执行C-c g如果 Magit 状态面板正常打开说明快捷键绑定成功。验证终端执行M-x vterm如果能进入一个可交互的终端 buffer并且ls、cd等命令正常工作说明终端集成没问题。如果某些项没有生效优先检查两点一是init.el里对应包的配置段是否真的被加载了二是语言服务器是否已经安装到系统 PATH 中。8. 常见问题与排查思路下面整理了一些从零配置 Emacs 时最常遇到的问题。问题现象可能原因排查方式解决方案启动时提示File error: Cannot open load fileinit.el中引用了不存在的包或函数检查错误信息中提到的文件名确认包名是否正确或执行package-refresh-contents后重装对应包LSP 无法启动提示找不到命令语言服务器没有安装或不在 PATH 中在终端直接运行语言服务器命令例如pyright --version安装对应语言服务器并确保路径加入环境变量Alt 键无法正常输入终端模拟器把 Alt 当成了 Meta 键传递异常在 Emacs 中执行M-x describe-key后按 Alt 组合键观察输出在终端设置中把 Alt 键映射为 Meta或使用M-x set-input-method调整输入法中文显示为方块缺少中文字体配置检查M-x describe-font在init.el中设置set-fontset-font指定中文字体vterm启动报错缺少 libvterm 系统动态库查看*vterm*buffer 的错误信息按平台安装libvterm依赖后重启 Emacs补全弹窗延迟明显company-idle-delay设置过长或 LSP 响应慢尝试输入字符后观察弹窗时间调小company-idle-delay或检查语言服务器进程是否正常打开大文件卡顿未启用 Tree-sitter或启用了过多高亮级别执行M-x treesit-font-lock-level降低级别确认文件已进入 Tree-sitter major mode并适当降低高亮级别某些包安装后没有生效use-package的:defer或:commands导致延迟加载执行M-x load-library强制加载对应包查看包文档确认正确的激活方式必要时移除:defer配置修改后没变化没有重新加载配置执行M-x eval-buffer或重开 Emacs用M-x load-file指定~/.emacs.d/init.el重新加载其中最容易踩坑的是语言服务器安装。很多新手把注意力放在 Emacs 配置上忽略了 LSP 依赖外部命令。配置文件写得再正确语言服务器没装补全和跳转一样不会生效。另一个容易出现的问题是配置里用了use-package-always-ensure t但在网络受限的环境中启动较慢。这个选项适合日常在线开发如果在离线环境工作建议关闭该选项改为对指定的包单独设置:ensure t。9. 从“能用”到“好用”的工程建议配置跑通只是第一步。真正进入日常开发后有几个工程层面的问题值得提前规划。9.1 管理配置的配置版本控制~/.emacs.d/整个目录放进 Git 仓库是一个值得养成的习惯。这样你改坏了配置可以随时回滚换电脑时也能快速恢复环境。注意不要提交~/.emacs.d/elpa/这类包含下载包的目录可以在.gitignore里忽略它。# 文件路径~/.emacs.d/.gitignore elpa/ eln-cache/ auto-save-list/配置备份只是起点更高阶的做法是给不同用途分出独立配置比如工作环境用work-config.el个人项目用personal-config.el再在init.el里按条件加载。9.2 配置分块与加载顺序所有配置堆在一个init.el里很快就会失控。建议按功能拆分成多个文件然后用require加载。最常见的目录结构是~/.emacs.d/ ├── init.el ├── lisp/ │ ├── init-packages.el │ ├── init-ui.el │ ├── init-lsp.el │ ├── init-edit.el │ └── init-magit.el在init.el中按顺序加载;; 文件路径~/.emacs.d/init.el (add-to-list load-path (expand-file-name lisp user-emacs-directory)) (require init-packages) (require init-ui) (require init-lsp) (require init-edit) (require init-magit)这样做的好处是定位某个功能问题时只需要看对应文件而不是在一长串配置里滚动查找。9.3 不要贪多每加一个包都要回答三个问题在 Emacs 社区你很容易看到别人分享“我的两百个插件配置”但并不是插件越多越好。每添加一个包前建议先问自己三个问题这个包解决了我当前的真实困扰吗这个包的功能能不能用 Emacs 内置能力或更简单的包替代这个包长期维护情况如何是否引入了不必要的依赖保持配置精简Emacs 启动速度会更快排除问题时也更轻松。9.4 关注启动速度如果配置越加越多启动时间会逐渐变长。常见改善手段用use-package的:defer延迟加载不立即需要的包。将package-initialize放在init.el开头这能避免部分包在启动早期加载。使用emacs-init-time查看启动耗时M-x emacs-init-time如果启动时间超过两秒优先检查是否有包在启动阶段被强制加载。9.5 善用内置帮助系统describe-*系列命令是理解 Emacs 的关键入口C-h k查看某个快捷键绑定的命令。C-h f查看某个函数的文档。C-h v查看某个变量的文档和当前值。C-h m查看当前 major mode 和 minor mode 的文档和快捷键列表。遇到“这个快捷键干了什么”“这个变量有没有作用”这类问题时先用帮助系统查一下通常比搜索外部文章更快。9.6 生产环境与远程开发Emacs 在远程开发上有先天优势只要服务器上有 Emacs就可以通过终端在服务器上运行完整的编辑环境不需要把文件拉到本地。常用方案有两种使用tramp直接编辑远程文件适合偶尔修改远程文件。在远程服务器上完整安装 Emacs 配置本地通过M-x term或 vterm 连接。这种方式对网络要求高但体验最接近本地开发。无论哪种方式都要注意远程环境中的 PATH 和语言服务器安装。远程服务器上缺少某个语言服务器LSP 一样不会工作。10. 总结与实践路径Emacs 从零到 IDE 的旅程核心不在于抄一份高端配置而在于理解它的基本概念之后按自己的开发习惯逐步组装环境。这篇文章讲清楚了几个关键点Emacs 不是 IDE但它可以通过 LSP、Tree-sitter、company、magit、vterm 等方案组合成接近完整 IDE 的开发环境。配置管理的核心工具是use-package它让插件安装和配置可以声明式地组织在init.el里。LSP 是让 Emacs 补全和跳转能力追平 IDE 的关键但语言服务器本身需要安装到系统中。从零配置时先跑通一个最小可用环境再逐步加功能比一次性导入复杂配置更可靠。下一步建议这样实践先按本文的配置搭好基础环境用一周时间进行日常开发。遇到不顺手的地方再去查对应包的文档或帮助系统。这种“按需学习”的方式比一开始就试图读完所有文档高效得多。如果你正打算从 VS Code 或 JetBrains 迁移也提醒一句这不是一个短周期的切换过程。头两周你可能会明显感受到效率下降因为长期形成的快捷键和操作习惯需要时间迁移。但一旦基础概念和配置结构掌握了Emacs 的长期收益是值得投入的。别急着卸载原来的 IDE先并行使用一段时间确认日常开发不再需要切回旧工具时再彻底切换也不迟。
返回列表