Files
flake/home/standalone/.zsh.d/normalize-fpath.zsh
T

57 lines
1.5 KiB
Bash

# 这个文件用于在 grml/compinit 初始化补全系统之前规整 fpath。
#
# 修复的问题:
# 1. NixOS、Home Manager、用户 profile 和 zsh 自带目录会同时向 fpath 注入补全目录。
# 2. 这些目录里大量内容重复,有些只是同一真实目录的不同软链接入口。
# 3. compinit 会遍历这些重复目录,导致启动变慢,并且更容易让 .zcompdump 的文件数校验失效。
#
# 处理策略:
# 1. 先按 realpath 去重,移除同一真实目录的多重入口。
# 2. 再按目录类别保留一份,避免 site-functions、vendor-completions 和 zsh 标准函数目录被重复扫描。
normalize-fpath() {
emulate -L zsh
setopt extendedglob
local dir real key bucket
local -a new_fpath
local -A seen_realpath seen_bucket
for dir in $fpath; do
[[ -d "$dir" ]] || continue
real="${dir:A}"
key="${real%/}"
if [[ -n "${seen_realpath[$key]}" ]]; then
continue
fi
bucket=""
case "$real" in
*/share/zsh/site-functions)
bucket="site:${real:t}"
;;
*/share/zsh/vendor-completions)
bucket="vendor:${real:t}"
;;
*/share/zsh/<->.<->/functions)
bucket="core:${real:t:h:t}"
;;
/usr/share/grml/zsh/*)
bucket="grml:${real:t}"
;;
esac
if [[ -n "$bucket" && -n "${seen_bucket[$bucket]}" ]]; then
continue
fi
seen_realpath[$key]=1
[[ -n "$bucket" ]] && seen_bucket[$bucket]=1
new_fpath+=("$dir")
done
fpath=("${new_fpath[@]}")
}
normalize-fpath