zsh: vista previa de los nombres del directorio principal cuando 'cd ../../../'

zsh: vista previa de los nombres del directorio principal cuando 'cd ../../../'

¿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-dotpara 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:

  1. no está optimizado y es muy feo de leer (incluso se usa perlpara generar la salida)
  2. falla cuando los enlaces simbólicos entran en juego
  3. 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.

información relacionada