Emacs Lisp

[ 最后修订与导出时间: 2026-01-28 20:01:40 +0800 ,总字数: 7755 ]

GNU Emacs 在线手册

GNU Emacs 官方网站地址:https://www.gnu.org/software/emacs/

若需获取 Emacs 的使用方法,可查阅《Emacs 手册》。

若要查看其他格式的本手册,请点击此处

本手册为对应 Emacs 30.2 版本的 GNU Emacs Lisp 参考手册。

版权声明 © 1990-1996、1998-2025 自由软件基金会有限公司

您可以依据《GNU 自由文档许可证》1.3 版或自由软件基金会发布的任何更新版本的条款,复制、分发和 / 或修改本文档。其中,不可变章节为《GNU 通用公共许可证》;前封面文本为《一份 GNU 手册》;后封面文本如下 (a) 款所示。本许可证副本收录于名为《GNU 自由文档许可证》的章节中。

(a) 自由软件基金会(FSF)的后封面文本内容为:您拥有复制和修改这份 GNU 手册的自由。向自由软件基金会购买手册副本,将助力其开发 GNU 软件并推广软件自由理念。

1. 引言

1.1. 注意事项

1.2. Lisp 语言发展史

1.3. 约定

1.3.1. 部分术语

1.3.2. nil 与 t

1.3.3. 求值表示法

1.3.4. 打印表示法

1.3.5. 错误信息

1.3.6. 缓冲区文本表示法

1.3.7. 描述格式

1.3.7.1. 函数描述示例
1.3.7.2. 变量描述示例

1.4. 版本信息

1.5. 致谢

2. Lisp 数据类型

2.1. 打印表示与读取语法

2.2. 特殊读取语法

2.3. 注释

2.4. 程序设计类型

2.4.1. 整数类型

2.4.2. 浮点类型

2.4.3. 字符类型

2.4.3.1. 基础字符语法
2.4.3.2. 通用转义语法
2.4.3.3. 控制字符语法
2.4.3.4. 元字符语法
2.4.3.5. 其他字符修饰位

2.4.4. 符号类型

2.4.5. 序列类型

2.4.6. 复合单元与列表类型

2.4.6.1. 列表的框图表示法
2.4.6.2. 点对表示法
2.4.6.3. 关联列表类型

2.4.7. 数组类型

2.4.8. 字符串类型

2.4.8.1. 字符串语法
2.4.8.2. 字符串中的非 ASCII 字符
2.4.8.3. 字符串中的不可打印字符
2.4.8.4. 字符串中的文本属性

2.4.9. 向量类型

2.4.10. 字符表类型

2.4.11. 布尔向量类型

2.4.12. 哈希表类型

2.4.13. 函数类型

2.4.14. 宏类型

2.4.15. 原始函数类型

2.4.16. 闭包函数类型

2.4.17. 记录类型

2.4.18. 类型描述符

2.4.19. 类型说明符

2.4.20. 自动加载类型

2.4.21. 终结器类型

2.5. 编辑类型

2.5.1. 缓冲区类型

2.5.2. 标记类型

2.5.3. 窗口类型

2.5.4. 框架类型

2.5.5. 终端类型

2.5.6. 窗口配置类型

2.5.7. 框架配置类型

2.5.8. 进程类型

2.5.9. 线程类型

2.5.10. 互斥锁类型

2.5.11. 条件变量类型

2.5.12. 流类型

2.5.13. 键映射类型

2.5.14. 覆盖层类型

2.5.15. 字体类型

2.5.16. X 组件类型

2.6. 循环对象的读取语法

2.7. 类型谓词

2.8. 相等性谓词

2.9. 可变性

2.10. Emacs Lisp 对象的类型层级

3. 数字

3.1. 整数基础

3.2. 浮点数基础

3.3. 数字类型谓词

3.4. 数字比较

3.5. 数值转换

3.6. 算术运算

3.7. 舍入运算

3.8. 整数的按位运算

3.9. 标准数学函数

3.10. 随机数

4. 字符串与字符

4.1. 字符串与字符基础

4.2. 字符串谓词

4.3. 创建字符串

4.4. 修改字符串

4.5. 字符与字符串的比较

4.6. 字符与字符串的转换

4.7. 字符串格式化

4.8. 自定义格式字符串

4.9. Lisp 中的大小写转换

4.10. 大小写转换表

5. 列表

5.1. 列表与复合单元

5.2. 列表谓词

5.3. 列表元素的访问

