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

Delaying menu completion


Having decided I like this new ^Xa for expanding all matches, as suggested
by Sven, I've been inspired onto 'greater' things...

Currently I try to avoid menu completion because I prefer the old style of
stopping when an ambiguous expansion is met, and me typing a character to
resolve it. However, menu selection clearly has a significant plus side so
I'd like the option to use either. Essentially I want to complete as normal
on tab (since that's the most efficient way normally), and then press a
different key to drop into menu selection if it'll be easier.

So, what I've done is kept my curent completion settings which don't menu
complete, added the style menu = select, and bound the menu-complete widget
onto a key. In addition to being a really easy change, this does almost
exactly what I want. However,

Problem 1

It falls down with _match and _approximate. These two both launch into menu
selection on their own and I can't seem to stop them. Setting style
insert-unambiguous = yes gets me part of the way there, but they still
won't stop fully. Now obviously these completers are not particularly
useful without menu completion, but the problem here is that I want it to
wait until I ask it to do that - especially with _approximate, since I may
not be looking at the screen (or more likely the computer won't have caught
up with me), and so I'll continue typing without knowing it's entered menu
completion. And when that happens the usual result is a mess (I've had
_approximate in there for a while and almost removed it because of this).

So what I'd like is for _match and _approximate to just list the
possibilities and do nothing else if they've got nothing better to do. Then
I'll invoke menu selection and go from there. The _list completer does
something a little similar but I still want any common prefix etc added,
and I still want _complete to work as normal.

Problem 2

Currently I've bound a function key to menu-complete. However, what I'd
really like is to use the down arrow key. This would have the advantage of
putting me on the arrow keys ready for the menu selection, and seems a
logical way of dropping down on to the list. I only want the down arrow to
do this if there's already a completion list shown, because the rest of the
time I want it to have its normal use (which for me is

So I tried this:

_menu_or_down() {
  if [[ $compstate[old_list] == shown ]]
    zle menu-complete
    zle .history-beginning-search-forward

zle -C menu-or-down menu-complete _menu_or_down
bindkey "^[[B" menu-or-down

This does the test correctly but zsh complains that it isn't in ZLE when
trying to call the original widgets (which surprised me). The first one can
be replaced with _main_complete I guess, but I can't see a way round it for
the second one. Using zle -N etc makes the widget calls work but then the
compstate isn't available for testing...

Any suggestions for this?

Also, the second parameter after zle -C (menu-complete here) - the
documentation says that this is the built in widget it behaves like. I
couldn't understand from the documentation though what exactly this was
used for and why it was needed.



This e-mail message is CONFIDENTIAL and may contain legally privileged
information.  If you are not the intended recipient you should not  read,
copy, distribute, disclose or otherwise use the information in this e-mail.
Please also telephone or fax us immediately and delete the message from
your system.  E-mail may be susceptible to data corruption, interception
and unauthorised amendment, and we do not accept liability for any such
corruption, interception or amendment or the consequences thereof.

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