From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 14681 invoked by alias); 4 May 2015 13:06:33 -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: 35029 Received: (qmail 21007 invoked from network); 4 May 2015 13:06:17 -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=1430744344; bh=ZvSz966FU5DwL6mqqEqH24O3lH5oIvoNnZ15OHa3Omw=; h=From:To:Subject:Date:From:Subject; b=FCfPj96QV/g+oIXIX8iYJPrlGF5HEwEcxEFBXfDAnRGFCZ/ogpNfj/MGsy2y7uRlC2IKtHKgcFkg2S/Qxs4YQqEHry1v3MgkUqSbw/Rj0sv7wYFiyqegYKsCTc8QKoF8y/EW4lTrHmo2kJgz6PXO13R9cy9lp08EmhXbJOlq3GdMQ4svWkox8vTMU3/vICO1FxEtLPvwy0sa66Hc93nvaGiAUd/9n5uzAWfucCF6teMRWlpqq4xn0V6h9Krg38LxR4/eANDk96HqvCRxNpyuP30LbvBbcWA8xXCPF2GZ9nC0SleYerhpyz/p5XptyB5VfxLOwfe1QF/xqqSoynb2gQ== X-Yahoo-Newman-Id: 111250.36843.bm@smtp138.mail.ir2.yahoo.com X-Yahoo-Newman-Property: ymail-3 X-YMail-OSG: n5l7h3oVM1nnqz3DKjwm9zGrdUGwt73mQJ02Ld401E_BamS jE2SVHgEqnVNpmMIu3KUUvEG6dnCLO5smFTgF3zTl7Ixi6dfisvWzST.tu9S QtNwKQagGKWPdCBZascKj5UGFZSNiqlsVhyrnA6wyuF3qhjDweQhVbzNusMU C78mHRDdjtdtAV5HhW3p63e4JtrBTg6DRWdAl7dhYqxRiEOdaGurn2SuqDUb FhasnVmhl4plp2pXl.4AMfRJolQkVrHHt_ZNpR6NRcIWqEWkGrkvOPpm6rZZ 1zp6nvEm.DFoDb_gk54Ywasci1PGuGD.7BpTKMzaPQUmJEmG_TnC3GiuO58X NTuo2QuU5kjs6wgug1bPL1.wOb7NsjuMzErRD.K621mhNGsqFScHh.2J1uL0 hxxUzIW87qKar6284h9TIQzAqB6oCNMuF9xFEXoKC7HlisQ1i52ZDYTPD6Gq AatW1jTZi.RQSZFZgR2xjR2.SP123TrqzqXwonStPE4Wvdb7mYlnwWCx0X8_ n7.T4c2Etzb7rjw3XabryBzINLohWnfcj X-Yahoo-SMTP: opAkk_CswBAce_kJ3nIPlH80cJI- From: Oliver Kiddle To: Zsh workers Subject: PATCH: vi-mode word movement improvements to newline handling MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-ID: <31718.1430744342.1@thecus.kiddle.eu> Date: Mon, 04 May 2015 14:59:03 +0200 Message-ID: <31719.1430744343@thecus.kiddle.eu> This patch affects how newlines are handled in the vi-mode word movement widgets. There were one or two cases that were clear bugs (e.g. b would stop at the end of the last word on a preceding lines). Mostly, this is just improving compatibility with vi. There are still subtle differences such as for a line containing just spaces but at that level, you'll also find differences between vi/vim/nvi. Oliver diff --git a/Src/Zle/zle_word.c b/Src/Zle/zle_word.c index cb5e5db..2e6d75e 100644 --- a/Src/Zle/zle_word.c +++ b/Src/Zle/zle_word.c @@ -80,16 +80,21 @@ viforwardword(char **args) return ret; } while (n--) { + int nl; if (Z_vialnum(zleline[zlecs])) while (zlecs != zlell && Z_vialnum(zleline[zlecs])) INCCS(); else - while (zlecs != zlell && !Z_vialnum(zleline[zlecs]) && !ZC_iblank(zleline[zlecs])) + while (zlecs != zlell && !Z_vialnum(zleline[zlecs]) && + !ZC_inblank(zleline[zlecs])) INCCS(); if (wordflag && !n) return 0; - while (zlecs != zlell && ZC_inblank(zleline[zlecs])) + nl = (zleline[zlecs] == ZWC('\n')); + while (zlecs != zlell && nl < 2 && ZC_inblank(zleline[zlecs])) { INCCS(); + nl += (zleline[zlecs] == ZWC('\n')); + } } return 0; } @@ -108,12 +113,16 @@ viforwardblankword(char **args) return ret; } while (n--) { - while (zlecs != zlell && !ZC_iblank(zleline[zlecs])) + int nl; + while (zlecs != zlell && !ZC_inblank(zleline[zlecs])) INCCS(); if (wordflag && !n) return 0; - while (zlecs != zlell && ZC_iblank(zleline[zlecs])) + nl = (zleline[zlecs] == ZWC('\n')); + while (zlecs != zlell && nl < 2 && ZC_inblank(zleline[zlecs])) { INCCS(); + nl += (zleline[zlecs] == ZWC('\n')); + } } return 0; } @@ -159,14 +168,14 @@ viforwardblankwordend(UNUSED(char **args)) while (zlecs != zlell) { int pos = zlecs; INCPOS(pos); - if (!ZC_iblank(zleline[pos])) + if (!ZC_inblank(zleline[pos])) break; zlecs = pos; } while (zlecs != zlell) { int pos = zlecs; INCPOS(pos); - if (ZC_iblank(zleline[pos])) + if (ZC_inblank(zleline[pos])) break; zlecs = pos; } @@ -216,7 +225,7 @@ viforwardwordend(char **args) if (zlecs == zlell) break; INCPOS(pos); - if (Z_vialnum(zleline[pos]) || ZC_iblank(zleline[pos])) + if (Z_vialnum(zleline[pos]) || ZC_inblank(zleline[pos])) break; } } @@ -273,16 +282,19 @@ vibackwardword(char **args) return ret; } while (n--) { + int nl = 0; while (zlecs) { - int pos = zlecs; - DECPOS(pos); - if (!ZC_iblank(zleline[pos])) + DECCS(); + if (!ZC_inblank(zleline[zlecs])) break; - zlecs = pos; + nl += (zleline[zlecs] == ZWC('\n')); + if (nl == 2) { + INCCS(); + break; + } } if (zlecs) { int pos = zlecs; - DECPOS(pos); if (Z_vialnum(zleline[pos])) { for (;;) { zlecs = pos; @@ -298,7 +310,7 @@ vibackwardword(char **args) if (zlecs == 0) break; DECPOS(pos); - if (Z_vialnum(zleline[pos]) || ZC_iblank(zleline[pos])) + if (Z_vialnum(zleline[pos]) || ZC_inblank(zleline[pos])) break; } } @@ -321,17 +333,20 @@ vibackwardblankword(char **args) return ret; } while (n--) { + int nl = 0; while (zlecs) { int pos = zlecs; DECPOS(pos); - if (!ZC_iblank(zleline[pos])) + if (!ZC_inblank(zleline[pos])) break; + nl += (zleline[pos] == ZWC('\n')); + if (nl == 2) break; zlecs = pos; } while (zlecs) { int pos = zlecs; DECPOS(pos); - if (ZC_iblank(zleline[pos])) + if (ZC_inblank(zleline[pos])) break; zlecs = pos; } @@ -356,7 +371,7 @@ vibackwardwordend(char **args) int start = 0; if (Z_vialnum(zleline[zlecs])) start = 1; - else if (!ZC_iblank(zleline[zlecs])) + else if (!ZC_inblank(zleline[zlecs])) start = 2; DECCS(); while (zlecs) { @@ -387,9 +402,9 @@ vibackwardblankwordend(char **args) return ret; } while (n--) { - while (zlecs && !ZC_iblank(zleline[zlecs])) + while (zlecs && !ZC_inblank(zleline[zlecs])) DECCS(); - while (zlecs && ZC_iblank(zleline[zlecs])) + while (zlecs && ZC_inblank(zleline[zlecs])) DECCS(); } return 0; diff --git a/Test/X02zlevi.ztst b/Test/X02zlevi.ztst index 6ca047d..14bc02e 100644 --- a/Test/X02zlevi.ztst +++ b/Test/X02zlevi.ztst @@ -414,6 +414,94 @@ >BUFFER: One tWO three >CURSOR: 4 + zletest $' --ww ww--\eo\eoww\eo\eo--\eo\eo ww\e' bi{a,b,c,d,e,f,g,h,i,j,k}$'\e' +0:backward word +>BUFFER: k j--iww hwwg-- +>f +>eww +>d +>c-- +>b +> aww +>CURSOR: 0 + + zletest $' --ww ww--\eo\eoww\eo\eo--\eo\eo ww\e' Bi{a,b,c,d,e,f,g,h,i}$'\e' +0:backword blank word +>BUFFER: i h--ww gww-- +>f +>eww +>d +>c-- +>b +> aww +>CURSOR: 0 + + zletest $' --ww ww--\eo\eoww\eo\eo--\eo\eo ww\e' gei{a,=,b,c,=,d,e,=,f}$'\e' +0:backward word end +>BUFFER: f -=-wew wdw-=- +>c +>wbw +> +>-=- +>a +> ww +>CURSOR: 0 + + zletest $' --ww ww--\eo\eoww\eo\eo--\eo\eo ww\e' gEi{=,b,=,d,e}$'\e' +0:backward blank word end +>BUFFER: e --wdw ww-=- +> +>wbw +> +>-=- +> +> ww +>CURSOR: 0 + + zletest $' ww\eO\eO--\eO\eOww\eO\eO --ww ww--\e0' wi{=,a,b,=,c,d,e,=,f,g}$'\e' +0:forward word +>BUFFER: =--aww bww=-- +>c +>dww +>e +>=-- +>f +> gww +>CURSOR: 32 + + zletest $' ww\eO\eO--\eO\eOww\eO\eO --ww ww--\e0' Wi{=,a,b,c,d,=,e,f}$'\e' +0:forward blank word +>BUFFER: =--ww aww-- +>b +>cww +>d +>=-- +>e +> fww +>CURSOR: 30 + + zletest $' ww\eO\eO--\eO\eOww\eO\eO --ww ww--\e0' ea{a,b,c,d,e,f,g}$'\e' +0:forward word end +>BUFFER: --awwb wwc--d +> +>wwe +> +>--f +> +> wwg +>CURSOR: 31 + + zletest $' ww\eO\eO--\eO\eOww\eO\eO --ww ww--\e0' Ea{a,b,c,d,e}$'\e' +0:forward blank word end +>BUFFER: --wwa ww--b +> +>wwc +> +>--d +> +> wwe +>CURSOR: 29 + zletest $' ----word ---- word word---- ----\e42|daw30|daw22|daw14|daw2|daw' 0:delete all word on blanks >BUFFER: word