5.4. 构造复合单元与列表

5.5. 修改列表变量

5.6. 修改已有列表结构

5.6.1. 使用 setcar 修改列表元素

5.6.2. 修改列表的 CDR 部分

5.6.3. 重排列表的函数

5.7. 将列表用作集合

5.8. 关联列表

5.9. 属性列表

5.9.1. 属性列表与关联列表

5.9.2. 符号之外的属性列表

6. 序列、数组与向量

6.1. 序列

6.2. 数组

6.3. 操作数组的函数

6.4. 向量

6.5. 向量专用函数

6.6. 字符表

6.7. 布尔向量

6.8. 固定大小对象环的管理

7. 记录

7.1. 记录函数

7.2. 向后兼容性

8. 哈希表

8.1. 创建哈希表

8.2. 哈希表访问

8.3. 定义哈希比较规则

8.4. 其他哈希表函数

9. 符号

9.1. 符号的组成部分

9.2. 定义符号

9.3. 创建与登记符号

9.4. 符号属性

9.4.1. 符号属性的访问

9.4.2. 标准符号属性

9.5. 简写形式

9.5.1. 例外情况

9.6. 带位置信息的符号

10. 求值

10.1. 求值简介

10.2. 形式的种类

10.2.1. 自求值形式

10.2.2. 符号形式

10.2.3. 列表形式的分类

10.2.4. 符号函数的间接引用

10.2.5. 函数形式的求值

10.2.6. Lisp 宏的求值

10.2.7. 特殊形式

10.2.8. 自动加载

10.3. 引用

10.4. 反引用

10.5. Eval 函数

10.6. 延迟求值与惰性求值

11. 控制结构

11.1. 顺序执行

11.2. 条件判断

11.3. 条件组合构造

11.4. 模式匹配条件语句

11.4.1. pcase 宏

11.4.2. 扩展 pcase

11.4.3. 反引用风格的模式

11.4.4. 使用 pcase 模式进行解构

11.5. 循环

11.6. 生成器

11.7. 非局部退出

11.7.1. 显式非局部退出:catch 与 throw

11.7.2. catch 与 throw 的示例

11.7.3. 错误

11.7.3.1. 触发错误的方法
11.7.3.2. Emacs 处理错误的机制
11.7.3.3. 编写错误处理代码
11.7.3.4. 错误符号与条件名称

11.7.4. 非局部退出的清理工作

11.8. 条件编译

12. 变量

12.1. 全局变量

12.2. 不可变变量

12.3. 局部变量

12.4. 变量未定义的情况

12.5. 定义全局变量

12.6. 稳健定义变量的技巧

12.7. 变量值的访问

12.8. 变量值的设置

12.9. 变量变更时执行函数

12.9.1. 限制条件

12.10. 变量绑定的作用域规则

12.10.1. 词法绑定

12.10.2. 动态绑定

12.10.3. 动态绑定的正确用法

12.10.4. Lisp 方言的选择

12.10.5. 迁移至词法绑定

12.11. 缓冲区局部变量

12.11.1. 缓冲区局部变量简介

12.11.2. 创建与删除缓冲区局部绑定

12.11.3. 缓冲区局部变量的默认值

12.12. 文件局部变量

12.13. 目录局部变量

12.14. 连接局部变量

12.14.1. 连接局部配置文件

12.14.2. 应用连接局部变量

12.15. 变量别名

12.16. 受限值变量

12.17. 广义变量

12.17.1. setf 宏

12.17.2. 定义新的 setf 形式

12.18. 多会话变量

13. 函数

13.1. 函数的概念

13.2. 拉姆达表达式

13.2.1. 拉姆达表达式的组成部分

13.2.2. 拉姆达表达式的简单示例

13.2.3. 参数列表的特性

13.2.4. 函数的文档字符串

13.3. 为函数命名

13.4. 定义函数

13.5. 调用函数

13.6. 映射函数

13.7. 匿名函数

13.8. 泛型函数

13.9. 函数单元内容的访问

13.10. 闭包

13.11. 开放闭包

13.12. 为 Emacs Lisp 函数添加建议

13.12.1. 操作建议的原始函数

13.12.2. 为命名函数添加建议

13.12.3. 建议的组合方式

13.12.4. 适配旧版 defadvice 的代码

13.12.5. 建议与字节码

13.13. 声明函数过时

13.14. 内联函数

13.15. declare 形式

13.16. 告知编译器函数已定义

13.17. 判断函数是否可安全调用

14.

