# st

Unnamed repository; edit this file 'description' to name the repository.

| Log | Files | Refs | README | LICENSE

    commit 5159d55c631cd1179bd2f872859d4540668745b9
    parent 6fd887077e29efd789499e06193314d7abdcac38
    Author: Colona <colona@ycc.fr>
    Date:   Thu,  5 Jun 2014 06:32:01 +0200

    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>

    Diffstat:
    Mst.c | 44+++++++++++++++++++++-----------------------

    1 file changed, 21 insertions(+), 23 deletions(-)
    diff --git a/st.c b/st.c
    @@ -703,6 +703,9 @@ selected(int x, int y) {

     void
     selsnap(int mode, int *x, int *y, int direction) {
    +	int newx, newy, xt, yt;
    +	Glyph *gp;
    +
     	switch(mode) {
     	case SNAP_WORD:
     		/*
    @@ -710,36 +713,31 @@ selsnap(int mode, int *x, int *y, int direction) {
     		 * beginning of a line.
     		 */
     		for(;;) {
    -			if(direction < 0 && *x <= 0) {
    -				if(*y > 0 && term.line[*y - 1][term.col-1].mode
    -						& ATTR_WRAP) {
    -					*y -= 1;
    -					*x = term.col-1;
    -				} else {
    +			newx = *x + direction;
    +			newy = *y;
    +			if(!BETWEEN(newx, 0, term.col - 1)) {
    +				newy += direction;
    +				newx = (newx + term.col) % term.col;
    +				if (!BETWEEN(newy, 0, term.row - 1))
     					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 {
    +
    +				if(direction > 0)
    +					yt = *y, xt = *x;
    +				else
    +					yt = newy, xt = newx;
    +				if(!(term.line[yt][xt].mode & ATTR_WRAP))
     					break;
    -				}
     			}

    -			if(term.line[*y][*x+direction].mode & ATTR_WDUMMY) {
    -				*x += direction;
    -				continue;
    -			}
    +			if (newx >= tlinelen(newy))
    +				break;

    -			if(*x >= tlinelen(*y) || strchr(worddelimiters,
    -					term.line[*y][*x+direction].c[0])) {
    +			gp = &term.line[newy][newx];
    +			if (!(gp->mode & ATTR_WDUMMY) && strchr(worddelimiters, gp->c[0]))
     				break;
    -			}

    -			*x += direction;
    +			*x = newx;
    +			*y = newy;
     		}
     		break;
     	case SNAP_LINE: