Backport 10849 and 10851
authorEric Andersen <andersen@codepoet.org>
Mon, 18 Jul 2005 23:54:47 +0000 (23:54 -0000)
committerEric Andersen <andersen@codepoet.org>
Mon, 18 Jul 2005 23:54:47 +0000 (23:54 -0000)
busybox/editors/vi.c

index 5a47f5a23f2120b8efe92d3e088f608d3aa89021..eb0aa33f6078df4543afa3bf0a8d12c7bf4e4241 100644 (file)
@@ -344,6 +344,7 @@ extern int vi_main(int argc, char **argv)
 #endif                                                 /* CONFIG_FEATURE_VI_CRASHME */
 
        status_buffer = STATUS_BUFFER;
+       *status_buffer = '\0';  // clear status buffer
 
 #ifdef CONFIG_FEATURE_VI_READONLY
        vi_readonly = readonly = FALSE;
@@ -462,7 +463,6 @@ static void edit_file(Byte * fn)
        last_forward_char = last_input_char = '\0';
        crow = 0;
        ccol = 0;
-       edit_status();
 
 #ifdef CONFIG_FEATURE_VI_USE_SIGNALS
        catch_sig(0);
@@ -506,6 +506,7 @@ static void edit_file(Byte * fn)
        adding2q = 0;
 #endif                                                 /* CONFIG_FEATURE_VI_DOT_CMD */
        redraw(FALSE);                  // dont force every col re-draw
+       edit_status();
        show_status_line();
 
        //------This is the main Vi cmd handling loop -----------------------
@@ -871,6 +872,7 @@ static void colon(Byte * buf)
                } else {
                        // user wants file status info
                        edit_status();
+                       show_status_line();
                }
        } else if (strncasecmp((char *) cmd, "features", i) == 0) {     // what features are available
                // print out values of all features
@@ -1333,22 +1335,30 @@ static void dot_left(void)
 {
        if (dot > text && dot[-1] != '\n')
                dot--;
+       edit_status();                  // show current file status
+       show_status_line();
 }
 
 static void dot_right(void)
 {
        if (dot < end - 1 && *dot != '\n')
                dot++;
+       edit_status();                  // show current file status
+       show_status_line();
 }
 
 static void dot_begin(void)
 {
        dot = begin_line(dot);  // return pointer to first char cur line
+       edit_status();                  // show current file status
+       show_status_line();
 }
 
 static void dot_end(void)
 {
        dot = end_line(dot);    // return pointer to last char cur line
+       edit_status();                  // show current file status
+       show_status_line();
 }
 
 static Byte *move_to_col(Byte * p, int l)
@@ -1373,11 +1383,15 @@ static Byte *move_to_col(Byte * p, int l)
 static void dot_next(void)
 {
        dot = next_line(dot);
+       edit_status();                  // show current file status
+       show_status_line();
 }
 
 static void dot_prev(void)
 {
        dot = prev_line(dot);
+       edit_status();                  // show current file status
+       show_status_line();
 }
 
 static void dot_scroll(int cnt, int dir)
@@ -1402,6 +1416,8 @@ static void dot_scroll(int cnt, int dir)
        if (dot > q)
                dot = begin_line(q);    // is dot is below bottom line?
        dot_skip_over_ws();
+       edit_status();                  // show current file status
+       show_status_line();
 }
 
 static void dot_skip_over_ws(void)
@@ -1592,11 +1608,11 @@ static Byte *char_insert(Byte * p, Byte c) // insert the char c at 'p'
                cmd_mode = 0;
                cmdcnt = 0;
                end_cmd_q();    // stop adding to q
-               strcpy((char *) status_buffer, " ");    // clear the status buffer
+               *status_buffer = '\0';  // clear the status buffer
                if ((p[-1] != '\n') && (dot>text)) {
                        p--;
                }
