1
0
Fork 0
mirror of git://git.code.sf.net/p/zsh/code synced 2025-09-04 10:41:11 +02:00

28530: replace (z+opts+) flag with (Z:opts:), add reserved (_🎏).

This commit is contained in:
Bart Schaefer 2010-12-15 04:05:50 +00:00
parent ef5cf45780
commit 66152e8ada
4 changed files with 63 additions and 25 deletions

View file

@ -1,3 +1,8 @@
2010-12-14 Barton E. Schaefer <schaefer@zsh.org>
* 28530: Doc/Zsh/expn.yo, Src/subst.c, Test/D04parameter.ztst:
replace (z+opts+) flag with (Z:opts:), add reserved (_:flags:).
2010-12-14 Peter Stephenson <pws@csr.com>
* unposted: Src/lex.c: another neatening of lexflags use for
@ -13958,5 +13963,5 @@
*****************************************************
* This is used by the shell to define $ZSH_PATCHLEVEL
* $Revision: 1.5151 $
* $Revision: 1.5152 $
*****************************************************

View file

@ -1009,18 +1009,6 @@ find the words, i.e. taking into account any quoting in the value.
Comments are not treated specially but as ordinary strings, similar
to interactive shells with the tt(INTERACTIVE_COMMENTS) option unset.
The flag can take a combination of option letters between a following
pair of `tt(PLUS())' characters. tt(LPAR()z+PLUS()c+PLUS()RPAR())
causes comments to be parsed as a string and retained; any field in the
resulting array beginning with an unquoted comment character is a
comment. tt(LPAR()z+PLUS()C+PLUS()RPAR()) causes comments to be parsed
and removed. The rule for comments is standard: anything between a word
starting with the third charcter of tt($HISTCHARS), default tt(#), up to
the next newline is a comment. tt(LPAR()z+PLUS()n+PLUS()RPAR()) causes
unquoted newlines to be treated as ordinary whitespace, else they are
treated as if they are shell code delimiters and converted to
semicolons.
Note that this is done very late, as for the `tt((s))' flag. So to
access single words in the result, one has to use nested expansions as
in `tt(${${(z)foo}[2]})'. Likewise, to remove the quotes in the
@ -1129,6 +1117,25 @@ produces two lines of output for tt(one) and tt(three) and elides the
empty field. To override this behaviour, supply the "(@)" flag as well,
i.e. tt("${(@s.:.)line}").
)
item(tt(Z:)var(opts)tt(:))(
As tt(z) but takes a combination of option letters between a following
pair of delimiter characters. tt(LPAR()Z+PLUS()c+PLUS()RPAR())
causes comments to be parsed as a string and retained; any field in the
resulting array beginning with an unquoted comment character is a
comment. tt(LPAR()Z+PLUS()C+PLUS()RPAR()) causes comments to be parsed
and removed. The rule for comments is standard: anything between a word
starting with the third character of tt($HISTCHARS), default tt(#), up to
the next newline is a comment. tt(LPAR()Z+PLUS()n+PLUS()RPAR()) causes
unquoted newlines to be treated as ordinary whitespace, else they are
treated as if they are shell code delimiters and converted to
semicolons.
)
item(tt(_:)var(flags)tt(:))(
The underscore (tt(_)) flag is reserved for future use. As of this
revision of zsh, there are no valid var(flags); anything following an
underscore, other than an empty pair of delimiters, is treated as an
error, and the flag itself has no effect.
)
enditem()
The following flags are meaningful with the tt(${)...tt(#)...tt(}) or

View file

@ -1936,10 +1936,15 @@ paramsubst(LinkList l, LinkNode n, char **str, int qt, int ssub)
case 'z':
shsplit = LEXFLAGS_ACTIVE;
if (s[1] == '+') {
s += 2;
while (*s && *s != '+' && *s != ')' && *s != Outpar) {
switch (*s++) {
break;
case 'Z':
t = get_strarg(++s, &arglen);
if (*t) {
sav = *t;
*t = 0;
while (*++s) {
switch (*s) {
case 'c':
/* Parse and keep comments */
shsplit |= LEXFLAGS_COMMENTS_KEEP;
@ -1956,12 +1961,14 @@ paramsubst(LinkList l, LinkNode n, char **str, int qt, int ssub)
break;
default:
goto flagerr;
*t = sav;
goto flagerr;
}
}
if (*s != '+')
goto flagerr;
}
*t = sav;
s = t + arglen - 1;
} else
goto flagerr;
break;
case 'u':
@ -1973,6 +1980,25 @@ paramsubst(LinkList l, LinkNode n, char **str, int qt, int ssub)
evalchar = 1;
break;
case '_':
t = get_strarg(++s, &arglen);
if (*t) {
sav = *t;
*t = 0;
while (*++s) {
/* Reserved for future use */
switch (*s) {
default:
*t = sav;
goto flagerr;
}
}
*t = sav;
s = t + arglen - 1;
} else
goto flagerr;
break;
default:
flagerr:
zerr("error in flags");

View file

@ -421,9 +421,9 @@
print "*** Normal ***"
print -l ${(z)line}
print "*** Kept ***"
print -l ${(z+c+)line}
print -l ${(Z+c+)line}
print "*** Removed ***"
print -l ${(z+C+)line}
print -l ${(Z+C+)line}
0:Comments with (z)
>*** Normal ***
>A
@ -457,13 +457,13 @@
>one
line='with comment # at the end'
print -l ${(z+C+)line}
print -l ${(Z+C+)line}
0:Test we don't get an additional newline token
>with
>comment
line=$'echo one\necho two # with a comment\necho three'
print -l ${(z+nc+)line}
print -l ${(Z+nc+)line}
0:Treating zplit newlines as ordinary whitespace
>echo
>one