diff options
| author | Denys Vlasenko <vda.linux@googlemail.com> | 2010-03-26 16:10:14 +0100 |
|---|---|---|
| committer | Denys Vlasenko <vda.linux@googlemail.com> | 2010-03-26 16:10:14 +0100 |
| commit | 35fdb1bc9cb82fa5630c2d40ae49110ecd7c88ea (patch) | |
| tree | 36e64090e5f689bbbc8dd982118efb0374561be5 | |
| parent | 023a08f2292a5ae6eb6a8350dc8a94fc64bfcb7c (diff) | |
| download | busybox-w32-35fdb1bc9cb82fa5630c2d40ae49110ecd7c88ea.tar.gz busybox-w32-35fdb1bc9cb82fa5630c2d40ae49110ecd7c88ea.tar.bz2 busybox-w32-35fdb1bc9cb82fa5630c2d40ae49110ecd7c88ea.zip | |
vi: fix NUM + "$" handling
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
| -rw-r--r-- | editors/vi.c | 77 |
1 files changed, 39 insertions, 38 deletions
diff --git a/editors/vi.c b/editors/vi.c index a22a6a104..633d42a8c 100644 --- a/editors/vi.c +++ b/editors/vi.c | |||
| @@ -3015,17 +3015,17 @@ static void do_cmd(int c) | |||
| 3015 | case KEYCODE_LEFT: // cursor key Left | 3015 | case KEYCODE_LEFT: // cursor key Left |
| 3016 | case 8: // ctrl-H- move left (This may be ERASE char) | 3016 | case 8: // ctrl-H- move left (This may be ERASE char) |
| 3017 | case 0x7f: // DEL- move left (This may be ERASE char) | 3017 | case 0x7f: // DEL- move left (This may be ERASE char) |
| 3018 | if (cmdcnt-- > 1) { | 3018 | if (--cmdcnt > 0) { |
| 3019 | do_cmd(c); | 3019 | do_cmd(c); |
| 3020 | } // repeat cnt | 3020 | } |
| 3021 | dot_left(); | 3021 | dot_left(); |
| 3022 | break; | 3022 | break; |
| 3023 | case 10: // Newline ^J | 3023 | case 10: // Newline ^J |
| 3024 | case 'j': // j- goto next line, same col | 3024 | case 'j': // j- goto next line, same col |
| 3025 | case KEYCODE_DOWN: // cursor key Down | 3025 | case KEYCODE_DOWN: // cursor key Down |
| 3026 | if (cmdcnt-- > 1) { | 3026 | if (--cmdcnt > 0) { |
| 3027 | do_cmd(c); | 3027 | do_cmd(c); |
| 3028 | } // repeat cnt | 3028 | } |
| 3029 | dot_next(); // go to next B-o-l | 3029 | dot_next(); // go to next B-o-l |
| 3030 | dot = move_to_col(dot, ccol + offset); // try stay in same col | 3030 | dot = move_to_col(dot, ccol + offset); // try stay in same col |
| 3031 | break; | 3031 | break; |
| @@ -3040,9 +3040,9 @@ static void do_cmd(int c) | |||
| 3040 | break; | 3040 | break; |
| 3041 | case 13: // Carriage Return ^M | 3041 | case 13: // Carriage Return ^M |
| 3042 | case '+': // +- goto next line | 3042 | case '+': // +- goto next line |
| 3043 | if (cmdcnt-- > 1) { | 3043 | if (--cmdcnt > 0) { |
| 3044 | do_cmd(c); | 3044 | do_cmd(c); |
| 3045 | } // repeat cnt | 3045 | } |
| 3046 | dot_next(); | 3046 | dot_next(); |
| 3047 | dot_skip_over_ws(); | 3047 | dot_skip_over_ws(); |
| 3048 | break; | 3048 | break; |
| @@ -3062,9 +3062,9 @@ static void do_cmd(int c) | |||
| 3062 | case ' ': // move right | 3062 | case ' ': // move right |
| 3063 | case 'l': // move right | 3063 | case 'l': // move right |
| 3064 | case KEYCODE_RIGHT: // Cursor Key Right | 3064 | case KEYCODE_RIGHT: // Cursor Key Right |
| 3065 | if (cmdcnt-- > 1) { | 3065 | if (--cmdcnt > 0) { |
| 3066 | do_cmd(c); | 3066 | do_cmd(c); |
| 3067 | } // repeat cnt | 3067 | } |
| 3068 | dot_right(); | 3068 | dot_right(); |
| 3069 | break; | 3069 | break; |
| 3070 | #if ENABLE_FEATURE_VI_YANKMARK | 3070 | #if ENABLE_FEATURE_VI_YANKMARK |
| @@ -3147,9 +3147,10 @@ static void do_cmd(int c) | |||
| 3147 | #endif /* FEATURE_VI_YANKMARK */ | 3147 | #endif /* FEATURE_VI_YANKMARK */ |
| 3148 | case '$': // $- goto end of line | 3148 | case '$': // $- goto end of line |
| 3149 | case KEYCODE_END: // Cursor Key End | 3149 | case KEYCODE_END: // Cursor Key End |
| 3150 | if (cmdcnt-- > 1) { | 3150 | if (--cmdcnt > 0) { |
| 3151 | dot_next(); | ||
| 3151 | do_cmd(c); | 3152 | do_cmd(c); |
| 3152 | } // repeat cnt | 3153 | } |
| 3153 | dot = end_line(dot); | 3154 | dot = end_line(dot); |
| 3154 | break; | 3155 | break; |
| 3155 | case '%': // %- find matching char of pair () [] {} | 3156 | case '%': // %- find matching char of pair () [] {} |
| @@ -3175,9 +3176,9 @@ static void do_cmd(int c) | |||
| 3175 | // | 3176 | // |
| 3176 | //**** fall through to ... ';' | 3177 | //**** fall through to ... ';' |
| 3177 | case ';': // ;- look at rest of line for last forward char | 3178 | case ';': // ;- look at rest of line for last forward char |
| 3178 | if (cmdcnt-- > 1) { | 3179 | if (--cmdcnt > 0) { |
| 3179 | do_cmd(';'); | 3180 | do_cmd(';'); |
| 3180 | } // repeat cnt | 3181 | } |
| 3181 | if (last_forward_char == 0) | 3182 | if (last_forward_char == 0) |
| 3182 | break; | 3183 | break; |
| 3183 | q = dot + 1; | 3184 | q = dot + 1; |
| @@ -3188,9 +3189,9 @@ static void do_cmd(int c) | |||
| 3188 | dot = q; | 3189 | dot = q; |
| 3189 | break; | 3190 | break; |
| 3190 | case ',': // repeat latest 'f' in opposite direction | 3191 | case ',': // repeat latest 'f' in opposite direction |
| 3191 | if (cmdcnt-- > 1) { | 3192 | if (--cmdcnt > 0) { |
| 3192 | do_cmd(','); | 3193 | do_cmd(','); |
| 3193 | } // repeat cnt | 3194 | } |
| 3194 | if (last_forward_char == 0) | 3195 | if (last_forward_char == 0) |
| 3195 | break; | 3196 | break; |
| 3196 | q = dot - 1; | 3197 | q = dot - 1; |
| @@ -3202,9 +3203,9 @@ static void do_cmd(int c) | |||
| 3202 | break; | 3203 | break; |
| 3203 | 3204 | ||
| 3204 | case '-': // -- goto prev line | 3205 | case '-': // -- goto prev line |
| 3205 | if (cmdcnt-- > 1) { | 3206 | if (--cmdcnt > 0) { |
| 3206 | do_cmd(c); | 3207 | do_cmd(c); |
| 3207 | } // repeat cnt | 3208 | } |
| 3208 | dot_prev(); | 3209 | dot_prev(); |
| 3209 | dot_skip_over_ws(); | 3210 | dot_skip_over_ws(); |
| 3210 | break; | 3211 | break; |
| @@ -3238,9 +3239,9 @@ static void do_cmd(int c) | |||
| 3238 | // user changed mind and erased the "/"- do nothing | 3239 | // user changed mind and erased the "/"- do nothing |
| 3239 | break; | 3240 | break; |
| 3240 | case 'N': // N- backward search for last pattern | 3241 | case 'N': // N- backward search for last pattern |
| 3241 | if (cmdcnt-- > 1) { | 3242 | if (--cmdcnt > 0) { |
| 3242 | do_cmd(c); | 3243 | do_cmd(c); |
| 3243 | } // repeat cnt | 3244 | } |
| 3244 | dir = BACK; // assume BACKWARD search | 3245 | dir = BACK; // assume BACKWARD search |
| 3245 | p = dot - 1; | 3246 | p = dot - 1; |
| 3246 | if (last_search_pattern[0] == '?') { | 3247 | if (last_search_pattern[0] == '?') { |
| @@ -3252,9 +3253,9 @@ static void do_cmd(int c) | |||
| 3252 | case 'n': // n- repeat search for last pattern | 3253 | case 'n': // n- repeat search for last pattern |
| 3253 | // search rest of text[] starting at next char | 3254 | // search rest of text[] starting at next char |
| 3254 | // if search fails return orignal "p" not the "p+1" address | 3255 | // if search fails return orignal "p" not the "p+1" address |
| 3255 | if (cmdcnt-- > 1) { | 3256 | if (--cmdcnt > 0) { |
| 3256 | do_cmd(c); | 3257 | do_cmd(c); |
| 3257 | } // repeat cnt | 3258 | } |
| 3258 | dc3: | 3259 | dc3: |
| 3259 | dir = FORWARD; // assume FORWARD search | 3260 | dir = FORWARD; // assume FORWARD search |
| 3260 | p = dot + 1; | 3261 | p = dot + 1; |
| @@ -3405,9 +3406,9 @@ static void do_cmd(int c) | |||
| 3405 | case 'B': // B- back a blank-delimited Word | 3406 | case 'B': // B- back a blank-delimited Word |
| 3406 | case 'E': // E- end of a blank-delimited word | 3407 | case 'E': // E- end of a blank-delimited word |
| 3407 | case 'W': // W- forward a blank-delimited word | 3408 | case 'W': // W- forward a blank-delimited word |
| 3408 | if (cmdcnt-- > 1) { | 3409 | if (--cmdcnt > 0) { |
| 3409 | do_cmd(c); | 3410 | do_cmd(c); |
| 3410 | } // repeat cnt | 3411 | } |
| 3411 | dir = FORWARD; | 3412 | dir = FORWARD; |
| 3412 | if (c == 'B') | 3413 | if (c == 'B') |
| 3413 | dir = BACK; | 3414 | dir = BACK; |
| @@ -3455,9 +3456,9 @@ static void do_cmd(int c) | |||
| 3455 | if (cmdcnt > (rows - 1)) { | 3456 | if (cmdcnt > (rows - 1)) { |
| 3456 | cmdcnt = (rows - 1); | 3457 | cmdcnt = (rows - 1); |
| 3457 | } | 3458 | } |
| 3458 | if (cmdcnt-- > 1) { | 3459 | if (--cmdcnt > 0) { |
| 3459 | do_cmd('+'); | 3460 | do_cmd('+'); |
| 3460 | } // repeat cnt | 3461 | } |
| 3461 | dot_skip_over_ws(); | 3462 | dot_skip_over_ws(); |
| 3462 | break; | 3463 | break; |
| 3463 | case 'I': // I- insert before first non-blank | 3464 | case 'I': // I- insert before first non-blank |
| @@ -3470,9 +3471,9 @@ static void do_cmd(int c) | |||
| 3470 | cmd_mode = 1; // start insrting | 3471 | cmd_mode = 1; // start insrting |
| 3471 | break; | 3472 | break; |
| 3472 | case 'J': // J- join current and next lines together | 3473 | case 'J': // J- join current and next lines together |
| 3473 | if (cmdcnt-- > 2) { | 3474 | if (--cmdcnt > 1) { |
| 3474 | do_cmd(c); | 3475 | do_cmd(c); |
| 3475 | } // repeat cnt | 3476 | } |
| 3476 | dot_end(); // move to NL | 3477 | dot_end(); // move to NL |
| 3477 | if (dot < end - 1) { // make sure not last char in text[] | 3478 | if (dot < end - 1) { // make sure not last char in text[] |
| 3478 | *dot++ = ' '; // replace NL with space | 3479 | *dot++ = ' '; // replace NL with space |
| @@ -3488,9 +3489,9 @@ static void do_cmd(int c) | |||
| 3488 | if (cmdcnt > (rows - 1)) { | 3489 | if (cmdcnt > (rows - 1)) { |
| 3489 | cmdcnt = (rows - 1); | 3490 | cmdcnt = (rows - 1); |
| 3490 | } | 3491 | } |
| 3491 | if (cmdcnt-- > 1) { | 3492 | if (--cmdcnt > 0) { |
| 3492 | do_cmd('-'); | 3493 | do_cmd('-'); |
| 3493 | } // repeat cnt | 3494 | } |
| 3494 | dot_begin(); | 3495 | dot_begin(); |
| 3495 | dot_skip_over_ws(); | 3496 | dot_skip_over_ws(); |
| 3496 | break; | 3497 | break; |
| @@ -3524,9 +3525,9 @@ static void do_cmd(int c) | |||
| 3524 | case 'X': // X- delete char before dot | 3525 | case 'X': // X- delete char before dot |
| 3525 | case 'x': // x- delete the current char | 3526 | case 'x': // x- delete the current char |
| 3526 | case 's': // s- substitute the current char | 3527 | case 's': // s- substitute the current char |
| 3527 | if (cmdcnt-- > 1) { | 3528 | if (--cmdcnt > 0) { |
| 3528 | do_cmd(c); | 3529 | do_cmd(c); |
| 3529 | } // repeat cnt | 3530 | } |
| 3530 | dir = 0; | 3531 | dir = 0; |
| 3531 | if (c == 'X') | 3532 | if (c == 'X') |
| 3532 | dir = -1; | 3533 | dir = -1; |
| @@ -3568,9 +3569,9 @@ static void do_cmd(int c) | |||
| 3568 | break; | 3569 | break; |
| 3569 | case 'b': // b- back a word | 3570 | case 'b': // b- back a word |
| 3570 | case 'e': // e- end of word | 3571 | case 'e': // e- end of word |
| 3571 | if (cmdcnt-- > 1) { | 3572 | if (--cmdcnt > 0) { |
| 3572 | do_cmd(c); | 3573 | do_cmd(c); |
| 3573 | } // repeat cnt | 3574 | } |
| 3574 | dir = FORWARD; | 3575 | dir = FORWARD; |
| 3575 | if (c == 'b') | 3576 | if (c == 'b') |
| 3576 | dir = BACK; | 3577 | dir = BACK; |
| @@ -3669,9 +3670,9 @@ static void do_cmd(int c) | |||
| 3669 | } | 3670 | } |
| 3670 | case 'k': // k- goto prev line, same col | 3671 | case 'k': // k- goto prev line, same col |
| 3671 | case KEYCODE_UP: // cursor key Up | 3672 | case KEYCODE_UP: // cursor key Up |
| 3672 | if (cmdcnt-- > 1) { | 3673 | if (--cmdcnt > 0) { |
| 3673 | do_cmd(c); | 3674 | do_cmd(c); |
| 3674 | } // repeat cnt | 3675 | } |
| 3675 | dot_prev(); | 3676 | dot_prev(); |
| 3676 | dot = move_to_col(dot, ccol + offset); // try stay in same col | 3677 | dot = move_to_col(dot, ccol + offset); // try stay in same col |
| 3677 | break; | 3678 | break; |
| @@ -3691,9 +3692,9 @@ static void do_cmd(int c) | |||
| 3691 | last_forward_char = 0; | 3692 | last_forward_char = 0; |
| 3692 | break; | 3693 | break; |
| 3693 | case 'w': // w- forward a word | 3694 | case 'w': // w- forward a word |
| 3694 | if (cmdcnt-- > 1) { | 3695 | if (--cmdcnt > 0) { |
| 3695 | do_cmd(c); | 3696 | do_cmd(c); |
| 3696 | } // repeat cnt | 3697 | } |
| 3697 | if (isalnum(*dot) || *dot == '_') { // we are on ALNUM | 3698 | if (isalnum(*dot) || *dot == '_') { // we are on ALNUM |
| 3698 | dot = skip_thing(dot, 1, FORWARD, S_END_ALNUM); | 3699 | dot = skip_thing(dot, 1, FORWARD, S_END_ALNUM); |
| 3699 | } else if (ispunct(*dot)) { // we are on PUNCT | 3700 | } else if (ispunct(*dot)) { // we are on PUNCT |
| @@ -3719,9 +3720,9 @@ static void do_cmd(int c) | |||
| 3719 | dot = move_to_col(dot, cmdcnt - 1); // try to move to column | 3720 | dot = move_to_col(dot, cmdcnt - 1); // try to move to column |
| 3720 | break; | 3721 | break; |
| 3721 | case '~': // ~- flip the case of letters a-z -> A-Z | 3722 | case '~': // ~- flip the case of letters a-z -> A-Z |
| 3722 | if (cmdcnt-- > 1) { | 3723 | if (--cmdcnt > 0) { |
| 3723 | do_cmd(c); | 3724 | do_cmd(c); |
| 3724 | } // repeat cnt | 3725 | } |
| 3725 | if (islower(*dot)) { | 3726 | if (islower(*dot)) { |
| 3726 | *dot = toupper(*dot); | 3727 | *dot = toupper(*dot); |
| 3727 | file_modified++; | 3728 | file_modified++; |
