Make ctrl-w work in middle of line
authorSimon Andersson <simon.andersson@magine.com>
Wed, 22 Jul 2015 22:27:10 +0000 (00:27 +0200)
committerSimon Andersson <simon.andersson@magine.com>
Wed, 22 Jul 2015 22:27:10 +0000 (00:27 +0200)
src/curses/ux_input.c

index c05cd5ae476b8d2902f484401411e71cf6dee81d..216015912f76b6ed20863f7f849506a7027efdc4 100644 (file)
@@ -449,20 +449,22 @@ zchar os_read_line (int max, zchar *buf, int timeout, int width, int continued)
            }
            break;
        case ZC_DEL_WORD:
-               if (scrpos != 0 && scrpos == len) {
+               if (scrpos != 0) {
                        /* Search for start of preceding word */
-                       int i = len;
-                       while (i > 0 && buf[i] != ' ') {
-                               mvaddch(y, x + i, ' ');
-                               i--;
-                       }
+                       int i;
+                       for (i = scrpos - 1; i > 0 && buf[i] != ' '; i--) {}
 
                        searchpos = -1;
                        int delta = scrpos - i;
+                       int oldlen = len;
+                       int oldscrpos = scrpos;
                        len -= delta;
                        scrpos -= delta;
-                       scrnmove(x + scrpos, x + scrpos + delta, delta);
-                       memmove(buf + scrpos, buf + scrpos + delta, delta);
+                       scrnmove(x + scrpos, x + oldscrpos, len - scrpos);
+                       memmove(buf + scrpos, buf + oldscrpos, len - scrpos);
+                       for (i = len; i <= oldlen ; i++) {
+                               mvaddch(y, x + i, ' ');
+                       }
                }
                break;
        case CHR_DEL: