当control-g在非常大的文件中不起作用时,如何中断emacs?


16

在Emacs中查看非常大的文件(例如128MB)并跳到文件末尾时,我遇到了某种O(n ^ 2)或更坏的行为。我认为可能与我的着色算法有关,以便根据上下文对文本进行着色。如果键入control-g(键盘退出),则该操作不受影响。我想要某种方法来恢复我的emacs会话而不仅仅是杀死它。我尝试发送SIGINT,但是emacs刚刚退出。我是否可以发送任何信号,或者是否可以通过其他方式(也许在调试器中)发送任何正在运行的操作以放弃控制权并交还给我?


我不知道使字体锁定可中断的方法,但是您可以在此Emacs Wiki页面上找到有关加快字体锁定的用途。
亚伦·米勒

5
您是否尝试过3次逃脱?
yPhil

是的,我认为您自己的字体锁定代码可能在这里有问题。仔细检查您的正则font-lock-keywords表达式以尝试查找问题。
Drew

1
EMACS:八兆字节并不断交换:-)
user829755

2
击中3次逃逸对我没有任何帮助。
WilliamKF 2013年

Answers:


9

我怀疑是字体锁定模式。那可能只会在可见区域附近进行。它可能正在复制内存中的数据。

sigusr1

sigusr2

当Emacs进程接收到信号SIGUSR1和时,将生成这些事件SIGUSR2。它们不包含其他数据,因为信号不携带其他信息。它们对于调试很有用(请参阅错误调试)。

来源:GNU Emacs Lisp参考手册:其他事件

我不知道它会做什么(或您正在运行的emacs版本),但是您可以尝试PROBABLY无损信号(USR1或USR2)。

$ kill -USR1 pid

或者您可以入睡,看看它是否可以恢复。


我想知道您的计算机有多忙(CPU和磁盘)。这可能会告诉您有关它在做什么的信息。..并且您可能能够运行emacs的另一个副本和“ kill -USR1 pid”这个新副本,以查看在执行您关心的副本之前发生了什么。
9mjb 2013年

3
哇,发送kill -USR2emacs-mac在类似的情况下对我也有用-以js2模式加载了一个大文件并启动了isearch。USR2退出isearch并进入调试器。比杀死进程好得多!
威廉

我不同意你的怀疑。杀人为我工作。它把我踢到了调试器,并且font-lock-default-fontify-region被卡在了那里。
布赖恩

2

我不知道emacs会进行任何信号处理,但是您可以通过以下方式使用Emacs服务器: server-start〜/ .emacs文件以便可以在正在运行的emacs实例上进行RPC。

然后,当您想杀死emacs并编写代码时,可以从shell调用emacsclient -e '(save-buffers-kill-emacs t)'

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.