
Dank anKlas Mellbournmeine aktuelle Eingabeaufforderung sieht so aus
# this variable can be changed later to change the fraction of the line
export PROMPT_PERCENT_OF_LINE=40
# make a function, so that it can be evaluated repeatedly
function myPromptWidth() {
echo $(( ${COLUMNS:-80} * PROMPT_PERCENT_OF_LINE / 100 ))
}
# for some reason you can't put a function right in PROMPT, so make an
# intermediary variable
width_part='$(myPromptWidth)'
# if myPromptWidth is less than current prompt ... pad with dots
PS1="%F{013}%${width_part}<...<%d%f%F{012}\${__git_ps1_foo}%f%F{011}%(1j.jobs%j.)%f%(?.%F{004}.%F{001}✕%?)%<<%# %f"
Die Ausgabe ist also etwa
/media/blueray/WDPurple/_DataBackup/_Work/_NotesFilteredADOC% cd ~
/home/blueray%
Ich möchte aber, dass alle Eingabeaufforderungen gleich lang sind. Wenn eine Eingabeaufforderung kürzer ist, myPromptWidth
sollte sie mit Punkten aufgefüllt werden.
Meine erwartete Ausgabe ist also
/media/blueray/WDPurple/_DataBackup/_Work/_NotesFilteredADOC% cd ~
.............................................../home/blueray%
Wie kann ich das erreichen?
Aktualisierung 1
Ich habe mit experimentiert %${width_part}(l.true-text.false-text)
. Ich bin nicht sicher, ob dies zur Lösung des Problems verwendet werden kann.
Antwort1
width_part='$((${COLUMNS:-80} * PROMPT_PERCENT_OF_LINE / 100))'
PS1="%F{013}%$width_part<<\${(l[$width_part][.])}%~%F{012}\${__git_ps1_foo}%F{011}%(1j.jobs%j.)%(?.%F{004}.%F{001}✕%?)%<<%# %f"
So wie es ist, führen wir immer noch eine Kürzung mit durch %<width><<truncated-part%<<
, allerdings mit einer leeren Ersetzungszeichenfolge (das ...
ist weg), fügen aber stattdessen <width>
den Wert von .
am Anfang von ein, truncated-part
wobei ${(l[<width>][.])}
das Flag zur Parametererweiterung für die linke Auffüllung hier auf gar keinen Parameter angewendet wird.
Sie werden feststellen, dass das Ganzedoppelt-Anführungszeichen, und einige der $
s werden maskiert und andere nicht. Diejenigen, die nicht maskiert sind ( $width_part
), werden zum Zeitpunkt dieser Zuweisung erweitert, diejenigen, die maskiert sind, werden wörtlich in eingefügt $PS1
, sodass sie zum Zeitpunkt der Berechnung jeder Eingabeaufforderung erweitert werden. Der tatsächliche Wert dieser $PS1
Variable ist:
%F{013}%$((${COLUMNS:-80} * PROMPT_PERCENT_OF_LINE / 100))<<${(l[$((${COLUMNS:-80} * PROMPT_PERCENT_OF_LINE / 100))][.])}%~%F{012}${__git_ps1_foo}%F{011}%(1j.jobs%j.)%(?.%F{004}.%F{001}✕%?)%<<%# %f
Antwort2
Etwa Folgendes würde die Eingabeaufforderung mithilfe Ihrer myPromptWidth
Funktion mit einer entsprechenden Anzahl von Punkten füllen:
width="$(myPromptWidth)"
print -v dots -f '%*s' $width .
dots=${dots// /.}
PS1="%$width<...<$dots %/%% "
Die resultierende Eingabeaufforderung lautet etwa:
......................./tmp%
dots
muss eine ausreichende Anzahl an Punkten enthalten, das oben genannte ist wahrscheinlich nur eine Möglichkeit, es zu erstellen.
Dies ist so ziemlich das, was Stéphane gerade kommentiert hat, während ich es geschrieben habe: Füllen Sie die Eingabeaufforderung mit Punkten und lassen Sie die Shell sie auf die gewünschte Länge kürzen.
Beachten Sie, dass dadurch auch der tatsächlich nützliche Teil der Eingabeaufforderung abgeschnitten wird, wenn er länger als ist $width
.