见证Emacs所见证的 - Emacs 101

什么是 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)

  • 1972Carl Mikkelsen 创建了第一组"控制-R"(Control-R)模式的宏
    • Control-R 模式:允许实时编辑,所见即所得
    • 这是从行编辑到屏幕编辑的革命性转变
  • 1974Guy 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)

1976Richard 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)

1978Bernie Greenberg 的革命性创新

Bernie Greenberg 是 Honeywell 的程序员,他在 Multics 操作系统上工作时,需要一个类似 EMACS 的编辑器。但是:

  • Multics 没有 TECO
  • 他不想用晦涩的宏语言
  • 他是 Lisp 的爱好者

关键决策:用 MacLisp 重写整个编辑器

  • 核心用 Lisp 编写:编辑器的命令、缓冲区管理、窗口系统都是 Lisp 函数
  • 扩展也用 Lisp:用户可以用同样的语言扩展编辑器
  • 代码即数据:利用 Lisp 的同像性,编辑器可以自我修改
  • 交互式:可以在运行时重新定义任何函数

为什么这是革命性的?

TECO EMACS 的扩展是用 TECO 宏语言,晦涩难懂。Greenberg 的创新是:

  1. 将编辑器本身作为 Lisp 环境
  2. 编辑器命令就是 Lisp 函数
  3. 用户扩展和核心代码使用同一种语言

这个设计后来被几乎所有现代 Emacs 实现采用,包括 GNU Emacs。

Greenberg 后来说:"我当时并不知道这会影响整个 Emacs 的未来。我只是觉得 Lisp 比 TECO 宏好写多了。"

Multics Emacs 的影响

  • 证明了 Lisp 是编辑器扩展语言的优秀选择
  • 影响了后来的 Gosling Emacs(Mocklisp)
  • 直接启发了 GNU Emacs 使用 Elisp
  • 但因为 Multics 系统昂贵,用户基数小,没有广泛传播

Gosling Emacs:Unix 上的突破与背叛(1981-1983)

1981James 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 项目的第一个主要软件

1985GNU 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

分叉的原因:

  1. 技术差异

    • XEmacs 优先支持 GUI 特性(菜单、工具栏、颜色)
    • GNU Emacs 优先保证终端下的体验
    • 两个项目对代码重构的策略不同
  2. 开发哲学

    • XEmacs:更激进,快速添加新特性
    • GNU Emacs:更保守,注重稳定性和向后兼容
  3. 社区分歧

    • 一些开发者希望有更多自主权
    • 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)

  • 2012Emacs 24,重大更新:

    • 内置包管理器(package.el)
    • 词法作用域(lexical binding)
    • 主题系统
    • 打开了现代化的大门
    • MELPA 生态开始繁荣
  • 2014:Emacs 24.4,MELPA 生态成熟,5000+ 包

  • 2016:Emacs 25,异步动态模块支持

高性能时代(2020s)

  • 2020Emacs 27

    • 原生 JSON 解析(性能提升 100 倍)
    • Tab-bar mode
    • 更好的线程支持
  • 2021Emacs 28

    • 原生编译(Native Compilation):Elisp 编译成机器码,性能接近 C
    • Tree-sitter 实验性支持(新一代语法解析)
    • 纯 GTK 支持(更好的 Wayland 兼容性)
  • 2023Emacs 29

    • Tree-sitter 成为正式特性
    • Eglot(LSP 客户端)并入核心
    • 更好的 emoji 和 Unicode 支持
    • SQLite 支持
  • 2024-现在:Emacs 30 开发中

    • 继续优化性能
    • 更好的现代开发工具集成
    • Android 移植实验

生态系统的繁荣

配置框架的兴起:

现代 Emacs 用户不再从零配置,而是使用配置框架:

  • Spacemacs(2014):Emacs + Vim 的混合体,易于上手
  • Doom Emacs(2016):高性能、现代化配置,面向开发者
  • PreludePurcell'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

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)

这个哲学的深层含义:

  1. 统一的操作界面

    • 所有 buffer 都可以用相同的编辑命令(移动、搜索、复制、粘贴)
    • 不需要为每个功能学习不同的界面
    • 例如:在终端 buffer 中可以用 C-s 搜索输出,在 Git buffer 中可以用 C-w 复制提交信息
  2. 文本是一等公民

    • 任何信息都以文本形式呈现
    • 可以用文本处理工具操作一切
    • 可以将任何 buffer 的内容保存、编辑、转换
  3. 无缝集成

    • 所有功能都在同一个环境中
    • 可以轻松在不同 buffer 之间切换、传递数据
    • 例如:从编译错误 buffer 跳转到源代码 buffer,从文档 buffer 复制代码到编辑 buffer
  4. 可编程性

    • 每个 buffer 都是 Elisp 对象,可以用代码操作
    • 可以创建自定义的 buffer 来展示任何信息
    • 这就是为什么 Emacs 能扩展出如此多样的功能

