From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 26213 invoked from network); 28 May 2001 05:25:26 -0000 Received: from sunsite.dk (130.225.51.30) by ns1.primenet.com.au with SMTP; 28 May 2001 05:25:26 -0000 Received: (qmail 20699 invoked by alias); 28 May 2001 05:25:16 -0000 Mailing-List: contact zsh-workers-help@sunsite.dk; run by ezmlm Precedence: bulk X-No-Archive: yes X-Seq: 14497 Received: (qmail 20680 invoked from network); 28 May 2001 05:25:14 -0000 From: "Bart Schaefer" Message-Id: <1010528052358.ZM1986@candle.brasslantern.com> Date: Mon, 28 May 2001 05:23:58 +0000 X-Mailer: Z-Mail (5.0.0 30July97) To: zsh-workers@sunsite.dk Subject: A tweak to magic-space MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii I believe I mentioned this in a previous posting ... I've been using this function: magic-space() { [[ "$LBUFFER" = (|*[^\\])!\"* ]] && zle .self-insert || zle .magic-space } zle -N magic-space This means that if the current input line contains !" to the left of the insertion point, history is not expanded upon typing a space. This is all very well and good, but it makes using `set -x' an incredible pain, because the trace of the above function keeps popping out in place of every space I type. (Maybe we need an inverse of `typeset -ft' ... though, oddly, execution tracing set only with `typeset -ft' does NOT happen when widgets are called directly by ZLE, which is probably a bug.) The following patch puts the equivalent of the above into the C code. I won't commit it until after 4.0.1 is released, unless enough somebodies say I should. However, if any of you try it, I could use some feedback on whether it's better to test for !" only in LBUFFER, or whether to test all of $BUFFER (that is, drop the `bangq + 2 > line + cs' test in the C version). I go back and forth ... --- zsh-forge/current/Src/Zle/zle_tricky.c Thu May 17 08:48:46 2001 +++ zsh-4.0/Src/Zle/zle_tricky.c Thu May 24 01:15:32 2001 @@ -2239,9 +2239,13 @@ int magicspace(char **args) { + char *bangq; int ret; c = ' '; - if (!(ret = selfinsert(args))) + for (bangq = (char *)line; (bangq = strchr(bangq, bangchar)); bangq += 2) + if (bangq[1] == '"' && (bangq == (char *)line || bangq[-1] != '\\')) + break; + if (!(ret = selfinsert(args)) && (!bangq || bangq + 2 > (char *)line + cs)) doexpandhist(); return ret; } -- Bart Schaefer Brass Lantern Enterprises http://www.well.com/user/barts http://www.brasslantern.com Zsh: http://www.zsh.org | PHPerl Project: http://phperl.sourceforge.net