Note: instructions are in Fish, but concept can be ported to other shells.
~/.config/fish/config.fish, add the following:
# pyenv if status is-login pyenv init - --no-rehash fish | source and funcsave pyenv and sh -c 'command pyenv rehash 2>/dev/null &' end # rbenv if status is-login rbenv init - --no-rehash fish | source and funcsave rbenv and sh -c 'command rbenv rehash 2>/dev/null &' end
- Setup your terminal with the following login command (I’m currently using Alacritty).
shell: program: /usr/local/bin/fish args: - --login - -c - 'tmux attach || tmux -f ~/.config/tmux/tmux.conf'
set-option -g default-command "/usr/local/bin/fish" set-option -g default-shell "/bin/sh"
This instantiates pyenv & rbenv and quickly runs rehash once, when the terminal app launches (i.e., when it’s a login terminal). Then each subsequent session is loaded instantly.
Fish functions can’t be exported, so instead a definition is copied to
~/.config/fish/functions that can be lazy-loaded by child shells. It’s probably only necessary to do this once, but I’ve left it in the init file to avoid having to think about it changing between versions.
On macOS, this requires Fish 3.1 or above since it fixes a bug with paths getting mangled.
I only use Fish as a login shell so have no need to do this in other shells, but instructions in zsh should be similar. Just add this to
AUTOLOAD_FUNC_DIR="$HOME/.my-zsh-functions" export FPATH="$AUTOLOAD_FUNC_DIR:$FPATH" eval "$(rbenv init - --no-rehash zsh)" && whence -f rbenv >"$AUTOLOAD_FUNC_DIR/rbenv" && (command rbenv rehash 2>/dev/null &)
Then add this to
autoload -Uz rbenv
In Bash this is easier (for better or for worse). Instead of saving the function to a file, just use
export -f in
eval "$(rbenv init - --no-rehash bash)" && export -f rbenv && (command rbenv rehash 2>/dev/null &)
To test that it’s working properly, try using
rbenv shell which requires the wrapper function to be defined. The only caveat is that both of these break shell completions, which isn’t the case with Fish since its completions are already included with the shell.