14.1. 宏的简单示例

14.2. 宏调用的展开

14.3. 宏与字节编译

14.4. 定义宏

14.5. 使用宏的常见问题

14.5.1. 时机错误

14.5.2. 宏参数的重复求值

14.5.3. 宏展开式中的局部变量

14.5.4. 宏展开阶段对参数的求值

14.5.5. 宏的展开次数

14.6. 宏的缩进

15. 自定义设置

15.1. 通用项关键字

15.2. 定义自定义组

15.3. 定义自定义变量

15.4. 自定义类型

15.4.1. 简单类型

15.4.2. 复合类型

15.4.3. 拼接到列表中

15.4.4. 类型关键字

15.4.5. 定义新类型

15.5. 应用自定义配置

15.6. 自定义主题

16. 加载

16.1. 程序的加载方式

16.2. 加载后缀

16.4. 加载含非 ASCII 字符的文件

16.5. 自动加载

16.5.1. 按前缀自动加载

16.5.2. 自动加载的适用场景

16.6. 重复加载

16.7. 特性

16.8. 查找定义特定符号的文件

16.9. 卸载

16.10. 加载相关的钩子

16.11. Emacs 动态模块

17. 字节编译

17.1. 字节编译代码的性能

17.2. 字节编译函数

17.3. 文档字符串与编译

17.4. 编译期间的求值

17.5. 编译器错误

17.6. 闭包函数对象

17.7. 反汇编字节码

18. Lisp 代码编译为原生代码

18.1. 原生编译函数

18.2. 原生编译变量

19. Lisp 程序调试

19.1. Lisp 调试器

19.1.1. 出错时进入调试器

19.1.2. 调试重绘错误

19.1.3. 调试无限循环

19.1.4. 函数调用时进入调试器

19.1.5. 变量被修改时进入调试器

19.1.6. 显式进入调试器

19.1.7. 调试器的使用方法

19.1.8. 回溯信息

19.1.9. 调试器命令

19.1.10. 调试器的调用

19.1.11. 调试器的内部实现

19.2. Edebug

19.2.1. Edebug 的使用

19.2.2. 为 Edebug 插桩

19.2.3. Edebug 执行模式

19.2.4. 跳转操作

19.2.5. Edebug 杂项命令

19.2.6. 断点

19.2.6.1. Edebug 断点
19.2.6.2. 全局断点条件
19.2.6.3. 源码断点

19.2.7. 错误捕获

19.2.8. Edebug 视图

19.2.9. 求值操作

19.2.10. 求值列表缓冲区

19.2.11. Edebug 中的打印

19.2.12. 跟踪缓冲区

19.2.13. 覆盖率测试

19.2.14. 外部上下文

19.2.14.1. 判断是否停止
19.2.14.2. Edebug 显示更新
19.2.14.3. Edebug 递归编辑

19.2.15. Edebug 与宏

19.2.15.1. 为宏调用插桩
19.2.15.2. 规范列表
19.2.15.3. 规范中的回溯
19.2.15.4. 规范示例

19.2.16. Edebug 选项

19.3. 调试无效的 Lisp 语法

19.3.1. 左括号过多

19.3.2. 右括号过多

19.4. 测试覆盖率

19.5. 性能分析

20. Lisp 对象的读取与打印

20.1. 读取与打印简介

20.2. 输入流

20.3. 输入函数

20.4. 输出流

20.5. 输出函数

20.6. 影响输出的变量

20.7. 覆盖输出变量

21. 迷你缓冲区

21.1. 迷你缓冲区简介

21.2. 使用迷你缓冲区读取文本字符串

21.3. 使用迷你缓冲区读取 Lisp 对象

21.4. 迷你缓冲区历史记录

21.5. 初始输入内容

21.6. 补全

21.6.1. 基础补全函数

21.6.2. 补全与迷你缓冲区

21.6.3. 实现补全的迷你缓冲区命令

21.6.4. 高级补全函数

21.6.5. 读取文件名

21.6.6. 补全相关变量

21.6.7. 程序化补全

21.6.8. 普通缓冲区中的补全

21.7. 是非查询

21.8. 多选一提问

21.9. 读取密码

21.10. 迷你缓冲区命令

21.11. 迷你缓冲区窗口

21.12. 迷你缓冲区内容

21.13. 递归迷你缓冲区

21.14. 禁止交互操作

21.15. 迷你缓冲区杂项

22. 命令循环

22.1. 命令循环概述

22.2. 定义命令

