From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 5977 invoked by alias); 16 Dec 2014 14:18:59 -0000 Mailing-List: contact zsh-workers-help@zsh.org; run by ezmlm Precedence: bulk X-No-Archive: yes List-Id: Zsh Workers List List-Post: List-Help: X-Seq: 33978 Received: (qmail 24494 invoked from network); 16 Dec 2014 14:18:57 -0000 X-Spam-Checker-Version: SpamAssassin 3.3.2 (2011-06-06) on f.primenet.com.au X-Spam-Level: X-Spam-Status: No, score=-0.5 required=5.0 tests=BAYES_00,RCVD_IN_BRBL_LASTEXT, RCVD_IN_DNSWL_NONE autolearn=no version=3.3.2 X-Biglobe-Sender: From: "Jun T." Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit Subject: accept-and-hold in interactive mode of menu select Message-Id: <6B615901-83A3-41A0-9017-3EFA7EF5CA42@kba.biglobe.ne.jp> Date: Tue, 16 Dec 2014 23:18:16 +0900 To: zsh-workers@zsh.org Mime-Version: 1.0 (Mac OS X Mail 7.3 \(1878.6\)) X-Mailer: Apple Mail (2.1878.6) X-Biglobe-Spnum: 57097 In the interactive mode of menu select, accept-and-hold does not work as I expect. In the worst case, it results in an infinite loop. ### create a file with the following contents: $ cat init zmodload zsh/complist autoload -Uz compinit compinit zstyle ':completion:*' menu on select=2 bindkey '^K' vi-insert bindkey '^L' accept-and-hold ### create a test directory and a few files: $ mkdir test $ touch test/{aaaa,abbb,abbc} ### Start a new shell, and setup menu select: $ zsh -f % source init ### Test-1: % ls test/ >>> hit TAB % ls test/aaaa aaaa abbb abbc abbd >>> hit ^K to go into the interactive mode: % ls test/ interactive: test/[] aaaa* abbb abbc ('*' indicates where the selection in the list) >>> type ab % ls test/ab interactive: test/abb[] abbb* abbc >>> hit ^L % ls test/ab test/abbc abbb abbc* Note that the 1st word on the command line is not updated to test/abbb. ### Test-2: % ls test/{ >>> hit TAB % ls test/{aaaa aaaa* abbb abbc >>> hit ^K % ls test/{ interactive: test/[] aaaa abbb abbc >>> type ab % ls test/{ab interactive: test/{abb[] abbb* abbc >>> hit ^L then zsh goes into an infinite loop; ^C does not work. gdb indicates that it is looping in a "do {...} while(...)" loop at lines 1222-1240 of compresult.c, in function do_menucmp(). It seems the 1st condition in while() is always true; menuacc==1 and hasbrpsfx() always returns 0. It seems the real problem is that, as the Test-1 indicates, accept-and- hold does not update the command line. I tried the patch below, and it does avoid the infinite loop. But it is far from sufficient; for example, the ^L above now gives (as I expect) % ls test/{abbb,abbc but if I hit ^K to go to the interactive mode again, then I get % ls test/{ab diff --git a/Src/Zle/complist.c b/Src/Zle/complist.c index c129940..80f8dd5 100644 --- a/Src/Zle/complist.c +++ b/Src/Zle/complist.c @@ -2790,6 +2790,8 @@ domenuselect(Hookdef dummy, Chdata dat) Menustack s = (Menustack) zhalloc(sizeof(*s)); int ol; + if (mode == MM_INTER) + do_single(*minfo.cur); mode = 0; s->prev = u; u = s;