На 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. Посмотрите на это примечание:

http://ignaciopp.wordpress.com/2009/07/02/emacs-shell-workaround-for-killing-input-in-windows-version/

Другие вопросы по тегам