22.2.1. interactive 的使用

22.2.2. interactive 的代码字符

22.2.3. interactive 的使用示例

22.2.4. 为命令指定模式

22.2.5. 命令备选方案的选择

22.3. 交互式调用

22.4. 区分交互式调用

22.5. 来自命令循环的信息

22.6. 命令执行后调整光标位置

22.7. 输入事件

22.7.1. 键盘事件

22.7.2. 功能键

22.7.3. 鼠标事件

22.7.4. 点击事件

22.7.5. 拖拽事件

22.7.6. 按键按下事件

22.7.7. 重复事件

22.7.8. 移动事件

22.7.9. 触摸屏事件

22.7.10. 焦点事件

22.7.11. X 组件事件

22.7.12. 其他系统事件

22.7.13. 事件示例

22.7.14. 事件分类

22.7.15. 鼠标事件的访问

22.7.16. 滚动条事件的访问

22.7.17. 将键盘事件存入字符串

22.8. 读取输入

22.8.1. 按键序列输入

22.8.2. 读取单个事件

22.8.3. 输入事件的修改与转换

22.8.4. 输入法的调用

22.8.5. 带引号的字符输入

22.8.6. 事件输入的其他特性

22.9. 特殊事件

22.10. 等待时间流逝或输入到达

22.11. 退出操作

22.12. 命令前缀参数

22.13. 递归编辑

22.14. 禁用命令

22.15. 命令历史记录

22.16. 键盘宏

23. 键映射

23.1. 键映射基础

23.2. 修改按键绑定

23.3. 键映射的格式

23.4. 创建键映射

23.5. 键映射的继承关系

23.6. 前缀键

23.7. 活动键映射

23.8. 搜索活动键映射

23.9. 活动键映射的控制

23.10. 按键查找

23.11. 按键查找函数

23.12. 按键序列

23.13. 底层按键绑定

23.14. 命令重映射

23.15. 用于事件序列转换的键映射

23.15.1. 与普通键映射的交互

23.16. 绑定按键的命令

23.17. 扫描键映射

23.18.1. 定义菜单

23.18.1.1. 简单菜单项
23.18.1.2. 扩展菜单项
23.18.1.4. 别名菜单项

23.18.2. 菜单与鼠标

23.18.3. 菜单与键盘

23.18.6. 工具栏

23.18.7. 菜单修改

23.18.8. 简易菜单

24. 主模式与次模式

24.1. 钩子

24.1.1. 运行钩子

24.1.2. 设置钩子

24.2. 主模式

24.2.1. 主模式约定

24.2.2. Emacs 选择主模式的方式

24.2.3. 获取主模式的帮助信息

24.2.4. 定义派生模式

24.2.5. 基础主模式

24.2.6. 模式钩子

24.2.7. 表格列表模式

24.2.8. 通用模式

24.2.9. 主模式示例

24.3. 次模式

24.3.1. 编写次模式的约定

24.3.2. 键映射与次模式

24.3.3. 定义次模式

24.4. 模式行格式

24.4.1. 模式行基础

24.4.2. 模式行的数据结构

24.4.3. 模式行控制的顶层结构

24.4.4. 模式行中使用的变量

24.4.5. 模式行中的 % 结构

24.4.6. 模式行中的属性

24.4.7. 窗口标题栏

24.4.8. 窗口标签栏

24.4.9. 模拟模式行格式化

24.5. 索引菜单

24.6. 大纲次模式

24.7. 语法高亮模式

24.7.1. 语法高亮基础

24.7.2. 基于搜索的语法高亮

24.7.3. 自定义基于搜索的语法高亮

24.7.4. 其他语法高亮变量

24.7.5. 语法高亮级别

24.7.6. 预计算语法高亮

24.7.7. 语法高亮的面

24.7.8. 基于语法的语法高亮

24.7.9. 多行语法高亮结构

24.7.9.1. 多行语法高亮
24.7.9.2. 缓冲区变更后需要高亮的区域

24.7.10. 基于解析器的语法高亮

24.8. 代码自动缩进

24.8.1. 简易缩进引擎

24.8.1.1. SMIE 的设置与特性
24.8.1.2. 运算符优先级文法
24.8.1.3. 定义语言的文法
24.8.1.4. 定义记号
24.8.1.5. 兼容功能较弱的解析器
24.8.1.6. 指定缩进规则
24.8.1.7. 缩进规则的辅助函数
24.8.1.8. 缩进规则示例
24.8.1.9. 自定义缩进方式

