Bri*_*ell 1 emacs elisp emacsclient
在我当前的设置中,我emacs --daemon在启动时运行,然后用于emacsclient工作。但是,我注意到了一个问题。当发生复杂的处理块时,C-g停止工作:复杂的工作不能提前停止或终止。据我所知,这是因为 emacs 客户端需要等待服务器确认才能处理客户端的任何输入。因此,C-g当我最需要它时,它不起作用——摆脱耗时或可能具有破坏性的过程。
是否有任何解决方法,或者告诉服务器进程“停止!”的方法?手册的“退出”或“紧急逃生”部分似乎没有承认这个问题的存在 - 所以这也有可能是我做错了什么的结果。如果是这样,我做错了什么?
如果答案是“不,没有办法做你想做的事;emacsclient进程无法应对服务器被阻塞很长一段时间”,我会将代码或文档中指出的答案标记为已接受在那里可以得到答案:我还没有找到这样的东西。:(
到目前为止,我发现唯一可行的方法是SIGUSR2使用命令行向繁忙的 emacs 进程发送信号kill——无论它是否作为服务器运行(使用--daemon)。这不会强制终止 emacs 进程,同时能够中断它正在执行的操作。让我们尝试一个示例来打破sleep-foremacs 服务器上运行的循环。(是的,sleep-for可以打破C-g,但这只是一个例子。它在emacs 不响应键盘命令的某些情况下起作用。)
首先,启动 emacs 服务器,然后使用emacsclientconnect 来连接它,输入M-: (sleep-for 120). 现在转到另一个终端并使用命令行查找服务器的进程 ID:ps x|grep 'emacs.*--daemon'。假设我们在这里找到的PID是12345。现在使用终端来破解它:
kill -USR2 12345
我们现在应该看到sleep-for循环被中断。在某些情况下,我需要多次发送此信号。
另请注意,这SIGUSR1不起作用SIGUSR2,因此建议这样做,并且这可能仅适用于高于 v24 的 Emacs 版本。希望这可以帮助!