Do you cd .. a lot?



If you have multiple software repositories, how do you move between them?
Possibly you have all repositories checked out into the same parent directory?
Do you cd .. a lot?

user@machine:~/code$ cd repo1
user@machine:~/code/repo1$ cd ..
user@machine:~/code$ cd repo2
user@machine:~/code/repo2$ cd ..
user@machine:~/code$ cd repo3
user@machine:~/code/repo3$ cd ..
...

Save some time by making a new “go-to-repository-command”. Let’s call this command r. Mine looks like this:

REPOSITORY_DIRECTORY="/Users/olof/code"

function r {
    cd "${REPOSITORY_DIRECTORY}/${1}"
}

if [[ -n "${ZSH_VERSION}" ]]; then
    autoload -U +X compinit && compinit
    function _r {
        _files -W "${REPOSITORY_DIRECTORY}"
    }
    compdef _r r
elif [[ -n "${BASH_VERSION}" ]]; then
    function _r {
        COMPREPLY=( $( compgen -d "${REPOSITORY_DIRECTORY}/${2}" ) )
        COMPREPLY=( ${COMPREPLY[@]#${REPOSITORY_DIRECTORY}/} )
        if [[ "${#COMPREPLY[@]}" -eq 1 ]]; then
            COMPREPLY[0]="${COMPREPLY[0]}/"
        fi
    }
    complete -F _r -o nospace r
fi

The function itself is pretty short. Adding tab completion is the tricky part. The solution above supports both bash and ZSH. The following links was useful when coding it:

Simply typing r will take you to the parent directory.
Typing r repo1 will take you directly to the repo1 child directory, regardless of where you are currently standing.
Tab completion always acts as if you were standing in the parent directory.

Now you may skip cd .. entirely!

user@machine:/tmp/somedir$ r repo1
user@machine:~/code/repo1$ r repo2
user@machine:~/code/repo2$ r repo3
user@machine:~/code/repo3$ git status
...

You may want to investigate which terminal commands you commonly use. Perhaps cd .. is there?