* Prompt escape sequences. @ 1996-10-01 17:11 Louis Granboulan 1996-10-02 23:18 ` Zoltan Hidvegi 0 siblings, 1 reply; 5+ messages in thread From: Louis Granboulan @ 1996-10-01 17:11 UTC (permalink / raw) To: zsh-workers I wanted to add a new escape sequence %${varname} to print the content of a variable. Looking at putpromptchar, I found some bugs... print -P %2147483648v does a segmentation fault because 2147483648 is translated to a negative number by zstrtol. The patch below corrects this bug. print -P %-%7- outputs '%-%-' instead of '%-%7-'. I did not correct this behaviour. It may be easy to do. print -P 'a\0b' outputs 'a', since \0 ends the string. "print 'a\0b'" does output a null character. I did not correct this behaviour. We may need to rewrite the whole function. *** Src/zle_misc.c.orig Tue Aug 13 22:24:14 1996 --- Src/zle_misc.c Tue Oct 1 19:05:11 1996 *************** *** 859,865 **** putpromptchar(int doprint, int endchar) { char buf3[PATH_MAX], *ss; ! int t0, arg, test, sep; struct tm *tm; time_t timet; Nameddir nd; --- 859,866 ---- putpromptchar(int doprint, int endchar) { char buf3[PATH_MAX], *ss; ! int t0, test, sep; ! unsigned int arg; struct tm *tm; time_t timet; Nameddir nd; *************** *** 894,909 **** case '.': case '~': if ((nd = finddir(ss))) { ! arg--; ss += strlen(nd->dir); } case '/': case 'C': for (; *ss; ss++) if (*ss == '/') ! arg--; ! if (arg <= 0) ! test = 1; break; case 't': case 'T': --- 895,909 ---- case '.': case '~': if ((nd = finddir(ss))) { ! test++; ss += strlen(nd->dir); } case '/': case 'C': for (; *ss; ss++) if (*ss == '/') ! test++; ! test = (arg <= test); break; case 't': case 'T': *************** *** 1230,1235 **** --- 1230,1262 ---- addbufspc(1); *bp++ = (geteuid())? '%' : '#'; break; + case '$': + if (fm[1] != '{') { + *bp++ = '%'; + *bp++ = '$'; + break; + } + else { + char **array, *variable, endname; + fm++; variable = fm+1; + while (*fm && *fm != '}') fm++; + /* We don't need to allocate something for the var name */ + endname = *fm; + *fm = NULL; + if (arg) { + array = getaparam(variable); + variable = NULL; + if ( array && (arrlen(array) >= arg) ) + variable = array[arg-1]; + } + else + variable = getsparam(variable); + stradd(variable ? variable : ""); + *fm = endname; + } + if(!*fm) + return 0; + break; case 'v': if (!arg) arg = 1; *************** *** 1241,1247 **** break; case '_': if (cmdsp) { ! if (arg > cmdsp || arg <= 0) arg = cmdsp; for (t0 = cmdsp - arg; arg--; t0++) { stradd(cmdnames[cmdstack[t0]]); --- 1268,1274 ---- break; case '_': if (cmdsp) { ! if (arg > cmdsp || !arg) arg = cmdsp; for (t0 = cmdsp - arg; arg--; t0++) { stradd(cmdnames[cmdstack[t0]]); *** Doc/zshparam.man.orig Tue Aug 13 22:24:13 1996 --- Doc/zshparam.man Tue Oct 1 19:05:08 1996 *************** *** 579,584 **** --- 579,589 ---- The value of the first element of the $psvar array parameter. Following the '%' with an integer gives that element of the array. .TP + .B %${\fIvarname\fB} + The value of the variable $varname. + Following the '%' with an integer gives that element of the array. + Using the $psvar array is faster. + .TP \fB%{\fP...\fB%}\fP Include a string as a literal escape sequence. The string within the braces should not change the cursor *** Doc/zsh.texi.orig Thu Aug 15 18:47:39 1996 --- Doc/zsh.texi Tue Oct 1 19:09:00 1996 *************** *** 4144,4149 **** --- 4144,4154 ---- Following the @code{%} with an integer gives that element of the array. + @item %$@{@var{varname}@} + The value of the variable @code{varname}. + Following the @code{%} with an integer gives that element of the array. + Using the $psvar array is faster. + @item %@{@dots{}%@} Include a string as a literal escape sequence. The string within the braces should not change the cursor position. ^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: Prompt escape sequences. 1996-10-01 17:11 Prompt escape sequences Louis Granboulan @ 1996-10-02 23:18 ` Zoltan Hidvegi 1996-10-03 6:09 ` Richard Coleman 0 siblings, 1 reply; 5+ messages in thread From: Zoltan Hidvegi @ 1996-10-02 23:18 UTC (permalink / raw) To: Louis Granboulan; +Cc: zsh-workers > I wanted to add a new escape sequence %${varname} to print the > content of a variable. Looking at putpromptchar, I found some > bugs... Thank you for the bugfix. But I really do not see the usefullness of the %${varnane} feature. The same can be achieved using the promptsubst option. The %${...} syntax can create confusion since it is identical to the parameter expansion syntax. > print -P %-%7- > outputs '%-%-' instead of '%-%7-'. > I did not correct this behaviour. > It may be easy to do. I do not think it is a bug. %% should always be used to put a % into the prompt since future versions may introduce new % sequences. After looking at this patch I thought that a new point to the Util/zsh-development-guide might be useful. I think that this should go under Etc. Richard, why did you put it into Util when you created it? 6) Please try not using lines longer than 79 characters. The coding style is Kernighan and Ritchie with 4 characters indentations. This means that the opening brace is the last character in the line of the if/while/for/do statement and the closing brace has its own line: if (foo) { do that } Put only one command in a line (this also means that the body of an if/while/for/do statement has its own line with 4 characters indentation even if there are no braces). Do not use space between the function name and the opening parenthesis. Use space after if/for/while. Use space after type casts. Do not use (unsigned char) casts since some compilers do not handle them properly. Use the provided STOUC(X) macro instead. If you use emacs 19.30 or newer you can put the following line to your ~/.emacs file to make these formatting rules the default: (add-hook 'c-mode-common-hook (function (lambda () (c-set-style "BSD")))) A global function declaration must look like this: /**/ int foo(char *s, char **p) { function body } There must be an empty line, a line with /**/, a line with the type of the function and finally the name of the function with typed arguments. These lines should not be indented. This rule is a must because the script generating function prototypes and the ansi2knr program depends on this format. Zoltan ^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: Prompt escape sequences. 1996-10-02 23:18 ` Zoltan Hidvegi @ 1996-10-03 6:09 ` Richard Coleman 0 siblings, 0 replies; 5+ messages in thread From: Richard Coleman @ 1996-10-03 6:09 UTC (permalink / raw) To: Zoltan Hidvegi; +Cc: zsh-workers > After looking at this patch I thought that a new point to the > Util/zsh-development-guide might be useful. I think that this should go > under Etc. Richard, why did you put it into Util when you created it? I think I originally planned on adding some other developer oriented things to Util, but never got back to that. rc ^ permalink raw reply [flat|nested] 5+ messages in thread
[parent not found: <20071008034223.GA789@primenet.com.au>]
[parent not found: <071007210217.ZM24374@torch.brasslantern.com>]
[parent not found: <20071008042759.GA2413@primenet.com.au>]
* Re: PROMPT escape sequences [not found] ` <20071008042759.GA2413@primenet.com.au> @ 2007-10-08 15:44 ` Bart Schaefer 2007-10-09 3:23 ` Geoff Wing 0 siblings, 1 reply; 5+ messages in thread From: Bart Schaefer @ 2007-10-08 15:44 UTC (permalink / raw) To: zsh-workers [moved to -workers] On Oct 8, 2:27pm, Geoff Wing wrote: } } :PS1='very%Blong%bstring%#%S ' } :The %S effect begins at the %B, not at the point where it should. } } OK, well, it was broken between 4.2.0 and 4.2.1. } Quick surface check and I'd say it looks like zle_refresh.c:1.13 That seems unlikely; there's only a two-line diff in there, and the first of those lines is "if (trashedzle)". zsh-workers/20149 may have been the culprit, but I don't see anything else from around July 2004 that meddles with prompts. ^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: PROMPT escape sequences 2007-10-08 15:44 ` PROMPT " Bart Schaefer @ 2007-10-09 3:23 ` Geoff Wing 0 siblings, 0 replies; 5+ messages in thread From: Geoff Wing @ 2007-10-09 3:23 UTC (permalink / raw) To: Zsh Hackers On Tuesday 2007-10-09 01:45 +1000, Bart Schaefer output: :On Oct 8, 2:27pm, Geoff Wing wrote: :} :PS1='very%Blong%bstring%#%S ' :} :The %S effect begins at the %B, not at the point where it should. :} OK, well, it was broken between 4.2.0 and 4.2.1. :} Quick surface check and I'd say it looks like zle_refresh.c:1.13 :That seems unlikely; there's only a two-line diff in there, and the first :of those lines is "if (trashedzle)". :zsh-workers/20149 may have been the culprit, but I don't see anything :else from around July 2004 that meddles with prompts. I don't use anything that needs to reexpand the prompt in-place, so I'm not entirely sure this covers all that is needed. Regards, Geoff --- Src/Zle/zle_main.c.org 2007-10-09 11:56:26.000000000 +1000 +++ Src/Zle/zle_main.c 2007-10-09 13:00:22.000000000 +1000 @@ -1678,8 +1678,10 @@ reexpandprompt(void) if (!reexpanding++) { free(lpromptbuf); lpromptbuf = promptexpand(raw_lp ? *raw_lp : NULL, 1, NULL, NULL); + pmpt_attr = txtchange; free(rpromptbuf); rpromptbuf = promptexpand(raw_rp ? *raw_rp : NULL, 1, NULL, NULL); + rpmpt_attr = txtchange; } reexpanding--; } --- Src/Zle/zle_refresh.c.org 2007-10-09 11:56:26.000000000 +1000 +++ Src/Zle/zle_refresh.c 2007-10-09 13:11:04.000000000 +1000 @@ -413,6 +413,23 @@ snextline(Rparams rpms) rpms->sen = rpms->s + winw; } +/**/ +static void +settextattributes(void) +{ + if (txtchangeisset(TXTNOBOLDFACE)) + tsetcap(TCALLATTRSOFF, 0); + if (txtchangeisset(TXTNOSTANDOUT)) + tsetcap(TCSTANDOUTEND, 0); + if (txtchangeisset(TXTNOUNDERLINE)) + tsetcap(TCUNDERLINEEND, 0); + if (txtchangeisset(TXTBOLDFACE)) + tsetcap(TCBOLDFACEBEG, 0); + if (txtchangeisset(TXTSTANDOUT)) + tsetcap(TCSTANDOUTBEG, 0); + if (txtchangeisset(TXTUNDERLINE)) + tsetcap(TCUNDERLINEBEG, 0); +} /**/ mod_export void @@ -429,11 +446,9 @@ zrefresh(void) int tmpcs, tmpll; /* ditto cursor position and line length */ int tmpalloced; /* flag to free tmpline when finished */ int remetafy; /* flag that zle line is metafied */ + int fixprompt; /* we still need to reexpand the prompt */ struct rparams rpms; - if (trashedzle) - reexpandprompt(); - /* If this is called from listmatches() (indirectly via trashzle()), and * * that was called from the end of zrefresh(), then we don't need to do * * anything. All this `inlist' code is actually unnecessary, but it * @@ -525,6 +540,7 @@ zrefresh(void) listshown = 0; } #endif + fixprompt = trashedzle; resetvideo(); resetneeded = 0; /* unset */ oput_rpmpt = 0; /* no right-prompt currently on screen */ @@ -533,6 +549,8 @@ zrefresh(void) tsetcap(TCALLATTRSOFF, 0); tsetcap(TCSTANDOUTEND, 0); tsetcap(TCUNDERLINEEND, 0); + /* cheat on attribute unset */ + txtunset(TXTBOLDFACE|TXTSTANDOUT|TXTUNDERLINE|TXTDIRTY); if (!clearflag) { if (tccan(TCCLEAREOD)) @@ -544,26 +562,17 @@ zrefresh(void) } if (t0 > -1) olnct = (t0 < winh) ? t0 : winh; + if (fixprompt) + reexpandprompt(); if (termflags & TERM_SHORT) vcs = 0; - else if (!clearflag && lpromptbuf[0]) { + else if (!clearflag && lpromptbuf[0]) { zputs(lpromptbuf, shout); if (lpromptwof == winw) zputs("\n", shout); /* works with both hasam and !hasam */ } else { txtchange = pmpt_attr; - if (txtchangeisset(TXTNOBOLDFACE)) - tsetcap(TCALLATTRSOFF, 0); - if (txtchangeisset(TXTNOSTANDOUT)) - tsetcap(TCSTANDOUTEND, 0); - if (txtchangeisset(TXTNOUNDERLINE)) - tsetcap(TCUNDERLINEEND, 0); - if (txtchangeisset(TXTBOLDFACE)) - tsetcap(TCBOLDFACEBEG, 0); - if (txtchangeisset(TXTSTANDOUT)) - tsetcap(TCSTANDOUTBEG, 0); - if (txtchangeisset(TXTUNDERLINE)) - tsetcap(TCUNDERLINEBEG, 0); + settextattributes(); } if (clearflag) { zputc(ZWC('\r')); @@ -872,20 +881,8 @@ individually */ /* reset character attributes */ if (clearf && postedit) { - if ((txtchange = pmpt_attr ? pmpt_attr : rpmpt_attr)) { - if (txtchangeisset(TXTNOBOLDFACE)) - tsetcap(TCALLATTRSOFF, 0); - if (txtchangeisset(TXTNOSTANDOUT)) - tsetcap(TCSTANDOUTEND, 0); - if (txtchangeisset(TXTNOUNDERLINE)) - tsetcap(TCUNDERLINEEND, 0); - if (txtchangeisset(TXTBOLDFACE)) - tsetcap(TCBOLDFACEBEG, 0); - if (txtchangeisset(TXTSTANDOUT)) - tsetcap(TCSTANDOUTBEG, 0); - if (txtchangeisset(TXTUNDERLINE)) - tsetcap(TCUNDERLINEBEG, 0); - } + if ((txtchange = pmpt_attr ? pmpt_attr : rpmpt_attr)) + settextattributes(); } clearf = 0; oput_rpmpt = put_rpmpt; ^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2007-10-09 3:23 UTC | newest] Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 1996-10-01 17:11 Prompt escape sequences Louis Granboulan 1996-10-02 23:18 ` Zoltan Hidvegi 1996-10-03 6:09 ` Richard Coleman [not found] <20071008034223.GA789@primenet.com.au> [not found] ` <071007210217.ZM24374@torch.brasslantern.com> [not found] ` <20071008042759.GA2413@primenet.com.au> 2007-10-08 15:44 ` PROMPT " Bart Schaefer 2007-10-09 3:23 ` Geoff Wing
Code repositories for project(s) associated with this public inbox https://git.vuxu.org/mirror/zsh/ This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).