zsh – Vorschau der Namen übergeordneter Verzeichnisse bei „cd ../../../“

zsh – Vorschau der Namen übergeordneter Verzeichnisse bei „cd ../../../“

Kennt jemand eine Möglichkeit, mit zsh eine Vorschau des übergeordneten Verzeichnisses anzuzeigen, in dem ich mich befinden würde, wenn ich jetzt die Eingabetaste drücke?

Wenn ich mich beispielsweise sehr weit unten in einem Verzeichnisbaum befinde und mit der Eingabe beginne ....(die zu erweitert wird ../../..), möchte ich eine Vorschau des obersten Ordnernamens anzeigen, bei dem ich nach diesen drei Sprüngen im Verzeichnisbaum landen würde.

Antwort1

Ich nehme an, dass die Erweiterung von ....zu ../../..spontan erfolgt, sodass Sie eine spezielle Tastenkombination für haben .. Das habe ich auch, inspiriert von Jérémie Roquets Beitrag im zsh-Benutzer-MailingListe. Ich habe diese Funktion erweitert, die aufgerufen wird, magic-dotum den Pfad anzuzeigen, auf den in derMini-Puffer, also unterhalb der Kommandozeile:

user@linux:~/foo> ls ../../
[ /home/ ]

Mein Code hat einige Nachteile:

  1. es ist nicht optimiert und wirklich hässlich zu lesen (es wird sogar perlzur Generierung der Ausgabe verwendet)
  2. es schlägt fehl, wenn Symlinks ins Spiel kommen
  3. der Minipuffer wird nicht gelöscht, ist also möglicherweise nach der Ausführung des Befehls noch sichtbar

(Die Punkte 1 und 3 sollten behebbar sein, aber ich entschuldige mich, dass ich das nicht gleich getan habe.)

Aber in den meisten Fällen funktioniert es für mich sehr gut, daher möchte ich ein minimales (nicht wirklich?!) funktionierendes Beispiel als Ausgangspunkt für eigene Experimente teilen:

PS1="$PS1o"

terminfo_down_sc=$terminfo[cud1]$terminfo[cuu1]$terminfo[sc]$terminfo[cud1]

function zle-statusline() {
  PS1="%{${terminfo_down_sc}$1$terminfo[rc]%}$PS1o"
  zle reset-prompt
}
# taken from http://stackoverflow.com/questions/3622943/zsh-vi-mode-status-line
zle -N zle-statusline

function magic-dot() {
if [[ $LBUFFER = *. && $LBUFFER != *{*. && ${${${(z)${:-DUMMY $LBUFFER}}[-1]}[1]} != '/' ]]; then
  LBUFFER+=./
  zle-statusline "[ $(print "$(builtin pwd -P)"/${${(z)${:-DUMMY $LBUFFER}}[-1]} \
                           | perl -pe 's/\n//; $i=0; while($_=~/\.\./ && !($_=~/^\/\./)) { $i++; if($i>100) {print "INFTY!"; exit;} s/\/[^\/]+\/\.\.// }') ]"
elif [[ $LBUFFER = *../ && ${${${(z)${:-DUMMY $LBUFFER}}[-1]}[1]} != '/' ]]; then
  LBUFFER+=../
  zle-statusline "[ $(print "$(builtin pwd -P)"/${${(z)${:-DUMMY $LBUFFER}}[-1]} \
                           | perl -pe 's/\n//; $i=0; while($_=~/\.\./ && !($_=~/^\/\./)) { $i++; if($i>100) {print "INFTY!"; exit;} s/\/[^\/]+\/\.\.// }') ]"
else
  zle self-insert
fi
}
zle -N magic-dot
bindkey "." magic-dot

precmd () { PS1="$PS1o" }

Antwort2

Sie können wahrscheinlich ls ../../..und dann ausführen cd ../../..; ls. Das ist möglich, aber ich weiß nicht wirklich, welche anderen Techniken in der Dokumentation für zsh aufgeführt sind.

verwandte Informationen