【发布时间】:2026-02-08 18:15:01
【问题描述】:
我使用 Cygwin 版本的 Emacs。除了使用 Emacs shell(M-x shell)时的一些怪癖之外,一切都很好。 Emacs shell 使用的是 Cygwin 的 bash。现在最大的问题是无法向 shell 发送 SIGINT 来中断当前正在运行的命令。例如,我经常使用 ssh 登录到远程主机,然后“tail -f”一个文件。我无法摆脱 tail 命令。在 Unix/Linux 下使用 Emacs shell 时,按 C-c C-c (comint-interrupt-subjob) 将向 shell (bash) 发送 SIGINT,tail 命令(或其他命令)将按预期中断。
举个简单的例子,运行“M-x shell”,然后运行“sleep 30”,并尝试中断睡眠命令。您可以退出 (C-g) 并在 Emacs 中执行其他操作,但 Emacs shell 在 sleep 命令期间会挂起。
我觉得这与 Cygwin 中的信号发送/处理的差异有关,而不是 Unix 中的信号。由于 Cygwin bash shell 对信号做出适当的响应,我必须假设有某种方法可以让 Emacs 以它理解的方式向 bash shell 发送 SIGINT。有什么想法吗?
顺便说一句,我使用过 Emacs eshell、term 和 ansi-term,但出于多种原因,我更喜欢 shell。我也使用 mintty 和 GNU Screen,对此没有任何抱怨,但是使用 Emacs shell 并将我的终端会话视为文本文件是一件很棒的事情。
【问题讨论】:
-
C-c C-c在 Cygwin/bash/xemacs 中为我工作。 -
啊,是的,C-c C-c 在 XEmacs(版本 21)中可以正常工作。感谢您指出这一点。我希望让它与 GNU Emacs 23.2 一起工作。
-
看起来这是您遇到的(长期存在的)错误。 (cygwin.com/ml/cygwin/2010-10/msg00437.html)。这个错误必须修复。到那时,如果使用 eshell 代替 shell,您会错过哪些功能?
-
@vpit3833 FWIW,该错误已在最新的 cygwin.com/snapshots 以及即将推出的 Cygwin 1.7.8 中修复。
-
昨天发布了带有该修复程序的 Cygwin 1.7.8。