24.8.2. 基于解析器的缩进

24.9. 桌面保存模式

25. 文档

25.1. 文档基础

25.2. 文档字符串的访问

25.3. 文档中按键绑定的替换

25.4. 文本引用风格

25.5. 帮助消息中字符的描述方式

25.6. 帮助函数

25.7. 文档组

26. 文件

26.1. 访问文件

26.1.1. 访问文件的函数

26.1.2. 访问文件的子例程

26.2. 保存缓冲区

26.3. 从文件读取内容

26.4. 向文件写入内容

26.5. 文件锁

26.6. 文件相关信息

26.6.1. 可访问性测试

26.6.2. 文件类型区分

26.6.3. 真实名称

26.6.4. 文件属性

26.6.5. 扩展文件属性

26.6.6. 在标准位置查找文件

26.7. 修改文件名与文件属性

26.8. 文件与二级存储

26.9. 文件名

26.9.1. 文件名的组成部分

26.9.2. 绝对文件名与相对文件名

26.9.3. 目录名

26.9.4. 扩展文件名的函数

26.9.5. 生成唯一文件名

26.9.6. 文件名补全

26.9.7. 标准文件名

26.10. 目录内容

26.11. 目录的创建、复制与删除

26.12. 实现 “魔法” 文件名

26.13. 文件格式转换

26.13.1. 概述

26.13.2. 往返转换规范

26.13.3. 分段转换规范

27. 备份与自动保存

27.1. 备份文件

27.1.1. 生成备份文件

27.1.2. 通过重命名还是复制生成备份?

27.1.3. 带编号备份文件的生成与删除

27.1.4. 备份文件的命名规则

27.2. 自动保存

27.3. 恢复操作

28. 缓冲区

28.1. 缓冲区基础

28.2. 当前缓冲区

28.3. 缓冲区名称

28.4. 缓冲区对应的文件名

28.5. 缓冲区的修改状态

28.6. 缓冲区的修改时间

28.7. 只读缓冲区

28.8. 缓冲区列表

28.9. 创建缓冲区

28.10. 删除缓冲区

28.11. 间接缓冲区

28.12. 在两个缓冲区之间交换文本

28.13. 缓冲区间隙

29. 窗口

29.1. Emacs 窗口的基本概念

29.2. 窗口与框架

29.3. 窗口选择

29.4. 窗口大小

29.5. 调整窗口大小

29.6. 窗口大小的保存

29.7. 分割窗口

29.8. 删除窗口

29.9. 合并窗口

29.10. 窗口的循环排序

29.11. 缓冲区与窗口

29.12. 在窗口中切换缓冲区

29.13. 在合适的窗口中显示缓冲区

29.13.1. 选择用于显示缓冲区的窗口

29.13.2. 缓冲区显示的动作函数

29.13.3. 缓冲区显示的动作关联列表

29.13.4. 缓冲区显示的附加选项

29.13.5. 动作函数的优先级

29.13.6. 缓冲区显示的设计原则

29.14. 窗口历史记录

29.15. 专用窗口

29.16. 退出窗口

29.17. 侧边窗口

29.17.1. 在侧边窗口中显示缓冲区

29.17.2. 侧边窗口的选项与函数

29.17.3. 含侧边窗口的框架布局

29.18. 原子窗口

29.19. 窗口与光标位置

29.20. 窗口的起始与结束位置

29.21. 文本滚动

29.22. 垂直比例滚动

29.23. 水平滚动

29.24. 坐标与窗口

29.25. 鼠标窗口自动选择

29.26. 窗口配置

29.27. 窗口参数

29.28. 窗口滚动与变更的钩子

30. 框架

30.1. 创建框架

30.2. 多终端

30.3. 框架几何属性

30.3.1. 框架布局

30.3.2. 框架字体

30.3.3. 框架位置

30.3.4. 框架大小

30.3.5. 隐式框架调整大小

30.4. 框架参数

30.4.1. 框架参数的访问

30.4.2. 初始框架参数

30.4.3. 窗口框架参数

30.4.3.1. 基础参数
30.4.3.2. 位置参数
30.4.3.3. 大小参数
30.4.3.4. 布局参数
30.4.3.5. 缓冲区参数
30.4.3.6. 框架交互参数
30.4.3.7. 鼠标拖拽参数
30.4.3.8. 窗口管理参数
30.4.3.9. 光标参数
30.4.3.10. 字体与颜色参数

30.4.4. 几何属性

