什么是 Emacs?
Emacs 是一款功能强大、可扩展的文本编辑器,由 Richard Stallman 于 1976 年创建。它不仅仅是一个编辑器,更是一个完整的工作环境。
"Emacs is a great operating system, lacking only a decent text editor."
先看几个实际例子
在深入了解理论之前,先看看 Emacs 能做些什么:
- 在文档中执行代码 → Babel 可以在 Org 文档中直接执行 Python、Shell、SQL 等代码,并将结果嵌入文档
- 纯文本做电子表格 → Org-mode 的表格支持公式计算,类似 Excel 但纯文本
- 任务管理和 GTD → 内置的 TODO、日程、标签系统,可以管理项目和时间
- 绘制图表 → 用代码画流程图、UML(支持 PlantUML、Graphviz、Mermaid 等)
- 导出多格式 → 一份文档,可导出 HTML、PDF、Markdown、LaTeX 等多种格式
- Git 可视化管理 → Magit 是最强大的 Git 界面,比命令行更直观
- 远程文件编辑 → TRAMP 可以透明地编辑远程服务器上的文件,如同本地文件
Emacs 的历史演进
第一阶段(1962-1976):从 TECO 到 EMACS
TECO 的诞生(1962)
Emacs 的故事要从 1960 年代的 MIT 人工智能实验室(MIT AI Lab)说起。
TECO(Text Editor and COrrector):
- 1962 年:Dan Murphy 在 MIT 开发 TECO
- 实现语言:最初用 MACRO-10 汇编语言写成,运行在 PDP-10 大型机上
- 特点:一个强大但极其晦涩的文本编辑器
- 可编程:用户可以编写"编辑宏"(Editor MACroS)来扩展功能
- EMACS 的由来:这个名字就源自"Editor MACroS"
TECO 有多晦涩?
TECO 的命令像是密码:
5L表示向下移动 5 行D删除一个字符-3D删除前 3 个字符FB<ESC>搜索字符串(需要按 ESC 键结束)更复杂的是,TECO 宏程序本身就是一串难以理解的字符序列。有个经典的笑话:"TECO 编程的唯一方法是在键盘上随机按键,直到程序工作为止。"
TECO 的命令是用汇编语言实现的,执行速度快,但人类可读性几乎为零。这种设计在 1960 年代很常见(那时内存和计算资源极其珍贵),但随着硬件进步,人们开始追求更友好的界面。
TECO 宏的演进(1972-1974)
- 1972:Carl Mikkelsen 创建了第一组"控制-R"(Control-R)模式的宏
- Control-R 模式:允许实时编辑,所见即所得
- 这是从行编辑到屏幕编辑的革命性转变
- 1974:Guy Lewis Steele Jr. 加入改进
- Steele 当时是 MIT 本科生,后来成为 Scheme 语言的共同设计者
- 他和其他黑客(包括 David Moon、Richard Greenblatt)不断扩展宏库
- 逐渐形成了一个共享的、混乱的宏集合
- 每个人都有自己的宏,但缺乏统一标准
Guy Steele 的贡献
Guy Steele 不仅是早期 EMACS 的贡献者,他后来的成就包括:
- 与 Gerald Sussman 共同设计 Scheme 语言(1975)
- 参与设计 Common Lisp 标准
- 领导 Java 语言规范的编写
- Sun Fellow,计算机科学界的传奇人物
Steele 在接受采访时回忆:"我们那时只是想让编辑器更好用,没想到会影响整个软件世界。"
Stallman 的统一:EMACS 诞生(1976)
1976:Richard Stallman 创建了第一个统一的 EMACS
- Stallman 看到了混乱的宏集合,决定将它们整合
- 他花了几个月时间,重写和组织了所有宏
- 发布了第一个真正统一的 EMACS(Editor MACroS for TECO)
- 创新之处:
- 实时显示:所见即所得的编辑(当时很多编辑器是行编辑模式)
- 可扩展:用户可以编写自己的宏,用 TECO 宏语言
- 自文档化:按
C-h就能看到帮助(这在当时是革命性的) - 一致的键绑定:统一的快捷键系统(如
C-f前进,C-b后退) - 社区驱动:Emacs Commune 的概念 —— 任何人贡献宏都必须分享给社区
Emacs Commune(Emacs 公社)
Stallman 建立了一个规则:任何人想要把自己的宏加入官方 EMACS,必须同意将宏贡献给社区,让所有人都能使用和修改。这是自由软件运动的萌芽。
"EMACS 分发条款说,你必须将你的改进提供给我进行发布。反过来,人们可以从我这里获得所有其他人的改进。这就是公社(commune)的意义。"— Richard Stallman
这个理念后来演变成了 GPL 许可证的核心思想。
第二阶段(1978-1985):重写与分叉时代
1976 年之后,EMACS 理念传播开来,但因为依赖于 TECO 和 PDP-10 大型机,很多人开始在其他平台上用不同语言重写 Emacs。
Multics Emacs:Lisp 的引入(1978)
1978:Bernie Greenberg 的革命性创新
Bernie Greenberg 是 Honeywell 的程序员,他在 Multics 操作系统上工作时,需要一个类似 EMACS 的编辑器。但是:
- Multics 没有 TECO
- 他不想用晦涩的宏语言
- 他是 Lisp 的爱好者
关键决策:用 MacLisp 重写整个编辑器
- 核心用 Lisp 编写:编辑器的命令、缓冲区管理、窗口系统都是 Lisp 函数
- 扩展也用 Lisp:用户可以用同样的语言扩展编辑器
- 代码即数据:利用 Lisp 的同像性,编辑器可以自我修改
- 交互式:可以在运行时重新定义任何函数
为什么这是革命性的?
TECO EMACS 的扩展是用 TECO 宏语言,晦涩难懂。Greenberg 的创新是:
- 将编辑器本身作为 Lisp 环境
- 编辑器命令就是 Lisp 函数
- 用户扩展和核心代码使用同一种语言
这个设计后来被几乎所有现代 Emacs 实现采用,包括 GNU Emacs。
Greenberg 后来说:"我当时并不知道这会影响整个 Emacs 的未来。我只是觉得 Lisp 比 TECO 宏好写多了。"
Multics Emacs 的影响:
- 证明了 Lisp 是编辑器扩展语言的优秀选择
- 影响了后来的 Gosling Emacs(Mocklisp)
- 直接启发了 GNU Emacs 使用 Elisp
- 但因为 Multics 系统昂贵,用户基数小,没有广泛传播
Gosling Emacs:Unix 上的突破与背叛(1981-1983)
1981:James Gosling 在 CMU(卡内基梅隆大学)读博士时开发了 Gosling Emacs
背景:
- Unix 系统越来越流行,但没有好用的 Emacs
- TECO EMACS 依赖 PDP-10,无法移植到 Unix
- Multics Emacs 限于 Multics 平台
- Unix 用户迫切需要一个类似 EMACS 的编辑器
Gosling 的方案:
- 用 C 语言重写:C 是 Unix 的原生语言,可移植性强
- 核心用 C:编辑器引擎、缓冲区管理、显示系统用 C 实现(速度快)
- 扩展语言:发明了 Mocklisp,一种简化的类 Lisp 语言
- 语法像 Lisp(括号、前缀表示法)
- 但实现简单,功能有限
- 没有真正的 Lisp 特性(如宏、闭包、垃圾回收)
- 主要是为了兼容 Multics Emacs 的扩展
James Gosling 是谁?
- 加拿大计算机科学家
- 1981:开发 Gosling Emacs
- 1984:加入 Sun Microsystems
- 1995:创建 Java 语言,改变了软件世界
- 被称为"Java 之父"
Gosling 回忆:"我写 Emacs 只是为了自己用,没想到会传播得这么广。后来我把它卖给公司,Stallman 很生气,但我当时觉得这很正常。多年后我理解了他的观点。"
关键转折:商业化(1983)
- 1983:Gosling 将 Gosling Emacs 卖给了 UniPress 公司
- UniPress 将它变成商业软件 UniPress Emacs
- 源代码不再自由分发
- 需要付费购买许可证
- Stallman 的反应:
- 极度失望和愤怒
- 认为这是对社区的背叛
- 原本可以自由分享的软件变成了专有软件
- 这成为他创建 GNU Emacs 和 GPL 的直接动机
GNU Emacs 的诞生(1984-1985)
1984:GNU 项目启动
- Stallman 辞去 MIT 工作,全职开发自由软件
- 计划:创建一个完整的自由 Unix 系统
- Emacs 是 GNU 项目的第一个主要软件
1985:GNU Emacs 发布
- 完全用 C 和 Emacs Lisp 重写
- 设计理念:
- 自由:使用 GPL 许可证,永远自由
- 可移植:可以在各种 Unix 系统上运行
- 可扩展:Elisp 作为完整的编程语言,远比 Mocklisp 强大
- 自文档化:每个函数都有文档字符串
各版本对比总结:
| 实现 | 年份 | 作者 | 语言/平台 | 扩展语言 | 特点 |
|---|---|---|---|---|---|
| TECO EMACS | 1976 | Richard Stallman | TECO/PDP-10 | TECO 宏 | 原始版本,汇编级宏 |
| Multics Emacs | 1978 | Bernie Greenberg | MacLisp/Multics | MacLisp | 第一个纯 Lisp 实现 |
| Gosling Emacs | 1981 | James Gosling | C/Unix | Mocklisp | Unix 上的突破,后来商业化 |
| UniPress Emacs | 1983 | Gosling 商业化 | C/Unix | Mocklisp | 商业版本,需付费 |
| MicroEMACS | 1985 | Dave Conroy | C/多平台 | 无 | 轻量级,Linus 早期使用 |
| GNU Emacs | 1985 | Richard Stallman | C + Elisp | Elisp | 完全自由,GPL 保护 |
第三阶段(1985-1991):GNU Emacs 的崛起
1985-1990:快速发展
- GNU Emacs 迅速成为最流行的 Emacs 实现
- Gosling Emacs、UniPress Emacs 逐渐被淘汰
- 形成了庞大的社区和扩展生态
- 成为 GNU 项目的旗舰软件,也是早期最成功的自由软件之一
第四阶段(1991-2010s):XEmacs 分叉时代
分叉的开始:Lucid Emacs(1991)
Lucid 公司是一家由 Richard Gabriel 和 Scott Fahlman 创立的 Lisp 公司(开发 Lucid Common Lisp),他们需要一个更现代化的 Emacs:
- 问题:GNU Emacs 19 的 GUI 支持不够好
- 没有菜单栏、工具栏
- 颜色和字体支持有限
- X Window System 集成不佳
- 决策:Fork GNU Emacs 19,创建 Lucid Emacs
- 核心开发者:
- Jamie Zawinski (jwz):主力开发者,后来创建 Netscape Navigator
- Ben Wing:长期维护者
- Chuck Thompson:GUI 系统开发
Jamie Zawinski (jwz) 的传奇故事
Jamie Zawinski 是 1990 年代最著名的黑客之一:
- 在 Lucid 公司开发 Lucid Emacs(1991-1994)
- 1994:加入 Netscape,成为 Netscape Navigator 的核心开发者之一
- 在 Netscape 期间,他坚持使用 XEmacs 开发 C/C++ 代码
- 1999:离开 Netscape,在旧金山开了一家夜店(DNA Lounge)
- 他的博客(jwz.org)是技术圈的经典,充满了对软件行业的辛辣评论
jwz 的名言:
- "Some people, when confronted with a problem, think 'I know, I'll use regular expressions.' Now they have two problems."(正则表达式笑话)
- "Linux is only free if your time has no value."(对开源的现实主义看法)
他对 Emacs 的贡献:XEmacs 的 GUI 系统、多字体支持、国际化(i18n)支持。
更名与社区接管:XEmacs(1994)
- Lucid 公司因市场竞争失败而倒闭(Common Lisp 输给了 C++)
- 项目由社区接管,改名为 XEmacs(X Window System Emacs)
- 核心维护者:Ben Wing、Steve Baur、Martin Buchholz
分叉的原因:
技术差异:
- XEmacs 优先支持 GUI 特性(菜单、工具栏、颜色)
- GNU Emacs 优先保证终端下的体验
- 两个项目对代码重构的策略不同
开发哲学:
- XEmacs:更激进,快速添加新特性
- GNU Emacs:更保守,注重稳定性和向后兼容
社区分歧:
- 一些开发者希望有更多自主权
- Stallman 作为 GNU Emacs 的最终决策者,风格相对独断
两者并存(1990s-2000s)
- XEmacs 在 GUI 和一些现代特性上领先
- GNU Emacs 保持更大的用户基础和更活跃的开发
- 两个项目互相借鉴,但代码库逐渐分离
- 形成了"包兼容性"问题:一些包只支持其中一个
XEmacs 的衰落(2010s)
- 2009:XEmacs 21.5 发布(最后一个重要版本)
- GNU Emacs 迎头赶上,GUI 特性不再落后
- XEmacs 开发陷入停滞
- 大部分用户和开发者回归 GNU Emacs
分叉的教训
XEmacs 分叉是开源社区的一个经典案例:
- 技术分歧可以导致分叉,但最终用户基数和持续投入决定胜负
- 向后兼容的重要性:GNU Emacs 保持兼容性,赢得了长期优势
- 社区治理:独断式领导(Stallman)vs 民主式(XEmacs)各有利弊
XEmacs 并非失败,它推动了 Emacs 的进化,许多创新最终被 GNU Emacs 采纳。
第五阶段(2000s-现在):现代化与繁荣
成熟期(2000s)
- 2001:Emacs 21,Unicode 支持
- 2007:Emacs 22,改进的字体渲染
- 2008:Emacs 23,反锯齿字体、D-Bus 支持
现代化转折点(2010s)
2012:Emacs 24,重大更新:
- 内置包管理器(package.el)
- 词法作用域(lexical binding)
- 主题系统
- 打开了现代化的大门
- MELPA 生态开始繁荣
2014:Emacs 24.4,MELPA 生态成熟,5000+ 包
2016:Emacs 25,异步动态模块支持
高性能时代(2020s)
2020:Emacs 27:
- 原生 JSON 解析(性能提升 100 倍)
- Tab-bar mode
- 更好的线程支持
2021:Emacs 28:
- 原生编译(Native Compilation):Elisp 编译成机器码,性能接近 C
- Tree-sitter 实验性支持(新一代语法解析)
- 纯 GTK 支持(更好的 Wayland 兼容性)
2023:Emacs 29:
- Tree-sitter 成为正式特性
- Eglot(LSP 客户端)并入核心
- 更好的 emoji 和 Unicode 支持
- SQLite 支持
2024-现在:Emacs 30 开发中
- 继续优化性能
- 更好的现代开发工具集成
- Android 移植实验
生态系统的繁荣
配置框架的兴起:
现代 Emacs 用户不再从零配置,而是使用配置框架:
- Spacemacs(2014):Emacs + Vim 的混合体,易于上手
- Doom Emacs(2016):高性能、现代化配置,面向开发者
- Prelude、Purcell's configs:社区维护的配置模板
这些框架降低了 Emacs 的入门门槛,吸引了新一代用户。
包生态:
- ELPA(Emacs Lisp Package Archive):官方包仓库
- MELPA(2012):社区驱动,5000+ 包,每日更新
- Notable packages:
- Org mode:笔记、任务管理、文学编程
- Magit:最好的 Git 界面
- LSP-mode / Eglot:现代 IDE 功能
- Company、Ivy、Helm:补全和搜索框架
Richard Stallman 与 GNU 项目
Richard Stallman (RMS),自由软件运动的发起人,于 1984 年启动了 GNU 项目(GNU's Not Unix),目标是创建一个完全自由的类 Unix 操作系统。
- GNU 项目:开发了大量自由软件工具,如 GCC(编译器)、Bash(shell)、以及 Emacs
- 自由软件理念:用户拥有运行、复制、分发、研究、修改和改进软件的自由
- GPL 许可证:Stallman 创建了 GNU 通用公共许可证,确保软件保持自由
- GNU Emacs:1985 年,Stallman 发布了 GNU Emacs,成为 GNU 项目的旗舰软件之一
GPL 与自由软件的定义
GPL 许可证的核心是保障用户的自由。以下是 Richard Stallman 对自由软件的官方定义:
The Free Software Definition
- Freedom 0: The freedom to run the program as you wish, for any purpose.
- 自由度 0:以任何目的,按你的意愿运行程序的自由。
- Freedom 1: The freedom to study how the program works, and change it so it does your computing as you wish. Access to the source code is a precondition for this.
- 自由度 1:学习程序如何工作,并按你的意愿修改它以满足你的计算需求的自由。访问源代码是此项自由的前提条件。
- Freedom 2: The freedom to redistribute copies so you can help others.
- 自由度 2:重新分发副本以帮助他人的自由。
- Freedom 3: The freedom to distribute copies of your modified versions to others. By doing this you can give the whole community a chance to benefit from your changes. Access to the source code is a precondition for this.
- 自由度 3:将你修改后的版本副本分发给他人的自由。这样做可以让整个社区有机会从你的改进中受益。访问源代码是此项自由的前提条件。
"Free software" means software that respects users' freedom and community. Roughly, it means that the users have the freedom to run, copy, distribute, study, change and improve the software. "自由软件"意味着尊重用户自由和社区的软件。简而言之,这意味着用户拥有运行、复制、分发、研究、修改和改进软件的自由。
— Richard Stallman, GNU Project
**Copyleft(著佐权)**是 GPL 的核心机制:要求任何基于 GPL 软件的派生作品也必须使用 GPL 许可证,从而防止自由软件被变成专有软件。这正是 GPL 与 BSD 等宽松许可证的关键区别。
GNU/Linux 系统的大部分工具都来自 GNU 项目,Emacs 作为其核心组件,完美体现了自由软件的理念。
St. IGNUcius - Emacs 教会的圣人

Richard Stallman 有一个有趣的"副业"——他会在各种自由软件会议上扮演 St. IGNUcius(圣伊格纽修斯),这是"Emacs 教会"(Church of Emacs)的圣人。
背景故事:
- 头顶光环:Stallman 头上戴着的"光环"实际上是一个旧硬盘的盘片,象征着自由软件的神圣使命
- 教会仪式:他会穿着长袍,以幽默的方式"布道",宣扬自由软件的四大自由(运行、研究、再分发、改进软件的自由)
- Emacs vs Vi:在"Emacs 教会"中,Vi 被戏称为"恶魔编辑器"(因为要用
vi vi vi来召唤,而 vi 在罗马数字中是 6,三个 6 即 666) - 幽默传播:这是 Stallman 用幽默方式传播严肃理念的典范,让自由软件哲学更容易被大众接受
"使用自由软件是一种伦理选择,关乎我们想生活在什么样的社会中。" — Richard Stallman
示例:
Emacs 的设计哲学
核心哲学:一切皆 Buffer
"In Emacs, everything is a buffer."
一切皆 Buffer 是 Emacs 最核心的设计哲学,类似于 Unix 的"一切皆文件"。
什么是 Buffer?
Buffer 是 Emacs 中最基本的抽象单位,是一块可以被编辑的文本区域。在 Emacs 中:
- 文件 是 buffer(打开文件时创建 buffer)
- 终端 是 buffer(
M-x term创建终端 buffer) - Shell 输出 是 buffer(
M-x shell的交互界面) - 编译结果 是 buffer(
M-x compile的输出) - 帮助文档 是 buffer(
C-h f显示在 buffer 中) - 邮件 是 buffer(使用 mu4e、notmuch 等)
- Git 界面 是 buffer(Magit 的每个界面)
- 文件浏览器 是 buffer(Dired mode)
- 进程列表 是 buffer(
M-x list-processes) - 包管理界面 是 buffer(
M-x list-packages) - 甚至 临时计算 也是 buffer(
*scratch*buffer)
这个哲学的深层含义:
统一的操作界面:
- 所有 buffer 都可以用相同的编辑命令(移动、搜索、复制、粘贴)
- 不需要为每个功能学习不同的界面
- 例如:在终端 buffer 中可以用
C-s搜索输出,在 Git buffer 中可以用C-w复制提交信息
文本是一等公民:
- 任何信息都以文本形式呈现
- 可以用文本处理工具操作一切
- 可以将任何 buffer 的内容保存、编辑、转换
无缝集成:
- 所有功能都在同一个环境中
- 可以轻松在不同 buffer 之间切换、传递数据
- 例如:从编译错误 buffer 跳转到源代码 buffer,从文档 buffer 复制代码到编辑 buffer
可编程性:
- 每个 buffer 都是 Elisp 对象,可以用代码操作
- 可以创建自定义的 buffer 来展示任何信息
- 这就是为什么 Emacs 能扩展出如此多样的功能
与 Unix "一切皆文件"的对比:
| Unix 哲学 | Emacs 哲学 |
|---|---|
| 一切皆文件(Everything is a file) | 一切皆 Buffer(Everything is a buffer) |
| 通过文件描述符操作 | 通过 buffer 对象操作 |
| 文本流管道(pipe) | Buffer 之间传递 |
| 小工具组合 | 在同一环境中集成 |
Unix 将外部资源抽象为文件,Emacs 将内部功能抽象为 buffer。两者都是强大的统一抽象。
动手体验:Buffer 的魔力
;; 快速体验:列出当前所有 buffer
(mapcar #'buffer-name (buffer-list))
;; 将光标移到末尾,按 C-x C-e 执行
试试上面的代码,你会看到 Emacs 中当前打开的所有 buffer!
无论是:
- 文件 buffer(你正在编辑的文档)
- 终端 buffer(Shell 输出)
- 计算结果 buffer(数据分析)
- 搜索结果 buffer(Grep 输出)
- 邮件 buffer(电子邮件)
它们本质上都是 buffer,都可以用相同的方式操作:搜索、复制、保存、编辑。
Emacs Lisp:编辑器中的 Lisp 机器
Lisp:计算机科学的活化石
Lisp(LISt Processing) 是现存第二古老的高级编程语言(仅次于 Fortran),由 John McCarthy 于 1958 年在 MIT 创造。
Lisp 的历史地位:
人工智能的母语:
- 在 AI 研究的黄金时代(1960-1980),Lisp 是人工智能研究的首选语言
- MIT、斯坦福等顶尖 AI 实验室都使用 Lisp
- 专门的 Lisp 机器(Lisp Machine)曾风靡一时
编程语言创新的先驱:
- 垃圾回收:第一个引入自动内存管理的语言
- 动态类型:运行时类型检查
- 函数式编程:函数作为一等公民
- 递归:第一个支持递归的语言
- REPL:交互式编程环境(Read-Eval-Print Loop)
- 元编程:强大的宏系统,代码即数据
影响深远:
- Python、Ruby、JavaScript 的很多特性源自 Lisp
- 函数式编程的复兴(Haskell、Scala、Clojure)
- 现代语言的宏系统(Rust、Julia)
"Lisp 是值得学习的语言,即便你永远不会在工作中使用它。因为一旦你真正理解了 Lisp,你会获得一种启迪,让你成为更好的程序员。" — Eric S. Raymond,《如何成为一名黑客》
Lisp 家族:众多方言
Lisp 不是单一的语言,而是一个语言家族。主要方言包括:
| 方言 | 诞生年份 | 特点 | 代表应用 |
|---|---|---|---|
| Common Lisp | 1984 | 工业级、功能完整、标准化 | 商业应用、AI 研究 |
| Scheme | 1975 | 简洁优雅、教学友好 | 编程教育、SICP |
| Clojure | 2007 | 现代、函数式、JVM 平台 | Web 开发、大数据 |
| Racket | 1995 | 教学导向、语言实验室 | 编程语言研究 |
| Emacs Lisp | 1985 | 编辑器扩展、实用主义 | Emacs 生态 |
Lisp 的演变:
- 1958:John McCarthy 在 MIT 发明 Lisp
- 1960s:各种 Lisp 方言出现(Lisp 1.5, MacLisp, InterLisp)
- 1975:Scheme 诞生,强调简洁性
- 1984:Common Lisp 标准化,试图统一各方言
- 1985:Emacs Lisp 随 GNU Emacs 发布
- 1990s:AI 冬季,Lisp 商业应用衰退
- 2000s:函数式编程复兴,Clojure 等现代 Lisp 出现
- 2010s-现在:Lisp 思想影响现代语言设计
Emacs Lisp:为编辑器而生的 Lisp
Emacs Lisp (Elisp) 是 Emacs 的扩展和配置语言,也是 Lisp 家族中最实用的方言之一。
Elisp 的诞生:
- 1976:James Gosling 创建 Gosling Emacs,使用 MacLisp 方言
- 1984:Richard Stallman 开始编写 GNU Emacs
- 1985:GNU Emacs 发布,使用自己的 Lisp 方言 —— Emacs Lisp
- 设计目标:专门为文本编辑和扩展设计,而非通用编程
Elisp vs 其他 Lisp 方言:
| 特性 | Emacs Lisp | Common Lisp | Scheme |
|---|---|---|---|
| 设计目标 | 编辑器扩展 | 通用编程 | 教学、简洁 |
| 复杂度 | 中等 | 复杂 | 简洁 |
| 标准化 | 无正式标准 | ANSI 标准 | IEEE/R7RS 标准 |
| 命名空间 | 单命名空间 | 包(Package)系统 | 词法作用域 |
| 词法/动态 | 默认动态作用域* | 词法作用域 | 词法作用域 |
| 编译 | 字节码编译 | 原生编译 | 视实现而定 |
*注:Emacs 24.1(2012)后默认使用词法作用域
为什么 Emacs 选择 Lisp?
可扩展性:
- Lisp 的同像性(代码即数据)使得动态扩展成为可能
- 用户可以在运行时重定义任何函数
- 宏系统允许创建新的语言特性
交互性:
- REPL 环境天然适合编辑器
- 立即执行、立即生效,无需重启
- 实时调试和实验
表达能力:
- 高阶函数处理复杂的文本操作
- 递归和列表处理适合树状结构(如语法树)
- 强大的模式匹配和符号处理
哲学契合:
- Lisp 和 Unix 都强调"小工具组合"
- Lisp 的"自省"能力(可以检查和修改自身)
- 自由软件精神:代码可读、可修改、可分享
Emacs:伪装成编辑器的 Lisp 机器
Emacs 本质上是一个 Lisp 解释器,恰好它的主要应用是文本编辑。绝大部分 Emacs 功能(包括核心编辑命令)都是用 Elisp 编写的,只有最底层的显示和输入处理是 C 代码。
这种设计让 Emacs 拥有无限的可能性:你不是在使用一个固定的编辑器,而是在使用一个可编程的编辑环境。
Elisp 的发展与现状
早期(1985-2000):
- 随 GNU Emacs 稳步发展
- 逐步添加功能:高级数据结构、网络支持、多线程
- 形成了庞大的包生态(Emacs Lisp Package Archive)
现代化(2000-2012):
- 2001:引入 Unicode 支持
- 2008:字节码编译优化
- 2012:Emacs 24,引入词法作用域(lexical binding),性能大幅提升
当代(2012-现在):
- 原生编译:Emacs 28(2021)引入原生编译(native compilation),性能接近 C 代码
- 现代工具链:LSP(语言服务器协议)、Tree-sitter(语法解析)集成
- 生态繁荣:MELPA 拥有 5000+ 个包
- 新一代用户:Doom Emacs、Spacemacs 等配置框架降低入门门槛
Elisp 的独特生态:
- 自文档化:每个函数、变量都有文档字符串,可以即时查看
- 高度一致:40 年的发展保持了向后兼容
- 活跃社区:从学术界到工程界,从 Web 开发到科学计算
- 实用主义:不追求纯粹的函数式,而是平衡实用性和优雅性
学习 Elisp 的价值:
- 理解 Lisp 思想:学习编程语言设计的经典案例
- 掌握元编程:理解代码生成代码的强大能力
- 自定义工作环境:打造完全适合自己的编辑器
- 参与开源社区:Emacs 是历史最悠久的自由软件项目之一
想学习 Elisp 的语法和编程?可以参考后续的 Elisp 实战章节。
为什么选择 Emacs?
- 高度可定制:可以根据个人需求配置成完美的工作环境
- 生态丰富:拥有数千个扩展包,涵盖各种使用场景
- 持续发展:40多年的历史,社区活跃,持续更新
- 学习价值:学习 Emacs 能提升对编辑器、文本处理的理解
- 统一工作流:可以在 Emacs 中完成几乎所有工作,无需频繁切换工具
编辑器圣战:Vim vs Emacs
两大编辑器的核心特点
Vim 的特点:
- 模态编辑:通过不同模式(Normal、Insert、Visual 等)高效编辑文本
- 轻量快速:启动速度快(几十毫秒),资源占用少
- 键盘驱动:几乎所有操作都可以通过键盘完成,强调效率
- 学习曲线陡峭:初期难以上手,但熟练后效率极高
- 哲学:"做好一件事" - 专注于文本编辑本身
- 无处不在:几乎所有 Unix/Linux 系统都预装了 vi/vim
Emacs 的特点:
- 可编程环境:不仅是编辑器,更是一个 Lisp 运行环境
- 功能全面:可以扩展成 IDE、邮件客户端、日程管理、甚至游戏平台
- 自文档化:内置强大的帮助系统和文档
- 学习曲线平缓:可以逐步学习,边用边学(但要精通也很难)
- 哲学:"All in Emacs" - 在一个环境中完成所有工作
- 定制性:每个用户的 Emacs 配置都可能完全不同
名人的选择
Emacs 阵营:
- Richard Stallman:创造者,终身 Emacs 用户
- Eric S. Raymond:《大教堂与集市》作者,Emacs 爱好者
- Peter Norvig:Google 研究总监,AI 专家
- Guido van Rossum:Python 之父(早期用 Emacs)
- Linus Torvalds:Linux 之父,自己分叉的MicroEMACS
Vim 阵营:
- Rob Pike:Go 语言设计者之一,Unix 老将
- Brian Kernighan:C 语言共同发明者,《The C Programming Language》作者
中立/两者都用:
- Donald Knuth:TeX 作者,主要用自己的编辑器,但理解两者的价值
- Ken Thompson:Unix 创始人之一,创建了 ed(行编辑器),vi 和 Emacs 的共同祖先
扩展方式的对比
Vim/Neovim 的扩展方式:
- 传统 Vim:使用 Vimscript(一种专门为 Vim 设计的脚本语言)
- Neovim:引入 Lua 作为一等公民,提供更现代的扩展方式
- 插件管理:通过 vim-plug、packer.nvim 等插件管理器
- 异步支持:Neovim 原生支持异步操作
Emacs 的扩展方式:
- Emacs Lisp (Elisp):使用 Lisp 方言进行扩展
- 包管理:内置 package.el,以及第三方的 use-package、straight.el 等
- MELPA 生态:拥有庞大的包仓库
- 实时修改:可以在运行时重新定义函数,无需重启
Lua vs Elisp:本质区别
语言范式和设计哲学:
Elisp(Emacs Lisp)
- Lisp 方言:属于 Lisp 家族,拥有几十年历史
- 同像性(Homoiconicity):代码即数据,数据即代码
- S-表达式:使用括号表示的前缀表达式,如
(+ 1 2) - 宏系统:强大的元编程能力,可以在编译时生成代码
- 动态类型:运行时类型检查
- 垃圾回收:自动内存管理
Lua
- 独立脚本语言:最初为嵌入式应用设计
- 轻量级:语言核心小巧,易于嵌入其他程序
- 表(Table):唯一的复合数据结构,灵活但简单
- 元表(Metatable):通过元表实现面向对象等高级特性
- 动态类型:运行时类型检查
- 垃圾回收:增量式垃圾回收器
本质区别总结:
| 特性 | Elisp | Lua |
|---|---|---|
| 角色定位 | Emacs 的核心语言,编辑器即解释器 | Neovim 的嵌入式脚本语言 |
| 集成深度 | 深度集成,Emacs 就是运行在 Elisp 之上 | 通过 API 层与 Neovim 交互 |
| 元编程 | 强大的宏系统,代码生成代码 | 通过元表实现,相对受限 |
| 语言特性 | Lisp 函数式风格,S-表达式 | 命令式/过程式,类 C 语法 |
| 可修改性 | 可以动态重定义任何函数(包括内置) | 只能通过暴露的 API 操作 Neovim |
| 学习曲线 | Lisp 语法独特,需要适应 | 语法类似其他主流语言,易上手 |
| 生态成熟度 | 40+ 年积累,海量包和文档 | 相对年轻,但发展迅速 |
关键理解:
- Emacs = Elisp 解释器 + 文本编辑能力:用 Elisp 写的程序恰好是个编辑器
- Neovim = 编辑器 + Lua 扩展能力:用 C 写的编辑器通过 Lua 提供扩展接口
这就是为什么 Emacs 用户常说 "Emacs is a Lisp machine",而 Neovim 更像是 "一个支持 Lua 脚本的编辑器"。
获取 Emacs 资讯与社区动态
作为 Emacs 用户,了解最新的开发动态、社区资讯和 Richard Stallman 的相关消息是很重要的。以下是一些优质的信息来源。
官方渠道
1. emacs-devel 邮件列表(强烈推荐)
emacs-devel 是 Emacs 核心开发的官方邮件列表,是获取第一手开发信息的最佳渠道。
- 订阅地址:https://lists.gnu.org/mailman/listinfo/emacs-devel
- 在线存档:https://lists.gnu.org/archive/html/emacs-devel/
- 内容:
- Emacs 新功能讨论和设计决策
- Bug 报告和修复
- 补丁提交和代码审查
- 性能优化讨论
- 版本发布公告
- 特点:
- Richard Stallman、Eli Zaretskii(Emacs 维护者)等核心开发者经常参与
- 可以直接了解 Emacs 的发展方向
- 讨论深入且技术性强
2. 其他官方邮件列表
- emacs-tangents:emacs-devel 的非技术性讨论分支
- help-gnu-emacs:用户互助和使用问题
- bug-gnu-emacs:bug 报告
- emacs-announce:重要公告(版本发布等)
订阅地址:https://savannah.gnu.org/mail/?group=emacs
3. GNU 和 FSF 官方渠道
- GNU 官网:https://www.gnu.org/
- GNU 项目的整体动态
- Richard Stallman 的文章和演讲
- FSF 新闻:https://www.fsf.org/news/
- 自由软件基金会的最新消息
- Stallman 作为 FSF 创始人的相关动态
- Stallman 个人网站:https://stallman.org/
- Stallman 的政治观点、日程、文章
- 每日更新的政治笔记(Political Notes)
Emacs 社区资源
1. Planet Emacs
- 网址:https://planet.emacslife.com/
- 内容:聚合了众多 Emacs 博客的 RSS feed
- 特点:可以一站式浏览 Emacs 社区的博客文章
2. Reddit
- r/emacs:https://www.reddit.com/r/emacs/
- 活跃的 Emacs 社区
- 技巧分享、配置展示、问题解答
- 新包发布和项目宣传
3. Emacs China(中文社区)
- 论坛:https://emacs-china.org/
- 特点:中文 Emacs 用户的主要聚集地
- 内容:中文教程、经验分享、问题讨论
4. IRC/Matrix
- IRC:
#emacson irc.libera.chat - Matrix:
#emacs:libera.chat - 特点:实时聊天,可以快速获得帮助
5. Emacs StackExchange
- 网址:https://emacs.stackexchange.com/
- 特点:高质量的问答社区
- 内容:详细的技术问题和解答
官方文档和手册
1. Emacs 官方手册
;; 在 Emacs 中直接访问
(info "emacs") ; Emacs 用户手册
(info "elisp") ; Elisp 编程手册
(info "eintr") ; Elisp 入门教程
2. 在线文档
- Emacs 手册:https://www.gnu.org/software/emacs/manual/
- Elisp 参考:https://www.gnu.org/software/emacs/manual/html_node/elisp/
开发相关
1. Emacs 源代码仓库
- 官方 Git:https://git.savannah.gnu.org/cgit/emacs.git
- GitHub 镜像:https://github.com/emacs-mirror/emacs
- 特点:可以查看最新的提交和开发进度
2. Emacs Bug Tracker
- 网址:https://debbugs.gnu.org/cgi/pkgreport.cgi?package=emacs
- 特点:查看已知 bug 和修复进度

Comments (0)
No comments yet. Be the first to share your thoughts!