From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 2653 invoked from network); 31 May 1999 09:20:30 -0000 Received: from sunsite.auc.dk (130.225.51.30) by ns1.primenet.com.au with SMTP; 31 May 1999 09:20:30 -0000 Received: (qmail 12414 invoked by alias); 31 May 1999 09:20:14 -0000 Mailing-List: contact zsh-workers-help@sunsite.auc.dk; run by ezmlm Precedence: bulk X-No-Archive: yes X-Seq: 6379 Received: (qmail 12401 invoked from network); 31 May 1999 09:20:12 -0000 From: "Bart Schaefer" Message-Id: <990531092002.ZM4475@candle.brasslantern.com> Date: Mon, 31 May 1999 09:20:02 +0000 In-Reply-To: <374DBCEE.69426B26@linna.com> Comments: In reply to Nik Gervae "The mystery of deferred prompt evaluation" (May 27, 2:45pm) References: <374DBCEE.69426B26@linna.com> X-Mailer: Z-Mail (5.0.0 30July97) To: nik@linna.com, zsh-workers@sunsite.auc.dk Subject: Re: The mystery of deferred prompt evaluation MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii On May 27, 2:45pm, Nik Gervae wrote: } Subject: The mystery of deferred prompt evaluation } } PROMPT_LEN=3 } PROMPT_DYN='%${PROMPT_LEN}C' } PROMPT='%0(#..)${PROMPT_DYN}% ' } } I get the really cool feature of being able to change PROMPT_LEN at } any point and having my prompt adjust how much of my path it shows. } Oddly enough, this only works if I put the %(...) construct before } the parameter reference in the prompt, if that isn't there then my } prompt ends up being the literal text of the definition, with the } parameter not getting expanded. I might add that in 3.1.5 the latter } behavior is always the case (which I when I first noticed this). You're making use of an undocumented (mis)feature. You've relied on two levels of parameter expansion, which you're getting in 3.0.x only by accident. } Does anyone know: } } a) Why I shouldn't be able to defer parameter expansion in my } prompts in general? You should, by use of the PROMPT_SUBST option, which you must have set for any of this to happen even in 3.0.x. What you can't expect is that the expansion of a parameter is re-expanded when it happens to have a $ in it, unless you tell zsh to do so. } b) Why in 3.0.5 it works with %(...) before the parameter } but not without? } c) Why it doesn't work at all, ever, in 3.1.5? The 3.0.x prompt code calls itself recursively when it encounters a %( ) construct, which causes the PROMPT_SUBST option to be applied twice (or more, if the nesting is deeper). This was not supposed to happen, and in fact is a bug if you're trying to get a prompt that contains a $ or other special character. Prompt display has been completely rewritten for 3.1.5, so this no longer occurs. } d) How I can get this behavior back? :-) Use the (e) parameter flag, like so: PROMPT_LEN=3 PROMPT_DYN='%${PROMPT_LEN}C' PROMPT='${(e)PROMPT_DYN}% ' Or simply eliminate one level of indirection: PROMPT_LEN=3 PROMPT='%${PROMPT_LEN}C% ' -- Bart Schaefer Brass Lantern Enterprises http://www.well.com/user/barts http://www.brasslantern.com