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-dot
um den Pfad anzuzeigen, auf den in derMini-Puffer, also unterhalb der Kommandozeile:
user@linux:~/foo> ls ../../
[ /home/ ]
Mein Code hat einige Nachteile:
- es ist nicht optimiert und wirklich hässlich zu lesen (es wird sogar
perl
zur Generierung der Ausgabe verwendet) - es schlägt fehl, wenn Symlinks ins Spiel kommen
- 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.