Emacs 29 新特性预览
作为日常使用 Emacs 进行开发的重度用户,困扰笔者的一个问题时,同时打开多个项目时, xref 会错乱,这十分烦人,忍受一段时间后,最终去 SO 提问[1]了一下,Emacs 又一次没令我失望,29 里面已经有了解法:
(setq xref-history-storage 'xref-window-local-history)
于是花了一点点时间,从 28 升级到了 29,只能说太香了,还在 28 踌躇的读者可以着手升级了。这里列举一些笔者认为 29 中一些比较实用的更新,完整列表可以去看 NEWS.29[2]。
新包
eglot: Emacs Client for the Language Server Protocol. use-package: Declarative package configuration. wallpaper: 设置桌面壁纸 js-json-mode: 轻量级的 js-mode,打开 json 时用 使用 tree-sitter 重写的 major mode: 当编译时开启 tree-sitter
选项时启用。
新函数
rename-visited-file
: Emacs 终于支持同时重命名 buffer 和文件名了。delete-process
: 变成了交互式命令restart-emacs
: 与save-buffers-kill-emacs
类似,只是在关闭 emacs 后,会重新用同样的启动参数再次启动scratch-buffer
: 交互式命令,切换到*scratch*
buffer,可以解决误删的问题project-list-buffers
: 用于展示当前项目的 bufferxref-find-references-and-replace
: 重命名变量duplicate-line
和duplicate-dwim
: 复制当前行,当有 active region 时dwim
会复制当前 region,否则就是当前行find-sibling-file
: 寻找“兄弟”文件,兄弟文件是由find-sibling-rules
这个变量定义的。比如可以定义如下规则来打开.c
对应的.h
文件:("\\\\([^/]+\\\\)\\\\.c\\\\\\='" "\\\\1.h")
sqlite-mode-open-file
: 可以直接以sqlite-mode
打开 sqlite 数据库文件,并且可以直接浏览、修改表数据!emoji-insert
,emoji-list
,emoji-search
,emoji-recent
方便快捷的在 Emacs 中输入 emoji 💯 😎ensure-empty-lines
: 向上插入一空行package-update
,package-update-all
: 更新包,无需再使用list-packages
新选项
eww-url-transformers
: 用于在访问 URL 前进行改写,默认它会移除utm_
这个用于追踪的参数xref-history-storage
: 如何保存 xref 的历史 marker,一个有用的选项是xref-window-local-histor
,这样在用 Emacs 同时打开多个项目时, xref 就不会错乱了。
优化
长行优化。主要是下面两个 commit。这样按说就不再需要在使用 so-long-mode
了
[Actually fix the long lines display bug](https://github.com/emacs-mirror/emacs/commit/1792cbaddc33772c344e45fb9478bee85fee66e7\ "Actually fix the long lines display bug") Improvements to long lines handling.[3]
kill-buffer
如果没有保存会给出 save then kill
的提示tramp
支持了 docker
podman
kubernetes
Deprecated
EIEIO 相关 compat 函数默认已经不再加载,最主要的就是 defmethod
defgeneric
函数,如果之前配置中有用到,
EIEIO 相关 compat 函数默认已经不再加载,最主要的就是 defmethod
defgeneric
函数,如果之前配置中有用到,
EIEIO 相关 compat 函数默认已经不再加载,最主要的就是 defmethod
defgeneric
函数,如果之前配置中有用到,
可以直接加上前缀 cl-{func}
即可,比如下面这个 PR:
Fix defmethod by sarg · Pull Request #3 · ukaszg/aria2[4]
除此之外,在升级过程中还有可能遇到下面的 warning,根据提示来修复即可。
twittering-mode.el: Warning: ‘block’ is an obsolete alias (as of 27.1); use ‘cl-block’ instead.
twittering-mode.el: Warning: ‘return-from’ is an obsolete alias (as of 27.1); use ‘cl-return-from’ instead.
twittering-mode.el: Warning: ‘decf’ is an obsolete alias (as of 27.1); use ‘cl-decf’ instead.
twittering-mode.el: Warning: ‘incf’ is an obsolete alias (as of 27.1); use ‘cl-incf’ instead.
Emacs Server
emacsclient 支持 -r
新选项。表示复用现有的 GUI frame,如果没有的话,则新创建一个
参考
Marcin Borkowski: 2022-12-19 A few new things in Emacs 29[5]
参考资料
SO 提问: https://stackoverflow.com/questions/75791497/
[2]NEWS.29: https://github.com/emacs-mirror/emacs/blob/master/etc/NEWS.29
[3]Improvements to long lines handling.: https://github.com/emacs-mirror/emacs/commit/e7b5912b235936b304701ba6b1e808d9b197fd4f
[4]Fix defmethod by sarg · Pull Request #3 · ukaszg/aria2: https://github.com/ukaszg/aria2/pull/3
[5]Marcin Borkowski: 2022-12-19 A few new things in Emacs 29: https://mbork.pl/2022-12-19_A_few_new_things_in_Emacs_29