Zsh Mailing List Archive
Messages sorted by:
Reverse Date,
Date,
Thread,
Author
Re: quoting question
On Tue, 2023-09-12 at 13:45 -0500, Jim wrote:
> Hi everyone,
>
> Zsh quoting at times makes me wonder. Do quoting? Don't do quoting?
> The following case has me scratching my head. Can someone explain what is
> going on?
>
> datetimetest ()
> {
> local DT
> DT="${(%):-%D{%Y-%m-%d %H:%M:%S %Z}}"
> print $DT
> DT=${(%):-%D{%Y-%m-%d %H:%M:%S %Z}}
> print $DT
> print -- "${(%):-%D{%Y-%m-%d %H:%M:%S %Z}}"
> print -- ${(%):-%D{%Y-%m-%d %H:%M:%S %Z}}
> print -- "Date and Time: ${(%):-%D{%Y-%m-%d %H:%M:%S %Z}} Test"
> }
>
> Output:
>
> 2023-09-12 13:21:40 CDT} <-- why "}" when quoted
> 2023-09-12 13:21:40 CDT
> 2023-09-12 13:21:40 CDT} <-- why "}" when quoted
> 2023-09-12 13:21:40 CDT
> Date and Time: 2023-09-12 13:21:40 CDT} Test <-- why "}" when quoted
That's a very, very good question and I'm very glad you asked. Er.
It looks like we're not couting brace pairs within quotes the way we do
outside. I suppose the reason for that is something along the lines of:
if we encounter a "{" inside quotes itʼs just a reguler character so
doesnʼt have a special syntax associated. But the inconvenience of
counting braces differently just because youʼve added double quotes surely
outweighs that.
The fix is something like the straightforward tweak at the bottom, though
this causes a failure in Y01completion.ztst that needs tracking down.
The test is
comptesteval 'comptest-postfunc() {}'
comptest $': *\t\t\t\t\t\t'
0:_expand shows file types
>line: {: dir1/}{}
>DESCRIPTION:{expansions}
>DI:{dir1}
>DI:{dir2}
>FI:{file1}
>FI:{file2}
>DESCRIPTION:{all expansions}
>NO:{dir1 dir2 file1 file2}
>DESCRIPTION:{original}
>NO:{*}
>line: {: dir2/}{}
>line: {: file1 }{}
>line: {: file2 }{}
>line: {: dir1 dir2 file1 file2 }{}
>line: {: *}{}
and the failure is (even though all braces here are balanced)
--- /tmp/zsh.ztst.38062/ztst.out 2023-09-12 20:52:55.852041189 +0100
+++ /tmp/zsh.ztst.38062/ztst.tout 2023-09-12 20:52:55.988039951 +0100
@@ -1,15 +1,6 @@
-line: {: dir1/}{}
-DESCRIPTION:{expansions}
-DI:{dir1}
-DI:{dir2}
-FI:{file1}
-FI:{file2}
-DESCRIPTION:{all expansions}
-NO:{dir1 dir2 file1 file2}
-DESCRIPTION:{original}
-NO:{*}
-line: {: dir2/}{}
-line: {: file1 }{}
-line: {: file2 }{}
-line: {: dir1 dir2 file1 file2 }{}
+line: {: *}{}
+line: {: *}{}
+line: {: *}{}
+line: {: *}{}
+line: {: *}{}
line: {: *}{}
Test ./Y01completion.ztst failed: output differs from expected as shown above for:
comptesteval 'comptest-postfunc() {}'
comptest $': *\t\t\t\t\t\t'
diff --git a/Src/lex.c b/Src/lex.c
index 2f7937410..30d69a28b 100644
--- a/Src/lex.c
+++ b/Src/lex.c
@@ -1584,6 +1584,13 @@ dquote_parse(char endchar, int sub)
} else
err = 1;
break;
+ case '{':
+ if (intick || !bct)
+ break;
+ c = Inbrace;
+ bct++;
+ cmdpush(CS_BRACEPAR);
+ break;
}
if (err || lexstop)
break;
pws
Messages sorted by:
Reverse Date,
Date,
Thread,
Author