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:
prompt() {
PS1=$(printf "%*s\r%s\n\$ " "$(tput cols)" 'right' 'left')
}
PROMPT_COMMAND=prompt
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.
function prompt_right() {
echo -e "\033[0;36m$(echo ${RANDOM})\033[0m"
}
function prompt_left() {
echo -e "\033[0;35m${RANDOM}\033[0m"
}
function prompt() {
compensate=11
PS1=$(printf "%*s\r%s\n\$ " "$(($(tput cols)+${compensate}))" "$(prompt_right)" "$(prompt_left)")
}
PROMPT_COMMAND=prompt
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.
function prompt_right() {
echo -e "\033[0;36m\\\t\033[0m"
}
function prompt_left() {
echo -e "\033[0;35m\w\033[0m"
}
function prompt() {
compensate=5
PS1=$(printf "%*s\r%s\n\$ " "$(($(tput cols)+${compensate}))" "$(prompt_right)" "$(prompt_left)")
}
PROMPT_COMMAND=prompt
nJoy!