如何在 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,有时甚至同一条目重复三次。 Wiki 确实继续说,这在多个 zsh 会话中效果不佳,而且我确实在 zsh 运行时打开了多个终端选项卡,因此这可能是问题的原因。

我可以以某种方式修改此函数以仅保留唯一的条目吗?这是一种复杂的方式来实现 zsh 提供的更简单的方法吗?

我怎样才能拥有一个只有唯一条目的持久目录堆栈?

答案1

简单的方法typeset -U dirstack失败了,因为dirstack对于应用通常的唯一限制来说无疑太特殊了(typeset但这对于数组之类的东西来说很方便path)。仔细检查后,Arch Wiki 代码存在不完整的唯一性,因为只有dirstack在写出时才是唯一的,而不是使用PWD,也不在读入文件时。因此,如果PWD中也包含某些内容dirstack,则会创建重复项,然后读入因此,最快的解决方法是对读取应用唯一扩展:

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

也许还有文件写入,这更复杂,因为它需要一个唯一的dirstackminus 中的PWDplus PWD

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

相关内容