35029: improvements to newline handling for vi-mode word movement

This commit is contained in:
Oliver Kiddle 2015-05-04 21:51:06 +02:00
parent 1e6fb1a4f0
commit 9afbe051b9
3 changed files with 126 additions and 18 deletions

View file

@ -1,3 +1,8 @@
2015-05-04 Oliver Kiddle <opk@zsh.org>
* 35029: Src/Zle/zle_word.c, Test/X02zlevi.ztst:
improvements to newline handling for vi-mode word movement
2015-05-04 Mikael Magnusson <mikachu@gmail.com>
* 35021: Src/builtin.c: Fix two bugs in typeset_setbase

View file

@ -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;

View file

@ -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