Adding Git Completion to Zsh
I recently switched my shell from Bash to Zsh, and after installing my new favorite extensions (Powerlevel9k and Nerd Fonts), I realized I was missing an important component from Bash: Git completion.
Since we don’t all have the luxury of running
brew install bash-completion and following the associated directions, I’ll discuss how I manually installed the shell scripts necessary to support Git completion in Zsh.
Finding the Dependencies
The Git community maintains all of their shell completion scripts in their repository on GitHub. Navigating to this folder reveals scripts for a variety of shells, including Bash and Zsh.
Since both Bash and Zsh are based on the Bourne shell, they tend to share many similarities. Git makes this pretty evident after one opens the
git-completion.zsh and the comment at the top states:
You need git’s bash completion script installed somewhere, by default it would be the location bash-completion uses.
Thus, we need two scripts to have Git completion in its entirety.
Downloading the Scripts
Now that it is clear which scripts are necessary for full Git completion functionality, let’s go get them:
Notice how, by convention, I placed the shell scripts in a folder called
.zsh under the user’s home folder.
Configuring the Shell
Once the scripts are in position, the
.zshrc file may be configured to provide access to their functionality. Open up the
~/.zshrc file and add the following lines of code:
On your first run, make sure you clear our all of the shell’s autocompletion cache with:
Then save the script, reload your shell, and viola!
For the curious reader, here’s a quick summary of what the above configuration script accomplishes:
zstyle: Instructs the shell on how to provide inline, contextual hints
git-completion.zshis a function file, not designed to be
sourcedlike the bash script. This command appends the
~/.zshdirectory onto the shell’s function lookup list.
autoload: Scan each path within the
fpathvariable for files starting with an underscore (
_git, in our case) and loads the corresponding script as a function file
compinit: Initializes the shell’s auto-completion functionality
These links proved themselves very helpful as I learned how to understand and configure this on my own: