Emacs 29 新特性预览
Jiacai Liu tags: release
文章目录
29.1 已经在 2023-07-30 发布了💥
作为日常使用 Emacs 进行开发的重度用户,困扰笔者的一个问题时,同时打开多个项目时, xref 会错乱,这十分烦人,忍受一段时间后,最终去 SO 提问了一下,Emacs 又一次没令我失望,29 里面已经有了解法:
1(setq xref-history-storage 'xref-window-local-history)于是花了一点点时间,从 28 升级到了 29,只能说太香了,还在 28 踌躇的读者可以着手升级了。这里列举一些笔者认为 29 中一些比较实用的更新,完整列表可以去看 NEWS.29。
新包
- eglot
- Emacs Client for the Language Server Protocol.
- use-package
- Declarative package configuration. 上面这两个包一直都在使用,这下不用再额外安装了。
- 使用 tree-sitter 重写的 major mode
- 当编译时开启
tree-sitter选项时启用。具体操作步骤可参考:starter - wallpaper
- 设置桌面壁纸
- js-json-mode
- 轻量级的 js-mode,打开 json 时用。轻量使用的话,joshwnj/json-mode 可以不用再安装。
- sqlite-mode
- 内置对 sqlite 的支持 😎。需要在编译机器上安装
sqlite库。sqlite-mode-open-file可以直接以sqlite-mode打开 sqlite 数据库文件,并且可以直接浏览、修改表数据!笔者计划后续会单独写一篇文章来介绍。 - multisession
- 这个包提供了在不同会话间持久化变量的功能。现阶段只有
emoji-recent使用到了,用户也可以通过define-multisession-variable来添加新变量。另外值得一提的是,该包除了使用文件作为存储介质外,还支持 sqlite,可通过multisession-storage配置。 - pixel-scroll-precision-mode
- 像素级滚动,Emacs 默认只能按行滚动,开启它后就可以按像素滚动了,不过对于写代码来说体验区别不大。
- vtable.el
- 展示表格数据,这个包使用
variable-pitch字体来格式化数据 - leuven-dark
- leuven 的暗黑主题
新函数
rename-visited-file- Emacs 终于支持同时重命名 buffer 和文件名了。👍
delete-process- 变成了交互式命令
restart-emacs- 与
save-buffers-kill-emacs类似,只是在关闭 emacs 后,会重新用同样的启动参数再次启动 scratch-buffer- 交互式命令,切换到
*scratch*buffer,可以解决误删的问题 project-list-buffers- 用于展示当前项目的 buffer
xref-find-references-and-replace- 重命名变量
xref-go-forward- 与
xref-go-back对应,默认快捷键C-M-, duplicate-line和duplicate-dwim- 复制当前行,当有 active region 时
dwim会复制当前 region,否则就是当前行 ensure-empty-lines- 确保当前行上面是空行
find-sibling-file寻找“兄弟”文件,兄弟文件是由
find-sibling-rules这个变量定义的。比如可以定义如下规则来打开.c对应的.h文件:1("\\\\([^/]+\\\\)\\\\.c\\\\\\='" "\\\\1.h")emoji-insert,emoji-list,emoji-search,emoji-recent- 方便快捷的在 Emacs 中输入 emoji 💯 😎
package-update,package-update-all- 更新包,无需再使用
list-packages package-vc-install- 从制定仓库安装包
split-root-window-belowsplit-root-window-right- 把 root 窗口分成 2 个,窗口相关的命令可以在
C-x w内找到 elisp-eval-region-or-buffer- 如果有 region,执行 region 内的 elisp 代码,否则就是整个 buffer
recentf-open- 打开最新的文件
新选项
eww-url-transformers- 用于在访问 URL 前进行改写,默认它会移除
utm_这个用于追踪的参数。 之前写的 URL 重定向就可以利用它来实现。 eww-auto-rename-buffer- 自动给 eww buffer 命名,默认为 nil,可以设置为
'title或'url browse-url-default-scheme- 当使用
browse-url等函数时,默认的 URl scheme,默认是http xref-history-storage- 如何保存 xref 的历史 marker,一个有用的选项是
xref-window-local-history,这样在用 Emacs 同时打开多个项目时, xref 就不会错乱了。 show-paren-context-when-offscreen- 当光标在右括号时,如果左括号不在屏幕时,会在 echo area 中展示相关信息,在 GUI 中,可以设置成
overlay或child-frame package-install-upgrade-built-in- 是否允许升级内置包,比如 eglot。默认 nil
tramp-use-scp-direct-remote-copying- 当设置为 true 时,使用 scp 来复制文件
python-shell-dedicated- 是否为每个项目、buffer 开启特定的 Python shell,默认为 nil
新快捷键
M-SPC现在绑定cycle-spacing,之前是just-one-space。循环的操作可以通过cycle-spacing-actions配置。
优化
长行优化。主要是下面两个 commit。这样按说就不再需要在使用
so-long-mode了,long-line-threshold控制长行的阈值,超过即进行优化展示。kill-buffer如果没有保存会给出save then kill的提示tramp支持了dockerpodmankubernetes- Org 升级到 v9.6
- C++ mode 支持 C++20 中的新语法
Deprecated
linum.el正式作废,推荐使用display-line-numbers-mode来替代。- EIEIO 相关 compat 函数默认已经不再加载,最主要的就是
defmethoddefgeneric函数,如果之前配置中有用到,可以直接加上前缀cl-即可,比如下面这个 PR:Fix defmethod by sarg · Pull Request #3 · ukaszg/aria2
除此之外,在升级过程中还有可能遇到下面的 warning,根据提示来修复即可。
1twittering-mode.el: Warning: ‘block’ is an obsolete alias (as of 27.1); use ‘cl-block’ instead.
2twittering-mode.el: Warning: ‘return-from’ is an obsolete alias (as of 27.1); use ‘cl-return-from’ instead.
3twittering-mode.el: Warning: ‘decf’ is an obsolete alias (as of 27.1); use ‘cl-decf’ instead.
4twittering-mode.el: Warning: ‘incf’ is an obsolete alias (as of 27.1); use ‘cl-incf’ instead.Emacsclient
- 新选项
-r - 复用现有的 GUI frame,如果没有的话,则新创建一个
- 新选项
-w - 超时时间,如果 Emacs 没有在规定时间内响应,那么 client 就会自动退出。
启动项
--batch--script现在会调整 GC 参数,gc-cons-percentage会设置成 1(默认是 0.1)。- Emacs 可以更方便的用于脚本中。
#!/usr/bin/emacs -x会跳过 init.el 文件,直接执行文件后面的内容,最后一个表达式为脚本的退出码。 - 可以通过
--init-directory设置user-emacs-directory变量 .eld结尾的文件默认用lisp-data-mode打开。
收听方式

反馈
- 对节目有想法或发现内容错误?欢迎来信交流️