Currently ZSH displays a menu when I first hit tab and the completion is ambiguous. So, if I have 'cd ' in the command prompt and I hit tab, it will show the different available completions. If I hit tab again, it will select the first available completion.

I would like to merge these two steps into a single press of the tab key. So, if I'm at 'cd ' and I tab, I would like ZSH to insert the first available match (when ambiguous) and display the menu, which I can then tab through if the first match wasn't the directory I had in mind.

The ZSH setup tool put this in my .zshrc, in case any of this is affecting the behavior of my shell:

zstyle ':completion:*' completer _expand _complete _ignored
zstyle ':completion:*' list-colors ''
zstyle ':completion:*' list-prompt %SAt %p: Hit TAB for more, or the character to insert%s
zstyle ':completion:*' matcher-list 'm:{[:lower:][:upper:]}={[:upper:][:lower:]}' '' 'm:{[:lower:][:upper:]}={[:upper:][:lower:]}'
zstyle ':completion:*' menu select=5
zstyle ':completion:*' select-prompt %SScrolling active: current selection at %p%s
zstyle :compinstall filename '/home/robb/.zshrc'
  • Add this line to your ~/.zshrc: setopt menu_complete See man zshoptions for details.
    – yibe
    Apr 23, 2011 at 17:06

3 Answers 3


Add this line to your ~/.zshrc:

setopt menu_complete

See man zshoptions for details.

  • Can I make it autocomplete the first file first (if there is a matching file and directory)
    – minseong
    Jun 18, 2023 at 21:32

if original question didn't have this in their .zshrc but if you went through the compinstall process, check to make sure that you don't have "_list" on the completer options:

zstyle ':completion:*' completer _expand _complete _ignored _correct _approximate _prefix

With _list, you only get a list of possible completions with the first tab-completion request, and it overrides some solutions.


Make sure you don't have _list set:

I had:

zstyle ':completion:*' completer _list _expand _complete _ignored _match _correct _approximate _prefix

Removing _list had it expand immediately.

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .