Ich möchte meine Eingabeaufforderung auf etwas wie einstellen %1~ \#
, das das aktuelle Verzeichnis ohne den vollständigen Pfad (gefolgt von %
oder #
) anzeigt. Wenn der Verzeichnisname jedoch lang ist, möchte ich nicht den gesamten Namen. Wie könnte ich ihn beispielsweise auf 8 Zeichen begrenzen? Gibt es hierfür eine integrierte Funktion in zsh oder muss man ein externes Tool verwenden?
Antwort1
Um den Verzeichnisnamen zu kürzen, versuchen Sie Folgendes:
PS1='%8>..>%1~%<< %# '
Beispiel: Das Verzeichnis Wow longdirnameislong
wird nun in der Eingabeaufforderung wie folgt angezeigt:
Wow lo.. %
man 1 zshmisc
sagt:
Bedingte Teilzeichenfolgen in Eingabeaufforderungen
%<string<
%>string>
%[xstring]
Gibt das Abschneideverhalten für den Rest der Eingabeaufforderungszeichenfolge an. Die dritte, veraltete Form ist äquivalent zu
%xstringx
, d. h. x kann<
oder sein>
. Die Zeichenfolge wird anstelle des abgeschnittenen Teils einer beliebigen Zeichenfolge angezeigt. Beachten Sie, dass hier keine Eingabeaufforderungserweiterung erfolgt.Das numerische Argument, das in der dritten Form unmittelbar nach dem erscheinen kann
[
, gibt die maximal zulässige Länge der verschiedenen Zeichenfolgen an, die in der Eingabeaufforderung angezeigt werden können. In den ersten beiden Formen kann dieses numerische Argument negativ sein. In diesem Fall wird die Kürzungslänge bestimmt, indem der absolute Wert des numerischen Arguments von der Anzahl der verbleibenden Zeichenpositionen in der aktuellen Eingabeaufforderungszeile abgezogen wird. Wenn dies eine Länge von Null oder negativ ergibt, wird eine Länge von 1 verwendet. Mit anderen Worten: Ein negatives Argument sorgt dafür, dass nach der Kürzung mindestens n Zeichen vor dem rechten Rand (linker Rand für RPROMPT) verbleiben.Die Formen mit
<
Truncate links vom String und die Formen mit>
Truncate rechts vom String. Wenn das aktuelle Verzeichnis beispielsweise ist/home/pike
, wird die Eingabeaufforderung%8<..<%/
auf erweitert..e/pike
. In diesem String kann das Abschlusszeichen (<
,>
oder]
) oder eigentlich jedes beliebige Zeichen durch ein vorangestelltes Anführungszeichen in Anführungszeichen gesetzt werden\
; beachten Sie jedoch bei der Verwendung von print -P, dass dies verdoppelt werden muss, da der String zusätzlich zu allen Backslashes, die durch einen String in doppelten Anführungszeichen entfernt werden, auch der Standarddruckverarbeitung unterliegt: der schlimmste Fall ist daherprint -P "%<\\\\<<..."
.Wenn die Zeichenfolge länger als die angegebene Kürzungslänge ist, wird sie vollständig angezeigt und ersetzt die gekürzte Zeichenfolge vollständig.
Der abzuschneidende Teil der Eingabeaufforderungszeichenfolge reicht bis zum Ende der Zeichenfolge oder bis zum Ende der nächsten umschließenden Gruppe der
%(
Konstruktion oder bis zur nächsten Abschneidung, die auf derselben Gruppierungsebene angetroffen wird (d. h. Abschneidungen innerhalb von a%(
sind getrennt), je nachdem, was zuerst eintritt. Insbesondere%<<
markiert eine Abschneidung mit dem Argument Null (z. B. ) das Ende des Bereichs der abzuschneidenden Zeichenfolge und schaltet die Abschneidung von da an aus. Beispielsweise%10<...<%~%<<%#
druckt die Eingabeaufforderung eine abgeschnittene Darstellung des aktuellen Verzeichnisses, gefolgt von einem%
oder#
, gefolgt von einem Leerzeichen. Ohne das%<<
würden diese beiden Zeichen in die abzuschneidende Zeichenfolge aufgenommen. Beachten Sie, dass dies%-0<<
nicht gleichbedeutend mit ist,%<<
sondern angibt, dass die Eingabeaufforderung am rechten Rand abgeschnitten wird.Die Kürzung gilt nur innerhalb jeder einzelnen Zeile der Eingabeaufforderung, abgegrenzt durch eingebettete Zeilenumbrüche (sofern vorhanden). Wenn die Gesamtlänge einer Zeile der Eingabeaufforderung nach der Kürzung größer als die Terminalbreite ist oder wenn der abzukürzende Teil eingebettete Zeilenumbrüche enthält, ist das Kürzungsverhalten undefiniert und kann sich in einer zukünftigen Version der Shell ändern. Verwenden Sie diese Option,
%-n(l.true-text.false-text)
um Teile der Eingabeaufforderung zu entfernen, wenn der verfügbare Platz kleiner als n ist.
Antwort2
Das ist einfach!
%d
%/ Current working directory. If an integer follows the `%', it spec‐
ifies a number of trailing components of the current working direc‐
tory to show; zero means the whole path. A negative integer speci‐
fies leading components, i.e. %-1d specifies the first component.
%~ As %d and %/, but if the current working directory starts with
$HOME, that part is replaced by a `~'. Furthermore, if it has a
named directory as its prefix, that part is replaced by a `~' fol‐
lowed by the name of the directory, but only if the result is
shorter than the full path; see Dynamic and Static named directo‐
ries in zshexpn(1).
©man zshmisc