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を作成するにはどうすればよいですか?
単純なtypeset -U dirstack
は失敗します。これは、dirstack
が特別すぎて、通常の一意の制限を適用できないためです(ただし、このtypeset
は、path
配列などに便利です)。よく調べてみると、Arch Wikiコードは不完全な一意性に悩まされており、書き出されたときだけdirstack
が一意になり、PWD
を使用したり、ファイルを読み込んだりすることはありません。したがって、PWD
にdirstack
にも何かが含まれていると、重複が作成されます。したがって、最も簡単な修正は、読み取りに一意の展開を適用することです。
dirstack=( ${(uf)"$(< $DIRSTACKFILE)"} )
また、ファイルの書き込みも複雑になります。これは、一意のdirstack
からPWD
にあるものを差し引いたものにPWD
を加えたものが必要なためです。
print -l $PWD ${(u)${dirstack:#$PWD}} >$DIRSTACKFILE