在 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
它检查匹配后必须至少跟三个正斜杠。
我正在使用以下函数生成我的 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
它检查匹配后必须至少跟三个正斜杠。