像pyenv
或rbenv
这样的 oh-my-zsh 插件很棒,但很多时候我被迫不使用插件,因为它会使我的 shell 启动时间变得很慢。 这就是为什么我们会遇到像 #6017 这样的问题。
是否可以异步加载一些插件,所以在所有插件启动之前不会阻止我的 shell 提示? 如果做不到这一点,我可以按需加载插件吗?
我无法回答有关异步加载的部分,但是对于手动加载,您可以在 .zshrc 中添加一个函数来执行此操作。
一个基本的例子(只能处理一个插件,没有错误检查)
function load-plugin() {
source $ZSH/plugins/"$1"/"$1".plugin.zsh
}
然后在需要时运行load-plugin pyenv
。
只是想插一句,现在 NVM(Node.js 版本管理器)存在一个非常相似的问题: https://github.com/creationix/nvm/issues/1277。
@crenwick提出了一种按需加载 NVM 的好方法:
alias load_nvm='export NVM_DIR="$HOME/.nvm" && [ -s "$NVM_DIR/nvm.sh" ] && . "$NVM_DIR/nvm.sh"'
alias node='unalias node npm && load_nvm && node'
alias npm='unalias node npm && load_nvm && npm'
我希望pyenv也能做到这一点:
alias load_pyenv='eval "$(pyenv init -)"'
alias pyenv='unalias pyenv && load_pyenv && pyenv'
@awinecki感谢您提供的信息。
这让我想知道我们是否可以有另一个 shell 变量lazy_plugins
可以用来自动定义像上面这样的别名,或者使用 zsh autoload
所以实际加载插件的成本会产生当用户尝试使用插件时,而不是在 shell 启动时。
很想听听脚本专家对这个想法的看法。
最有用的评论
我无法回答有关异步加载的部分,但是对于手动加载,您可以在 .zshrc 中添加一个函数来执行此操作。
一个基本的例子(只能处理一个插件,没有错误检查)
然后在需要时运行
load-plugin pyenv
。