Как я могу запустить Cygwin Bash Shell из Emacs?
-
04-07-2019 - |
Вопрос
Я использую GNU Emacs в Windows, поэтому ввожу:
M-x shell
запускает оболочку DOS командной строки Windows.Однако вместо этого я хотел бы иметь возможность запускать оболочку Cygwin Bash (или любую другую оболочку, отличную от Windows) из Emacs.Как это можно легко сделать?
Решение
shell-file-name
- это переменная, которая определяет, какую оболочку Emacs использует, когда хочет выполнить команду оболочки.
явное-имя-оболочки-файла
- это переменная, определяющая, какая оболочка M-x shell
запускается.
ответ Кена изменяется оба из тех, которые вы можете или не можете.
У вас также может быть функция, которая запускает другую оболочку, временно изменяя явное-имя-оболочки-файла
:
(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. Вы можете сделать это, установив явный-bash-args
. (Обратите внимание, что Mx shell
использует явный -
PROGRAM -args
, где PROGRAM - это часть имени файла пути оболочки. Вот почему вы не должны включите .exe
при настройке оболочки.
Другие советы
Лучшее решение, которое я нашел, это следующее:
;; 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"))))))
Проблема с передачей " - логина " как предполагает 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: " или что-то подобное.
Я использую 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"))
Еще один важный совет на эту тему.
Если вы используете режим оболочки Emacs и иногда хотите использовать bash и cmd, настройте его на использование bash по умолчанию, потому что вы можете ввести cmd в bash, и получающаяся оболочка dos работает просто отлично.
Если вы настроите Emacs для использования cmd в качестве оболочки (то есть, как устанавливает NT emacs), то оболочка dos работает нормально, но если вы наберете bash или bash -i для запуска оболочки bash, получающаяся оболочка не работать правильно - см. ответ 0.
Но это нормально работает, если bash является " первым " запускается оболочка emacs.
Вы можете запустить 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:
Обходной путь - вручную добавить символ комментария (#) в конце каждой команды, которая эффективно закомментирует текст \ r:
ls #
myfile,txt
foo.bar
anotherfile.txt
Этот общий подход далеко не идеален, но может быть полезен, если вы хотите заскочить в bash из собственной оболочки Windows для выполнения некоторых быстрых операций, а затем выйти, чтобы продолжить работу в Windows.
ls\r': command not found
Обходной путь - вручную добавить символ комментария (#) в конце каждой команды, которая эффективно закомментирует текст \ r:
<*>Этот общий подход далеко не идеален, но может быть полезен, если вы хотите заскочить в bash из собственной оболочки Windows для выполнения некоторых быстрых операций, а затем выйти, чтобы продолжить работу в Windows.
Я использую EmacsW32. C-h a shell $
дает список команд запуска оболочки, а команды cmd-shell и cygwin-shell выглядят интересно. Обе команды нуждаются в EmacsW32. Их также можно найти в меню: Инструменты > W & 32 снарядов .
Если вы запускаете cygwin-shell в первый раз, и если вы не настроили путь cygwin в Emacs, вы попадете на страницу настройки, где вы можете настроить путь cygwin, нажав кнопку «Найти».
Поскольку эти подходы мне не помогли, я получил это следующим образом:
(Я использую NTEmacs, который по умолчанию открывает оболочку DOS, так что, возможно, ваш emacs ведет себя так же)
Создайте переменную среды Windows с именем SHELL («SHELL», а не «$SHELL») и укажите путь к bash.exe вашей установки cygwin (например, c:\programs\cygwin\bin\bash.exe).
Теперь при выполнении оболочки M-x открывается bash.
С уважением,
Инно
В дополнение к ответу @Chris Jones об отказе от аргумента --login для bash я установил следующие аргументы командной строки:
(setq explicit-bash-args '("--noediting" "-i"))
Параметр --noediting предотвращает вмешательство в библиотеку readline GNU, а параметр -i указывает, что оболочка является интерактивной. Я также использую файл .emacs_bash в своем домашнем каталоге для любых настроек bash, специфичных для emacs. Р>