lineedit: fix insertion deep inside line (*several lines* before end)
authorDenys Vlasenko <vda.linux@googlemail.com>
Mon, 17 May 2010 10:30:44 +0000 (12:30 +0200)
committerDenys Vlasenko <vda.linux@googlemail.com>
Mon, 17 May 2010 10:30:44 +0000 (12:30 +0200)
function                                             old     new   delta
input_backward                                       212     229     +17

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
libbb/lineedit.c

index 36d057b..f7d3ffe 100644 (file)
@@ -486,15 +486,22 @@ static void input_backward(unsigned num)
                while (cursor < sv_cursor)
                        put_cur_glyph_and_inc_cursor();
        } else {
-               int count_y;
-               unsigned w;
+               int lines_up;
+               unsigned width;
+               /* num = chars to go back from the beginning of current line: */
                num -= cmdedit_x;
-               w = cmdedit_termw; /* read volatile var once */
-               count_y = 1 + (num / w);
-               cmdedit_y -= count_y;
-               cmdedit_x = w * count_y - num;
-               /* go to 1st column; go up; go to correct column */
-               printf("\r" "\033[%uA" "\033[%uC", count_y, cmdedit_x);
+               width = cmdedit_termw; /* read volatile var once */
+               /* num=1...w: one line up, w+1...2w: two, etc: */
+               lines_up = 1 + (num - 1) / width;
+               cmdedit_x = (width * cmdedit_y - num) % width;
+               cmdedit_y -= lines_up;
+               /* go to 1st column; go up */
+               printf("\r" "\033[%uA", lines_up);
+               /* go to correct column.
+                * xtarm, konsole, Linux VT interpret 0 as 1 below! wow.
+                * Need to *make sure* we skip it if cmdedit_x == 0 */
+               if (cmdedit_x)
+                       printf("\033[%uC", cmdedit_x);
        }
 }