Ich bin sicher, dass jemand einen Teil seiner Eingabeaufforderung in seinem Terminalfenster rechts ausgerichtet hat und der eigentliche Cursor in einer zweiten Zeile beginnt. Ich weiß, dass ich die zweite Zeile mit einem "\ n" in der PS1 erreichen kann, aber ich kann nicht herausfinden, wie ich einen Teil davon nach rechts ausrichte. Wurde zwischen den beiden Zeichenfolgen nur ein Leerzeichen eingefügt?
quelle
.inputrc
istset show-mode-in-prompt on
. Beide berechnen nicht die Länge der nicht druckbaren ANSI-CSI-Codes und schließen sie nicht ordnungsgemäß in\[
und\]
wie von @Mu Mind erwähnt ein. In dieser Antwort finden Sie eine Lösung.Basierend auf den Informationen, die ich hier gefunden habe, konnte ich eine einfachere Lösung für die Rechtsausrichtung finden, während Inhalte mit variabler Länge rechts oder links einschließlich Unterstützung für Farbe berücksichtigt wurden. Zur Vereinfachung hier hinzugefügt ...
Hinweis zu Farben: Die Verwendung des
\033
Fluchtweges zugunsten von Alternativen ohne\[\]
Gruppierungen erweist sich als am besten kompatibel und wird daher empfohlen.Der Trick besteht darin, zuerst die rechte Seite zu schreiben, dann mit dem Wagenrücklauf (
\r
) zum Zeilenanfang zurückzukehren und den Inhalt der linken Seite darüber hinaus wie folgt zu überschreiben:Ich verwende
tput cols
Mac OS X zum Abrufen der Terminal- / Konsolenbreite,terminfo
da meine Variable$COLUMNS
nicht ausgefüllt ist.env
Sie können jedoch den ersetzbaren*
Wert in%*s
, durch die Angabe von "${COLUMNS}
" oder einen anderen von Ihnen bevorzugten Wert ersetzen .Das nächste Beispiel, das
$RANDOM
zum Generieren von Inhalten unterschiedlicher Länge verwendet wird, enthält Farben und zeigt, wie Sie Funktionen extrahieren können, um die Implementierung in wiederverwendbare Funktionen umzugestalten.Da
printf
davon ausgegangen wird, dass die Länge der Zeichenfolge der Anzahl der Zeichen entspricht, die zum Rendern der Farben erforderlich sind, befindet sich diese Zeichenfolge aufgrund der nicht gedruckten ANSI-Zeichen ohne Kompensation immer kurz vor dem Ende des Bildschirms. Die für die Farbe erforderlichen Zeichen bleiben konstant, und Sie werden feststellen, dass printf auch die Längenänderung berücksichtigt, die$RANDOM
beispielsweise durch 'zurückgegeben wird, wodurch die richtige Ausrichtung erhalten bleibt.Dies ist nicht der Fall mit speziellen Bash - Prompt - Escape - Sequenzen (dh.
\u
,\w
,\h
,\t
) , Obwohl, da diese nur eine Länge von 2 aufzeichnen , weil bash sie nur übersetzen, wenn die Eingabeaufforderung angezeigt wird, nachdem printf die Zeichenfolge verdient gemacht hat. Dies betrifft nicht die linke Seite, aber vermeiden Sie sie am besten auf der rechten Seite.Es ist jedoch unerheblich, ob der generierte Inhalt konstant bleibt. Wie bei der
\t
Zeitoption, bei der immer die gleiche Anzahl von Zeichen (8) für 24 Mal ausgegeben wird. Wir müssen nur die erforderliche Kompensation berücksichtigen, um die Differenz zwischen 2 gezählten Zeichen auszugleichen, was in diesen Fällen zu 8 Zeichen beim Drucken führt.Denken Sie daran, dass Sie möglicherweise
\\\
einige Escape-Sequenzen verdreifachen müssen, die sonst für Zeichenfolgen eine Bedeutung haben. Wie im folgenden Beispiel hat das aktuelle Arbeitsverzeichnis-Escape\w
ansonsten keine Bedeutung. Es funktioniert also wie erwartet, aber die Zeit\t
, dh ein Tabulatorzeichen, funktioniert nicht wie erwartet, ohne dass es zuvor dreimal maskiert wird.nJoy!
quelle
Der Umgang
printf
mit$COLUMNS
hat sehr gut funktioniert, so etwas wie:Es hat es für mich vollkommen gerechtfertigt.
quelle
Im Folgenden werden das aktuelle Datum und die aktuelle Uhrzeit auf der rechten Seite des Terminals in ROT angezeigt.
Vorteile:
shellcheck
reinigen..inputrc
hatset show-mode-in-prompt on
.\[
und\]
so , dass der Text an der Eingabeaufforderung verursacht nicht die Aufforderung seltsam nachzudrucken eingegeben bearbeiten.Hinweis : Sie werden sicherstellen müssen, dass alle Farbsequenzen in dem
$PS1
vor diesem Code exeucted sind richtig eingeschlossen in\[
und\]
und dass es keine Verschachtelung von ihnen.quelle
bash: local: can only be used in a function
, der trivial zu beheben ist, und danach zeigt es nichts an, weilCOLUMNS
es nicht definiert ist: es muss durch ersetzt werden$(tput cols)
. Dasselbe Ergebnis, wenn das Snippet in einer anderen Datei gespeichert und dann in "" bezogen wird.bashrc
.tput cols
wenn er nicht gesetzt$COLUMNS
ist. Und ja, dieser Code sollte in einer Funktion enthalten sein. Ich benutzePROMPT_COMMAND='_prompt_bash_set'
und benenne die Funktion_prompt_bash_set
.Ich dachte nur, ich würde meine hier reinwerfen. Es ist fast genau dasselbe wie die GRML-zsh-Eingabeaufforderung (mit der Ausnahme, dass zsh-Aktualisierungen bei neuen Zeilen und Leerzeichen etwas besser sind - was in bash unmöglich zu replizieren ist ... na ja, zumindest zu diesem Zeitpunkt sehr schwierig).
Ich habe gute drei Tage damit verbracht (nur auf einem Laptop getestet, auf dem arch läuft), also hier ein Screenshot und dann das, was in meinem ~ / .bashrc steckt :)
Warnung - es ist ein bisschen verrückt
nebenbei wichtig - jeder
^[
(wie^[[34m
) ist wirklich der Fluchtcharakter(char)27
. Die einzige Möglichkeit, dies einzufügen, ist die Eingabe von ctrl+ ( [v) (dh drücken Sie beide Tasten [und halten Sie vdabei ctrlgedrückt).Ich arbeite immer noch daran, die Farben konfigurierbar zu machen, aber ich bin zufrieden mit den Farben, wie sie jetzt sind.
Derzeit wird an einem Fix für den verrückten
^[
Charakter und dem einfachen Farbwechsel gearbeitet :)quelle
Mit können Sie
printf
die richtige Ausrichtung vornehmen:quelle
Als Ergänzung zu Giles 'Antwort habe ich etwas geschrieben, um Farben besser handhaben zu können (vorausgesetzt, sie sind ordnungsgemäß in
\[
und eingeschlossen\]
. Es ist von Fall zu Fall und behandelt nicht jeden Fall, aber ich kann meine PS1L in der gleichen Syntax wie PS1 einstellen und verwendet das (ungefärbte) Datum als PS1R.Hier ist es auf Github: dbarnett / dotfiles / right_prompt.sh . Ich benutze es in meinem .bashrc wie folgt:
Hinweis: Ich habe nach PS1R auch eine neue Zeile eingefügt, die keinen visuellen Unterschied macht, aber die Eingabeaufforderung nicht verstümmelt, wenn Sie durch bestimmte Befehle in Ihrem Befehlsverlauf zurückblättern.
Ich bin sicher, dass jemand anderes dies verbessern und vielleicht einige der Sonderfälle verallgemeinern kann.
quelle
Hier ist eine Lösung basierend auf
PROMPT_COMMAND
undtput
:Die Magie wird ausgeführt von:
Welches ist unterteilt in:
In PS1
tput
wird mit \ [\] maskiert, so dass es nicht in der angezeigten Länge gezählt wird.quelle