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

4

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

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

    
por Alice 06.05.2015 / 23:49

2 respostas

2

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:

  1. não é otimizado e muito feio de ler (ele usa perl para gerar a saída)
  2. falha quando os links simbólicos entram em ação
  3. 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" }
    
por 08.05.2015 / 21:03
0

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

    
por 07.05.2015 / 01:09

Tags