搜集能使 Emacs 崩溃的方法

为了更好感受到 Lockfile、备份(Backup)和预存(Auto-save)的必要程度,我打算把它们都关掉

;; .#foo.txt
;; 不同进程修改同一个文件
(setq create-lockfiles nil)
;; foo.txt~
;; 备份最近一个版本
(setq make-backup-files nil)
;; #foo.txt#
;; 定期预存,否则停电、系统崩溃等会损失没保存数据
(setq auto-save-default nil)

从这里想到有哪些能使 Emacs 崩溃的方法?比如运行某一个 Emacs Lisp 表达式?印象中非法 Byte Code、Thread、Dynamic Module 都有可能使 Emacs 崩溃。大家知道有哪些具体的、 可以稳定重现的方法吗?

1 个赞
kill -9 PID # 绝对灵的办法
3 个赞

最近使用 emacs-mac 26.1 编辑着编辑着就闪退了。。。但是没法稳定复现。似乎和company 的补全有关系。//

拔电源插头.

禁用鼠标和键盘

自动保存就用写的 https://www.emacswiki.org/emacs/auto-save.el 吧, 不知道比 emacs 默认的那种版本管理省心多少倍, 指头一松就自动保存, 而且还不会产生一大堆垃圾文件。

配置文件也超级简单:

https://www.emacswiki.org/emacs/init-auto-save.el

4 个赞

Emacs 自带的 Auto-Save 与你所指的「自动保存」不是一个意思,以下是 Auto Save 的定义(粗体是我加的):

From time to time, Emacs automatically saves each visited file in a separate file, without altering the file you actually use. This is called “auto-saving”.

我猜测你的 auto-save.el 和 Emacs 自带的 auto-save-visited-mode 功能一样,虽然两者我都还没试过。

Emacs Byte-code Internals « null program 提到有问题的 Byte-code 能使 Emacs 崩溃,比如:

M-: (#[0 "\300\207" [] 0])

不一样,用一下,不要猜

我不认为我有这个需要。

有问题的 byte-code 会造成访问错误的内存地址,也就是通称 segfault,操作系统检测到以后会发送 SIGSEGV,实际上和主动运行 kill -11 PID 效果应该是完全一样的。


似乎 Emacs 26 以后会对 byte code 进行檢查,对不合法的指令直接报错以免崩潰。

3 个赞

这些设置留在那儿和auto-save.el不会有冲突吧

   auto-save-visited-file-name t
   auto-save-interval 300
;; 禁用Emacs备份机制
(setq make-backup-files nil)
(setq auto-save-default nil)

;; 启用 LazyCat 的自动备份插件
(require 'auto-save)
(auto-save-enable)
(setq auto-save-slient t)
(setq auto-save-delete-trailing-whitespace t)

感觉mac下的emacs崩溃的概率要比linux大很多.

自己编译的还好。

auto-save 有没有什么缺陷的,我看很多大牛说这个自动保存并不是完美的,总会有一些缺陷

auto-save.el 是我写的, 我都用了十几年了, 很多东西要自己用才知道好不好。

1 个赞

感觉你俩说的 auto-save 不是同一个东西, @manateelazycat 的 auto-save.el 是自动把未保存的 buffer 保存到它的文件中,我有在用,挺好用的,解放双手,不用自己再手动 C-x C-s 保存。

Emacs 内置的 auto save 是把内容保存到 xxx~ 中,而不是 xxx 文件本身。

我觉得最大的问题是,用了这个以后 revert-buffer 就算废了。这就是为什么 Emacs 自带的备份是存在别的文件。

macOS 很多带有自动保存的软件,尤其是官方出的,也不会擅自覆盖原来的文件,而是利用集成到桌面系统的版本控制功能保存副本。

那类似 IDEA 这种实时保存是怎么做的?其实也是后台保存到另一套文件中么?