news 2026/9/28 5:44:19

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
从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,开箱就能获得以前需要折腾半天才能凑齐的现代化开发体验。

另一个容易被忽视的信号是生态活跃度。MELPA(Emacs的包仓库,类似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解释器。你用Elisp(Emacs自带的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-comp;Ubuntu或CentOS建议直接源码编译,编译时加上--with-native-compilation,不要用系统源里的旧版本;Windows从GNU官网下预编译版或者用scoop安装都行,近几年的Windows版体验已经进步很多。

装好之后,先搞明白配置文件放哪。Emacs的配置叫init.el,Linux/macOS通常在~/.emacs.d/init.el,Windows在~/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 配置报错:学会看懂backtrace

Elisp是一门完整的编程语言,所以配置写错了,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"这个问题,我的答案其实就一句话:因为它依然提供着别处找不到的、真正属于个人的可编程性。至于你要不要启程,听完这些真实的经验,你的心里应该已经有答案了。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/28 5:42:51

本科生降AI率实用指南:9款工具实测与提示词策略

1. 先说结论:为什么"降AI率"成了本科生的刚需这两年我后台收到最多的一类私信,就是本科生发来的求助:"学长,我用AI写的综述被老师查出来了,怎么办?" "查重率过了,但AI…

作者头像 李华
网站建设 2026/9/28 5:42:51

RFID读写器开发实战:C#调用Impinj R420写入标签User区全解析

简介:面向RFID应用开发者的C#读写器编程资料包,围绕Impinj R420固定式读写器,演示如何通过C#将特定内容写入标签用户区,适用于库存管理、物流跟踪、资产监控等场景。包内含官方协议文档与可运行示例,适合需要快速上手R…

作者头像 李华
网站建设 2026/9/28 5:42:38

用Docker跑MySQL:从环境准备到数据持久化的完整指南

我一直觉得,用 Docker 跑 MySQL 是本地开发最省心的方案,没有之一。你不需要去官网找下载链接,不需要担心系统里残留旧版本,更不用为了给测试环境换一个 MySQL 8.0 而把自己机器上的 5.7 卸载掉。一条docker run命令,M…

作者头像 李华
网站建设 2026/9/28 5:42:35

Docker启动MySQL实战:从基础安装到数据持久化与故障排查

“用docker启动mysql”这个需求,我几乎每周都会碰到一次。不管是给新项目搭一个测试库,还是帮同事在本地还原生产环境,最顺手的方案就是Docker跑MySQL。为什么?因为MySQL能力很强,但传统方式安装起来真的折磨人&#x…

作者头像 李华
网站建设 2026/9/28 5:42:18

Azure Container App Debug Console 实战:无 SSH 时代容器排障的终极利器

容器应用崩了,日志里只剩一行exit code 139,剩下的全是空白。你想进到容器里看看进程状态、跑几个命令定位问题,却发现 Azure Container App 不像传统 VM 那样给你开 SSH。这是不少人第一次被 Azure Container App 的 Debug Console “救回来…

作者头像 李华
网站建设 2026/9/28 5:42:17

Claude Code + Chrome MCP:浏览器自动化测试配置与验证指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华