在W32 Emacs上为什么Cygwin或MinGW bash中的Ctrl-D会发出重复的EOF?

时间:2012-10-19 06:32:20

标签: shell emacs cygwin eof emacsw32

我正在使用W32 GNU Emacs 24.1.50.1和Cygwin bash 3.2.51。我知道这种组合很麻烦(见EmacsWikiCygwin list)。但是我现在要解决的问题并不仅限于Cygwin。我也得到了MinGW的问题。所以,问题是:

在Emacs中,如果您已正确设置变量M-x shellshell-file-name,请通过explicit-bash-args启动shell(请参阅例如here)。然后发出一个期望stdin输入的命令,例如cat。要取消cat,您通常可以键入Ctrl-D 一次,然后返回到shell提示符。在W32 emacs执行此操作时(或者甚至在您明确发出M-x comint-send-eof时),cat命令退出并且 bash shell也会退出。

我尝试通过将环境变量IGNOREEOF设置为5来增加bash的“弹性”,但是单个Ctrl-D会导致以下输出

$ Use "exit" to leave the shell.
$ Use "exit" to leave the shell.
$ Use "exit" to leave the shell.
$ Use "exit" to leave the shell.
$ Use "exit" to leave the shell.
$ exit

Process shell finished

当然,bash已经退出了。这个问题只发生在shell运行W32 emacs - Cygwin bash通过Cygwin tty窗口和MinGW bash通过它自己的MinTTY工作正常。

为什么在W32 Emacs中发生这种情况?如何在不退出bash shell的情况下使用W32 Emacs时退出正在运行的子命令(例如cat)?

3 个答案:

答案 0 :(得分:0)

在W32世界中,tty的概念就像你期望的那样。如果你想看到这个Unixy行为,你不仅需要运行一个Cygwin程序,而且Cygwin程序需要与另一个Cygwin程序(Emacs,终端,你命名它)交谈。以下你只能使用Cygwin版本的Emacs。

答案 1 :(得分:0)

GNU Emacs FAQ for MS Windows注意到shell缓冲区中的任何子进程都存在此问题。所以它也会影响DOS命令行(当然你通常不会在DOS中使用Ctrl-D,所以它并不那么引人注目)。常见问题解答中没有建议解决方法,因此我猜测没有简单的解决办法。

答案 2 :(得分:0)