当我通过使用 geiser + 球拍评估 emacs 中的表单意外地造成无限循环时,经过一分钟左右的等待,最终 emacs 将再次开始响应。不幸的是,之后的每次评估至少需要一分钟。通常,在第二次或第三次 eval 之后,emacs 将完全停止响应,此时最快的事情就是重新启动 Ubuntu 机器。
是否有一些设置可以防止在 geiser 中发生这种情况,或者有一种方法可以告诉 emacs 杀死 geiser?
这就是我在某些事情挂断时所做的事情。多年来,我不记得 Emacs 陷入无法恢复的状态。
使用C-g. 如果需要,重复。它调用keyboard-quit
. 这应该会打破任何死循环并让您能够输入命令。
现在,如果 geiser 或任何其他进程行为不端,只需终止与该进程对应的缓冲区即可。 C-x C-b将为您提供所有缓冲区的列表。如果您不认识属于 geiser 的那个,只需重新启动 Emacs 并仅打开 geiser 并再次查看缓冲区列表。
现在用 标记行为不端的缓冲区d。使用 执行删除x。而已。您现在可以重新启动 geiser 或其他任何东西。这种方法是完全通用的。
顺便说一句,重新启动 Ubuntu 机器太激烈了。如果无法通过窗口停止应用程序,但 X 仍然有效,请使用xkill
实用程序。例如,我已将其绑定到Ctrl-Alt-F12
。然后你只需点击一个你不喜欢的窗口,它就消失了。
如果xkill
不起作用,请切换到虚拟终端
Ctrl-Alt-F1
并使用并终止htop
应用程序。
根据REPL文档,您应该能够使用Cc Cq来杀死 REPL。从 REPL 文档的链接,转到急救部分;它在它的底部附近。
Geiser 也在这里挂起循环。在两天前更新的 Debian 7 上运行的 emacs 24.3.1 中;Mx 运行-geiser;然后得到一个带有 REPL 提示的窗口。一切都很好,但是然后说 > (define f (* f (- n 1))),然后 > (f 3) 并且缓冲区中的进程被锁定。Cc Cc 和 Cc Cq 什么都不做。杀死缓冲区,对杀死子进程的查询回答“是”,然后重新启动确实会得到一个 REPL 提示,所有定义都消失了。