Zsh Mailing List Archive
Messages sorted by: Reverse Date, Date, Thread, Author

Re: starting <tab> completion / command history

On Aug 11, 11:11pm, Sebastian Tramp wrote:
} Is there a way to map a <tab> at the beginning of a command line to a
} completion function?

What you need to do is bind tab to a non-completion zle widget so you
can examine the cursor position, then invoke the appropriate completion
widget depending on where you are.

    overload-tab () {
      if (( CURSOR < 1 ))
      then zle your-new-widget
      else zle expand-or-complete
    zle -N overload-tab
    bindkey $'\t' overload-tab

Next of course you need to define your-new-widget.

} I want to use it to complete full command lines which I save as a
} history for each directory so that I can re-use commonly executed
} commands (incl. parameters) for a specific directory.

The problem with this scheme is that completion is EXTREMELY word-
oriented.  As soon as you introduce a command line containing spaces
and/or quotes and/or punctuation, completion is likely to become very

I've actually implemented something basically like this and the only
way I got it to work reasonably reliably was (a) bind it to something
other than TAB and (b) force it directly into menu selection so you
have to choose the command by navigation.  It's pretty simple and
looks like this:

-- 8< -- snip -- 8< --
#compdef -k menu-complete ^X:
zmodload -i zsh/complist
_cmdselect() {
local -a commands
commands=(${(f)"$(< ~/.cmdselect)"})
compadd -Qa commands
_cmdselect "$@"
-- 8< -- snip -- 8< --

Note the #compdef line to automatically bind this to ctrl-x colon.
Also note the use of compadd -Q to insert the selection without turning
into a monolithic quoted word.

Messages sorted by: Reverse Date, Date, Thread, Author