diff -r -X skiplist -U 3 zsh/Src/zle.h /home/marvin/src/zsh/Src/zle.h --- zsh/Src/zle.h Wed Jul 22 13:26:22 1998 +++ /home/marvin/src/zsh/Src/zle.h Fri Jul 24 12:27:28 1998 @@ -36,6 +36,12 @@ #endif #ifdef ZLE + +/* Number of tabs in a sequence needed to show completionlist */ +#define TABS_REQUIRED 2 + +/* Number of tabs pressed in sequence */ +ZLEXTERN int tabcount; /* size of line buffer */ ZLEXTERN int linesz; diff -r -X skiplist -U 3 zsh/Src/zle_main.c /home/marvin/src/zsh/Src/zle_main.c --- zsh/Src/zle_main.c Wed Jul 22 13:26:23 1998 +++ /home/marvin/src/zsh/Src/zle_main.c Fri Jul 24 12:27:28 1998 @@ -360,6 +360,7 @@ tv.tv_sec = 0; #endif + tabcount = 0; keytimeout = getiparam("KEYTIMEOUT"); if (!shout) { if (SHTTY != -1) diff -r -X skiplist -U 3 zsh/Src/zle_tricky.c /home/marvin/src/zsh/Src/zle_tricky.c --- zsh/Src/zle_tricky.c Wed Jul 22 13:26:23 1998 +++ /home/marvin/src/zsh/Src/zle_tricky.c Fri Jul 24 12:27:29 1998 @@ -2994,6 +2994,8 @@ { if(showinglist == -2) listmatches(); + else + tabcount = 0; if(validlist) { freearray(amatches); zsfree(rpre); @@ -3177,9 +3179,10 @@ } /* At this point, we might want a completion listing. Show the listing * * if it is needed. */ - if (isset(LISTBEEP)) + if (isset(LISTBEEP) && tabcount==0) feep(); - if (isset(AUTOLIST) && !amenu && !showinglist) + if ( (isset(AUTOLIST) || (tabcount++ == TABS_REQUIRED-1)) + && !amenu && !showinglist) showinglist = -2; if(inv) invalidatelist();