在 zsh 提示符下折叠目录

Collapse directories in zsh prompt

我正在使用以下函数生成我的 zsh prompt:

_sudar_collapsed_wd() {
  echo $(pwd | perl -pe "
   BEGIN {
      binmode STDIN,  ':encoding(UTF-8)';
      binmode STDOUT, ':encoding(UTF-8)';
   }; s|^$HOME|~|g; s|/([^/])[^/]*(?=/)|/$1|g
")
}

基本上,这会通过折叠除当前目录之外的所有父目录,将 /Users/sudar/dir1/dir2/dir3/dir4 之类的路径转换为 ​​~/D/c/d/d/d/dir4

但我不想折叠路径中的最后 3 个目录。所以 /Users/sudar/dir1/dir2/dir3/dir4 变成 ~/D/c/d/dir2/dir3/dir4

实际替换发生在这个正则表达式中:s|/([^/])[^/]*(?=/)|/$1|g.

如何更改此正则表达式,使其不替换路径中的最后 3 个目录?

你可以用这个,

s|^$HOME|~|g; s|/([^/])[^/]*(?=/[^/]*/[^/]*/)|/$1|g

它检查匹配后必须至少跟三个正斜杠。

DEMO