From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 6665 invoked by alias); 30 Oct 2014 18:00:58 -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: 33576 Received: (qmail 21305 invoked from network); 30 Oct 2014 18:00:55 -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=-2.0 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,FREEMAIL_FROM,RCVD_IN_DNSWL_NONE autolearn=ham version=3.3.2 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yahoo.co.uk; s=s2048; t=1414691683; bh=IzJWkLTphCkTAdFVFsj6sd0zjoNg/I+QqdjFQwOE5z0=; h=In-reply-to:From:References:To:Subject:Date:From:Subject; b=aFaSRGJHudv7mbNuzIR95+zuzK7RZqLnV4kv+2WtLDYYPiaeGF7L6WSAwTimsRhlNqYbaozI37bSJcHdjG15eEG22FDOt63xXp/CsANp4Bl69cm0H/bk0w+73eaYer9M0B6DGptJM6/ysXAM3Hv9ZMfywQ3DjftD6rB6FU9veAJ8xZQOrpQARyDArKy5CoPttXPX9QPqWWsu7T8j6VrXOzhwxlYv2RpXAyyty5JAwG1muLeRYcnRAgg5UGyRk1QDdBcHiXyn0WN+Pc557CbYJ/gontDe+GiDoDjE9IeAavUtGCJOU3bo+yEBO3XBJgnPxFvOHIKI/Lunk65WWSZrog== DomainKey-Signature: a=rsa-sha1; q=dns; c=nofws; s=s2048; d=yahoo.co.uk; b=qIcMpa5IwYhCOiGWvSDi3+lebh19Mfnsup7azbEQG4ezrQHiF4NWJegqGpfVteenMWkPDceww+33GGum1gew6jqeZHiWltsHnI8fZl5dG6fb4ZQ/FcpuoqPm8Q4AdIlxDVn/0v2brd3upVL/OwXAxx+3n1yBwYz5WOjpKVlWsdfdG4aCUFuekB2TFIAA4lMr7tyn611HK6RrCuRpdLZo42N2mT413pQtr9V6mTPuD65UqJgip896L3l2CLtUHUbMvgQMap4KrbMoiYhbDq9ghe122wf+Ljl619nCxhjzJUT4VCOuHAKigawx93m/A6KPuK1kuS2iQqjeBxHVf6XEvA==; X-Yahoo-Newman-Id: 942567.9754.bm@smtp107.mail.ir2.yahoo.com X-Yahoo-Newman-Property: ymail-3 X-YMail-OSG: n0fveAwVM1n1hdwDsnUxAlsfbA0S0Wn6en8yhvHZ0WmYOIZ FmSwqb.lW6WmFs42FEsrrOXworbnq2tHLE2ZTxyr_CNze8OBezZCEZreDy4H Hj2x8mRegqqqKbdmYNEPro8fZjtbbzIIbRzaxapuhRwN5b8Xjyaf9JkYMZBO I53yzGfjBH6pUBXlB1IT.zx5Tm2oJKlop8j3I75PRh.4LuabDO2kHDPIspXz GofzoPaofo2chNA1wxgho8PpzQgWBAKJM..roysbqLngV9.ANDWwDZGoGo6s 8ln7UU431h1EiMJiJdx2VCEreUMyKRAbMQ2Ju9MbtBRFjGaAHGSG05QvSKg2 Rjy7raoALqTq.1WwwRCgEQzkcZ0Tm6WXDRSaXsLkDVO93f9bJW68jX9R73BD 1T4IXA5fEUs7DXE.wjInBfbs8VnyvHYZOYBPbMdwiq4nTwT14hTjvbBTb6s3 vFP2kUfd4YF4nNWL7uXzZTCsNnAYO1dN1FTQ_ANo8bpfdg1SK_BK652lY5eb BhfL25QsJCBNDIhArIW7n6e23k4I- X-Yahoo-SMTP: opAkk_CswBAce_kJ3nIPlH80cJI- In-reply-to: <20141030085358.3c9f9d54@pws-pc.ntlworld.com> From: Oliver Kiddle References: <15607.1414626173@thecus.kiddle.eu> <20141030085358.3c9f9d54@pws-pc.ntlworld.com> To: Zsh workers Subject: Re: PATCH: make kill ring work in vi mode MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-ID: <20352.1414691681.1@thecus.kiddle.eu> Date: Thu, 30 Oct 2014 18:54:41 +0100 Message-ID: <20353.1414691681@thecus.kiddle.eu> Peter wrote: > > Nothing here's a real problem, though if it's possible to refactor it > more neatly that's nice to have. Patch below refactors and adds tests. I left yank() alone which you might question. I think I'll ignore the undo issue until I've used it in practice awhile. At least the current behaviour avoids the need for a reverse-yank-pop. Oliver diff --git a/Src/Zle/zle_misc.c b/Src/Zle/zle_misc.c index 10bd71c..3d4a9bb 100644 --- a/Src/Zle/zle_misc.c +++ b/Src/Zle/zle_misc.c @@ -507,6 +507,40 @@ yank(UNUSED(char **args)) return 0; } +static void pastebuf(Cutbuffer buf, int mult, int after) +{ + int cc; + if (buf->flags & CUTBUFFER_LINE) { + if (after) { + yankb = zlecs = findeol(); + spaceinline(buf->len + 1); + zleline[zlecs++] = ZWC('\n'); + yanke = zlecs + buf->len; + ZS_memcpy(zleline + zlecs, buf->buf, buf->len); + } else { + yankb = zlecs = findbol(); + spaceinline(buf->len + 1); + ZS_memcpy(zleline + zlecs, buf->buf, buf->len); + yanke = zlecs + buf->len + 1; + zleline[zlecs + buf->len] = ZWC('\n'); + } + vifirstnonblank(zlenoargs); + } else { + if (after && zlecs != findeol()) + INCCS(); + yankb = zlecs; + cc = buf->len; + while (mult--) { + spaceinline(cc); + ZS_memcpy(zleline + zlecs, buf->buf, cc); + zlecs += cc; + } + yanke = zlecs; + if (zlecs) + DECCS(); + } +} + /**/ int viputbefore(UNUSED(char **args)) @@ -524,24 +558,7 @@ viputbefore(UNUSED(char **args)) return 1; kct = -1; yankcs = zlecs; - if (kctbuf->flags & CUTBUFFER_LINE) { - yankb = zlecs = findbol(); - spaceinline(kctbuf->len + 1); - ZS_memcpy(zleline + zlecs, kctbuf->buf, kctbuf->len); - yanke = zlecs + kctbuf->len + 1; - zleline[zlecs + kctbuf->len] = ZWC('\n'); - vifirstnonblank(zlenoargs); - } else { - yankb = zlecs; - while (n--) { - spaceinline(kctbuf->len); - ZS_memcpy(zleline + zlecs, kctbuf->buf, kctbuf->len); - zlecs += kctbuf->len; - } - yanke = zlecs; - if (zlecs) - DECCS(); - } + pastebuf(kctbuf, n, 0); return 0; } @@ -562,26 +579,7 @@ viputafter(UNUSED(char **args)) return 1; kct = -1; yankcs = zlecs; - if (kctbuf->flags & CUTBUFFER_LINE) { - yankb = zlecs = findeol(); - spaceinline(kctbuf->len + 1); - zleline[zlecs++] = ZWC('\n'); - yanke = zlecs + kctbuf->len; - ZS_memcpy(zleline + zlecs, kctbuf->buf, kctbuf->len); - vifirstnonblank(zlenoargs); - } else { - if (zlecs != findeol()) - INCCS(); - yankb = zlecs; - while (n--) { - spaceinline(kctbuf->len); - ZS_memcpy(zleline + zlecs, kctbuf->buf, kctbuf->len); - zlecs += kctbuf->len; - } - yanke = zlecs; - if (zlecs) - DECCS(); - } + pastebuf(kctbuf, n, 1); return 0; } @@ -589,7 +587,7 @@ viputafter(UNUSED(char **args)) int yankpop(UNUSED(char **args)) { - int cc, kctstart = kct; + int kctstart = kct; Cutbuffer buf; if (!(lastcmd & ZLE_YANK) || !kring || !kctbuf) { @@ -637,32 +635,7 @@ yankpop(UNUSED(char **args)) zlecs = yankb; foredel(yanke - yankb, CUT_RAW); zlecs = yankcs; - - if (buf->flags & CUTBUFFER_LINE) { - if (lastcmd & ZLE_YANKBEFORE) { - yankb = zlecs = findbol(); - spaceinline(buf->len + 1); - ZS_memcpy(zleline + zlecs, buf->buf, buf->len); - yanke = zlecs + buf->len + 1; - zleline[zlecs + buf->len] = ZWC('\n'); - } else { - yankb = zlecs = findeol(); - spaceinline(buf->len + 1); - zleline[zlecs++] = ZWC('\n'); - yanke = zlecs + buf->len; - ZS_memcpy(zleline + zlecs, buf->buf, buf->len); - } - vifirstnonblank(zlenoargs); - } else { - if ((lastcmd & ZLE_YANKAFTER) && zlecs != findeol()) - INCCS(); - yankb = zlecs; - cc = buf->len; - spaceinline(cc); - ZS_memcpy(zleline + zlecs, buf->buf, cc); - zlecs += cc; - yanke = zlecs; - } + pastebuf(buf, 1, lastcmd & ZLE_YANKAFTER); return 0; } diff --git a/Test/X02zlevi.ztst b/Test/X02zlevi.ztst index 2af6f06..185980b 100644 --- a/Test/X02zlevi.ztst +++ b/Test/X02zlevi.ztst @@ -116,6 +116,34 @@ >BUFFER: stnwararart >CURSOR: 9 + zpty_run 'bindkey -a "^P" yank-pop' + zletest $'word\C-wline\eddiSE\eP\C-P' +0:line based put before followed by character based yank-pop +>BUFFER: SwordE +>CURSOR: 4 + + zletest $'line\eddiword\C-w\eiSE\eP\C-P' +0:character based put before followed by line based yank-pop +>BUFFER: line +>SE +>CURSOR: 0 + + zletest $'one two three\C-w\C-w\C-wSE\e0p\C-P\C-P' +0:put after cycled twice with yank-pop +>BUFFER: SthreeE +>CURSOR: 5 + + zletest $'word\C-wline\eddiSE\ehp\C-P' +0:line based put after followed by character based yank-pop +>BUFFER: SwordE +>CURSOR: 5 + + zletest $'line\eddiword\C-w\eiSE\ehp\C-P' +0:character based after before followed by line based yank-pop +>BUFFER: SE +>line +>CURSOR: 3 + zletest $'word\euaend' 0:undo initial change >BUFFER: end