Problem bei der Eingabeaufforderungsanpassung mit der if-Klausel

Problem bei der Eingabeaufforderungsanpassung mit der if-Klausel

Ich habe vor kurzem meine PS1 ein wenig optimiert. Der Code lautet wie folgt:

PS1='$(if [[ $? != 0 ]]; then echo " \e[91m\e[0m"; fi) \u $(assemble_prompt)$ '

Das fehlende Zeichen stammt vonNerd-Schriftartenund spielt in meiner Frage (ebenso wie in assemble_promptder Funktion) keine Rolle.

Das Problem, auf das ich gestoßen bin, ist ein defektes PS1, wenn ich die Größe des Terminalfensters auf die Größe einer Eingabeaufforderung (ungefähr) verkleinere. Dann scheint es die PS1-Einstellung zu ignorieren und PS1 $nur auf Zeichen einzustellen (siehe Screenshot). Beachten Sie, dass es in diesem Fall einfach meine benutzerdefinierte Eingabeaufforderung überschreibt, wenn ich mit dem Tippen beginne.

PS1 ist durchgedreht

Ich habe das Problem auf eine if-Klausel eingegrenzt, die das Zeichen „fail“ hinzufügt, wenn der vorherige Befehl nicht erfolgreich war. Wenn ich diesen Teil entferne, funktioniert alles wie erwartet.

Gibt es eine Möglichkeit, den Klauselteil beizubehalten if, aber das Problem mit dem PS1-Reset zu beheben, wenn die Fenstergröße zu klein ist?

PS: Ich verwende rxvt-unicodeals mein Terminal, aber das Problem besteht auch bei allen anderen Terminals (getestet xterm, st).

Antwort1

Sie möchten die Terminal-Steuercodes wahrscheinlich einschließen, um \[...\]Bash mitzuteilen, dass sie eigentlich keine Zeichen drucken. Andernfalls verwirren sie die Shell, wenn sie versucht, die Breite der Eingabeaufforderung zu zählen.

Verwenden Sie also "\[\e[91m\]xxx\[\e[0m\]".

Von demHandbuch:

\[  Begin a sequence of non-printing characters. 
    This could be used to embed a terminal control sequence into the prompt.
\]  End a sequence of non-printing characters.

verwandte Informationen