From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 3261 invoked by alias); 24 Jul 2013 14:44:15 -0000 Mailing-List: contact zsh-workers-help@zsh.org; run by ezmlm Precedence: bulk X-No-Archive: yes List-Id: Zsh Workers List List-Post: List-Help: X-Seq: 31570 Received: (qmail 4736 invoked from network); 24 Jul 2013 14:44:08 -0000 X-Spam-Checker-Version: SpamAssassin 3.3.2 (2011-06-06) on f.primenet.com.au X-Spam-Level: X-Spam-Status: No, score=-6.9 required=5.0 tests=BAYES_00,RCVD_IN_DNSWL_HI, SPF_HELO_PASS autolearn=ham version=3.3.2 Received-SPF: none (ns1.primenet.com.au: domain at samsung.com does not designate permitted sender hosts) X-AuditID: cbfec7f5-b7f376d000001ec6-44-51efe82a43a4 Date: Wed, 24 Jul 2013 15:43:53 +0100 From: Peter Stephenson To: zsh-workers@zsh.org Subject: Re: interactivecomments and preexec Message-id: <20130724154353.0602bc07@pwslap01u.europe.root.pri> In-reply-to: <20130722203928.GF9580@chaz.gmail.com> References: <20130721194524.GC10400@chaz.gmail.com> <20130722105332.2e7e8366@pwslap01u.europe.root.pri> <20130722193012.3a0a4f9f@pws-pc.ntlworld.com> <20130722210203.4f1245d2@pws-pc.ntlworld.com> <20130722202216.GC9580@chaz.gmail.com> <20130722213056.4aa51744@pws-pc.ntlworld.com> <20130722203702.GE9580@chaz.gmail.com> <20130722203928.GF9580@chaz.gmail.com> Organization: Samsung Cambridge Solution Centre X-Mailer: Claws Mail 3.7.9 (GTK+ 2.22.0; i386-redhat-linux-gnu) MIME-version: 1.0 Content-type: text/plain; charset=US-ASCII Content-transfer-encoding: 7bit X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFuphluLIzCtJLcpLzFFi42I5/e/4FV2tF+8DDf5stLA42PyQyYHRY9XB D0wBjFFcNimpOZllqUX6dglcGQ839rEW3OOpeL72CVMD4zLOLkYODgkBE4nr9026GDmBTDGJ C/fWs3UxcnEICSxllJjy6xMzhLOcSWLmjnfMIFUsAqoSz2ctZwWx2QQMJaZums0IYosIiEuc XXueBcQWFtCReHXrAFgNr4C9xPTTt8BqOAWMJa4c+w82R0hgJ7PE/L25IDa/gL7E1b+fmCCu sJeYeeUMI0SvoMSPyffAZjILaEls3tbECmHLS2xe85Z5AqPALCRls5CUzUJStoCReRWjaGpp ckFxUnqukV5xYm5xaV66XnJ+7iZGSAh+3cG49JjVIUYBDkYlHt7CWe8ChVgTy4orcw8xSnAw K4nwvn3wPlCINyWxsiq1KD++qDQntfgQIxMHp1QDo5oY37UHts3rrn1V7/i4t6k1yn/BUZec ozfkGQ+xnPpygWXPSu+nSbKLpkVImiQ+7z+qUa5fts/O4nayfePl8/21s02mBp78X5a742am 5YdDehPc3n9pkrJexh+jqvDPYGamaItX6gEpi7eXb9ntyRV0jbKcwd0m7Mfc+GxpXmzeUtc3 ny4eVWIpzkg01GIuKk4EAA6rKPkfAgAA On Mon, 22 Jul 2013 21:39:28 +0100 Stephane Chazelas wrote: > Or, to make it clearer, to reproduce: > > zsh -f > > setopt histreduceblanks interactivecomments > : # blah > > Press here. Finally remembered what I'm doing next... diff --git a/Src/hist.c b/Src/hist.c index 561e2ac..5e962e9 100644 --- a/Src/hist.c +++ b/Src/hist.c @@ -927,7 +927,8 @@ hbegin(int dohist) void histreduceblanks(void) { - int i, len, pos, needblank, spacecount = 0; + int i, len, pos, needblank, spacecount = 0, trunc_ok; + char *lastptr, *ptr; if (isset(HISTIGNORESPACE)) while (chline[spacecount] == ' ') spacecount++; @@ -939,6 +940,12 @@ histreduceblanks(void) if (chline[len] == '\0') return; + /* Remember where the delimited words end */ + if (chwordpos) + lastptr = chline + chwords[chwordpos-1]; + else + lastptr = chline; + for (i = 0, pos = spacecount; i < chwordpos; i += 2) { len = chwords[i+1] - chwords[i]; needblank = (i < chwordpos-2 && chwords[i+2] > chwords[i+1]); @@ -949,7 +956,25 @@ histreduceblanks(void) } pos += len + needblank; } - chline[pos] = '\0'; + + /* + * A terminating comment isn't recorded as a word. + * Only truncate the line if just whitespace remains. + */ + trunc_ok = 1; + for (ptr = lastptr; *ptr; ptr++) { + if (!inblank(*ptr)) { + trunc_ok = 0; + break; + } + } + if (trunc_ok) { + chline[pos] = '\0'; + } else { + ptr = chline + pos; + while ((*ptr++ = *lastptr++)) + ; + } } /**/ pws