Как в emacs настроить, какая оболочка используется для запуска процессов при использовании M-x comint-run

Я запускаю emacs на окнах. Я использую cygwin, и у меня также установлены версии ruby ​​и rdebug для cygwin. Когда я вызываю M-x comint-run ENTER rdebug ENTER, я заметил, что он пытается запустить rdebug.bat через командную строку Microsoft вместо использования bash для запуска rdebug (без .bat). Я бы хотел, чтобы comint-run использовал bash для вызова любого процесса, который его просят запустить. Любые идеи о том, как я могу это сделать?

Если вам интересно, почему я это делаю, см. здесь длинную историю: Идеи по устранению ошибки emacs: apply: Создание дочернего процесса: ошибка формата exec

Незначительный прогресс

Я немного покопался в коде elisp для comint-run, и похоже, что он, наконец, вызывает start-process — к сожалению, здесь я застрял, поскольку start-process — это функция, определенная в исходном коде C. И start-process по какой-то причине, похоже, игнорирует значения manifest-shell-file-name и shell-file-name.


person Rohith    schedule 15.02.2010    source источник


Ответы (4)


У меня есть это в моем .emacs

(setenv "SHELL" "C:/cygwin/bin/bash.exe")
(setq shell-file-name "C:/cygwin/bin/bash.exe")
(add-hook 'comint-output-filter-functions 'shell-strip-ctrl-m nil t)

Я не хакер elisp, и я скопировал и вставил этот код откуда-то давным-давно. Я не знаю, поможет ли это вам. Но, по крайней мере, он запускает bash, когда я делаю «M-x shell».

person Jörgen Lundberg    schedule 15.02.2010

ответ наверняка сработает, однако Emacs сначала смотрит на значение переменной explicit-shell-file-name, чтобы определить, какую оболочку запустить для нижняя интерактивная оболочка (см. ссылку на документацию). Таким образом, безошибочный ответ будет заключаться в том, чтобы установить:

(setq explicit-shell-file-name "C:/cygwin/bin/bash.exe")
person Trey Jackson    schedule 15.02.2010
comment
Не работает - у меня уже есть явное имя файла оболочки и имя файла оболочки, установленное на bash (и действительно, оболочка Mx правильно вызывает bash). Но comint-run, похоже, их игнорирует. - person Rohith; 16.02.2010

Несмотря на большую отладку elisp, я не мог найти способ настроить процесс запуска для использования cygwin bash. Теперь, когда я оглядываюсь на это, для меня это вроде как имеет смысл: предполагая, что emacs использует start-process для запуска различных процессов, которые ему нужны и внутри, start-process всегда должен вызывать оболочку, которая зависит от базовой операционной системы. система, а не какие-либо пользовательские настройки.

person Rohith    schedule 05.03.2010

Насколько я могу судить, Emacs start-process вообще не использует никакой оболочки — он запускает указанную вами программу напрямую, без промежуточных процессов. Естественно, если вы укажете командный файл (.BAT), он будет выполнен с помощью Microsoft Command Shell.

Если у вас есть несколько файлов с одинаковыми именами (один заканчивается на .BAT, а другой нет), я предлагаю вам убедиться, что выполняется правильный файл, указав полный путь. Это не Emacs, а Windows запускает командную оболочку для интерпретации пакетного файла, который Emacs попросил его выполнить.

person Markus Hallmann    schedule 02.03.2011