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

Re: [PATCH] vared: Escape empty elements of arrays



Daniel Shahaf wrote on Tue, 19 May 2020 23:54 +0000:
> +++ b/Test/X05zlebuiltins.ztst
> @@ -0,0 +1,22 @@
> +%test
> +
> +  zpty_run 'a=("foo foo" "" "bar")'
> +  zletest $'vared a\n\C-xw'
> +0:vared: basic quoting test
> +>BUFFER: foo\ foo '' bar
> +>CURSOR: 15  

The patch is wrong, and the test here is incomplete.

First, because of how vared works —

> > If an array or array slice is being edited, separator characters as defined
> > in tt($IFS) will be shown quoted with a backslash, as will backslashes
> > themselves.  Conversely, when the edited text is split into an array, a
> > backslash quotes an immediately following separator character or backslash;
> > no other special handling of backslashes, or any handling of quotes, is
> > performed.

— it seems to be impossible for the result of a vared operation to
include empty elements.  In particular, editing an array with empty
elements in master silently drops them.  With the patch, the elements
would become «''» (two bytes).

The test didn't catch this because it didn't check the variable's value
after the edit.

---

I assume there should be a way to use vared to make an array element
empty.

Since the documentation specifically promises its own quoting
semantics, I guess we have to continue to support them, even if we
might've designed differently if we could redesign it from scratch.

All in all, I guess we should add another a mode where vared would use
normal shell quoting semantics.  For array variables that'd be
well-defined.  For editing scalars there'd be a question of how to handle
unescaped spaces.

I'll fix the test and commit it later, but I don't have the brainwidth
to add support for empty elements if it's not just a quick fix.

Patches welcome.

Cheers,

Daniel



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