Как мне запустить Cygwin Bash Shell из Emacs? - PullRequest
38 голосов
/ 25 октября 2008

Я использую GNU Emacs в Windows, поэтому введите:

M-x shell

запускает оболочку DOS командной строки Windows. Однако вместо этого я хотел бы иметь возможность запускать оболочку Cygwin Bash (или любую другую, отличную от Windows) внутри Emacs Как это легко сделать?

Ответы [ 8 ]

42 голосов
/ 25 октября 2008

shell-file-name - это переменная, управляющая оболочкой, которую Emacs использует для запуска команды оболочки.

explicit-shell-file-name - это переменная, определяющая, какая оболочка M-x shell запускается.

Ответ Кена меняет оба из тех, которые вы можете или не хотите.

Вы также можете иметь функцию, которая запускает другую оболочку, временно изменяя explicit-shell-file-name:

(defun cygwin-shell ()
  "Run cygwin bash in shell mode."
  (interactive)
  (let ((explicit-shell-file-name "C:/cygwin/bin/bash"))
    (call-interactively 'shell)))

Возможно, вы также захотите передать аргумент --login в bash, потому что вы начинаете новый сеанс Cygwin. Вы можете сделать это, установив explicit-bash-args. (Обратите внимание, что M-x shell использует explicit- PROGRAM -args, где PROGRAM - это часть имени файла пути оболочки. Именно поэтому вы не должны включать .exe при установке оболочки.

7 голосов
/ 05 января 2012

Лучшее решение, которое я нашел, это следующее:

;; When running in Windows, we want to use an alternate shell so we
;; can be more unixy.
(setq shell-file-name "C:/MinGW/msys/1.0/bin/bash")
(setq explicit-shell-file-name shell-file-name)
(setenv "PATH"
    (concat ".:/usr/local/bin:/mingw/bin:/bin:"
        (replace-regexp-in-string " " "\\\\ "
            (replace-regexp-in-string "\\\\" "/"
                (replace-regexp-in-string "\\([A-Za-z]\\):" "/\\1"
                    (getenv "PATH"))))))

Проблема с передачей "--login", как указывает cjm , - ваша оболочка всегда будет запускаться в вашем домашнем каталоге Но если вы редактируете файл и нажимаете «M-x shell», вы хотите, чтобы ваша оболочка находилась в каталоге этого файла. Кроме того, я протестировал эту настройку с "M-x grep" и "M-x compile". Я подозреваю, что другие примеры здесь не сработают из-за проблем с каталогами и PATH.

Этот фрагмент elisp находится в вашем файле ~ / .emacs. Если вы хотите использовать Cygwin вместо MinGW, измените первую строку на C: / cygwin / bin / bash. Вторая строка добавляется к вашей переменной PATH в Windows (после преобразования этой переменной PATH в форму с соответствующей комбинацией); в Cygwin вы, вероятно, захотите "~ / bin: / usr / local / bin: / usr / bin:" или что-то подобное.

6 голосов
/ 25 октября 2008

Я использую XEmacs с Cygwin и относительно легко могу запустить bash из XEmacs.

Вот соответствующий раздел из init.el

;; Let's use CYGWIN bash...
;;
(setq binary-process-input t) 
(setq w32-quote-process-args ?\") 
(setq shell-file-name "bash") ;; or sh if you rename your bash executable to sh. 
(setenv "SHELL" shell-file-name) 
(setq explicit-shell-file-name shell-file-name) 
(setq explicit-sh-args '("-login" "-i"))
5 голосов
/ 14 мая 2009

Еще один важный совет на эту тему.

Если вы используете режим оболочки Emacs и иногда хотите использовать bash и cmd, настройте его на использование bash по умолчанию, потому что вы можете ввести cmd в bash, и полученная оболочка dos работает просто отлично.

Если вы настроили Emacs для использования cmd в качестве оболочки (то есть, как устанавливает NT emacs), то оболочка dos работает нормально, но если вы введете bash или bash -i для запуска оболочки bash, то получающаяся оболочка не работать правильно - см. ответ 0.

Но это нормально работает, если bash - "первая" оболочка, которую вызывает emacs.

2 голосов
/ 29 января 2010

Я использую EmacsW32. C-h a shell$ дает список команд запуска оболочки, а команды cmd-shell и cygwin-shell выглядят интересно. Обе команды нуждаются в EmacsW32. Они также находятся в меню: Инструменты> Оболочки W & 32 .

Если вы запускаете cygwin-shell в первый раз, и если вы не настроили путь cygwin в Emacs, вы попадете на страницу настройки, где вы можете настроить путь cygwin, нажав кнопку Find.

2 голосов
/ 04 декабря 2008

Вы можете запустить bash напрямую из оболочки командной строки Windows по умолчанию в буфере Emacs * shell *:

Microsoft Windows XP [Version 5.1.2600]
(C) Copyright 1985-2001 Microsoft Corp.

C:\temp>bash
bash     

Однако командная строка не видна, что может привести к дезориентации ваших команд, и их результаты будут смешиваться вместе.

Кроме того, по какой-то неизвестной причине, если вы введете команду и нажмете клавишу return, в конце вашего оператора команды будет добавлен символ обратной строки (\ r), вызывающий ошибку bash:

ls
bash: line 1: $'ls\r': command not found

Обходной путь - вручную добавить символ комментария (#) в конце каждой команды, которая эффективно закомментирует текст \ r:

ls #
myfile,txt
foo.bar
anotherfile.txt

Этот общий подход далеко не идеален, но может быть полезен, если вы хотите зайти в bash из собственной оболочки Windows, чтобы выполнить некоторые быстрые операции, а затем выйти из системы, чтобы продолжить работу в Windows.

1 голос
/ 20 августа 2009

Поскольку эти подходы не сработали для меня, я получил это следующим образом:

(я использую NTEmacs, который по умолчанию открывает оболочку dos, поэтому, возможно, ваш emacs ведет себя так же)

Создайте переменную среды Windows с именем SHELL («SHELL», а не «$ SHELL») и укажите путь к bash.exe вашей установки cygwin (например, c: \ Programs \ cygwin \ bin \ bash.exe)

Теперь при выполнении оболочки M-x открывается bash.

С уважением,

Inno

0 голосов
/ 19 ноября 2012

В дополнение к ответу @Chris Jones о том, что нужно избегать аргумента --login для bash, я установил следующие аргументы командной строки:

 (setq explicit-bash-args '("--noediting" "-i"))

Параметр --noediting предотвращает вмешательство в библиотеку readline GNU, а параметр -i указывает, что оболочка является интерактивной. Я также использую файл .emacs_bash в своем домашнем каталоге для любых настроек bash, специфичных для emacs.

...