Zsh Mailing List Archive
Messages sorted by: Reverse Date, Date, Thread, Author

Re: functions in prompts evaluated twice?



[Redirected to -workers]

On Mar 9, 12:56pm, Frank Terbeck wrote:
}
} I was about to use the output of a function in my prompt, when I
} noticed, that it was evaluated twice.

That's definitely new in 4.3.x.  The first time it's expanded is here:

[...]
#12 0x080aa9b7 in promptexpand (s=0xb7d281d8 "", ns=1, rs=0x0, Rs=0x0)
    at ../../zsh-4.3/Src/prompt.c:170
#13 0x0811a8ed in zleread (lp=0x8166a48, rp=0x0, flags=3, context=0)
    at ../../../zsh-4.3/Src/Zle/zle_main.c:1135
#14 0x0807c541 in inputline () at ../../zsh-4.3/Src/input.c:278
#15 0x0807c3f8 in ingetc () at ../../zsh-4.3/Src/input.c:214
#16 0x08072eca in ihgetc () at ../../zsh-4.3/Src/hist.c:240
#17 0x08083bbf in gettok () at ../../zsh-4.3/Src/lex.c:663
#18 0x0808349f in yylex () at ../../zsh-4.3/Src/lex.c:350
#19 0x0809daf8 in parse_event () at ../../zsh-4.3/Src/parse.c:451
#20 0x0807926e in loop (toplevel=1, justonce=0) at ../../zsh-4.3/Src/init.c:129
#21 0x0807c041 in zsh_main (argc=2, argv=0xbff9c9d4)


The second time is here:

[...]
#12 0x080aa9b7 in promptexpand (s=0xb7d282c0 "", ns=1, rs=0x0, Rs=0x0)
    at ../../zsh-4.3/Src/prompt.c:170
#13 0x0811c52e in reexpandprompt () at ../../../zsh-4.3/Src/Zle/zle_main.c:1702
#14 0x081218b4 in zrefresh () at ../../../zsh-4.3/Src/Zle/zle_refresh.c:554
#15 0x0811ab26 in zleread (lp=0x8166a48, rp=0x0, flags=3, context=0)
    at ../../../zsh-4.3/Src/Zle/zle_main.c:1181
#16 0x0807c541 in inputline () at ../../zsh-4.3/Src/input.c:278
#17 0x0807c3f8 in ingetc () at ../../zsh-4.3/Src/input.c:214
#18 0x08072eca in ihgetc () at ../../zsh-4.3/Src/hist.c:240
#19 0x08083bbf in gettok () at ../../zsh-4.3/Src/lex.c:663
#20 0x0808349f in yylex () at ../../zsh-4.3/Src/lex.c:350
#21 0x0809daf8 in parse_event () at ../../zsh-4.3/Src/parse.c:451
#22 0x0807926e in loop (toplevel=1, justonce=0) at ../../zsh-4.3/Src/init.c:129
#23 0x0807c041 in zsh_main (argc=2, argv=0xbff9c9d4)


The fix is *either* to clear trashedzle in zleread(), or to *set* trashedzle
in zleread() and remove the stuff that computes the prompt there.  However,
I'm a unsure of which to do, because reexpandprompt() doesn't do all the
same steps as zleread().  However, I tried the latter approach and got a
core dump, so here's a short patch that does the former.  The second hunk
is cosmetic.

Index: Src/Zle/zle_main.c
--- zsh-forge/current/Src/Zle/zle_main.c	2008-02-16 08:22:31.000000000 -0800
+++ Src/Zle/zle_main.c	2008-03-09 09:12:20.000000000 -0700
@@ -1131,6 +1131,7 @@
     eofsent = 0;
     resetneeded = 0;
     fetchttyinfo = 0;
+    trashedzle = 0;
     raw_lp = lp;
     lpromptbuf = promptexpand(lp ? *lp : NULL, 1, NULL, NULL);
     pmpt_attr = txtchange;
@@ -1721,7 +1722,8 @@
 /**/
 mod_export void
 zle_resetprompt(void)
-{   reexpandprompt();
+{
+    reexpandprompt();
     if (zleactive)
         redisplay(NULL);
 }



Messages sorted by: Reverse Date, Date, Thread, Author