Skip to content

Instantly share code, notes, and snippets.

@jpalala
Forked from callumlocke/.zshrc
Created March 19, 2022 08:01
Show Gist options
  • Save jpalala/43e395b0b25eebda8a33d1acb4754992 to your computer and use it in GitHub Desktop.
Save jpalala/43e395b0b25eebda8a33d1acb4754992 to your computer and use it in GitHub Desktop.

Revisions

  1. @callumlocke callumlocke revised this gist Nov 13, 2019. 1 changed file with 2 additions and 2 deletions.
    4 changes: 2 additions & 2 deletions .zshrc
    Original file line number Diff line number Diff line change
    @@ -1,6 +1,6 @@
    ####
    # Auto-switch Node version whenever you change directory, for ZSH.
    # https://git.io/JermA
    # ZSH function to auto-switch to correct Node version
    # https://gist.github.com/callumlocke/30990e247e52ab6ac1aa98e5f0e5bbf5
    #
    # - Searches up your directory tree for the closest .nvmrc, just like `nvm use` does.
    #
  2. @callumlocke callumlocke revised this gist Nov 13, 2019. 1 changed file with 1 addition and 0 deletions.
    1 change: 1 addition & 0 deletions .zshrc
    Original file line number Diff line number Diff line change
    @@ -1,5 +1,6 @@
    ####
    # Auto-switch Node version whenever you change directory, for ZSH.
    # https://git.io/JermA
    #
    # - Searches up your directory tree for the closest .nvmrc, just like `nvm use` does.
    #
  3. @callumlocke callumlocke created this gist Nov 13, 2019.
    85 changes: 85 additions & 0 deletions .zshrc
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,85 @@
    ####
    # Auto-switch Node version whenever you change directory, for ZSH.
    #
    # - Searches up your directory tree for the closest .nvmrc, just like `nvm use` does.
    #
    # - If you are already on the right Node version, IT DOES NOTHING, AND PRINTS NOTHING.
    #
    # - Works correctly if your .nvmrc file contains something relaxed/generic,
    # like "4" or "v12.0" or "stable".
    #
    # - If an .nvmrc is found but you have no installed version that satisfies it, it
    # prints a clear warning, so you can decide whether you want to run `nvm install`.
    #
    # - If no .nvmrc is found, it does `nvm use default`.
    #
    # Recommended: leave your default as something generic,
    # e.g. do `nvm alias default stable`
    ####

    auto-switch-node-version() {
    NVMRC_PATH=$(nvm_find_nvmrc)
    CURRENT_NODE_VERSION=$(nvm version)

    if [[ ! -z "$NVMRC_PATH" ]]; then
    # .nvmrc file found!

    # Read the file
    REQUESTED_NODE_VERSION=$(cat $NVMRC_PATH)

    # Find an installed Node version that satisfies the .nvmrc
    MATCHED_NODE_VERSION=$(nvm_match_version $REQUESTED_NODE_VERSION)

    if [[ ! -z "$MATCHED_NODE_VERSION" && $MATCHED_NODE_VERSION != "N/A" ]]; then
    # A suitable version is already installed.

    # Clear any warning suppression
    unset AUTOSWITCH_NODE_SUPPRESS_WARNING

    # Switch to the matched version ONLY if necessary
    if [[ $CURRENT_NODE_VERSION != $MATCHED_NODE_VERSION ]]; then
    nvm use $REQUESTED_NODE_VERSION
    fi
    else
    # No installed Node version satisfies the .nvmrc.

    # Quit silently if we already just warned about this exact .nvmrc file, so you
    # only get spammed once while navigating around within a single project.
    if [[ $AUTOSWITCH_NODE_SUPPRESS_WARNING == $NVMRC_PATH ]]; then
    return
    fi

    # Convert the .nvmrc path to a relative one (if possible) for readability
    RELATIVE_NVMRC_PATH="$(realpath --relative-to=$(pwd) $NVMRC_PATH 2> /dev/null || echo $NVMRC_PATH)"

    # Print a clear warning message
    echo ""
    echo "WARNING"
    echo " Found file: $RELATIVE_NVMRC_PATH"
    echo " specifying: $REQUESTED_NODE_VERSION"
    echo " ...but no installed Node version satisfies this."
    echo " "
    echo " Current node version: $CURRENT_NODE_VERSION"
    echo " "
    echo " You might want to run \"nvm install\""

    # Record that we already warned about this unsatisfiable .nvmrc file
    export AUTOSWITCH_NODE_SUPPRESS_WARNING=$NVMRC_PATH
    fi
    else
    # No .nvmrc file found.

    # Clear any warning suppression
    unset AUTOSWITCH_NODE_SUPPRESS_WARNING

    # Revert to default version, unless that's already the current version.
    if [[ $CURRENT_NODE_VERSION != $(nvm version default) ]]; then
    nvm use default
    fi
    fi
    }

    # Run the above function in ZSH whenever you change directory
    autoload -U add-zsh-hook
    add-zsh-hook chpwd auto-switch-node-version
    auto-switch-node-version