¿Alguien conoce una manera de hacer que zsh me muestre una vista previa del directorio principal en el que estaría si presionara regresar ahora mismo?
Por ejemplo, si estoy muy abajo en un árbol de directorios y empiezo a escribir ....
(que se expande a ../../..
), me gustaría obtener una vista previa del nombre de la carpeta superior en la que terminaría con esos tres saltos hacia arriba en el árbol de directorios. .
Respuesta1
Supongo que la expansión de ....
to ../../..
ocurre sobre la marcha, por lo que tienes una combinación de teclas especial para .
. Yo también, que se inspiró en
El post de Jérémie Roquet sobre el correo de los usuarios de zshlista. Extendí esta función, llamada magic-dot
para mostrar la ruta, a la que se hará referencia en elminibúfer, es decir, debajo de la línea de comando:
user@linux:~/foo> ls ../../
[ /home/ ]
Mi código tiene algunas desventajas:
- no está optimizado y es muy feo de leer (incluso se usa
perl
para generar la salida) - falla cuando los enlaces simbólicos entran en juego
- el mini buffer no se borra, por lo que es posible que aún esté visible después de la ejecución del comando
(Los puntos 1 y 3 deberían poder solucionarse, pero me disculpo por no haberlo hecho ahora).
Pero en la mayoría de los casos funciona muy bien para mí, así que me gustaría compartir un ejemplo de trabajo mínimo (¡¿no realmente?!) como punto de partida para mis propios experimentos:
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" }
Respuesta2
Probablemente puedas hacerlo ls ../../..
y luego cd ../../..; ls
. Es posible hacer esto, pero realmente no sé qué otras técnicas tienen en la documentación de zsh.