30.5. 终端参数

30.6. 框架标题

30.7. 删除框架

30.8. 查找所有框架

30.9. 迷你缓冲区与框架

30.10. 输入焦点

30.11. 框架的可见性

30.12. 框架的置顶、置底与堆叠顺序调整

30.13. 框架配置

30.14. 子框架

30.15. 鼠标跟踪

30.16. 鼠标位置

30.17. 弹出菜单

30.18. 屏幕键盘

30.19. 对话框

30.20. 指针形状

30.21. 窗口系统选择内容

30.22. 选择内容的访问

30.22.1. X 选择内容

30.22.2. 其他选择内容

30.23. 粘贴媒体内容

30.24. 拖放操作

30.25. 颜色名称

30.26. 文本终端颜色

30.27. X 资源

30.28. 显示功能测试

31. 位置

31.1. 光标位置

31.2. 移动操作

31.2.1. 按字符移动

31.2.2. 按单词移动

31.2.3. 移动到缓冲区首尾

31.2.4. 按文本行移动

31.2.5. 按屏幕行移动

31.2.6. 跨越平衡表达式移动

31.2.7. 跳过字符

31.3. 临时跳转

31.4. 区域缩小

32. 标记   noexport_num

32.1. 标记概述

32.2. 标记谓词

32.3. 创建标记的函数

32.4. 从标记中获取信息

32.5. 标记的插入类型

32.6. 标记位置的移动

32.7. 标记点

32.8. 区域

33. 文本

33.1. 检查光标附近的文本

33.2. 检查缓冲区内容

33.3. 文本比较

33.4. 插入文本

33.5. 用户级别的插入命令

33.6. 删除文本

33.7. 用户级别的删除命令

33.8. 剪切环

33.8.1. 剪切环的概念

33.8.2. 剪切操作的函数

33.8.3. 粘贴操作

33.8.4. 粘贴操作的函数

33.8.5. 底层剪切环

33.8.6. 剪切环的内部实现

33.9. 撤销

33.10. 撤销列表的维护

33.11. 文本填充

33.12. 填充边距

33.13. 自适应填充模式

33.14. 自动填充

33.15. 文本排序

33.16. 列数统计

33.17. 缩进

33.17.1. 缩进原语

33.17.2. 由主模式控制的缩进

33.17.3. 缩进整个区域

33.17.4. 基于前一行的缩进

33.17.5. 可调整的制表位

33.17.6. 基于缩进的移动命令

33.18. 大小写转换

33.19. 文本属性

33.19.1. 文本属性的检查

33.19.2. 文本属性的修改

33.19.4. 具有特殊含义的属性

33.19.5. 格式化文本属性

33.19.6. 文本属性的粘性

33.19.7. 文本属性的延迟计算

33.19.8. 定义可点击文本

33.19.9. 字段的定义与使用

33.19.10. 文本属性不采用区间实现的原因

33.20. 字符编码的替换

33.21. 寄存器

33.22. 文本交换

33.23. 缓冲区文本替换

33.24. 压缩数据处理

33.25. Base64 编码

33.26. 校验和 / 哈希

33.27. 可疑文本

33.28. GnuTLS 加密

33.28.1. GnuTLS 加密输入数据的格式

33.28.2. GnuTLS 加密函数

33.29. 数据库

33.30. HTML 与 XML 解析

33.30.1. 文档对象模型

33.31. JSON 数据的解析与生成

33.32. JSONRPC 通信

33.32.1. 概述

33.32.2. 基于进程的 JSONRPC 连接

33.32.3. JSONRPC 的 JSON 对象格式

33.32.4. 延迟 JSONRPC 请求

33.33. 原子变更组

33.34. 变更钩子

33.34.1. 缓冲区修改的跟踪

34. 非 ASCII 字符

34.1. 文本表示方式

34.2. 禁用多字节字符

34.3. 文本表示方式的转换

34.4. 表示方式的选择

34.5. 字符编码

34.6. 字符属性

34.7. 字符集

34.8. 字符集扫描

34.9. 字符转换

34.10. 编码系统

34.10.1. 编码系统的基本概念

34.10.2. 编码与输入输出

34.10.3. Lisp 中的编码系统

34.10.4. 用户选择的编码系统

34.10.5. 默认编码系统

34.10.6. 为单次操作指定编码系统

34.10.7. 显式编码与解码

34.10.8. 终端输入输出编码

34.11. 输入法

34.12. 区域设置

35. 搜索与匹配

