Подтвердить что ты не робот

Как запустить Cygwin Bash Shell из Emacs?

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

M-x shell

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

4b9b3361

Ответ 1

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

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

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

У вас также может быть функция, которая запускает другую оболочку, временно меняя 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 при настройке оболочки.

Ответ 2

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

;; 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. Вторая строка добавляется к вашей Windows PATH (после преобразования этой PATH в соответствующую форму unixy); в Cygwin вы, вероятно, хотите "~/bin:/usr/local/bin:/usr/bin:" или что-то подобное.

Ответ 3

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

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

;; Let 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"))

Ответ 4

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

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

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

Но он отлично работает, если bash является "первой" оболочкой emacs вызывает.

Ответ 5

Вы можете запустить 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.

Ответ 6

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

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

Ответ 7

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

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

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

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

Привет,

Inno

Ответ 8

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

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

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