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: 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 у відповідь - мені не потрібно цього бачити. Залишилося користувач @ хост, поточний каталог та 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 repo і т.д. Що стосується utf-8, що default-process-coding-systemвстановлено у вашому Emacs?
глюкас

Це я знайшов у посібнику Emacs: "Щоб вказати систему кодування для оболонки, ви можете скористатися командою Cx RET c безпосередньо перед оболонкою Mx. Ви також можете змінити систему кодування для запущеної підрозділу, ввівши Cx RET p в оболонці. буфер. " (див. gnu.org/software/emacs/manual/html_node/emacs/… )
glucas

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

Міна - utf-8 dos та UNIX. Я не встановлюю це явно, але у мене є такі параметри: (віддаю перевагу-кодування-системі 'utf-8) (setq-типовий буфер-файл-кодування-система' 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

Гаразд, так як я його видалити?
marczellm

1
Ви використовуєте, explicit-shell-file-nameтому я вважаю, що ви хотіли б встановити, наприклад (setq explicit-bash-args '("--login" "-i")).
глюкас

1

Я знаю, що це не зовсім так, як у ОП, але я думаю, що це цікавий варіант. Ви можете запустити emacs з командного рядка git-bash. Це змусить емаків прийняти git-bash як оболонку.

Введіть щось подібне до наступного у вашому підказі

bla@host MINGW64 ~/ $ emacs .&

Потім у emacs Mx "оболонка"

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.