На W32 Emacs, почему Ctrl-D в Cygwin или MinGW bash выдает повторяющиеся EOF?
Я использую W32 GNU Emacs 24.1.50.1 с Cygwin Bash 3.2.51. Я знаю, что эта комбинация очень хлопотна (см. Список EmacsWiki и Cygwin). Однако проблема, которую я хочу решить сейчас, не ограничивается Cygwin. У меня возникла проблема и с MinGW. Итак, проблема в том, что:
В Emacs запускаю оболочку через M-x shell
при условии, что вы установили переменные shell-file-name
а также explicit-bash-args
соответственно (см., например, здесь). Затем введите команду, которая ожидает ввода стандартного ввода, например cat
, Отменить из cat
обычно вы можете набрать Ctrl-D один раз и вернуться к приглашению оболочки. В W32 emacs, когда вы делаете это (или даже когда вы выдаете явно M-x comint-send-eof
) команда cat завершается, и оболочка bash также закрывается.
Я попытался увеличить "устойчивость" bash, установив переменную окружения IGNOREEOF
до, скажем, 5, но затем один 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 снова вышел. Эта проблема возникает только тогда, когда оболочка работает в Emacs W32 - Cygwin bash через окно Cygwin tty и MinGW bash через собственный MinTTY работают нормально.
Почему это происходит в W32 Emacs и как я могу просто выйти из работающей подкоманды (например, cat
) при использовании W32 Emacs без выхода из оболочки bash?
3 ответа
Понятие tty, как будто вы ожидаете, что оно будет себя вести, на самом деле не существует в W32. Если вы хотите увидеть это поведение Unixy, вам нужно не только запустить программу Cygwin, но и эту программу Cygwin, чтобы общаться с другой программой Cygwin (Emacs, терминал, вы называете это). IOW, вы получите это только с версией Cymawin Emacs.
В FAQ по GNU Emacs для MS Windows отмечается, что эта проблема существует для любого подпроцесса в буфере оболочки. Так что это влияет и на командную строку DOS (но, конечно, вы обычно не используете Ctrl-D в DOS, так что это не так заметно). В FAQ нет обходных путей, поэтому я думаю, что это не легко исправить.
Обычно вы можете использовать Ctrl-Z, а также Ctrl-D. Посмотрите на это примечание: