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

Re: [PATCH] enable number argument for transpose-words



On Mon, Aug 01, 2016 at 06:32:12PM +0800, Han Pingtian wrote:
> 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 <hanpt@xxxxxxxxxxxxxxxxxx>
> ---
>  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

Any suggestions to this one, please? Thanks in advance.



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