Suponho que a expansão de ....
para ../../..
seja imediata, por isso você tem uma ligação de chave especial para .
. Eu também, que foi inspirado por
A postagem de Jérémie Roquet na lista de discussão de usuários do zsh . Eu estendi essa função, chamada magic-dot
para exibir o caminho, que será referido no mini 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 (ele usa
perl
para gerar a saída) - falha quando os links simbólicos entram em ação
- o mini buffer não está limpo, portanto, pode ainda estar visível após a execução do comando
(Os pontos 1 e 3 devem ser consertados, mas peço desculpas por não ter feito isso agora.)
Mas para a maioria dos casos, funciona muito bem para mim, então gostaria de compartilhar um exemplo de trabalho mínimo (não realmente ?!) como ponto de partida para os 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" }