Заставить bash-оболочку Windows 7 SUA работать с emacs (EmacsW32)? - PullRequest
1 голос
/ 20 мая 2010

Недавно купив Windows 7 Ultimate для получения доступа к подсистеме SUA - http://www.suacommunity.com, я изо всех сил пытался заставить утилиту bash SUA (/ usr / local / bin / bash) работать с EmacsW32. SUA поставляется с ksh и csh по умолчанию, поэтому я установил пакет сообщества для получения процесса bash.

Оболочка M-x обычно вызывает процесс оболочки и передает stdio через буфер Emacs. Это хорошо работает с Cygwin. Я попытался настроить переменные emacs, такие как w32-shell- *, чтобы они указывали на исполняемый файл bash SUA, а также попытался вызвать bash с помощью инструмента posix.exe, поставляемого с SUA. Я часто вижу, что файловые дескрипторы, связанные с процессом bash, удаляются, как только процесс создается EmacsW32.

Cygwin очень медленный по сравнению с SUA, поэтому я очень хочу, чтобы этот объект работал с комбо EmacsW32 + SUA. Любые советы, опыт, решения будут оценены.

1 Ответ

1 голос
/ 20 мая 2010

Я не знаю переменных 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

У меня были трудности, пока я не понял две вещи:

  1. если вы не укажете аргументы командной строки для процесса оболочки, emacs по умолчанию использует -i. В случае powershell этот аргумент либо не был поддержан, либо он делал что-то отличное от того, что я хотел (я забыл). Поэтому мне пришлось явно установить аргументы для вызова оболочки.

  2. имя переменной для указания аргументов оболочки, зависит от имени программы, используемой для запуска оболочки. Насколько я знаю, это не документировано (если только вы не считаете исходный код документацией!). Если вы работаете в Linux и используете sh, тогда переменная explicit-sh-args. Если bsh, то 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)))

Может быть, что-то подобное подойдет вам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...