Refactor selsnap SNAP_WORD.

Refactor the SNAP_WORD part in selsnap, and fix a bug that caused the word
delimiters to be ignored if it was at the very beginning or end of a wrapped
line.

Signed-off-by: Roberto E. Vargas Caballero <k0ga@shike2.com>
dev
Colona 2014-06-05 06:32:01 +02:00 committed by Roberto E. Vargas Caballero
parent 6fd887077e
commit 5159d55c63
1 changed files with 22 additions and 24 deletions

48
st.c
View File

@ -703,6 +703,9 @@ selected(int x, int y) {
void void
selsnap(int mode, int *x, int *y, int direction) { selsnap(int mode, int *x, int *y, int direction) {
int newx, newy, xt, yt;
Glyph *gp;
switch(mode) { switch(mode) {
case SNAP_WORD: case SNAP_WORD:
/* /*
@ -710,36 +713,31 @@ selsnap(int mode, int *x, int *y, int direction) {
* beginning of a line. * beginning of a line.
*/ */
for(;;) { for(;;) {
if(direction < 0 && *x <= 0) { newx = *x + direction;
if(*y > 0 && term.line[*y - 1][term.col-1].mode newy = *y;
& ATTR_WRAP) { if(!BETWEEN(newx, 0, term.col - 1)) {
*y -= 1; newy += direction;
*x = term.col-1; newx = (newx + term.col) % term.col;
} else { if (!BETWEEN(newy, 0, term.row - 1))
break; break;
}
}
if(direction > 0 && *x >= term.col-1) {
if(*y < term.row-1 && term.line[*y][*x].mode
& ATTR_WRAP) {
*y += 1;
*x = 0;
} else {
break;
}
}
if(term.line[*y][*x+direction].mode & ATTR_WDUMMY) { if(direction > 0)
*x += direction; yt = *y, xt = *x;
continue; else
} yt = newy, xt = newx;
if(!(term.line[yt][xt].mode & ATTR_WRAP))
if(*x >= tlinelen(*y) || strchr(worddelimiters,
term.line[*y][*x+direction].c[0])) {
break; break;
} }
*x += direction; if (newx >= tlinelen(newy))
break;
gp = &term.line[newy][newx];
if (!(gp->mode & ATTR_WDUMMY) && strchr(worddelimiters, gp->c[0]))
break;
*x = newx;
*y = newy;
} }
break; break;
case SNAP_LINE: case SNAP_LINE: