JasonWoof Got questions, comments, patches, etc.? Contact Jason Woofenden
Change the behavior of word snapping on delimiters
[st.git] / st.c
diff --git a/st.c b/st.c
index 6165119..497885b 100644 (file)
--- a/st.c
+++ b/st.c
@@ -682,6 +682,9 @@ selnormalize(void) {
        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;
@@ -706,7 +709,8 @@ selected(int x, int y) {
 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:
@@ -714,6 +718,8 @@ selsnap(int mode, int *x, int *y, int direction) {
                 * 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;
@@ -735,11 +741,15 @@ selsnap(int mode, int *x, int *y, int direction) {
                                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:
@@ -777,15 +787,6 @@ getbuttoninfo(XEvent *e) {
 
        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;
@@ -900,8 +901,6 @@ bpress(XEvent *e) {
                } 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();
 
                /*