如何缓存compinit调用,避免每次Zsh启动运行以减少终端加载时间?
解决Zsh compinit加载缓慢的缓存方案
你可以通过缓存compinit的运行结果,让它只在补全文件发生变化时重新执行,具体有几种实用方法:
方法一:基于文件修改时间的缓存策略
替换你~/.zshrc里的原有代码为以下内容:
fpath+=(~/.zsh/completion) autoload -Uz compinit # 获取补全目录的最后修改日期(适配不同系统的date/stat命令) typeset -i comp_dir_mtime=$(date +'%j' -r ~/.zsh/completion 2>/dev/null || stat -f '%Sm' -t '%j' ~/.zsh/completion 2>/dev/null) # 对比当前日期与补全目录修改日期,决定是否重新生成缓存 if [ $(date +'%j') != $comp_dir_mtime ]; then # 重新扫描补全并生成缓存,-i忽略不存在的补全文件,-d指定缓存文件路径 compinit -i -d ~/.zsh/.zcompdump-"$ZSH_VERSION" else # 直接使用缓存,-C跳过扫描步骤 compinit -C -d ~/.zsh/.zcompdump-"$ZSH_VERSION" fi
这个逻辑会检查你的补全目录是否在当天有修改,只有发生变化时才重新运行完整的compinit,否则直接复用之前生成的缓存文件,大幅减少启动耗时。
方法二:预编译补全文件
针对你生成的大型补全文件,先手动执行一次编译命令:
zcompile ~/.zsh/completion/_你的程序名
编译后的文件会以.zwc后缀保存,Zsh加载编译后的文件速度比原文件快很多。你也可以把这条命令加到生成补全文件的脚本里,每次生成新补全后自动编译。
简化版缓存配置
如果不需要日期检查,也可以直接指定compinit使用固定缓存文件,Zsh会自动判断是否需要更新:
fpath+=(~/.zsh/completion) autoload -Uz compinit compinit -d ~/.zsh/.zcompdump-"$ZSH_VERSION"
加上$ZSH_VERSION是为了避免不同Zsh版本的缓存文件冲突,确保兼容性。
内容的提问来源于stack exchange,提问作者Hugo Trentesaux
相关产品推荐
相关产品推荐

