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 👈
    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 ---
    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
    (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
    (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
    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
    Autocompletion is ready to go!
    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

    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:
    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.

  • 58

    This website collects cookies to deliver better user experience

    How To Set Up History-Based Autocompletion in Zsh