1

在我当前的设置中,我emacs --daemon在启动时运行,然后用于emacsclient工作。但是,我注意到了这个问题。当发生复杂的处理块时,C-g停止工作:复杂的工作不能提前停止或终止。据我所知,这是因为在处理来自客户端的任何输入之前,emacs 客户端需要等待服务器确认。因此,C-g当我最需要它时,它就不起作用了——以摆脱耗时或可能具有破坏性的过程。

是否有任何解决方法,或者告诉服务器进程“停止它!”?手册的“退出”或“紧急逃生”部分似乎没有承认存在这个问题 - 所以这也可能是我做错了什么的结果。如果是这样,我做错了什么?

如果答案是“不,没有办法做你想做的事;emacsclient进程无法应对服务器被阻塞一段不平凡的时间”,我会将代码或文档中指出的答案标记为已接受哪里可以得到答案:我一直没能找到这样的东西。:(

4

2 回答 2

4

到目前为止,我发现唯一可行的方法是SIGUSR2使用命令行向繁忙的 emacs 进程发送信号kill——无论它是否作为服务器运行(使用--daemon)。这不会强制终止 emacs 进程,同时能够中断它正在做的事情。让我们尝试一个示例来打破sleep-for在 emacs 服务器上运行的循环。(是的,sleep-for可以中断,C-g但这只是一个示例。它适用于emacs 不响应键盘命令的某些情况。)

首先,启动 emacs 服务器,然后使用emacsclient连接到它,输入M-: (sleep-for 120). 现在转到另一个终端并使用命令行查找服务器的进程 ID ps x|grep 'emacs.*--daemon':。假设我们在这里找到的 PID 是 12345。现在使用终端来破解它:

kill -USR2 12345

我们现在应该看到sleep-for循环中断了。在某些情况下,我需要多次发送此信号。

另请注意,建议SIGUSR1SIGUSR2要这样做,这可能仅适用于高于 v24 的 Emacs 版本。希望这可以帮助!

于 2017-11-02T08:30:28.680 回答
-1

不幸的是,我认为没有优雅的解决方案。一种可能性是创建一个备用的 emacsclient 会话,隐藏在 tmux/screen 会话中,您可以将其重新启动,然后在其中插入 Cg。但这有点恶心。

于 2013-03-01T00:10:10.447 回答