web-dev-qa-db-ja.com

zshに一意のエントリを持つ永続的なdirstackを取得するにはどうすればよいですか?

Arch Wiki には、次の興味深い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

pushdignoredupsが設定されていても、dirsの出力に重複するエントリがあり、同じエントリが3回繰り返されることもあります。 Wikiは、これは複数のzshセッションではうまく機能しないと述べています。また、zshを実行しているときに複数のターミナルタブを開いているので、問題の原因である可能性があります。

この関数をなんらかの方法で変更して、一意のエントリのみを保持できますか?これは、zshがより簡単な方法を提供する何かを達成するための複雑な方法ですか?

一意のエントリのみを含む永続的なdirstackを作成するにはどうすればよいですか?

1
muru

単純なtypeset -U dirstackは失敗します。これは、dirstackが特別すぎて、通常の一意の制限を適用できないためです(ただし、このtypesetは、path配列などに便利です)。よく調べてみると、Arch Wikiコードは不完全な一意性に悩まされており、書き出されたときだけdirstackが一意になり、PWDを使用したり、ファイルを読み込んだりすることはありません。したがって、PWDdirstackにも何かが含まれていると、重複が作成されます。したがって、最も簡単な修正は、読み取りに一意の展開を適用することです。

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

また、ファイルの書き込みも複雑になります。これは、一意のdirstackからPWDにあるものを差し引いたものにPWDを加えたものが必要なためです。

print -l $PWD ${(u)${dirstack:#$PWD}} >$DIRSTACKFILE
1
thrig