Git Bash в Emacs на Windows


9

Я могу запустить оболочку Bash, которая поставляется с Git для Windows. Я положил это в моем .emacs:

(defun git-bash () (interactive)
  (let ((explicit-shell-file-name "D:/Program Files/git/bin/bash"))
    (call-interactively 'shell)))

Тогда M-x git-bashи вуаля, bash работает, но со странностями:

bash: cannot set terminal process group (-1): Inappropriate ioctl for device
bash: no job control in this shell
^[]0;MINGW64:/c/Users/M??rton^G
MĂĄrton@Marci MINGW64 /c/Users/MĂĄrton
$ 

и она печатает эту строку, начиная с ^[]каждой команды, которую я запускаю. Также кодировка испорчена. Как я могу это исправить .emacs?

Ответы:


10

^[]Шум исходит от различных управляющих символов терминала в вашем приглашении оболочки. Попробуйте echo $PS1просмотреть полную последовательность и, например, попытаться export PS1='$ 'увидеть, что более простая строка приглашения устраняет эту конкретную проблему.

Для кодировки вы можете попробовать сделать utf-8 предпочитаемой кодировкой:

(prefer-coding-system 'utf-8)

Настройка приглашения

Emacs устанавливает переменную INSIDE_EMACS, чтобы вы могли создать .bash_profile, который устанавливает PS1 только при работе в Emacs.

При тестировании на моей машине первая строка подсказки содержит проблемные управляющие символы. Я создал ~ / .bash_profile с этим.

if [ -n "$INSIDE_EMACS" ]; then
    export PS1='\[\033[32m\]\u@\h \[\033[33m\]\w\[\033[36m\]`__git_ps1`\[\033[0m\]\n$ '
fi

Это устанавливает приглашение на основе того, что git-bash было установлено по умолчанию, но я удалил первую строку (до \ n разрыва строки). Я также удалил $ MSYSTEM, который помещает MINGW64 в приглашение - мне не нужно это видеть. Остается только user @ host, текущий каталог и git repo. Управляющие символы устанавливают цвета, которые Emacs отображает для меня правильно. (Подробнее о настройке вашего приглашения см. Руководство по bash .)

В Emacs я установил оболочку на git-bash:

(setq explicit-shell-file-name "C:/git-for-windows/bin/bash.exe")
(setq explicit-bash.exe-args '("--login" "-i"))

С этой настройкой я все еще вижу начальное сообщение об ошибке ioctl, но в остальном все работает как положено, и кодировка - utf-8.


Это работает, спасибо! Что делает эта (для меня загадочная) линия PS1? Можете ли вы помочь автоматически установить кодировку буфера оболочки в utf-8? ( MĂĄrtonследует прочитать Márton)
marczellm

PS1 в моем примере был получен из установленного по умолчанию одного git-bash. Я просто удалил все до разрыва строки (\ n). Он использует эти управляющие последовательности для изменения цвета различных отображаемых битов информации - текущего пользователя, хоста, git-репо и т. Д. Я должен был бы отследить документацию по bash PS1 для получения подробной информации. Для utf-8, что default-process-coding-systemустановлено в вашем Emacs?
glucas

Я нашел это в руководстве по Emacs: «Чтобы указать систему кодирования для оболочки, вы можете использовать команду Cx RET c непосредственно перед оболочкой Mx. Вы также можете изменить систему кодирования для работающей подоболочки, набрав в оболочке Cx RET p буфер «. (см. gnu.org/software/emacs/manual/html_node/emacs/… )
glucas

Его значение (undecided-dos . undecided-unix). Я ищу способ установить кодировку буфера автоматически вместо того, чтобы каждый раз вспоминать другой набор нажатий клавиш при его открытии. Может быть, я должен задать новый вопрос.
marczellm

У меня есть utf-8 и UNIX. Я не устанавливаю это явно, но у меня есть эти настройки: (предпочитаемая-coding-system 'utf-8) (setq-default buffer-file-coding-system' utf-8-unix)
glucas

1

Эта ошибка указывает на несовпадающий переключатель. Это, вероятно, установлено, -icи вам нужно просто -c:

(setq shell-command-switch "-c")

Другой вариант - предоставить tty для git-bash командой, аналогичной (что бы ни было эквивалентно windows):

/sbin/getty -l bash -n 38400 tty0

Ваше первое предложение ничего не меняет. Более того, M-x list-processesпоказывает, что это не имело никакого эффекта: команда процесса есть D:/Program Files/git/bin/bash --noediting -i. Ваше второе предложение я не могу понять.
marczellm

1
Это потому, что вы не удалили ключ -i.
Emacs User

Хорошо, так как я могу удалить это?
marczellm

1
Вы используете, explicit-shell-file-nameтак что я думаю, что вы хотели бы установить, например (setq explicit-bash-args '("--login" "-i")).
glucas

1

Я знаю, что это не совсем то же самое, что OP, но я думаю, что это интересный вариант. Вы можете запустить emacs из командной строки git-bash. Это заставит emacs принять git-bash в качестве оболочки.

Введите в командной строке bash что-то вроде следующего

bla@host MINGW64 ~/ $ emacs .&

Тогда в Emacs Mx "shell"

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.