From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 14298 invoked from network); 24 Aug 2001 08:16:59 -0000 Received: from sunsite.dk (130.225.51.30) by ns1.primenet.com.au with SMTP; 24 Aug 2001 08:16:59 -0000 Received: (qmail 16053 invoked by alias); 24 Aug 2001 08:16:51 -0000 Mailing-List: contact zsh-workers-help@sunsite.dk; run by ezmlm Precedence: bulk X-No-Archive: yes X-Seq: 15703 Received: (qmail 16042 invoked from network); 24 Aug 2001 08:16:50 -0000 From: Sven Wischnowsky MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit Message-ID: <15238.3399.455051.715190@gargle.gargle.HOWL> Date: Fri, 24 Aug 2001 10:16:07 +0200 To: zsh-workers@sunsite.dk Subject: Working with the historywords special parameter In-Reply-To: <20010824065417.34532.qmail@web10408.mail.yahoo.com> References: <20010824065417.34532.qmail@web10408.mail.yahoo.com> X-Mailer: VM 6.92 under 21.1 (patch 3) "Acadia" XEmacs Lucid Felix Rosencrantz wrote: > I'm trying to create a completer that uses the previous word on the line > and the special parameter historywords to determine what values current > word should be. > > It looks to me like there is no single expression that can be used to > get just the list of all the elements that match an expression from an > array. It seems like you need to iterate over the elements of an array > via an expression like: > > #the_word is $words[CURRENT-1] > cnt=2 > words=() > while [[ $historywords[(in:cnt:)the_word] -lt $#historywords ]] ; do > words=($words $historywords[$historywords[(in:cnt:)the_word]-1] > let "cnt = cnt + 1" > done > > Is there a faster way to do this? I don't see anything faster than: local i length cnt=2 words hist words=() hist=($historywords) length=$#hist while (( ( i=$hist[(in:cnt++:)$the_word] ) <= length )); do words=($words $hist[i-1]) done Maybe ${(Mk)historywords:#$the_word} should expand to the list of the indices of the words equal to $the_word. > ... > > Would anyone object to a new special parameter (maybe historywordsnums) > that has corresponding elements to historywords saying with which > history line the word is associated? I ask since one of the problems > with this completer is that it picks up false "matches" when the > previous word is the last word of a previous command, it gets the next command. > > It would be nice to be able to determine if a word is the last word of > the line, or what the first word of the line is. Or maybe give that new array another name and let it report not only the line but also other information, e.g. the position on the line (word number and character positions so that that could be used to index into the values of the history assoc). Bye Sven -- Sven Wischnowsky wischnow@informatik.hu-berlin.de