Como posso obter um dirstack persistente com entradas únicas no zsh?

1

O Wiki do Arch tem essa configuração interessante de zsh:

DIRSTACKFILE="$HOME/.cache/zsh/dirs"
if [[ -f $DIRSTACKFILE ]] && [[ $#dirstack -eq 0 ]]; then
  dirstack=( ${(f)"$(< $DIRSTACKFILE)"} )
  [[ -d $dirstack[1] ]] && cd $dirstack[1]
fi
chpwd() {
  print -l $PWD ${(u)dirstack} >$DIRSTACKFILE
}

DIRSTACKSIZE=20    

setopt autopushd pushdsilent pushdtohome

## Remove duplicate entries
setopt pushdignoredups

## This reverts the +/- operators.
setopt pushdminus

Mesmo que pushdignoredups esteja definido, encontro entradas duplicadas na saída de dirs , às vezes até a mesma entrada é repetida três vezes. O Wiki continua dizendo que isso não funciona bem com várias sessões zsh, e eu tenho várias abas de terminal abertas com zsh em execução, então isso pode ser a causa do problema.

Posso modificar essa função de alguma forma para manter apenas entradas exclusivas? Esta é uma maneira complicada de conseguir algo que o zsh oferece maneiras mais fáceis de fazer?

Como posso ter um dirstack persistente, com apenas entradas exclusivas?

    
por muru 07.04.2016 / 16:07

1 resposta

1

O typeset -U dirstack simples falha, pois dirstack é sem dúvida muito especial para a limitação exclusiva usual (esse typeset é útil para coisas como a matriz path ). Em uma inspeção mais próxima, o código do Arch Wiki sofre de unicidade incompleta, em que somente dirstack somente quando está sendo escrito é feito único, e não com PWD , nem quando lendo o arquivo. Então se PWD contém algo também em dirstack , duplicatas serão criadas e depois lidas. Assim, a correção mais rápida é aplicar a expansão exclusiva na leitura:

  dirstack=( ${(uf)"$(< $DIRSTACKFILE)"} )

E talvez também para a gravação de arquivos, o que é mais complicado, já que precisa de um dirstack minus exclusivo, o que quer que esteja em PWD plus PWD .

print -l $PWD ${(u)${dirstack:#$PWD}} >$DIRSTACKFILE
    
por 07.04.2016 / 16:12