zsh - visualiza os nomes dos diretórios pais quando 'cd ../../../'

zsh - visualiza os nomes dos diretórios pais quando 'cd ../../../'

Alguém sabe uma maneira de fazer com que o zsh me mostre uma prévia do diretório pai em que eu estaria se pressionasse return agora?

Por exemplo, se eu estiver bem no fundo de uma árvore de diretórios e começar a digitar ....(que é expandido para ../../..), gostaria de visualizar o nome da pasta mais alta em que eu terminaria com esses três saltos para cima na árvore de diretórios .

Responder1

Suponho que a expansão de ....to ../../..aconteça dinamicamente, então você tem uma ligação de chave especial para .. Eu também, que fui inspirado por Postagem de Jérémie Roquet sobre a correspondência dos usuários do zshlista. Estendi esta função, chamada magic-dotpara exibir o caminho, que será referenciado nomini buffer, ou seja, abaixo da linha de comando:

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

Meu código tem algumas desvantagens:

  1. não é otimizado e é muito feio de ler (até usa perlpara gerar a saída)
  2. falha, quando links simbólicos entram em ação
  3. o mini buffer não foi limpo, então ainda pode estar visível após a execução do comando

(Os pontos 1 e 3 devem ser corrigíveis, mas peço desculpas por não ter feito isso agora.)

Mas na maioria dos casos funciona muito bem para mim, então gostaria de compartilhar um exemplo mínimo (não mesmo?!) de trabalho como ponto de partida para meus próprios 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" }

Responder2

Você provavelmente pode fazer ls ../../..e então cd ../../..; ls. É possível fazer isso, mas eu realmente não sei quais outras técnicas eles possuem na documentação do zsh.

informação relacionada