sel.nb.y = MIN(sel.ob.y, sel.oe.y);
sel.ne.y = MAX(sel.ob.y, sel.oe.y);
+ selsnap(sel.snap, &sel.nb.x, &sel.nb.y, -1);
+ selsnap(sel.snap, &sel.ne.x, &sel.ne.y, +1);
+
/* expand selection over line breaks */
if (sel.type == SEL_RECTANGULAR)
return;
void
selsnap(int mode, int *x, int *y, int direction) {
int newx, newy, xt, yt;
- Glyph *gp;
+ bool delim, prevdelim;
+ Glyph *gp, *prevgp;
switch(mode) {
case SNAP_WORD:
* Snap around if the word wraps around at the end or
* beginning of a line.
*/
+ prevgp = &term.line[*y][*x];
+ prevdelim = strchr(worddelimiters, prevgp->c[0]) != NULL;
for(;;) {
newx = *x + direction;
newy = *y;
break;
gp = &term.line[newy][newx];
- if (!(gp->mode & ATTR_WDUMMY) && strchr(worddelimiters, gp->c[0]))
+ delim = strchr(worddelimiters, gp->c[0]) != NULL;
+ if(!(gp->mode & ATTR_WDUMMY) && (delim != prevdelim
+ || (delim && gp->c[0] != prevgp->c[0])))
break;
*x = newx;
*y = newy;
+ prevgp = gp;
+ prevdelim = delim;
}
break;
case SNAP_LINE:
sel.oe.x = x2col(e->xbutton.x);
sel.oe.y = y2row(e->xbutton.y);
-
- if(sel.ob.y < sel.oe.y
- || (sel.ob.y == sel.oe.y && sel.ob.x < sel.oe.x)) {
- selsnap(sel.snap, &sel.ob.x, &sel.ob.y, -1);
- selsnap(sel.snap, &sel.oe.x, &sel.oe.y, +1);
- } else {
- selsnap(sel.snap, &sel.oe.x, &sel.oe.y, -1);
- selsnap(sel.snap, &sel.ob.x, &sel.ob.y, +1);
- }
selnormalize();
sel.type = SEL_REGULAR;
} else {
sel.snap = 0;
}
- selsnap(sel.snap, &sel.ob.x, &sel.ob.y, -1);
- selsnap(sel.snap, &sel.oe.x, &sel.oe.y, +1);
selnormalize();
/*