这拱门维基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
,有时甚至同一条目重复三次。 Wiki 确实继续说,这在多个 zsh 会话中效果不佳,而且我确实在 zsh 运行时打开了多个终端选项卡,因此这可能是问题的原因。
我可以以某种方式修改此函数以仅保留唯一的条目吗?这是一种复杂的方式来实现 zsh 提供的更简单的方法吗?
我怎样才能拥有一个只有唯一条目的持久目录堆栈?
答案1
简单的方法typeset -U dirstack
失败了,因为dirstack
对于应用通常的唯一限制来说无疑太特殊了(typeset
但这对于数组之类的东西来说很方便path
)。仔细检查后,Arch Wiki 代码存在不完整的唯一性,因为只有dirstack
在写出时才是唯一的,而不是使用PWD
,也不在读入文件时。因此,如果PWD
中也包含某些内容dirstack
,则会创建重复项,然后读入因此,最快的解决方法是对读取应用唯一扩展:
dirstack=( ${(uf)"$(< $DIRSTACKFILE)"} )
也许还有文件写入,这更复杂,因为它需要一个唯一的dirstack
minus 中的PWD
plus PWD
。
print -l $PWD ${(u)${dirstack:#$PWD}} >$DIRSTACKFILE