2026/9/28 5:44:29

从VS Code、Vim到Emacs:为什么这个近四十年编辑器仍值得学

从VS Code、Vim到Emacs:为什么这个近四十年编辑器仍值得学 还在学Emacs那不是一个上世纪的东西吗这是我在技术交流群里反复听到的话也是每次有人看到我的工作环境时最常给出的反应。作为一个用了十年Emacs、中间反复横跳过Vim和VS Code、最后还是回到Emacs常驻的深度用户今天想认真回答这个标题里的问题为什么今天还需要学习Emacs我的答案不是因为它经典而是因为它至今仍然提供着别的工具给不了的东西真正的可编程性、经得起时间考验的个人知识管理方式以及一种我的工作台我做主的底层控制感。这篇内容主要写给三类人第一类是被Org-mode吸引想找一套长期可用的笔记和任务管理工具的爱好者第二类是受够了IDE的封闭生态想要完全掌控自己开发环境的程序员第三类是纯粹好奇的围观者想搞清楚一个快四十岁的编辑器为什么还有一群人不离不弃。不管你属于哪一类我希望看完这篇之后你至少能对Emacs有一个清醒、不吹不黑的认识也能判断要不要踏上这趟旅程。1. Emacs过气了吗先看清它的真实状态1.1 一个快四十岁的老家伙凭什么还活着Emacs的历史可以追溯到1976年而GNU Emacs从1985年发布至今已经快四十年了。按软件领域的标准这绝对是高龄软件。但一个最容易被人忽略的事实是Emacs从来没有停止过进化而且近几年明显提速了。从版本号看就很直观。Emacs 27带来了原生JSON解析和更好的并发支持Emacs 28引入了原生Elisp编译native-comp这是过去十年里最重要的性能突破Emacs 29更是一口气把use-package内置、tree-sitter内置和EGLOT内置LSP客户端全部纳入官方发行版。也就是说今天你下载一个最新版Emacs开箱就能获得以前需要折腾半天才能凑齐的现代化开发体验。另一个容易被忽视的信号是生态活跃度。MELPAEmacs的包仓库类似npm或Homebrew上现在有超过六千个包从大模型客户端到语言服务器协议支持从窗口管理增强到各种奇怪的效率工具应有尽有。如果Emacs真的死了不可能还有这么多人在持续维护和发布新包。我经常跟人说看一个软件有没有生命力别听人怎么说去看它的包仓库更新频率这个数据骗不了人。1.2 编辑器三国杀与VS Code、Vim三分天下我习惯把现在的主流编辑器格局比作三国杀VS Code是曹操势力最大上手最快扩展生态庞大。但你是在用微软定义的编辑器框架装再多插件底层还是Electron、还是那套settings.json逻辑。它可以做得很好看、很好用但很难做出你真正想要的东西。Vim/Neovim是孙权核心哲学是键位即语言。练成之后文本编辑效率确实独步天下但那是一条陡峭的学习曲线而且它本质上更接近编辑器内核要凑齐IDE体验得自己拼装大量外部工具。Emacs是刘备起步最慢、姿态最笨重但自由度是三者里最高的。它敞开给你的是Lisp解释器、是每一个按键背后的可编程入口。你花的每一点学习成本都会变成可累积的资产。三家没有绝对优劣只看需求模型。如果你只想要开箱即用的好编辑器VS Code是最优解如果你痴迷于键盘编辑效率去学Vim但如果你想拥有一台可以随时改造的个人工作台目前没有任何工具比Emacs更彻底。这也是我今天依然觉得需要学习Emacs的根本原因——它占据的是另外两家给不了的那一极。2. 今天学Emacs到底能收获什么2.1 Org-mode被反复吹爆的杀手级特性到底是什么几乎所有想学Emacs的人第一个被吸引的点都是Org-mode。但很多人误以为它只是一个高级TODO列表工具这就把它看扁了。在我的使用体验里Org-mode的真正价值在于它是一种以纯文本为载体的信息组织哲学。先说万物可折叠的结构。你可以在一个.org文件里用*、**、***这样的星号建立无限层级的大纲按下Tab就能折叠和展开任意子树。我的整个生活都被组织在几个纯文本文件里——life.org管个人计划、work.org管项目拆解、notes.org管读书笔记。这些文件是纯文本意味着我可以丢进Git管理、可以在任何设备上打开、永远不用担心某个商业软件停止维护之后数据格式变成废品。再说Org-agenda这是让我彻底放弃其他任务管理软件的功能。把TODO项打上DEADLINE或SCHEDULED标签Org-agenda会自动汇总成一份跨项目的日程视图。我试过Notion、Things、Todoist和各种在线看板最后还是回到Org-agenda。原因很简单它足够快——一条命令、一屏文字不需要加载任何网页而且它和我的任务笔记在同一个文件系统里不存在任务归任务、笔记归笔记的割裂。最后提一下Org-babel也就是文学编程。你可以在Org文件里直接写一段代码块按下快捷键执行结果会以文本或表格形式插回文档。写技术方案的时候我先在Org里搭出文档大纲然后往里塞可执行的代码和计算结果一份文档既是说明、又是演示、还是可复现的脚本——这种体验其他笔记软件至今没有完全复制出来。2.2 可编程性把你的编辑器变成你的样子Emacs最核心的哲学可以概括为一句话编辑器即Lisp解释器。你用ElispEmacs自带的Lisp方言可以实时修改运行中的编辑器行为不需要重启、不需要重新编译、不需要等官方更新你在系统里写的每一段配置都是立刻生效的。很多人第一次听到Emacs可编程时脑子里想到的是我要去学一门新语言然后吓退了。但实际上你不需要变成Lisp高手才能受益。举个我自己的例子有一次我嫌弃默认的命令补全提示太干瘪希望在输入命令时能看到这个命令是干什么用的。我花了五分钟写了十几行Elisp挂钩到补全窗口的更新事件上把每个候选命令的文档字符串实时显示出来。整件事从有想法到落地没有向任何人提需求没有等任何版本更新。这种能力的长期价值是随着你使用时间增加Emacs会逐渐长成你的形状。你在配置文件里留下的每一行都是你对自己工作流的思考和沉淀。相反用固定功能的IDE你永远是在别人的框架里做选择而不是在做创造。2.3 现代开发支持LSP、tree-sitter与Magit如果只盯着Emacs的旧界面确实会觉得它属于上个世纪。但如果你愿意用五分钟把配置跟上Emacs作为日常主力开发工具完全够用甚至有一些体验是其他编辑器做不到的。先说语言支持。Emacs 29内置了EGLOT也就是LSP客户端。接上各类语言服务器之后跳转定义、自动补全、悬停签名、重构操作这些现代IDE功能全都有。我自己日常写Rust用rust-analyzer写Python用pylsp写前端用typescript-language-server体验很稳。再加上内置的tree-sitter支持代码高亮不再是脆弱的正则匹配——括号配对的正确率和解析速度都让人放心。再说Magit。这个包被很多人称为留在Emacs的最大理由。它把Git操作变成在一个结构化缓冲区里用快捷键组合命令查看状态、暂存文件、提交、交互式变基、二分查找都极其流畅。我用了Magit之后再回VS Code看Git面板总觉得像回到了带遥控器的功能机时代。Magit最厉害的地方是它把Git的底层概念完整呈现出来你在操作的过程中会真正理解Git在干什么而不只是点暂存所有改动按钮。这些能力叠加起来Emacs并不是一个需要情怀滤镜才能用的古董它只是需要你花点时间把零件拧到位。一旦拧好它的开发体验是稳定、快速、完全受你掌控的。3. 新手启程一周搭建一个可用环境3.1 安装与第一份init.el配置不同平台的安装方式我分别说一句macOS上推荐brew install emacs --with-native-compUbuntu或CentOS建议直接源码编译编译时加上--with-native-compilation不要用系统源里的旧版本Windows从GNU官网下预编译版或者用scoop安装都行近几年的Windows版体验已经进步很多。装好之后先搞明白配置文件放哪。Emacs的配置叫init.elLinux/macOS通常在~/.emacs.d/init.elWindows在~/AppData/Roaming/.emacs.d/init.el。如果你直接在里面堆几百行配置那很快会变成一团乱麻。所以不管新手老手我都强烈建议用use-package来管理包和配置。下面是我建议第一天就写入init.el的最简骨架它已经是可用状态;; -*- lexical-binding: t -*- (require package) (add-to-list package-archives (melpa . https://melpa.org/packages/) t) (package-initialize) (setq package-native-compile t) (require use-package) (unless package-archive-contents (package-refresh-contents)) (setq use-package-always-defer t)这段配置做的事情是开启包管理、添加MELPA源、开启原生编译、加载use-package。关键点在于use-package-always-defer t这一行——它让所有包默认延迟加载只有在真正需要某个功能时才加载对应的包这是保证Emacs启动速度的基石。3.2 第一天必装的几个包结合我自己和带过的新手朋友们的经验我整理了一份新手上路包数量刻意控制在八个以内避免你一上来就陷入配置的泥潭包名作用说明use-package包管理框架一切配置的基础必须装vertico orderless补全与模糊搜索让命令补全、文件名补全变得现代、顺手marginalia补全注解在补全列表里显示每个命令/函数的说明corfu代码补全轻量、现代和内置补全框架兼容好magitGit操作用一次就知道为什么值得为它留下来evilVim键位模拟如果是Vim迁移过来的用户强烈建议装eglotLSP客户端Emacs 29内置零配置接入语言服务器which-key快捷键提示按下前缀键后弹出可用键位菜单新手必备这里要特意提醒一个常见误区新手不要第一天就疯狂装包。网上有太多文章推荐了一大堆包——什么avy、ace-window、which-key、treemacs、dashboard——每个看起来都很好用但你一股脑全装上之后面临的是启动四五秒、键位互相冲突、功能严重重叠的灾难现场。克制一点先让核心体验跑通之后再按需扩展。3.3 第一周的学习路径怎么设计我给不少朋友做过Emacs入门引导效果最好的节奏是这样第一天不装任何额外配置只用默认Emacs。学会打开文件C-x C-f、保存C-x C-s、切换缓冲区C-x b、执行命令M-x。目标只有一个让用Emacs打开并编辑一个文件变成肌肉记忆。第二天加入use-package和vertico补全框架。练习全靠M-x输入命令名来操作学会用C-h k查看某个快捷键到底绑定了什么命令。第三天安装eglot用Emacs写一个自己熟悉语言的几十行小项目体验代码补全和跳转定义。这一步的意义是确认Emacs真的能写代码。第四到第五天开始用Org-mode。把你的每日待办、下周计划、零散笔记都放进Org文件里先感受大纲编辑和TODO状态切换不用学任何高级功能。第六到第七天安装magit在真实Git仓库里试用暂存、提交、查看diff和日志。这一关过了你大概率能理解为什么有人说Magit是回不去的功能。这个路径的核心设计原则是先建立正反馈再逐步深入。第一周结束的条件不是你学会了所有东西而是你有了一个不让人反感的、能完成日常任务的Emacs以及你已经发现了至少一个让你愿意继续学的功能。后面的事情交给时间。4. 踩坑实录新手的常见问题与排查方法4.1 启动慢得离谱先查这三个原因我装了十几个包启动要四秒这能用这是我听过最多的新手吐槽。其实启动慢通常是三个原因叠加导致的。第一个原因是没启用原生编译。Elisp是解释执行的大型包加载起来天然慢。解决方法是在init.el里加上(setq package-native-compile t)Emacs会把所有包编译成原生字节码启动和运行速度都会有质的提升。第二个原因是所有包都在启动时一股脑加载。很多人从网上抄配置时习惯把每个包都写成(require xxx)放在顶部等于把一整个货架的商品全在开门前摆好。正确做法是用use-package配合:defer或者:hook让包在你真正触发某个功能时才加载。第三个原因是你装了太多包。有些包尽管有延迟加载机制依然会有不可避免的初始化成本装二十个和装六十个的差距是显而易见的。排查时可以用M-x emacs-init-time查看启动耗时再用M-x profiler-start配合M-x profiler-report精准定位到具体包的加载耗时。我自己那份禁欲风格的配置在启用原生编译后启动时间稳定在0.6秒左右功能齐全的前提下这个数字是完全可以接受的。4.2 配置报错学会看懂backtraceElisp是一门完整的编程语言所以配置写错了Emacs给你的不是一个简单的配置文件错误提示而是backtrace——错误回溯栈。新手第一次看到backtrace都头皮发麻但它恰恰是最有价值的排错线索。排查流程是这样的当你改了配置导致Emacs启动报错时先用emacs --debug-init启动Emacs会暂停在错误现场并弹出完整回溯。回溯里最顶上那个函数就是你出错的位置往下的每一行是调用链。大部分配置错误的根源无非三种包的版本和API不兼容、某个变量名写错了、某个函数调用参数不对。你不需要读懂回溯的每一行只要顺着最顶层的几行往上找基本就能定位到init.el里具体是哪一段、哪一行出了问题。还有一个实用技巧在init.el里用(setq debug-on-error t)这样即使不是启动阶段运行时任何一个Elisp函数出错Emacs都会弹出回溯窗口。这个设置对排查某个功能突然失效的疑难杂症特别有用尤其是配合新装的包排查冲突。4.3 学习曲线太陡怎么避免三个月弃坑Emacs的学习曲线是真实存在的我不打算骗你说它很平缓。C-x、M-x这些组合键在当代用户身上没有任何肌肉记忆一切都要从零建立。所以核心问题是怎么才能不放弃我的经验是前期的核心法则叫渐进式切换不要一次性赌气把所有工作都搬到Emacs里。我当年犯过的错就是周末下定决心周一必须用Emacs写公司项目——结果整个周一都在查快捷键和改配置文件效率归零周二又默默打开了VS Code。正确做法是前期把Emacs当副手日常主力编辑器不变每天只用Emacs做笔记、查日志、改几个小文件。等Org-mode和Magit用顺手了再慢慢把编码任务迁移过来。这种方式的心理压力和效率损失都是最小的。另外一个容易被忽视的心理技巧是允许自己不会。Emacs的功能是海量的你不需要全部学会。我用了十年至今还有大把内置功能没碰过。每次你想我是不是还有某个更优的用法不知道时忍住去搜索的冲动先把手头的事办完。Emacs不是考试没有人会给你打分会用多少就用多少慢慢来反而走得远。4.4 高频问题速查表我在给新手答疑过程中总结了下面这些出现频率最高的故障和对应解法问题现象排查思路解决方案启动很慢用M-x emacs-init-time看耗时开启原生编译 use-package延迟加载M-x无法补全命令检查vertico是否启用在配置里加上:hook (after-init . vertico-mode)中文输入法导致快捷键失效输入法状态覆盖了Emacs按键切换到Emacs内置的C-\输入法模式避免系统输入法常驻eglot连不上语言服务器M-x eglot后看*eglot-log*缓冲区检查对应语言的LSP server是否已安装且正确配置代码高亮/缩进不正常可能落在旧的正则模式下Emacs 29启用tree-sitter模式如python-ts-mode、c-ts-mode这张表只能覆盖一部分场景但思路是通用的先确认问题是在配置层面还是功能层面再用内置诊断工具定位最后再动手改配置。很多新手一上来就去搜解决方案然后乱改一通结果问题没解决反而引入新问题——先诊断、后动手这个习惯比任何具体解决方案都重要。5. 我的个人体会与几条实用建议5.1 我从Emacs里学到的三个副产品坦白说Emacs对我的最大影响不是我有了一个好用的编辑器而是它重塑了我对整个工具链的看法这里有几个我完全没想到的副产品。第一个副产品是我养成了遇到不舒服就想办法改造的习惯。用Emacs之前我习惯接受软件默认的一切用Emacs之后我开始默认抱有这里是不是可以改一下的心态。这个习惯很快溢出到了编辑器之外——我会给自己常用的shell命令写函数封装会写脚本自动化重复的文件操作会为自己的工作流程搭建专属的小工具。Emacs训练出来的控制力意识比它本身的功能更值钱。第二个副产品是我因此踏进了Lisp的世界。最开始Elisp只是我的配置语言但在写了几个月配置之后我开始理解S表达式代码即数据的优雅于是去读了《计算机程序的构造和解释》接着学了Clojure和Common Lisp最后还用Common Lisp重写了自己的博客生成器。如果没有Emacs这个引子我大概永远不会主动去接触这个语言家族。第三个副产品是我有了长期数字资产的概念。我的Org文件里积累了几百条笔记和阅读记录全部是纯文本。九年之后我再打开它们和当年新建时没有任何障碍——不需要某个软件还活着不需要考虑格式迁移。这种确定性在数字时代是一种稀缺的安心感。5.2 给新手的最后几句大实话如果你决定启程开始Emacs之旅我把最想说的几句话放在最后。第一句别追求完美的配置。我见过太多人花两周时间折腾主题、优化排版、追求和某位大佬截图一模一样的界面结果连C-x C-f是什么意思都没记住。配置的最终目的是服务你的使用不是服务你的截图分享。第二句学会用C-h帮助系统。Emacs的自带帮助是我见过所有软件里最强悍的C-h k查看一个快捷键绑定了什么命令C-h f查看一个函数的完整文档C-h v查看一个变量的说明。遇到问题的第一反应应该是查帮助而不是先去搜索引擎搜Emacs怎么实现XXX。养成这个习惯之后你大部分问题都能独立解决而且解决的速度通常更快。第三句把学习周期拉长。不要期待一周变成专家我个人用了快两年才进入自己和编辑器合一的状态。但反过来这也是一句宽慰哪怕每天只用半小时只要持续在用的环境里慢慢渗透Emacs迟早会成为你工作流里不可替代的一部分。关键不是起点有多高而是你愿不愿意持续往前走。写到这里突然想起前几天有个朋友问我那你是不是打算劝我也换Emacs我说恰恰相反如果你现在用VS Code用得舒服没有任何必要换。工具本身没有高下重要的是你清楚自己的需求以及你是否愿意为长期效率投资。我自己留在Emacs是因为我享受我的工作台我做主的控制感而不是因为它是什么信仰。回到为什么今天还需要学习Emacs这个问题我的答案其实就一句话因为它依然提供着别处找不到的、真正属于个人的可编程性。至于你要不要启程听完这些真实的经验你的心里应该已经有答案了。