From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 6172 invoked from network); 26 Jul 2006 16:38:39 -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; 26 Jul 2006 16:38:39 -0000 Received-SPF: none (ns1.primenet.com.au: domain at sunsite.dk does not designate permitted sender hosts) Received: (qmail 94185 invoked from network); 26 Jul 2006 16:38:33 -0000 Received: from sunsite.dk (130.225.247.90) by a.mx.sunsite.dk with SMTP; 26 Jul 2006 16:38:33 -0000 Received: (qmail 22087 invoked by alias); 26 Jul 2006 16:38:21 -0000 Mailing-List: contact zsh-users-help@sunsite.dk; run by ezmlm Precedence: bulk X-No-Archive: yes X-Seq: 10550 Received: (qmail 22078 invoked from network); 26 Jul 2006 16:38:21 -0000 Received: from news.dotsrc.org (HELO a.mx.sunsite.dk) (130.225.247.88) by sunsite.dk with SMTP; 26 Jul 2006 16:38:20 -0000 Received: (qmail 92548 invoked from network); 26 Jul 2006 16:38:20 -0000 Received: from cluster-c.mailcontrol.com (168.143.177.190) by a.mx.sunsite.dk with SMTP; 26 Jul 2006 16:38:19 -0000 Received: from cameurexb01.EUROPE.ROOT.PRI ([62.189.241.200]) by rly12c.srv.mailcontrol.com (MailControl) with ESMTP id k6QGcDh4000434 for ; Wed, 26 Jul 2006 17:38:16 +0100 Received: from news01.csr.com ([10.103.143.38]) by cameurexb01.EUROPE.ROOT.PRI with Microsoft SMTPSVC(6.0.3790.1830); Wed, 26 Jul 2006 17:38:14 +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 k6QGcEWZ010501 for ; Wed, 26 Jul 2006 17:38:14 +0100 Received: from csr.com (pws@localhost) by news01.csr.com (8.13.4/8.13.4/Submit) with ESMTP id k6QGcE7E010498 for ; Wed, 26 Jul 2006 17:38:14 +0100 Message-Id: <200607261638.k6QGcE7E010498@news01.csr.com> X-Authentication-Warning: news01.csr.com: pws owned process doing -bs To: zsh-users@sunsite.dk (Zsh users list) Subject: Menu-driven version of history-beginning-search-backward Date: Wed, 26 Jul 2006 17:38:13 +0100 From: Peter Stephenson X-OriginalArrivalTime: 26 Jul 2006 16:38:14.0326 (UTC) FILETIME=[E3CE9D60:01C6B0D1] Content-Type: text/plain MIME-Version: 1.0 X-Scanned-By: MailControl A-07-00-11 (www.mailcontrol.com) on 10.67.0.122 I was too lazy to search the mailing list archive for anything like this, but in any case it would be good to have something like it in the distribution. It would be easy to expand it to allow patterns on the command line, but it's going a little beyond the original intention. #Start # 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. emulate -L zsh setopt extendedglob zmodload -i zsh/parameter local -aU matches local -a display if (( ${+NUMERIC} )); then matches=(${history[(R)*${(q)LBUFFER}*]}) else matches=(${history[(R)${(q)LBUFFER}*]}) 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