Git Bash w emacs w systemie Windows


9

Mogę uruchomić powłokę Bash dostarczoną z Git dla Windows. Umieszczam to w moim .emacs:

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

Potem M-x git-bashi voila, bash działa, ale z pewną dziwnością:

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
$ 

i wypisuje tę linię, zaczynając od ^[], po każdym uruchomieniu polecenia. Również kodowanie jest pomieszane. Jak mogę to naprawić .emacs?

Odpowiedzi:


10

^[]Szumów pochodzących z różnych terminali znaków sterujących w wierszu powłoki. Spróbuj echo $PS1zobaczyć pełną sekwencję i spróbuj np. export PS1='$ 'Zobaczyć, że prostszy ciąg zachęty usuwa ten konkretny problem.

W przypadku kodowania możesz spróbować ustawić utf-8 jako preferowane kodowanie:

(prefer-coding-system 'utf-8)

Konfigurowanie monitu

Emacs ustawia zmienną INSIDE_EMACS, dzięki czemu można utworzyć .bash_profile, który ustawia PS1 tylko podczas działania w Emacsie.

Testując na moim komputerze, pierwsza linia zachęty zawiera problematyczne znaki kontrolne. Za pomocą tego utworzyłem profil ~ / .bash_profile.

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

To ustawia monit na podstawie domyślnego ustawienia git-bash, ale usunąłem pierwszą linię (do \ n podziału linii). Usunąłem także $ MSYSTEM, który wyświetla MINGW64 w monicie - nie muszę tego widzieć. Pozostaje użytkownik @ host, bieżący katalog i repozytorium git. Znaki kontrolne ustawiają kolory, które Emacs wyświetla mi poprawnie. (Szczegółowe informacje na temat konfigurowania pytania znajdują się w podręczniku bash ).

W Emacsie ustawiłem powłokę na git-bash:

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

Przy tej konfiguracji nadal widzę początkowy komunikat o błędzie ioctl, ale poza tym wszystko działa zgodnie z oczekiwaniami, a kodowanie to utf-8.


To działa, dzięki! Co robi ta (dla mnie tajemnicza) linia PS1? Czy możesz pomóc w automatycznym ustawieniu kodowania bufora powłoki na utf-8? ( MĂĄrtonnależy przeczytać Márton)
marczellm

PS1 w moim przykładzie pochodzi z domyślnego zestawu git-bash. Właśnie usunąłem wszystko do końca linii (\ n). Wykorzystuje te sekwencje kontrolne do zmiany koloru różnych wyświetlanych informacji - bieżącego użytkownika, hosta, repozytorium git itp. Muszę wyśledzić dokument PS1 bash, aby uzyskać szczegółowe informacje. W przypadku utf-8, co jest default-process-coding-systemustawione w twoim Emacsie?
glucas

Znalazłem to w podręczniku Emacsa: „Aby określić system kodowania powłoki, możesz użyć polecenia Cx RET c bezpośrednio przed powłoką Mx. Możesz także zmienić system kodowania działającej podpowłoki, wpisując Cx RET p w powłoce bufor." (patrz gnu.org/software/emacs/manual/html_node/emacs/… )
glucas

Jego wartość to (undecided-dos . undecided-unix). Szukam sposobu na automatyczne ustawienie kodowania bufora zamiast konieczności zapamiętywania innego zestawu naciśnięć klawiszy za każdym razem, gdy go otwieram. Może powinienem zadać nowe pytanie.
marczellm

Mój to utf-8 dos i UNIX. Nie ustawiam tego wprost, ale mam następujące ustawienia: (prefer-coding-system 'utf-8) (setq-default-system buforowania plików-utf-8-unix)
glucas

1

Ten błąd wskazuje na niedopasowany przełącznik. Prawdopodobnie jest ustawiony -ici potrzebujesz tylko -c:

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

Inną opcją jest dostarczenie tty do git-bash za pomocą polecenia podobnego do (cokolwiek jest równoważne z Windows):

/sbin/getty -l bash -n 38400 tty0

Twoja pierwsza sugestia niczego nie zmienia. Co więcej, M-x list-processespokazuje, że nie miało to żadnego wpływu: polecenie procesu brzmi D:/Program Files/git/bin/bash --noediting -i. Druga sugestia, której nie rozumiem.
marczellm

1
To dlatego, że nie usunąłeś przełącznika -i.
Użytkownik Emacsa

Okej, więc jak to usunąć?
marczellm

1
Używasz, explicit-shell-file-namewięc uważam, że chcesz ustawić np (setq explicit-bash-args '("--login" "-i")).
glucas

1

Wiem, że to nie jest dokładnie to samo co OP, ale myślę, że to interesująca opcja. Możesz uruchomić emacsa z wiersza poleceń git-bash. Sprawi, że emacs przyjmie git-bash jako powłokę.

Wpisz coś takiego jak poniżej w swoim bashu

bla@host MINGW64 ~/ $ emacs .&

Następnie, w emacsie, Mx „shell”

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.