Ленивый source в zsh

Команда source, с помощью которой в оболочку подключаются инструменты вроде nvm или rvm, очень медленная. Загрузка nvm на моём Macbook с SSD занимает полсекунды. Это происходит при открытии новой вкладки или окна терминала — достаточно часто, чтобы заметить лаг. Первая мысль: source должен вызываться перед запуском команды, не раньше. То есть nvm.sh должен быть загружен перед вызовом nvm.

Решение я уже предлагал в issue #539 к nvm:

lazy_source () {
    eval "$1 () { [ -f $2 ] && source $2 && $1 \$@ }"
}

В функция принимает два аргумента: название команды и файл, из которого она импортируется. Добавим эту функцию в ~/.zshrc и задействуем для команды nvm:

NVM_SOURCE=$(brew --prefix nvm)/nvm.sh
lazy_source nvm $NVM_SOURCE

В этот момент создаётся функция, которая перед выполнением основной команды сделает импорт файла:

nvm () {
    [ -f $NVM_SOURCE ] && source $NVM_SOURCE && nvm $@
}

Теперь вызов nvm выполнит эту функцию. Она произведет импорт файла и снова выполнит nvm. На момент второго вызова функция уже будет перезаписана оригинальным nvm, поэтому рекурсивного вызова не произойдёт.

Ленивый импорт для нескольких команд решается применением lazy_source к каждой команде в цикле:

VIRTUALENV_SOURCE=/usr/local/bin/virtualenvwrapper.sh
_venv_commands=(workon mkvirtualenv rmvirtualenv)

for command in "${_venv_commands[@]}"; do
    lazy_source $command $VIRTUALENV_SOURCE
done

unset _venv_commands

Таким образом получился полностью ленивый source, который не блокирует загрузку шелла. Не без минусов: до загрузки файла не будет работать автодополнение.

Как это выглядит в моём zshrc.