From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on inbox.vuxu.org X-Spam-Level: X-Spam-Status: No, score=-1.0 required=5.0 tests=MAILING_LIST_MULTI, RCVD_IN_DNSWL_NONE autolearn=ham autolearn_force=no version=3.4.2 Received: from primenet.com.au (ns1.primenet.com.au [203.24.36.2]) by inbox.vuxu.org (OpenSMTPD) with ESMTP id 986c1800 for ; Sun, 29 Dec 2019 23:45:45 +0000 (UTC) Received: (qmail 10029 invoked by alias); 29 Dec 2019 23:45:38 -0000 Mailing-List: contact zsh-users-help@zsh.org; run by ezmlm Precedence: bulk X-No-Archive: yes List-Id: Zsh Users List List-Post: List-Help: List-Unsubscribe: X-Seq: 24581 Received: (qmail 17079 invoked by uid 1010); 29 Dec 2019 23:45:37 -0000 X-Qmail-Scanner-Diagnostics: from know-smtprelay-omc-8.server.virginmedia.net by f.primenet.com.au (envelope-from , uid 7791) with qmail-scanner-2.11 (clamdscan: 0.102.1/25677. spamassassin: 3.4.2. Clear:RC:0(80.0.253.72):SA:0(-2.0/5.0):. Processed in 1.78461 secs); 29 Dec 2019 23:45:37 -0000 X-Envelope-From: p.w.stephenson@ntlworld.com X-Qmail-Scanner-Mime-Attachments: | X-Qmail-Scanner-Zip-Files: | Received-SPF: pass (ns1.primenet.com.au: SPF record at _smtprelay.virginmedia.com designates 80.0.253.72 as permitted sender) X-Originating-IP: [86.16.88.158] X-Authenticated-User: p.w.stephenson@ntlworld.com X-Spam: 0 X-Authority: v=2.3 cv=X6h81lbe c=1 sm=1 tr=0 a=MiHCjVqLJ44lE3bxSlffFQ==:117 a=MiHCjVqLJ44lE3bxSlffFQ==:17 a=jpOVt7BSZ2e4Z31A5e1TngXxSK0=:19 a=IkcTkHD0fZMA:10 a=zLAj3dRTlVSV-5kX5JMA:9 a=QEXdDO2ut3YA:10 Message-ID: <373ee4b006198f68c835c902c0bc35242796b33d.camel@ntlworld.com> Subject: Re: ${(z)} parsing of multiple array assignments From: Peter Stephenson To: zsh-users@zsh.org Date: Sun, 29 Dec 2019 23:45:00 +0000 In-Reply-To: <7b7a941ddc3c20bea6a6b69b1e7ac35d827f320d.camel@ntlworld.com> References: <20191223173115.bvhwbpfmqgqhngle@tarpaulin.shahaf.local2> <7b7a941ddc3c20bea6a6b69b1e7ac35d827f320d.camel@ntlworld.com> Content-Type: text/plain; charset="UTF-8" X-Mailer: Evolution 3.28.5-0ubuntu0.18.04.1 Mime-Version: 1.0 Content-Transfer-Encoding: 7bit X-CMAE-Envelope: MS4wfGrALYIrqBljBnPU0XD/pFB1aJnwoORGDHtFNHEQ8+0gYOtGpATNwtIO47irFG8+KmVYCu32CDrh8UyIzI4F5kral8o2YyLcFj3IHlbChCd5oDgENv8l 7B3dsUvQ/nPydFs9X+r1YBu9ORETf05zUICzQCpXZDTF7WZeavQrRld0 On Sun, 2019-12-29 at 20:55 +0000, Peter Stephenson wrote: > Unless I'm missing some trick, bufferwords() is the function where we > need to update any parser state --- ctxtlex() is too low level for that, > it just handles the next token given the current state. So it's > probably something like this. Will need a new test adding. We also need to do something similar for completion, otherwise foo=(stuff) bar=(... looks like a glob qualifier. In this case it's already half handled, so there's a variable to hook into. pws diff --git a/Src/Zle/zle_tricky.c b/Src/Zle/zle_tricky.c index 2b25d6b2e..fdd168763 100644 --- a/Src/Zle/zle_tricky.c +++ b/Src/Zle/zle_tricky.c @@ -1236,8 +1236,10 @@ get_comp_string(void) else if (tok == OUTPAR) { if (parct) parct--; - else + else if (linarr) { linarr = 0; + incmdpos = 1; + } } if (inredir && IS_REDIROP(tok)) { rdstr = rdstrbuf; diff --git a/Src/hist.c b/Src/hist.c index 74116e82f..5281e8718 100644 --- a/Src/hist.c +++ b/Src/hist.c @@ -3321,6 +3321,7 @@ bufferwords(LinkList list, char *buf, int *index, int flags) int owb = wb, owe = we, oadx = addedx, onc = nocomments; int ona = noaliases, ocs = zlemetacs, oll = zlemetall; int forloop = 0, rcquotes = opts[RCQUOTES]; + int envarray = 0; char *p, *addedspaceptr; if (!list) @@ -3404,6 +3405,14 @@ bufferwords(LinkList list, char *buf, int *index, int flags) ctxtlex(); if (tok == ENDINPUT || tok == LEXERR) break; + /* + * After an array assignment, return to the initial + * start-of-command state. There could be a second ENVARRAY. + */ + if (tok == OUTPAR && envarray) { + incmdpos = 1; + envarray = 0; + } if (tok == FOR) { /* * The way for (( expr1 ; expr2; expr3 )) is parsed is: @@ -3441,6 +3450,7 @@ bufferwords(LinkList list, char *buf, int *index, int flags) switch (tok) { case ENVARRAY: p = dyncat(tokstr, "=("); + envarray = 1; break; case DINPAR: