Emacs 28 新特性介绍
tags: tips
文章目录
现任 Emacs 维护者 Eli Zaretskii 在 9 月 30 号通过邮件列表宣布 emacs-28 分支已经创建出,这意味着 28 版本的大功能已经 ready,不会再有大改动,但距离正式发版还要一段时间,根据之前的发版记录,大概率会在 22 年上半年 release。
2021-03-25 - Emacs 27.2 released.
2020-08-10 - Emacs 27.1 released.
2019-08-28 - Emacs 26.3 released.
2019-04-12 - Emacs 26.2 released.
2018-05-28 - Emacs 26.1 released.
2017-09-11 - Emacs 25.3 released.
...
对于 Emacs 拥趸来说,新功能要等上一两年才能使用是无法接受的。但实际这个问题不大,因为很多用户都在用开发版,这可能也是 Emacs 社区的特殊文化,自己去编译 master 分支来使用应该算是常态。由于使用人数多,所以即使是开发版,质量也能得到保证。
这篇文章就来介绍 Emacs 28 中,笔者个人觉得比较实用的功能,完整列表可参考 NEWS ( M-x view-emacs-news
),最后会介绍如何在 macOS 上编译。
安装选项变更
--with-native-compilation
这个功能是近几年 Emacs 中最大的更新,没有之一。它可以把解释执行的 elisp 代码通过 gccjit 技术直接编译成二进制代码。社区内相关讨论
编辑变更
- 新配置
word-wrap-by-category
这是第八期嘉宾 casouri 的贡献,针对 CJK 字符,提高 word-wrap 的效果。默认 false - 新增命令
undo-redo
(C-?) 取消上一次 undo 命令,而且这个取消操作本身无法取消。Emacs undo 机制比较绕,可以参考之前的文章介绍 - 新增命令
copy-matching-lines
与kill-matching-lines
。与flush-lines
命令类似,但是匹配的行会作为整体加到 kill ring 中 - 新配置
kill-transform-function
字符在添加到 kill ring 中的预处理函数 - 新命令
revert-buffer-quick
提示更少的 revert show-paren-mode
默认开启
通用变更
更好支持 emoji。在 27 版本中,需要做如下配置:
(set-fontset-font t 'symbol (font-spec :family "Apple Color Emoji") nil 'prepend)
现在不需要这个配置就可以正常展示,并且提供了一个专门的 script symbol 用于表示:
(set-fontset-font t 'emoji '("My New Emoji Font" . "iso10646-1") nil 'prepend)
- 新选项
kill-buffer-delete-auto-save-files
之前总是会弹出提示,现在可配置 新选项
use-short-answers
用y-or-n-p
替代yes-or-no-p
,之前都是用这么做的:(fset 'yes-or-no-p 'y-or-n-p)
- 新选项
copy-directory-create-symlink
在 src dir 为软链时,copy-directory
的 dst dir 是否也为软链,默认 false。 remove-hook
改成 interactive 命令- 新增命令
shortdoc-display-group
之前节目中多次提到过的功能,按函数类型归类,展示其用法 - 新增命令
memory-report
- 新增命令
submit-emacs-patch
- 在没有设置 LANG 时,默认采用 UTF8 编码,之前是 ISO-8859-1
特定 mode 变更
- 新配置
dired-kill-when-opening-new-dired-buffer
默认 false - 新配置
dired-compress-directory-default-suffix
控制压缩目录的默认后缀,nil 表示tar.gz
- 新配置
dired-copy-dereference
拷贝时是否跟随源文件中的符号链接 - Org 升级到 9.5 版本
- NonGNU ELPA 默认开启
- 新配置
abbrev-suggest
,开启后会根据用户输入,在 echo area 区域提示使用 abbrev 来简化输入 recentf-auto-cleanup
如果设置成时间字符串,会每天定时清理。比如11:00pm
- 新配置
browse-url-default-handlers
根据 url 来定制不同的打开方式 - mode-line 会展示 Elisp 作用域方式
- 新配置
shr-max-width
默认 120。 - project 更新了一堆实用的命令,后面会单独写一篇文章介绍 28 中的 project 使用方式。
新 mode/package
- 新 mode
repeat-mode
,比如C-x u u
表示C-x u C-x u
- 新主题
modus-vivendi
与modus-operandi
- 新 major mode
lisp-data-mode
适用于 lisp 表达式,但不是可执行的程序,比如.dir-locals.el
- transient.el,就是 magit 中菜单导航使用的库
- hierarchy.el,用于操作具有层级关系数据结构的库
- shorthands.el 一种 ELisp 命名空间的实现,社区内相关讨论
平台相关变更
不兼容变更
- Xref 实现机制从 EIEIO 迁移到 cl-defstruct, 不能再使用
oref
与with-slots
- 使用
define-minor-mode
中的 positional 参数已经被淘汰
编译方式
看了上面那么多新功能,读者可能已经按捺不住内心的喜悦,这里就来介绍如何在 macOS 中编译 28 版本,其他操作系统方式类似。
1. 下载源码
git clone git://git.savannah.gnu.org/emacs.git
cd emacs
git checkout emacs-28
2. 下载依赖
brew install mailutils libxml2
3. 编译
make configure
./configure --with-mailutils --with-xwidgets
make -j4
make install
4. 测试
# 直接打开 Emacs
open nextstep/Emacs.app
# 在 Finder 中打开 Emacs,方便拖到 /Applications
open -R nextstep/Emacs.app
如果遇到下面的错误
xml.c:26:10: fatal error: 'libxml/tree.h' file not found
可以在第二步下载依赖后,导出下面的环境变量即可
export CPATH=`xcrun --show-sdk-path`/usr/include:`xcrun --show-sdk-path`/usr/include/libxml2
That's all. Enjoy hacking Emacs.
收听方式
反馈
- 对节目有想法或发现内容错误?欢迎来信交流️