35.2. 搜索与大小写

35.3. 正则表达式

35.3.1. 正则表达式的语法

35.3.1.1. 正则表达式中的特殊字符
35.3.1.2. 字符类
35.3.1.3. 正则表达式中的反斜杠构造

35.3.2. 复杂正则表达式示例

35.3.3. rx 结构化正则表达式表示法

35.3.3.1. rx 正则表达式中的构造
35.3.3.2. 使用 rx 正则表达式的函数与宏
35.3.3.3. 定义新的 rx 形式

35.3.4. 正则表达式函数

35.3.5. 正则表达式的常见问题

35.5. 正则表达式匹配的最长匹配搜索

35.6. 匹配数据

35.6.1. 匹配文本的替换

35.6.2. 匹配数据的简单访问

35.6.3. 完整匹配数据的访问

35.6.4. 匹配数据的保存与恢复

35.7. 搜索与替换

35.8. 编辑中使用的标准正则表达式

35.9. Emacs 与 POSIX 正则表达式的差异

36. 语法表

36.1. 语法表的概念

36.2. 语法描述符

36.2.1. 语法类别表

36.2.2. 语法标志

36.3. 语法表函数

36.4. 语法属性

36.5. 移动操作与语法

36.6. 表达式解析

36.6.1. 基于解析的移动命令

36.6.2. 获取指定位置的解析状态

36.6.3. 解析器状态

36.6.4. 底层解析操作

36.6.5. 控制解析的参数

36.7. 语法表的内部实现

36.8. 字符类别

37. 解析表达式文法

37.1. PEX 定义

37.2. 解析动作

37.3. 编写 PEG 规则

38. 程序源码解析

38.1. 树分析器(Tree-sitter)语言文法

38.2. 树分析器的使用

38.3. 节点的检索

38.4. 节点信息的访问

38.5. 树分析器节点的模式匹配

38.6. 用户自定义 “语法单元” 与导航

38.7. 多语言文本的解析

38.8. 基于树分析器开发主模式

38.9. 树分析器 C 语言 API 对应关系

39. 缩写与缩写展开

39.1. 缩写表

39.2. 定义缩写

39.3. 将缩写保存到文件

39.4. 缩写的查找与展开

39.5. 标准缩写表

39.6. 缩写属性

39.7. 缩写表属性

40. 线程

40.1. 基础线程函数

40.2. 互斥锁

40.3. 条件变量

40.4. 线程列表

41. 进程

41.1. 创建子进程的函数

41.2. Shell 参数

41.3. 创建同步进程

41.4. 创建异步进程

41.5. 删除进程

41.6. 进程信息

41.7. 向进程发送输入

41.8. 向进程发送信号

41.9. 接收进程的输出

41.9.1. 进程缓冲区

41.9.2. 进程过滤器函数

41.9.3. 进程输出的解码

41.9.4. 接收进程输出

41.9.5. 进程与线程

41.10. 哨兵:检测进程状态变更

41.11. 退出前的查询

41.12. 其他进程的访问

41.13. 事务队列

41.14. 网络连接

41.15. 网络服务端

41.16. 数据报

41.17. 底层网络访问

41.17.1. make-network-process 函数

41.17.2. 网络选项

41.17.3. 网络功能可用性测试

41.18. 其他网络工具

41.19. 串口通信

41.20. 字节数组的打包与解包

41.20.1. 数据布局的描述

41.20.2. 字节解包与打包函数

41.20.3. 高级数据布局规范

42. Emacs 显示

42.1. 屏幕刷新

42.2. 强制重绘

42.3. 文本截断

42.4. 回显区

42.4.1. 在回显区显示消息

42.4.2. 操作进度的报告

42.4.3. 在 Messages 缓冲区记录消息

42.4.4. 回显区的自定义

42.5. 警告信息的报告

42.5.1. 警告基础

42.5.2. 警告相关变量

42.5.3. 警告选项

42.5.4. 延迟警告

42.6. 不可见文本

42.7. 选择性显示

42.8. 临时显示

42.9. 覆盖层

42.9.1. 覆盖层的管理

42.9.2. 覆盖层属性

42.9.3. 覆盖层的搜索

42.10. 显示文本的尺寸

42.11. 行高

42.12. 面(Faces)

42.12.1. 面的属性

42.12.2. 定义面

42.12.3. 面属性函数

42.12.4. 面的显示

42.12.5. 面的重映射

42.12.6. 面的操作函数

42.12.7. 面的自动分配

