これアーチスウィキ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コードは、書かれたときにのみ一意であり、使用されたりファイルに読み込まれたりするときは一意ではないため、不完全な一意性の問題を経験しています。したがって、アイテムも含まれている場合は、レプリカが作成され、読み取られます。したがって、最速の回避策は読み取りに独自の拡張を適用することです。dirstack
typeset
path
dirstack
PWD
PWD
dirstack
dirstack=( ${(uf)"$(< $DIRSTACKFILE)"} )
おそらくファイルの書き込みもdirstack
あるかもしれません。PWD
PWD
print -l $PWD ${(u)${dirstack:#$PWD}} >$DIRSTACKFILE