From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 5734 invoked from network); 27 Jul 2006 16:53:40 -0000 X-Spam-Checker-Version: SpamAssassin 3.1.3 (2006-06-01) on f.primenet.com.au X-Spam-Level: X-Spam-Status: No, score=-2.3 required=5.0 tests=AWL,BAYES_00, FORGED_RCVD_HELO,SUBJ_HAS_UNIQ_ID autolearn=ham version=3.1.3 Received: from news.dotsrc.org (HELO a.mx.sunsite.dk) (130.225.247.88) by ns1.primenet.com.au with SMTP; 27 Jul 2006 16:53:40 -0000 Received-SPF: none (ns1.primenet.com.au: domain at sunsite.dk does not designate permitted sender hosts) Received: (qmail 62828 invoked from network); 27 Jul 2006 16:53:31 -0000 Received: from sunsite.dk (130.225.247.90) by a.mx.sunsite.dk with SMTP; 27 Jul 2006 16:53:31 -0000 Received: (qmail 16265 invoked by alias); 27 Jul 2006 16:53:24 -0000 Mailing-List: contact zsh-users-help@sunsite.dk; run by ezmlm Precedence: bulk X-No-Archive: yes X-Seq: 10556 Received: (qmail 16256 invoked from network); 27 Jul 2006 16:53:23 -0000 Received: from news.dotsrc.org (HELO a.mx.sunsite.dk) (130.225.247.88) by sunsite.dk with SMTP; 27 Jul 2006 16:53:23 -0000 Received: (qmail 61817 invoked from network); 27 Jul 2006 16:53:23 -0000 Received: from cluster-c.mailcontrol.com (168.143.177.190) by a.mx.sunsite.dk with SMTP; 27 Jul 2006 16:53:21 -0000 Received: from cameurexb01.EUROPE.ROOT.PRI ([62.189.241.200]) by rly23c.srv.mailcontrol.com (MailControl) with ESMTP id k6RGrHOV018854 for ; Thu, 27 Jul 2006 17:53:17 +0100 Received: from news01.csr.com ([10.103.143.38]) by cameurexb01.EUROPE.ROOT.PRI with Microsoft SMTPSVC(6.0.3790.1830); Thu, 27 Jul 2006 17:53:17 +0100 Received: from news01.csr.com (localhost.localdomain [127.0.0.1]) by news01.csr.com (8.13.4/8.13.4) with ESMTP id k6RGrDnZ003553 for ; Thu, 27 Jul 2006 17:53:13 +0100 Received: from csr.com (pws@localhost) by news01.csr.com (8.13.4/8.13.4/Submit) with ESMTP id k6RGrCIk003550 for ; Thu, 27 Jul 2006 17:53:13 +0100 Message-Id: <200607271653.k6RGrCIk003550@news01.csr.com> X-Authentication-Warning: news01.csr.com: pws owned process doing -bs To: zsh-users@sunsite.dk (Zsh users list) Subject: Re: Menu-driven version of history-beginning-search-backward In-reply-to: References: <200607261638.k6QGcE7E010498@news01.csr.com> Date: Thu, 27 Jul 2006 17:53:12 +0100 From: Peter Stephenson X-OriginalArrivalTime: 27 Jul 2006 16:53:17.0178 (UTC) FILETIME=[285CA5A0:01C6B19D] Content-Type: text/plain MIME-Version: 1.0 X-Scanned-By: MailControl A-07-00-10 (www.mailcontrol.com) on 10.67.0.133 "Felix Rosencrantz" wrote: > I tried this function. One problem is it doesn't seem to work if the > line (your search string) contains a space. Grrr... the quoting of patterns in associative array subscripts is screwy. You *can* quote the pattern characters, but if you quote any other characters too they stay quoted. I've tried to quote only pattern characters. This isn't very programmer-friendly. > It would be nice if the > user says "foo bar" it matches lines that matches line that match > foo*bar I've done it so you do this by including "-space" in the name of the widget. #BEGIN # Menu-driven alternative to history-beginning-search-backward. # As it uses a menu there is no sense of "forward" or "backward", however; # the entire history is searched. # # Configuration: # autoload -U history-beginning-search-menu # zle -N history-beginning-search-menu # bindkey '\eP' history-beginning-search-menu # # Example: # % /bin/su # Enter digit: # 1 /bin/su -c 'make install' 4 /bin/su - perforce # 2 /bin/su 5 /bin/su -c # 3 /bin/su -c 'chown pws:pws **/*(u0)' # # Typing "1" expands the line to # % /bin/su -c 'make install' # # With a prefix argument, the search is not anchored to the beginning, # so for example "/su" could expand to "p4 files //depot/support/..." # # If this is bound to a widget containing "-end", e.g. # zle -N history-beginning-search-menu-end history-beginning-search-menu # then the cursor is put at the end of the line, else it is left # after the matched characters. # # If this is bound to a widget containing "-space", then any space in # the line so far is matched as a wildcard. (This means putting a space # at the start of the line is equivalent to specifying a prefix # argument.) emulate -L zsh setopt extendedglob zmodload -i zsh/parameter local -aU matches local -a display local search=$LBUFFER if [[ $WIDGET = *-space* ]]; then search=${search//(#m)[*?#<>]/\\$MATCH/} search=${search// /*} fi if (( ${+NUMERIC} )); then matches=(${(o)history[(R)*${search}*]}) else matches=(${(o)history[(R)${search}*]}) fi # Filter out any match that's the same as the original. # Note this isn't a pattern this time. matches=(${matches:#${LBUFFER}}) integer n=${#matches} integer width=${#n} (( n == 0 )) && return 1 # Hey, this works... integer i display=(${matches/(#m)*/${(l.$width..0.):-$((++i))} $MATCH}) zle -R "Enter digit${${width##1}:+s}:" $display local chars read -k$width chars if [[ $chars != [[:digit:]]## || $chars -eq 0 || $chars -gt $n ]]; then return 1 fi if [[ $WIDGET = *-end* ]]; then LBUFFER=${matches[$chars]} RBUFFER= else integer newcursor if (( ${+NUMERIC} )); then # Advance cursor so that it's still after the string typed local -a match mbegin mend if [[ $matches[$chars] = (#b)(*${LBUFFER})* ]]; then newcursor=${#match[1]} fi fi BUFFER=${matches[$chars]} (( newcursor )) && CURSOR=$newcursor fi #END -- Peter Stephenson Software Engineer CSR PLC, Churchill House, Cambridge Business Park, Cowley Road Cambridge, CB4 0WZ, UK Tel: +44 (0)1223 692070 To access the latest news from CSR copy this link into a web browser: http://www.csr.com/email_sig.php