42.12.8. 基础面

42.12.9. 字体选择

42.12.10. 字体查找

42.12.11. 字体集

42.12.12. 底层字体表示

42.13. 边缘区域

42.13.1. 边缘区域的尺寸与位置

42.13.2. 边缘区域指示器

42.13.3. 边缘区域光标

42.13.4. 边缘区域位图

42.13.5. 边缘区域位图的自定义

42.13.6. 覆盖层箭头

42.14. 滚动条

42.15. 窗口分隔线

42.16. display 属性

42.16.1. 替换文本的显示规范

42.16.2. 指定空白符

42.16.3. 空白符的像素规格

42.16.4. 其他显示规范

42.16.5. 边距中的显示

42.17. 图像

42.17.1. 图像格式

42.17.2. 图像描述符

42.17.3. XBM 图像

42.17.4. XPM 图像

42.17.5. ImageMagick 图像

42.17.6. SVG 图像

42.17.7. 其他图像类型

42.17.8. 定义图像

42.17.9. 图像的显示

42.17.10. 多帧图像

42.17.11. 图像缓存

42.18. 图标

42.19. 嵌入式原生组件

42.20. 按钮

42.20.1. 按钮属性

42.20.2. 按钮类型

42.20.3. 创建按钮

42.20.4. 按钮的操作

42.20.5. 按钮缓冲区命令

42.21. 抽象显示

42.21.1. 抽象显示函数

42.21.2. 抽象显示示例

42.22. 括号闪烁

42.23. 字符显示

42.23.1. 常规显示约定

42.23.2. 显示表

42.23.3. 活动显示表

42.23.4. 字形

42.23.5. 无字形字符的显示

42.24. 提示音

42.25. 窗口系统

42.26. 工具提示

42.27. 双向文本显示

43. 操作系统接口

43.1. Emacs 的启动

43.1.1. 概述:启动时的操作序列

43.1.2. 初始化文件

43.1.3. 终端相关的初始化

43.1.4. 命令行参数

43.2. 退出 Emacs

43.2.1. 关闭 Emacs

43.2.2. 挂起 Emacs

43.3. 操作系统环境

43.4. 用户身份识别

43.5. 系统时间

43.6. 时区规则

43.7. 时间转换

43.8. 时间的解析与格式化

43.9. 处理器运行时间

43.10. 时间计算

43.11. 延迟执行的计时器

43.12. 空闲计时器

43.13. 终端输入

43.13.1. 输入模式

43.13.2. 输入记录

43.14. 终端输出

43.15. 声音输出

43.16. X11 键符号的操作

43.17. 批处理模式

43.18. 会话管理

43.19. 桌面通知

43.20. 文件变更通知

43.21. 动态加载库

43.22. 安全注意事项

44. Lisp 代码的发布准备

44.1. 打包基础

44.2. 简单包

44.3. 多文件包

44.4. 包仓库的创建与维护

44.5. 与仓库 Web 服务器的对接

44.6. 对旧版 Emacs 的兼容支持

附录 A Emacs 29 反向更新日志

附录 B GNU 自由文档许可证

附录 C GNU 通用公共许可证

附录 D 技巧与约定

D.1 Emacs Lisp 编码约定

D.2 按键绑定约定

D.3 Emacs 编程技巧

D.4 提升编译代码运行速度的技巧

D.5 避免编译器警告的技巧

D.6 文档字符串编写技巧

D.7 注释编写技巧

D.8 Emacs 库的标准文件头

附录 E GNU Emacs 内部实现

E.1 Emacs 的构建

E.2 纯存储区

E.3 垃圾回收

E.4 栈分配对象

E.5 内存使用

E.6 C 语言方言

E.7 编写 Emacs 原始函数

E.8 编写动态加载模块

E.8.1 模块初始化代码

E.8.2 模块函数的编写

E.8.3 Lisp 与模块值的转换

E.8.4 模块的其他便捷函数

E.8.5 模块中的非局部退出

E.9 对象的内部实现

E.9.1 缓冲区的内部实现

E.9.2 窗口的内部实现

E.9.3 进程的内部实现

E.10 C 语言整数类型

附录 F 标准错误

附录 G 标准键映射

附录 H 标准钩子

索引

emacs

Emacs

org-mode

Orgmode

Donations

打赏

Copyright

© 2025 Jasper Hsu

Creative Commons

Creative Commons

Attribute

Attribute

Noncommercial

Noncommercial

Share Alike

Share Alike