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-dot
para 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:
- não é otimizado e é muito feio de ler (até usa
perl
para gerar a saída) - falha, quando links simbólicos entram em ação
- 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.