2013-12-20 21 views
5

Ich habe Cygwin auf meiner Windows 7-Box installiert und ich habe ein Problem, wo läuft, wenn ich einen Befehl eingeben wird es gelegentlich zurück auf die verpackt werden gleiche Zeile, Löschen der Bash-Eingabeaufforderung. Hier ist ein Beispiel:Cygwin wickelt Text zurück in die gleiche Zeile, wodurch Text überschrieben wird

wrapping example

Der Befehl betreffenden Befehl "201" (4 Zeilen von unten). Ich habe die anderen für den Kontext einbezogen.

Der Text des Befehls war ich tippe

git commit -m "Forced LF line endings."

(Anmerkung: Ich diese git Befehle mit meistens bin Entsendung, aber das Problem tritt bei jedem Befehl, den ich habe kein Muster noch bemerkt.)

Es sprang auf Anfang der Zeile und begann meine Eingabeaufforderung zu überschreiben.

Wenn ich den Pfeil nach oben schieben (die Geschichte zu sehen) das Ergebnis ist noch seltsamer:

enter image description here

(Beachten Sie den Cursor viele Zeichen über das Ende des Befehls.) Wenn

enter image description here

Dann, als ich: ich versuche, den Cursor von dieser Position ein Zeichen zurückzugehen, kann ich nur so weit gehen zurück steigen in die Geschichte von dieser backspaced Linie, bekomme ich diese:

enter image description here

Der Befehl beginnt mit dem Ende des Textes, der angezeigt wird. (Dies ist konsistent für die gesamte Geschichte) Aber wenn ich in der Geschichte auf die fehlerhafte git commit ... gehe es zeigt wie zuvor mit dem überschriebenen Text, aber wenn ich daran vorbei, löscht es eine Zeile der Aufforderung und zeigt an der vorherige Eintrag in der Geschichte auf die gleiche Weise wie vorher (a la Bild 2).

Als ich meine PS1-Variable erstellte, habe ich eine ungerade Ausgabe wie diese, aber ich habe seitdem meine Klammern und Dinge geschlossen und denke nicht, dass das das Problem verursacht. Wenn Sie jedoch meine .bash_profile (die die PS1 setzt) ​​sehen möchten, zögern Sie nicht, es auf GitHub zu sehen. Es ist wirklich kurz.

Ich habe versucht, nach dem Problem zu suchen und kann nur einige Cygwin E-Mail-Archive über die Zeilenumbruch in Xterm finden, aber keine Lösungen.

PS: Als ich das letzte .bash_profile schob, um sie zu verbinden, ich in das Problem wieder lief, als ich git add .bash_profile eingegeben und die Eingabetaste drücken, lief er den Befehl aber den Cursor an den Anfang des gleichen zurückgegeben Befehl statt eine neue Eingabeaufforderung zu drucken. Dann wenn ich eine andere Commit-Zeile schreiben, tat es das gleiche wie das erste Bild, aber es geschwärzt den Rest der Zeile (Es wickelte die Zeile, aber überschrieb die gesamte Zeile und nicht nur die ersten paar Zeichen.)

+2

Ich denke, dies passiert, weil Sie die Escape-Sequenzen in Ihrer Eingabeaufforderung nicht richtig codieren, so dass Bash über die Menge an verbleibendem Speicherplatz in der Zeile verwirrt ist. – Barmar

+0

Können Sie bitte ausarbeiten? Wie würde ich das beheben? – Vidia

Antwort

9

Siehe http://manpages.ubuntu.com/manpages/lucid/man1/bash.1.html#contenttoc26:

\ [

eine Sequenz von nicht-druckenden Zeichen beginnen, die verwendet werden, um eine Terminal-Steuerfolge in die Eingabeaufforderung

\ einzubetten]

Ende eine Folge von nicht druckbare Zeichen

Wenn Sie nicht nicht druckbare Zeichen einschließen (z Farbsequenzen) in Ihrer Eingabeaufforderung mit diesen wird ihre Länge als Teil der Länge der Aufforderung gezählt, was schließlich zu den Symptomen führt, die Sie beschreiben.

+0

Ich werde das testen und auf Sie zurückkommen. – Vidia

+1

Ich habe es auf meinem neuen Mac-Terminal getestet und es scheint gut zu funktionieren. Ich werde sehen, ob es auch auf anderen Terminals so ist, aber für jetzt erhalten Sie die akzeptierte Antwort. Es scheint, dass die Farbcodes mit '\ e [' beginnen und dann mit '\]' geschlossen werden müssen. Meine vim-Syntax-Hervorhebung stimmte nicht mit denen als Paar überein, also fügte ich zu viele hinzu. – Vidia

+1

Ich endete mit bash '$ (tput setaf #)', um die Farben einzustellen. Es scheint viel besser zu funktionieren als die Zahnspange. – Vidia

1

Es kommt mir nicht häufig vor. Wenn dies der Fall ist, tippe ich einfach 'kill -WINCH $$' in das Cygwin-Terminal ein und es behebt das Problem. link to source