Git Bash in Emacs unter Windows

9

Ich kann die Bash-Shell ausführen, die mit Git für Windows geliefert wird. Ich habe dies in meine .emacs:

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

Dann M-x git-bashund voila, Bash läuft, aber mit etwas Verrücktheit:

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
$ 

und es druckt diese Zeile beginnend mit ^[]nach jedem Befehl, den ich ausführe. Auch die Kodierung ist durcheinander. Wie kann ich das beheben .emacs?

marczellm
quelle

Antworten:

10

Das ^[]Geräusch kommt von verschiedenen Terminalsteuerungszeichen in Ihrer Shell-Eingabeaufforderung. Versuchen Sie echo $PS1, die vollständige Sequenz anzuzeigen, und versuchen Sie beispielsweise export PS1='$ 'festzustellen, dass eine einfachere Eingabeaufforderungszeichenfolge dieses bestimmte Problem beseitigt.

Für die Codierung können Sie versuchen, utf-8 zu Ihrer bevorzugten Codierung zu machen:

(prefer-coding-system 'utf-8)

Einrichten der Eingabeaufforderung

Emacs legt die Variable INSIDE_EMACS fest, sodass Sie ein .bash_profile erstellen können, das PS1 nur festlegt, wenn es in Emacs ausgeführt wird.

Beim Testen auf meinem Computer enthält die erste Zeile der Eingabeaufforderung die problematischen Steuerzeichen. Ich habe damit ein ~ / .bash_profile erstellt.

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

Dies setzt die Eingabeaufforderung basierend auf der Standardeinstellung von git-bash, aber ich habe die erste Zeile entfernt (bis zum Zeilenumbruch \ n). Ich habe auch das $ MSYSTEM entfernt, das MINGW64 in die Eingabeaufforderung einfügt - das muss ich nicht sehen. Was bleibt, ist der Benutzer @ Host, das aktuelle Verzeichnis und Git Repo. Die Steuerzeichen legen Farben fest, die Emacs für mich richtig anzeigt. (Einzelheiten zum Einrichten Ihrer Eingabeaufforderung finden Sie im Bash- Handbuch .)

In Emacs habe ich die Shell auf git-bash gesetzt:

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

Bei diesem Setup wird immer noch die erste ioctl-Fehlermeldung angezeigt, aber ansonsten funktionieren die Dinge wie erwartet und die Codierung ist utf-8.

Glucas
quelle
Das funktioniert, danke! Was macht diese (für mich kryptische) PS1-Leitung? Können Sie helfen, die Shell-Puffer-Codierung automatisch auf utf-8 einzustellen? ( MĂĄrtonsollte lesen Márton)
Marczellm
Die PS1 in meinem Beispiel wurde von der Standardeinstellung abgeleitet, die ein Git-Bash festgelegt hatte. Ich habe gerade alles bis zum Zeilenumbruch (\ n) gelöscht. Es verwendet diese Steuersequenzen, um die Farbe der verschiedenen angezeigten Informationen zu ändern - des aktuellen Benutzers, Hosts, Git-Repos usw. Ich müsste das Bash-PS1-Dokument für Details aufspüren. Was ist für utf-8 default-process-coding-systemin Ihrem Emacs eingestellt?
Glucas
Ich fand dies im Emacs-Handbuch: "Um ein Codierungssystem für die Shell anzugeben, können Sie den Befehl Cx RET c unmittelbar vor der Mx-Shell verwenden. Sie können das Codierungssystem für eine laufende Subshell auch ändern, indem Sie Cx RET p in die Shell eingeben Puffer." (siehe gnu.org/software/emacs/manual/html_node/emacs/… )
Glucas
Sein Wert ist (undecided-dos . undecided-unix). Ich suche nach einer Möglichkeit, die Puffercodierung automatisch einzustellen, anstatt sich beim Öffnen jedes Mal einen anderen Satz von Tastenanschlägen merken zu müssen. Vielleicht sollte ich eine neue Frage stellen.
Marczellm
Meins ist utf-8 dos und UNIX. Ich setze es nicht explizit, aber ich habe diese Einstellungen: (bevorzugtes Codierungssystem 'utf-8) (setq-Standard-Pufferdatei-Codierungssystem' utf-8-unix)
glucas
1

Dieser Fehler weist auf einen nicht übereinstimmenden Schalter hin. Es ist wahrscheinlich eingestellt -icund Sie brauchen nur -c:

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

Die andere Option besteht darin, tty to git-bash mit einem ähnlichen Befehl bereitzustellen (was auch immer Windows-äquivalent ist):

/sbin/getty -l bash -n 38400 tty0
Emacs Benutzer
quelle
Ihr erster Vorschlag ändert nichts. Darüber hinaus M-x list-processeszeigt, dass es keine Auswirkung hatte: Der Prozessbefehl ist D:/Program Files/git/bin/bash --noediting -i. Ihren zweiten Vorschlag kann ich nicht verstehen.
Marczellm
1
Das liegt daran, dass Sie den Schalter -i nicht entfernt haben.
Emacs User
Okay, wie entferne ich es?
Marczellm
1
Sie verwenden, explicit-shell-file-namealso glaube ich, dass Sie z (setq explicit-bash-args '("--login" "-i")).
Glucas
1

Ich weiß, dass dies nicht genau das gleiche ist wie das OP, aber ich denke, es ist eine interessante Option. Sie können Emacs über die git-bash-Befehlszeile starten. Es wird Emacs dazu bringen, Git-Bash als Shell anzunehmen.

Geben Sie an Ihrer Bash-Eingabeaufforderung Folgendes ein

bla@host MINGW64 ~/ $ emacs .&

Dann, in Emacs, Mx "Shell"

Marmeladen
quelle