zshで一意のエントリを持つ永続ディレクトリスタックを取得するには?

zshで一意のエントリを持つ永続ディレクトリスタックを取得するには?

これアーチスウィキ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が提供するより簡単な方法を実装する複雑な方法ですか?

一意のエントリのみを含む永続ディレクトリスタックをどのように持つことができますか?

答え1

単純なアプローチは、間違いなく一般的な固有の制約を適用するにはあまりにも具体的なのでtypeset -U dirstack失敗します(しかし、配列のような場合には便利です)。詳しく調べてみると、Arch Wikiコードは、書かれたときにのみ一意であり、使用されたりファイルに読み込まれたりするときは一意ではないため、不完全な一意性の問題を経験しています。したがって、アイテムも含まれている場合は、レプリカが作成され、読み取られます。したがって、最速の回避策は読み取りに独自の拡張を適用することです。dirstacktypesetpathdirstackPWDPWDdirstack

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

おそらくファイルの書き込みもdirstackあるかもしれません。PWDPWD

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

関連情報