From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 11555 invoked by alias); 1 Aug 2016 11:59:35 -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: 38983 Received: (qmail 11558 invoked from network); 1 Aug 2016 11:59:35 -0000 X-Qmail-Scanner-Diagnostics: from mx0b-001b2d01.pphosted.com by f.primenet.com.au (envelope-from , uid 7791) with qmail-scanner-2.11 (clamdscan: 0.99.2/21882. spamassassin: 3.4.1. Clear:RC:0(148.163.158.5):SA:0(0.0/5.0):. Processed in 0.203546 secs); 01 Aug 2016 11:59:35 -0000 X-Spam-Checker-Version: SpamAssassin 3.4.1 (2015-04-28) on f.primenet.com.au X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=unavailable autolearn_force=no version=3.4.1 X-Envelope-From: hanpt@linux.vnet.ibm.com X-Qmail-Scanner-Mime-Attachments: | X-Qmail-Scanner-Zip-Files: | Received-SPF: none (ns1.primenet.com.au: domain at linux.vnet.ibm.com does not designate permitted sender hosts) X-IBM-Helo: d03dlp01.boulder.ibm.com X-IBM-MailFrom: hanpt@linux.vnet.ibm.com Date: Mon, 1 Aug 2016 18:32:12 +0800 From: Han Pingtian To: zsh-workers@zsh.org Subject: [PATCH] enable number argument for transpose-words Mail-Followup-To: zsh-workers@zsh.org MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.6.2 (2016-07-01) X-TM-AS-GCONF: 00 X-Content-Scanned: Fidelis XPS MAILER x-cbid: 16080110-0004-0000-0000-00001008E77E X-IBM-SpamModules-Scores: X-IBM-SpamModules-Versions: BY=3.00005543; HX=3.00000240; KW=3.00000007; PH=3.00000004; SC=3.00000177; SDB=6.00738408; UDB=6.00347029; IPR=6.00511005; BA=6.00004634; NDR=6.00000001; ZLA=6.00000005; ZF=6.00000009; ZB=6.00000000; ZP=6.00000000; ZH=6.00000000; ZU=6.00000002; MB=3.00012119; XFM=3.00000011; UTC=2016-08-01 10:32:18 X-IBM-AV-DETECTION: SAVI=unused REMOTE=unused XFE=unused x-cbparentid: 16080110-0005-0000-0000-000077988486 Message-Id: <20160801103212.GA24067@localhost.localdomain> X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10432:,, definitions=2016-08-01_08:,, signatures=0 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 spamscore=0 suspectscore=1 malwarescore=0 phishscore=0 adultscore=0 bulkscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.0.1-1604210000 definitions=main-1608010113 Looks like number argument doesn't work for transpose-words widget: if the number is even, there is no words transposed; if the number is odd, the behavior is the same of no number argument given. With this patch, current word will be transposed with the preious nth word if number argument n given. Signed-off-by: Han Pingtian --- Src/Zle/zle_word.c | 90 +++++++++++++++++++++++++++++++----------------------- 1 file changed, 51 insertions(+), 39 deletions(-) diff --git a/Src/Zle/zle_word.c b/Src/Zle/zle_word.c index 3c1f26c..2a15171 100644 --- a/Src/Zle/zle_word.c +++ b/Src/Zle/zle_word.c @@ -678,46 +678,54 @@ killword(char **args) int transposewords(UNUSED(char **args)) { - int p1, p2, p3, p4, len, x = zlecs, pos; + int p1, p2, p3, p4, pt, len, x = zlecs, pos; ZLE_STRING_T temp, pp; int n = zmult; int neg = n < 0, ocs = zlecs; if (neg) n = -n; - while (n--) { - while (x != zlell && zleline[x] != ZWC('\n') && !ZC_iword(zleline[x])) - INCPOS(x); - if (x == zlell || zleline[x] == ZWC('\n')) { - x = zlecs; - while (x) { - if (ZC_iword(zleline[x])) - break; - pos = x; - DECPOS(pos); - if (zleline[pos] == ZWC('\n')) - break; - x = pos; - } - if (!x) - return 1; + + while (x != zlell && zleline[x] != ZWC('\n') && !ZC_iword(zleline[x])) + INCPOS(x); + + if (x == zlell || zleline[x] == ZWC('\n')) { + x = zlecs; + while (x) { + if (ZC_iword(zleline[x])) + break; pos = x; DECPOS(pos); if (zleline[pos] == ZWC('\n')) - return 1; - } - for (p4 = x; p4 != zlell && ZC_iword(zleline[p4]); INCPOS(p4)) - ; - for (p3 = p4; p3; ) { - pos = p3; - DECPOS(pos); - if (!ZC_iword(zleline[pos])) break; - p3 = pos; + x = pos; } - if (!p3) + if (!x) return 1; - for (p2 = p3; p2; ) { + pos = x; + DECPOS(pos); + if (zleline[pos] == ZWC('\n')) + return 1; + } + + for (p4 = x; p4 != zlell && ZC_iword(zleline[p4]); INCPOS(p4)) + ; + + for (p3 = p4; p3; ) { + pos = p3; + DECPOS(pos); + if (!ZC_iword(zleline[pos])) + break; + p3 = pos; + } + + if (!p3) + return 1; + + pt = p3; + + while (n--) { + for (p2 = pt; p2; ) { pos = p2; DECPOS(pos); if (ZC_iword(zleline[pos])) @@ -733,20 +741,24 @@ transposewords(UNUSED(char **args)) break; p1 = pos; } - pp = temp = (ZLE_STRING_T)zhalloc((p4 - p1)*ZLE_CHAR_SIZE); - len = p4 - p3; - ZS_memcpy(pp, zleline + p3, len); - pp += len; - len = p3 - p2; - ZS_memcpy(pp, zleline + p2, len); - pp += len; - ZS_memcpy(pp, zleline + p1, p2 - p1); + pt = p1; + } - ZS_memcpy(zleline + p1, temp, p4 - p1); + pp = temp = (ZLE_STRING_T)zhalloc((p4 - p1)*ZLE_CHAR_SIZE); + len = p4 - p3; + ZS_memcpy(pp, zleline + p3, len); + pp += len; + len = p3 - p2; + ZS_memcpy(pp, zleline + p2, len); + pp += len; + ZS_memcpy(pp, zleline + p1, p2 - p1); + + ZS_memcpy(zleline + p1, temp, p4 - p1); - zlecs = p4; - } if (neg) zlecs = ocs; + else + zlecs = p4; + return 0; } -- 2.5.5