在Emacs shell和Cygwin下处理信号

4
我使用的是Cygwin版本的Emacs,一切都很好,只有在使用Emacs shell(M-x shell)时存在一些怪癖。Emacs shell正在使用Cygwin的bash。目前最大的问题是不能发送SIGINT到shell以中断当前正在运行的命令。例如,我经常使用ssh登录到远程主机,然后“tail -f”一个文件。我无法中断tail命令。在Unix / Linux下使用Emacs shell时,按下C-c C-c(comint-interrupt-subjob)将向shell(bash)发送SIGINT,并且tail命令(或其他命令)将如预期中断。
为了快速简便,运行“M-x shell”,然后运行“sleep 30”,并尝试中断sleep命令。你可以在Emacs内退出(C-g)并做其他事情,但是Emacs shell会在sleep命令的持续时间内挂起。
我感觉这与Cygwin中信号发送/处理的差异有关,与Unix中的信号不同。由于Cygwin bash shell对信号作出了适当的响应,因此我必须假设有某种方式能够让Emacs以bash shell理解的方式发送SIGINT。你有什么想法吗?
顺便说一句,我曾经使用过Emacs eshell,term和ansi-term,但出于许多原因,我更喜欢shell。我还使用mintty和GNU Screen,在那里没有任何抱怨,但是使用Emacs shell并将终端会话视为文本文件是一件美妙的事情。

1
看起来你遇到了一个(长期存在的)bug。(http://cygwin.com/ml/cygwin/2010-10/msg00437.html) 这个bug必须要修复。在修复之前,你会错过哪些功能,比如使用eshell替代shell? - vpit3833
1
@vpit3833,值得一提的是,该错误已在最新的http://cygwin.com/snapshots中得到修复,因此即将推出的Cygwin 1.7.8也会修复该问题。 - ak2
如果那个bug是导致问题的原因,那么回答这个问题的答案可能是升级到最新版的Cygwin。 - vpit3833
@vpit3833 - 我认为使用eshell而不会错过任何功能。然而,如果我从eshell内部ssh到远程主机,然后按C-c C-c,则会终止ssh连接。理想的行为应该只杀死在远程主机上运行的进程。我知道,这听起来像我在挑剔。我只是希望它在Cygwin下的工作方式与Unix / Linux下的方式相同。 - PottedMeat
1
昨天发布了带有该修复程序的Cygwin 1.7.8版本。 - ak2
显示剩余3条评论
1个回答

0

我认为这更多是与命令提示符作为tty的问题。我在Cygwin中遇到了向emacs shell发送正确信号的问题,以及Cygwin的一般问题,所以我找到了一个叫做puttycyg的程序。Putty有一个很棒的shell,我想在Cygwin中也有类似的东西,所以我使用了这个:http://code.google.com/p/puttycyg/

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接