2008-10-24 4 views
37

Я бегу GNU Emacs на Windows, поэтому ввод:Как запустить Cygwin Bash Shell из Emacs?

M-x shell 

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

ответ

42

shell-file-name переменная, которая управляет, которая использует оболочку Emacs, когда он хочет запустить команду оболочки.

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

Ken's answer изменяет обе те, которые вы можете или не хотите.

Вы также можете иметь функцию, которая запускает другую оболочку, временно изменяя 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 аргумент оглушить, потому что вы начинаете новый сеанс Cygwin. Вы можете сделать это, установив explicit-bash-args. (Обратите внимание, что M-x shell использует explicit- ПРОГРАММЫ -args, где программа является имя файла часть имени пути оболочки. Поэтому вы не должны включать в себя .exe при установке оболочки.

+2

Ваш e-lisp лучше, чем мой - я достаточно научился, чтобы заставить его работать так, как я хотел _years_ назад, и с тех пор забыл, что это значит. Я думаю, что мой код был первоначально скопирован из FAQ где-то ... – 2008-10-24 23:07:57

+0

+1, поклоняется мастеру Йоды, владеющему скобками. Ваш e-lisp удаляет мою воду из воды. – 2009-05-14 12:15:48

6

Я использую 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")) 
2

Вы можете запустить Баш непосредственно из Windows, командная строка по умолчанию оболочки в пределах вашего Emacs * оболочки * буфер:

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

C:\temp>bash 
bash  

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

Кроме того, в течение некоторого Unkno. шп причина, если вы вводите команду и нажмите возвращения, обратный линейный характер (\ г) добавляется к концу вашей команды заявление вызывает ошибку Баш:

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

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

ls # 
myfile,txt 
foo.bar 
anotherfile.txt 

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

5

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

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

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

Но он отлично работает, если bash - это «первая» оболочка emacs вызывает.

1

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

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

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

Теперь, выполняя Mx-оболочку, открывается bash.

С уважением,

Inno

2

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

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

7

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

;; 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 suggests ваша оболочка всегда будет начинаться в вашем домашнем каталоге. Но если вы редактируете файл и вы нажмете «M-x shell», вы хотите, чтобы ваша оболочка находилась в каталоге этого файла. Кроме того, я проверил эту настройку с помощью «M-x grep» и «M-x compile». Я подозрительно, что другие примеры здесь не будут работать с проблемами из-за проблем с каталогом и PATH.

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

0

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

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

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