【发布时间】:2014-02-14 19:08:57
【问题描述】:
我在 emacs (adoc-mode) 中经常使用 Asciidoc。我相信它在编辑内联源代码时会出现错误。发生的事情是 emacs 冻结,CPU 消耗达到 100%。我可以很容易地重现这种行为。
我如何真正确定是什么脚本导致 emacs 那样挂起?最好产生一个回溯?
由于 emacs 在 在缓冲区中键入时会冻结,而不是在执行命令之后,诸如
toggle-debug-on-quit 或 debug-on-entry 没用。
我想我可以用printfs 标记adoc-mode.el 中的每个defun,但我希望有更简单的方法:)
编辑:
所以,我最终为所有defuns 和trace-function 每一个grepping 我的~/.emacs.d/lisp。
我能够缩小问题范围并创建了一个小测试用例。
这 3 个文件是必需的:
$ find /home/victor/.emacs.d/
/home/victor/.emacs.d/
/home/victor/.emacs.d/lisp
/home/victor/.emacs.d/lisp/doc-mode.el
/home/victor/.emacs.d/lisp/adoc-mode.el
/home/victor/.emacs.d/lisp/markup-faces.el
我的.emacs:
$ cat .emacs
(setq inhibit-startup-message t)
(add-to-list 'load-path "~/.emacs.d/lisp/")
(require 'adoc-mode)
(switch-to-buffer (find-file "test.doc"))
(adoc-mode)
(goto-char 29)
(delete-backward-char 5)
;; now (adoc-kwf-attriblist) is in endless loop!!
而testcase是(“shell”这个词被elisp删掉了):
$ cat test.doc
blah blah blah
[source,shell]
foo
bar
现在,运行emacs,它将挂在(adoc-kwf-attriblist)。我对emacs编程了解不多,但似乎这个东西最终并没有将点移到end位置。
(goto-char (or (text-property-not-all (point) end 'adoc-attribute-list nil)
end))
【问题讨论】:
-
当emacs死机时,你能用
C-g打断它吗? -
@Francesco:当 emacs 冻结时,它不能被 \C-g\ 中断。 Emacs 只是停留在那里,不响应事件(键入、单击以关闭窗口等)。
-
你是对的——假设如果 text-property-not-all 返回,它返回的东西大于点。不幸的是,它可以返回与点相同的值,因此它会循环。我已经在 github 上进行了修复