【问题标题】:Handling signals under Emacs shell and Cygwin在 Emacs shell 和 Cygwin 下处理信号
【发布时间】: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。

标签: bash shell emacs cygwin


【解决方案1】:

我认为这是命令提示符作为 tty 的更多问题。通常,我在向 Cygwin 和 Cygwin 内部的 emacs shell 发送正确信号时遇到问题,所以我找到了这个名为 puttycyg 的程序。 Putty 有一个很棒的外壳,我想为 Cygwin 提供类似的东西,所以我使用这个:http://code.google.com/p/puttycyg/

我在桌面上创建了一个快捷方式,以便于访问。您可以创建一个会话并从那里将其称为“cygwin”,然后创建可执行文件的快捷方式并使用-load "cygwin"

【讨论】: