DEV Community

Cover image for How To Set Up History-Based Autocompletion in Zsh
Jonas B. R.
Jonas B. R.

Posted on

54 4 1

How To Set Up History-Based Autocompletion in Zsh

Yes, Oh My Zsh is awesome! That’s the first thing I installed when I switched from Bash to Zsh and I used it for a few years.

Past that time, I realized that in my daily use, the only features I was taking advantage was:

  • Autocompletion and history-based autocompletion using the arrow keys.

  • The fancy multi-line and colorful user prompt showing the working directory, and the switching color after the fail/success of the previous command execution.

  • The git repository info at the user prompt.

  • The z command, provided by the ZSH-z plugin.

I couldn’t help myself but thinking that the Oh My Zsh framework was much more than I needed. I decided to remove Oh My Zsh and reset Zsh from scratch, so I could configure and install only the features I needed.

This is a four-part post series explaining how to set up those features on a fresh new Zsh installation:

Customize Zsh Pt.1 - Autocompletion 👈

Customize Zsh Pt.2 - User Prompt

Customize Zsh Pt.3 - Git Info

Customize Zsh Pt.4 - ZSH-z Plugin


Autocompletion

Zsh has a powerful completion system built-in by default. You need to load and initialize to take advantage of it. There is a lot to learn about it if you feel like going deeper but this post’s objectives are:

  • To enable the standard autocompletion.

  • To set up history-based autocompletion.

How to Set Up

After a Zsh fresh install it runs a helper for the first time you log into the shell:



This is the Z Shell configuration function for new users,
zsh-newuser-install.
You are seeing this message because you have no zsh startup files
(the files .zshenv, .zprofile, .zshrc, .zlogin in the directory
~).  This function can help you with a few settings that should
make your use of the shell easier.

You can:

(q)  Quit and do nothing.  The function will be run again next time.

(0)  Exit, creating the file ~/.zshrc containing just a comment.
     That will prevent this function being run again.

(1)  Continue to the main menu.

--- Type one of the keys in parentheses --- 


Enter fullscreen mode Exit fullscreen mode

Avoid using the helper and apply the settings inside the .zshrc file, so:

  • Type 0 to exit the Zsh helper creating a blank .zshrc file in your $HOME directory.

  • To load and initialize the Zsh completion system, open the .zshrc file in your code editor and add the following line at the top of the file:



# AUTOCOMPLETION

# initialize autocompletion
autoload -U compinit && compinit


Enter fullscreen mode Exit fullscreen mode

(Learn more: man zshcompsys and go to Use of compinit)

  • To allow history-based autocompletion, first, apply some configurations to improve Zsh’s history management by adding the following lines to the .zshrc file:


# history setup
setopt SHARE_HISTORY
HISTFILE=$HOME/.zhistory
SAVEHIST=1000
HISTSIZE=999
setopt HIST_EXPIRE_DUPS_FIRST


Enter fullscreen mode Exit fullscreen mode

(Read options and parameters descriptions: man zshoptions and man zshparam)

  • With Zsh history set, create key bindings to use up and down arrow keys to navigate history for the provided command:


# autocompletion using arrow keys (based on history)
bindkey '\e[A' history-search-backward
bindkey '\e[B' history-search-forward


Enter fullscreen mode Exit fullscreen mode

The code above assumes that [A is the value your terminal emulator sends for the keyboard up arrow, and that [B is the value for the keyboard down arrow.

You can double check by pressing <Ctrl> + v and <up-arrow> in your Zsh prompt, see more here.

(Learn more: man zshzle and go to ZLE BUILTINS for key bindings, and go to history-search-.)

  • Source the .zshrc file again, in the Zsh shell type:


source ~/.zshrc


Enter fullscreen mode Exit fullscreen mode

Autocompletion is ready to go!

gif01

The final .zshrc file must look like this:



# AUTOCOMPLETION

# initialize autocompletion
autoload -U compinit
compinit

# history setup
setopt APPEND_HISTORY
setopt SHARE_HISTORY
HISTFILE=$HOME/.zhistory
SAVEHIST=1000
HISTSIZE=999
setopt HIST_EXPIRE_DUPS_FIRST
setopt EXTENDED_HISTORY

# autocompletion using arrow keys (based on history)
bindkey '\e[A' history-search-backward
bindkey '\e[B' history-search-forward

# GENERAL

# (bonus: Disable sound errors in Zsh)

# never beep
setopt NO_BEEP


Enter fullscreen mode Exit fullscreen mode

With those simple steps autocompletion is ready and your Zsh shell is becoming more powerful.

Part 2 explores how to apply a simple configuration to improve the user prompt.


Next:

Customize Zsh Pt.2 - User Prompt


Useful links & references:


Footnotes:

  • This post appeared first at alldrops.info.

  • Follow me on Twitter to get more posts like this and other quick tips in your feed.

  • If you have any doubts or tips about this post, I’d appreciate knowing and discussing it in the comments section.

  • As English is not my native language, I apologize for the errors. Corrections are welcome.

  • Big thanks 🙌 to Eric Nielsen for pointing out some improvements in Zsh history settings.

Heroku

Build apps, not infrastructure.

Dealing with servers, hardware, and infrastructure can take up your valuable time. Discover the benefits of Heroku, the PaaS of choice for developers since 2007.

Visit Site

Top comments (6)

Collapse
 
receter profile image
Andreas Riedmüller • Edited

Thanks, that helped me!
The only thing I did differently: history-search-* uses the text before the space to query the history. There is another one history-beginning-search-* that only finds matches that start exactly like your currently typed command. This was the better option for me.

bindkey '\e[A' history-beginning-search-backward
bindkey '\e[B' history-beginning-search-forward
Enter fullscreen mode Exit fullscreen mode

unix.stackexchange.com/questions/1...

Collapse
 
waylonwalker profile image
Waylon Walker

@rossijonas why was I not already following you on dev??? Thanks for all that you are doing on alldrops. I just recently fixed my zsh history, I went like a week with it broken and no new commands being added. It was horrible, how does anyone live without a history.

Collapse
 
rossijonas profile image
Jonas B. R.

Waylon! Thank you for keeping the vibe! When I commit time into writing something, I always keep thinking if that would help anyone so, the big reward is knowing that people are reading and finding it useful. And yes! Shell history is a must for me too!

Collapse
 
sostenemunezero profile image
Sostene MUNEZERO BAGIRA

thank you for sharing this, I searched couple of hours and final found this

Collapse
 
th0rgall profile image
Thor Galle

Thanks, this is just what I needed to find on a first web search! Got rid of Oh My Zsh a while ago, but I was missing this.

Collapse
 
dirk_viljoen profile image
Dirk Viljoen

This is great! Thank you.

Image of Docusign

🛠️ Bring your solution into Docusign. Reach over 1.6M customers.

Docusign is now extensible. Overcome challenges with disconnected products and inaccessible data by bringing your solutions into Docusign and publishing to 1.6M customers in the App Center.

Learn more