-       } else if (c == erase_char) {   // Is this a BS
+       } else if (c == erase_char || c == 8 || c == 127) { // Is this a BS
                //     123456789
                if ((p[-1] != '\n') && (dot>text)) {
                        p--;
@@ -2659,7 +2675,7 @@ static void show_status_line(void)
        static int last_cksum;
        int l, cnt, cksum;
 
-       edit_status();
+       //edit_status();
        cnt = strlen((char *) status_buffer);
        for (cksum= l= 0; l < cnt; l++) { cksum += (int)(status_buffer[l]); }
        // don't write the status line unless it changes
@@ -2681,10 +2697,10 @@ static void psbs(const char *format, ...)
 
        va_start(args, format);
        strcpy((char *) status_buffer, SOs);    // Terminal standout mode on
-       vsprintf((char *) status_buffer + strlen((char *) status_buffer), format,
-                        args);
+       vsprintf((char *) status_buffer + strlen((char *) status_buffer), format, args);
        strcat((char *) status_buffer, SOn);    // Terminal standout mode off
        va_end(args);
+       show_status_line();
 
        return;
 }
@@ -2697,6 +2713,7 @@ static void psb(const char *format, ...)
        va_start(args, format);
        vsprintf((char *) status_buffer, format, args);
        va_end(args);
+       show_status_line();
        return;
 }
 
@@ -2723,17 +2740,19 @@ static void edit_status(void)   // show file status on status line
                cur = tot = 0;
                percent = 100;
        }
-       psb("\"%s\""
+
+       sprintf((char *) status_buffer,
+                       "\"%s\""
 #ifdef CONFIG_FEATURE_VI_READONLY
-               "%s"
+                       "%s"
 #endif                                                 /* CONFIG_FEATURE_VI_READONLY */
-               "%s line %d of %d --%d%%--",
-               (cfn != 0 ? (char *) cfn : "No file"),
+                       "%s line %d of %d --%d%%--",
+                       (cfn != 0 ? (char *) cfn : "No file"),
 #ifdef CONFIG_FEATURE_VI_READONLY
-               ((vi_readonly || readonly) ? " [Read only]" : ""),
+                       ((vi_readonly || readonly) ? " [Read only]" : ""),
 #endif                                                 /* CONFIG_FEATURE_VI_READONLY */
-               (file_modified ? " [modified]" : ""),
-               cur, tot, percent);
+                       (file_modified ? " [modified]" : ""),
+                       cur, tot, percent);
 }
 
 //----- Force refresh of all Lines -----------------------------
@@ -2879,6 +2898,8 @@ static void refresh(int full_screen)
 #endif                                                 /* CONFIG_FEATURE_VI_OPTIMIZE_CURSOR */
                        }
 
+                       edit_status();                  // show current file status
+                       show_status_line();
                        // write line out to terminal
                        {
                                int nic = ce-cs+1;
@@ -3058,15 +3079,18 @@ key_cmd_mode:
                break;
        case 7:                 // ctrl-G  show current status
                edit_status();
+               show_status_line();
                break;
        case 'h':                       // h- move left
        case VI_K_LEFT: // cursor key Left
-       case 8:                 // ctrl-H- move left    (This may be ERASE char)
-       case 127:                       // DEL- move left   (This may be ERASE char)
+       case 8:         // ctrl-H- move left    (This may be ERASE char)
+       case 127:       // DEL- move left   (This may be ERASE char)
                if (cmdcnt-- > 1) {
                        do_cmd(c);
                }                               // repeat cnt
                dot_left();
+               edit_status();                  // show current file status
+               show_status_line();
                break;
        case 10:                        // Newline ^J
        case 'j':                       // j- goto next line, same col
@@ -3225,7 +3249,7 @@ key_cmd_mode:
                //
                // dont separate these two commands. 'f' depends on ';'
                //
-               //**** fall thru to ... 'i'
+               //**** fall thru to ... ';'
        case ';':                       // ;- look at rest of line for last forward char
                if (cmdcnt-- > 1) {
                        do_cmd(';');
@@ -3383,6 +3407,7 @@ key_cmd_mode:
                        }
                } else if (strncasecmp((char *) p, "file", cnt) == 0 ) {
                        edit_status();                  // show current file status
+                       show_status_line();
                } else if (sscanf((char *) p, "%d", &j) > 0) {
                        dot = find_line(j);             // go to line # j
                        dot_skip_over_ws();