zsh 启动太慢(2秒以上),如何实现 Emacs 的 run-with-idle-timer 的功能?

每次打开一个新的 zsh 都很慢,调查发现是 compinit -isource "$NVM_DIR/nvm.sh" 这 2 个命令导致的,它倆常常不是一开终端就需要,zsh 能不能实现类似 Emacs 的 run-with-idle-timer 的功能,比如等终端空闲了 3 秒之后,自动执行一次这些耗时的命令。

我把 nvm 的配置改成下面这样,就算一开始就用 node 也 OK

export NVM_DIR="$HOME/.nvm"
# source "$NVM_DIR/nvm.sh"
function node() {
    echo "Lazy loading nvm..."
    unset -f node
    source "$NVM_DIR/nvm.sh"
    node
}

zsh 已经有插件支持 lazy load。

果然有 nvm :cry:

当时在 nvm issue 里找到这个插件

另外用了这些插件的话,emacs 里 exec-path-from-shell 拷贝 PATH 变量时可能需要注意一下

1 个赞

今天在电报群看到有人推荐用 fnm 或 volta 替代 nvm,这两个都是用 rust 写的,我试了下 fnm,确实比 nvm 快多了,目前还没遇到什么问题。

我的方案也是懒加载,并且在 zshenv 设置一个默认的 node 路径,仅当需要的时候切换时再手动执行 nvm ,体验也还可以,不至于把 node 都设成懒加载

话说 fnm 火得好快(好名字的重要性

不知道是不是错觉,感觉加载 fnm 加上 fnm zsh completion 的速度比懒加载 nvm 还快… 当然最重要的是 emacs exec-path-from-shell copy相关变量方便一些,不需要针对懒加载的环境变量做些额外的处理。

time zsh -i -c exit

:smile: 其实也就十几毫秒的差别,一般肉眼难以感受到,但是看到数字上涨就有点不爽