Заставить bash-оболочку Windows 7 SUA работать с emacs (EmacsW32)?
Недавно купив Windows 7 Ultimate для получения доступа к подсистеме SUA - http://www.suacommunity.com/ - я изо всех сил пытался заставить утилиту bash SUA (/usr/local/bin/bash) работать с EmacsW32. SUA поставляется с ksh и csh по умолчанию, поэтому я установил пакет сообщества для получения процесса bash.
Оболочка Mx обычно вызывает процесс оболочки и передает stdio через буфер Emacs. Это хорошо работает с Cygwin. Я попытался настроить переменные emacs, такие как w32-shell-*, чтобы они указывали на исполняемый файл bash SUA, а также попытался вызвать bash с помощью инструмента posix.exe, поставляемого с SUA. Я часто вижу, что файловые дескрипторы, связанные с процессом bash, удаляются, как только процесс создается EmacsW32.
Cygwin очень медленный по сравнению с SUA, поэтому я очень хочу, чтобы этот объект работал с комбо EmacsW32 + SUA. Любые советы, опыт, решения будут оценены.
1 ответ
Я не знаю переменных w32-shell-*. Может быть, вы могли бы показать код, чтобы проиллюстрировать, что вы имеете в виду.
Я также не знаю SUA. Я использую GNU emacs v22 в Windows и запускаю powershell как низкоуровневую оболочку. Сначала у меня были некоторые трудности, похожие на ваши, и я решил их с лучшим пониманием того, как запустить оболочку. Может быть, это поможет вам.
Я использую эти переменные:
(setq explicit-shell-file-name
"c:\\windows\\system32\\WindowsPowerShell\\v1.0\\powershell.exe")
(setq explicit-powershell.exe-args
'("-Command" "-" )) ;; interactive, but no command prompt
У меня были трудности, пока я не понял две вещи:
если вы не укажете аргументы командной строки для процесса оболочки, emacs по умолчанию использует
-i
, В случае powershell этот аргумент либо не был поддержан, либо он делал что-то отличное от того, что я хотел (я забыл). Поэтому мне пришлось явно установить аргументы для вызова оболочки.Имя переменной для указания аргументов оболочки зависит от имени программы, используемой для запуска оболочки. Насколько я знаю, это не задокументировано (если только вы не считаете исходный код документацией!). Если вы работаете в Linux и используете sh, то переменная
explicit-sh-args
, Если бш, тоexplicit-bsh-args
, Если вы работаете в Windows, вам нужно использовать правильное имя исполняемого файла, включая суффикс.exe. Это делает для странно выглядящего имени переменной, но это работает.
Полный код для запуска powershell как нижней оболочки emacs выглядит так:
;; get a name for the buffer
(setq buffer (get-buffer-create "*PowerShell*"))
(let ((tmp-shellfile explicit-shell-file-name))
(setq explicit-shell-file-name
"c:\\windows\\system32\\WindowsPowerShell\\v1.0\\powershell.exe")
(setq explicit-powershell.exe-args
'("-Command" "-" )) ; interactive, but no command prompt
;; launch the shell
(shell buffer)
; restore the original shell
(if tmp-shellfile
(setq explicit-shell-file-name tmp-shellfile)))
Может быть, что-то подобное подойдет вам.