Füllen Sie die Eingabeaufforderung mit Punkten auf, wenn die Länge der Eingabeaufforderung kleiner als n ist.

Füllen Sie die Eingabeaufforderung mit Punkten auf, wenn die Länge der Eingabeaufforderung kleiner als n ist.

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, myPromptWidthsollte 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-partwobei ${(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 $PS1Variable 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 myPromptWidthFunktion 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% 

dotsmuss 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.

verwandte Informationen