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