第 01 章:Emacs 简介
第 01 章:Emacs 简介
1.1 Emacs 的历史
Emacs 是最古老的、至今仍在活跃开发的文本编辑器之一。它的历史可以追溯到 1976 年。
时间线
| 年份 | 事件 |
|---|---|
| 1976 | Richard Stallman 在 MIT 人工智能实验室编写最初的 Emacs(Editor MACroS) |
| 1984 | Stallman 启动 GNU 项目,开始开发 GNU Emacs |
| 1985 | GNU Emacs 13.0 发布,首个广泛传播的版本 |
| 1994 | GNU Emacs 19.x 引入了 X Window 支持 |
| 2001 | GNU Emacs 21.x 引入了字体渲染和图片支持 |
| 2009 | GNU Emacs 23.x 支持 Unicode 和 daemon 模式 |
| 2012 | GNU Emacs 24.x 引入内置包管理器(package.el) |
| 2018 | GNU Emacs 26.x 引入线程支持、行号显示模式 |
| 2019 | GNU Emacs 27.x 原生支持 JSON 解析 |
| 2021 | GNU Emacs 28.x 引入原生编译(native-comp)和 Tree-sitter 支持 |
| 2023 | GNU Emacs 29.x 全面集成 Tree-sitter、内置 use-package |
| 2025 | GNU Emacs 30.x 发布,进一步优化性能和现代功能 |
名字的由来
Emacs 全称是 Editor MACroS,最初是为 TECO 编辑器编写的一组宏命令集合。 后来它演变为一个独立的编辑器,但名字保留了下来。
GNU Emacs 中的 GNU 来自 “GNU’s Not Unix”——这是 Stallman 发起的自由软件项目名称。
1.2 Emacs 的设计哲学
Emacs 的设计哲学与其他编辑器截然不同,理解这些理念有助于你更好地使用它。
核心理念
┌─────────────────────────────────────────────────┐
│ Emacs 设计哲学金字塔 │
├─────────────────────────────────────────────────┤
│ │
│ 自由软件 │
│ ╱ ╲ │
│ 可扩展性 可定制性 │
│ ╱ ╲ │
│ 自文档化 内部统一性 │
│ ╱ ╲ │
│ ┌──────────────────────────────┐ │
│ │ 一切都是文本缓冲区 │ │
│ └──────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────┘
1. 一切都是文本缓冲区(Everything is a Buffer)
Emacs 中的邮件、文件、终端输出、调试信息……统统以"缓冲区"的形式呈现。 这意味着你可以在任何地方使用相同的编辑命令。
2. 可扩展性(Extensibility)
Emacs 的核心几乎完全用 Emacs Lisp(Elisp)编写。你不仅可以通过配置来定制行为, 还可以通过编写 Elisp 代码来修改或扩展 Emacs 的任何功能。
3. 自文档化(Self-Documenting)
Emacs 的每个功能都有文档。你可以随时:
C-h k— 查看某个按键绑定的是什么命令C-h f— 查看某个函数的文档C-h v— 查看某个变量的含义C-h m— 查看当前主模式的文档
4. 内部统一性(Uniformity)
所有操作都遵循相同的模式:移动光标、编辑文本、执行命令。学了一套操作, 就能在所有场景中使用。
1.3 Emacs vs Vim
Emacs 和 Vim 是编辑器世界中两大"宗教"。以下是客观的对比:
功能对比表
| 特性 | Emacs | Vim |
|---|---|---|
| 学习曲线 | 陡峭(但更平滑入门路径) | 陡峭(模态编辑需要适应期) |
| 扩展语言 | Emacs Lisp(完整编程语言) | Vimscript / Lua |
| 模态编辑 | 默认无(可通过 Evil 插件获得) | 原生支持 |
| GUI 功能 | 窗口分割、图片、浏览器、终端 | 主要面向终端,GVim 有限支持 |
| 内置功能 | 极其丰富(邮件、日程、终端……) | 精简(聚焦编辑) |
| 启动速度 | 较慢(可通过 daemon 模式优化) | 快 |
| 内存占用 | 较高 | 较低 |
| 社区生态 | 包数量多,深度广 | 包数量多,配置多样 |
| 多平台 | Linux/macOS/Windows 全平台 | 全平台 |
| 许可证 | GPLv3 | Vim License(慈善软件) |
效率对比
;; Emacs 思维:用 Elisp 扩展一切
(defun my/open-project-readme ()
"打开当前项目的 README 文件。"
(interactive)
(let ((readme (locate-file "README.md" (list (projectile-project-root)))))
(when readme
(find-file readme)
(message "已打开项目 README: %s" readme))))
" Vim 思维:用 Vimscript 配置
function! OpenProjectReadme()
let l:readme = findfile('README.md', getcwd() . ';')
if !empty(l:readme)
execute 'edit ' . l:readme
endif
endfunction
哲学差异
| 维度 | Emacs | Vim |
|---|---|---|
| 设计理念 | 万物皆可 Emacs(集成环境) | 专精编辑,配合外部工具 |
| 键位风格 | 修饰键组合(Ctrl/Meta) | 模态切换(Normal/Insert) |
| 扩展方式 | 运行时动态修改一切 | 通过插件和 autocmd |
| 配置语言 | 一等公民(Elisp) | 二等公民(Vimscript) |
| 与系统集成 | 深度集成(TRAMP、Dired) | 通过 shell 管道 |
注意: 没有绝对的好坏。选择哪个编辑器取决于你的工作流和个人偏好。 许多用户在 Emacs 中使用 Evil 模式获得了两全其美的体验。
1.4 Emacs 的核心概念
在深入学习之前,需要理解 Emacs 的几个核心概念:
核心术语
| 术语 | 英文 | 说明 |
|---|---|---|
| 缓冲区 | Buffer | 内存中的文本块,对应一个文件或临时数据 |
| 窗口 | Window | 显示缓冲区的视图区域(可以有多个窗口) |
| 框架 | Frame | 操作系统级别的窗口(包含若干个窗口) |
| 主模式 | Major Mode | 决定当前缓冲区的行为(如编辑 Python、Org 文件) |
| 次模式 | Minor Mode | 可叠加的辅助功能(如行号显示、自动补全) |
| 点 | Point | 光标在缓冲区中的位置 |
| 区域 | Region | 标记(Mark)到光标(Point)之间的文本范围 |
| 杀环 | Kill Ring | 类似剪贴板的历史记录栈 |
| 键序列 | Key Sequence | 一组按键的组合,绑定到某个命令 |
模式系统
┌─────────────┐
│ 缓冲区 │
└──────┬──────┘
│
┌────────────┼────────────┐
▼ ▼ ▼
┌──────────┐ ┌──────────┐ ┌──────────┐
│ 主模式 │ │ 次模式 1 │ │ 次模式 2 │
│ (唯一) │ │ (可叠加) │ │ (可叠加) │
└──────────┘ └──────────┘ └──────────┘
│ │ │
▼ ▼ ▼
python-mode display-line company-mode
org-mode flycheck which-key
lisp-mode hl-todo evil-mode
- 每个缓冲区恰好有一个 主模式(Major Mode)
- 可以同时开启多个 次模式(Minor Mode)
- 主模式决定了基本的编辑行为和按键绑定
1.5 Emacs 发行版
由于 Emacs 的高度可定制性,社区创建了多种"开箱即用"的发行版。
主流发行版对比
| 发行版 | 风格 | 启动时间 | 学习曲线 | 适合人群 |
|---|---|---|---|---|
| 原版 Emacs | 极简 | 快 | 中等 | 喜欢从零构建的用户 |
| Doom Emacs | 类 Vim(Evil) | 中等 | 较低 | Vim 转 Emacs 的用户 |
| Spacemacs | 类 Vim(Evil) | 较慢 | 较低 | 全栈开发者 |
| Prelude | 纯正 Emacs | 快 | 中等 | 经典 Emacs 爱好者 |
| Centaur Emacs | 现代化 | 中等 | 低 | 追求美观的用户 |
| Crafted Emacs | 教学向 | 快 | 高 | 想深入学习 Elisp 的用户 |
Doom Emacs
Doom Emacs 是目前最受欢迎的 Emacs 发行版之一:
- 核心优势:速度快、外观精美、Evil 优先
- 模块系统:通过
init.el中的:tools、:lang等模块快速启用功能 - 包管理:使用
straight.el从 Git 源安装包 - 社区活跃:Discord 社区、完善的文档
# 安装 Doom Emacs
git clone --depth 1 https://github.com/doomemacs/doomemacs ~/.config/emacs
~/.config/emacs/bin/doom install
Spacemacs
Spacemacs 是最早的"batteries-included" Emacs 发行版:
- 核心优势:完善的 layer 系统、丰富的文档
- 层次系统:每个语言或工具是一个独立的 layer
- 社区成熟:大量教程和预配置
# 安装 Spacemacs
git clone https://github.com/syl20bnr/spacemacs ~/.emacs.d
选择建议
你是 Vim 用户?
├── 是 → 选择 Doom Emacs
└── 否 → 你喜欢折腾吗?
├── 是 → 从原版 Emacs 开始
└── 否 → 选择 Prelude 或 Centaur
建议:初学者可以从 Doom Emacs 或 Prelude 开始, 等熟悉了 Emacs 的概念后再考虑自定义配置。
1.6 为什么选择 Emacs
适用场景
| 场景 | Emacs 的优势 |
|---|---|
| 编程开发 | LSP、Tree-sitter、DAP、项目管理 |
| 写作与笔记 | Org-mode(比 Markdown 更强大) |
| 知识管理 | Org-roam(类似 Roam Research) |
| 邮件管理 | mu4e、Notmuch |
| 终端操作 | Eshell、Vterm、Shell |
| 远程编辑 | TRAMP(透明远程编辑) |
| 版本控制 | Magit(最好的 Git 客户端之一) |
| 文档排版 | LaTeX 集成、Org 导出 |
| 数据科学 | Org-babel(可执行代码块) |
用户案例
案例 1:全栈开发者小明
小明使用 Doom Emacs 作为主力编辑器:
- 用
eglot(LSP)编写 TypeScript 和 Python - 用
Magit进行 Git 操作和代码审查 - 用
Org-mode记录项目笔记和待办事项 - 用
TRAMP连接服务器修改配置文件 - 用
Vterm作为终端模拟器
案例 2:学术研究员小红
小红使用 Emacs 撰写论文:
- 用
Org-mode撰写论文大纲和初稿 - 用
Org-babel混合 LaTeX 和 Python 代码 - 用
Org-ref管理文献引用 - 用
pdf-tools阅读和标注 PDF - 用
Org-roam建立知识网络
1.7 本教程的使用方法
快捷键约定
本教程使用以下约定来表示键序列:
| 符号 | 含义 | 示例 |
|---|---|---|
C-x | Ctrl + x | C-x C-f 表示 Ctrl+x 然后 Ctrl+f |
M-x | Alt + x(Meta) | M-x 表示 Alt+x |
S-x | Shift + x | S-<tab> 表示 Shift+Tab |
RET | 回车键 | C-x C-s RET |
SPC | 空格键 | SPC f s 表示依次按空格、f、s |
- | 连续按键 | C-x C-f 表示先后按两组键 |
代码约定
;; 这是可以直接在 Emacs *scratch* 缓冲区中执行的 Elisp 代码
;; 执行方式:将光标放在代码末尾,按 C-x C-e
(message "Hello, Emacs!")
图标说明
- 📝 练习:动手练习的内容
- 💡 提示:有用的技巧和建议
- ⚠️ 注意:需要特别注意的内容
- 🔗 扩展阅读:深入了解的参考链接
- 📋 表格:信息汇总表
- 🏗️ 场景:真实业务使用场景
1.8 本章小结
| 要点 | 说明 |
|---|---|
| 历史悠久 | 从 1976 年延续至今,持续活跃开发 |
| 设计哲学 | 可扩展、可定制、自文档化、万物皆缓冲区 |
| 与 Vim 对比 | 集成环境 vs 专精编辑,无绝对优劣 |
| 发行版选择 | Doom(Vim 风格)、Prelude(纯正)、Spacemacs(全栈) |
| 核心概念 | 缓冲区、窗口、框架、主模式、次模式 |
1.9 扩展阅读
下一章 → 第 02 章:安装与配置