Команда source, с помощью которой в оболочку подключаются инструменты вроде nvm или rvm, очень медленная. Загрузка nvm на моём Macbook с SSD занимает полсекунды. Это происходит при открытии новой вкладки или окна терминала — достаточно часто, чтобы заметить лаг. Первая мысль: source должен вызываться перед запуском команды, не раньше. То есть nvm.sh должен быть загружен перед вызовом nvm.
В функция принимает два аргумента: название команды и файл, из которого она импортируется. Добавим эту функцию в ~/.zshrc и задействуем для команды 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, который не блокирует загрузку шелла. Не без минусов: до загрузки файла не будет работать автодополнение.
Ленивый source в zsh
Команда
source
, с помощью которой в оболочку подключаются инструменты вроде nvm или rvm, очень медленная. Загрузка nvm на моём Macbook с SSD занимает полсекунды. Это происходит при открытии новой вкладки или окна терминала — достаточно часто, чтобы заметить лаг. Первая мысль: source должен вызываться перед запуском команды, не раньше. То естьnvm.sh
должен быть загружен перед вызовом nvm.Решение я уже предлагал в issue #539 к nvm:
В функция принимает два аргумента: название команды и файл, из которого она импортируется. Добавим эту функцию в
~/.zshrc
и задействуем для командыnvm
:В этот момент создаётся функция, которая перед выполнением основной команды сделает импорт файла:
Теперь вызов
nvm
выполнит эту функцию. Она произведет импорт файла и снова выполнитnvm
. На момент второго вызова функция уже будет перезаписана оригинальнымnvm
, поэтому рекурсивного вызова не произойдёт.Ленивый импорт для нескольких команд решается применением
lazy_source
к каждой команде в цикле:Таким образом получился полностью ленивый
source
, который не блокирует загрузку шелла. Не без минусов: до загрузки файла не будет работать автодополнение.Как это выглядит в моём zshrc.