与 Unix "一切皆文件"的对比:

Unix 哲学 Emacs 哲学
一切皆文件(Everything is a file) 一切皆 Buffer(Everything is a buffer)
通过文件描述符操作 通过 buffer 对象操作
文本流管道(pipe) Buffer 之间传递
小工具组合 在同一环境中集成

Unix 将外部资源抽象为文件,Emacs 将内部功能抽象为 buffer。两者都是强大的统一抽象。

动手体验:Buffer 的魔力

elisp
;; 快速体验:列出当前所有 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 的历史地位:

  1. 人工智能的母语

    • 在 AI 研究的黄金时代(1960-1980),Lisp 是人工智能研究的首选语言
    • MIT、斯坦福等顶尖 AI 实验室都使用 Lisp
    • 专门的 Lisp 机器(Lisp Machine)曾风靡一时
  2. 编程语言创新的先驱

    • 垃圾回收:第一个引入自动内存管理的语言
    • 动态类型:运行时类型检查
    • 函数式编程:函数作为一等公民
    • 递归:第一个支持递归的语言
    • REPL:交互式编程环境(Read-Eval-Print Loop)
    • 元编程:强大的宏系统,代码即数据
  3. 影响深远

    • 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?

  1. 可扩展性

    • Lisp 的同像性(代码即数据)使得动态扩展成为可能
    • 用户可以在运行时重定义任何函数
    • 宏系统允许创建新的语言特性
  2. 交互性

    • REPL 环境天然适合编辑器
    • 立即执行、立即生效,无需重启
    • 实时调试和实验
  3. 表达能力

    • 高阶函数处理复杂的文本操作
    • 递归和列表处理适合树状结构(如语法树)
    • 强大的模式匹配和符号处理
  4. 哲学契合

    • 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:字节码编译优化
  • 2012Emacs 24,引入词法作用域(lexical binding),性能大幅提升

当代(2012-现在)

  • 原生编译:Emacs 28(2021)引入原生编译(native compilation),性能接近 C 代码
  • 现代工具链:LSP(语言服务器协议)、Tree-sitter(语法解析)集成
  • 生态繁荣:MELPA 拥有 5000+ 个包
  • 新一代用户:Doom Emacs、Spacemacs 等配置框架降低入门门槛

Elisp 的独特生态:

  • 自文档化:每个函数、变量都有文档字符串,可以即时查看
  • 高度一致:40 年的发展保持了向后兼容
  • 活跃社区:从学术界到工程界,从 Web 开发到科学计算
  • 实用主义:不追求纯粹的函数式,而是平衡实用性和优雅性

学习 Elisp 的价值:

  1. 理解 Lisp 思想:学习编程语言设计的经典案例
  2. 掌握元编程:理解代码生成代码的强大能力
  3. 自定义工作环境:打造完全适合自己的编辑器
  4. 参与开源社区:Emacs 是历史最悠久的自由软件项目之一

想学习 Elisp 的语法和编程?可以参考后续的 Elisp 实战章节。

为什么选择 Emacs?

  1. 高度可定制:可以根据个人需求配置成完美的工作环境
  2. 生态丰富:拥有数千个扩展包,涵盖各种使用场景
  3. 持续发展:40多年的历史,社区活跃,持续更新
  4. 学习价值:学习 Emacs 能提升对编辑器、文本处理的理解
  5. 统一工作流:可以在 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:本质区别

语言范式和设计哲学:

  1. Elisp(Emacs Lisp)

    • Lisp 方言:属于 Lisp 家族,拥有几十年历史
    • 同像性(Homoiconicity):代码即数据,数据即代码
    • S-表达式:使用括号表示的前缀表达式,如 (+ 1 2)
    • 宏系统:强大的元编程能力,可以在编译时生成代码
    • 动态类型:运行时类型检查
    • 垃圾回收:自动内存管理
  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 核心开发的官方邮件列表,是获取第一手开发信息的最佳渠道。

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

3. Emacs China(中文社区)

  • 论坛https://emacs-china.org/
  • 特点:中文 Emacs 用户的主要聚集地
  • 内容:中文教程、经验分享、问题讨论

4. IRC/Matrix

  • IRC#emacs on irc.libera.chat
  • Matrix#emacs:libera.chat
  • 特点:实时聊天,可以快速获得帮助

5. Emacs StackExchange

官方文档和手册

1. Emacs 官方手册

elisp
;; 在 Emacs 中直接访问
(info "emacs")      ; Emacs 用户手册
(info "elisp")      ; Elisp 编程手册
(info "eintr")      ; Elisp 入门教程

2. 在线文档

开发相关

1. Emacs 源代码仓库

2. Emacs Bug Tracker

Comments (0)

No comments yet. Be the first to share your thoughts!