diff options
author | watiko <service@mail.watiko.net> | 2016-01-14 18:49:35 +0900 |
---|---|---|
committer | watiko <service@mail.watiko.net> | 2016-02-01 03:43:36 +0900 |
commit | 5ef1cb5c2e77e3df70d93ade9afb54a3e989a3ee (patch) | |
tree | 065e87ff69e50f7c8030913697374ca0da91d9ff | |
parent | 6d1b948b6b98d34b1ca8c62a7bb6d08f85f85491 (diff) | |
download | rneovim-5ef1cb5c2e77e3df70d93ade9afb54a3e989a3ee.tar.gz rneovim-5ef1cb5c2e77e3df70d93ade9afb54a3e989a3ee.tar.bz2 rneovim-5ef1cb5c2e77e3df70d93ade9afb54a3e989a3ee.zip |
vim-patch:7.4.765
Problem: CTRL-A and CTRL-X in Visual mode do not always work well.
Solution: Improvements for increment and decrement. (Christian Brabandt)
https://github.com/vim/vim/commit/9bb1930af908338b68588e988be9601ad144af07
-rw-r--r-- | src/nvim/normal.c | 16 | ||||
-rw-r--r-- | src/nvim/ops.c | 65 | ||||
-rw-r--r-- | src/nvim/testdir/test_increment.in | 259 | ||||
-rw-r--r-- | src/nvim/testdir/test_increment.ok | 127 | ||||
-rw-r--r-- | src/nvim/version.c | 2 |
5 files changed, 441 insertions, 28 deletions
diff --git a/src/nvim/normal.c b/src/nvim/normal.c index 684467d26a..d831679b64 100644 --- a/src/nvim/normal.c +++ b/src/nvim/normal.c @@ -3506,7 +3506,21 @@ static void nv_addsub(cmdarg_T *cap) bool visual = VIsual_active; if (cap->oap->op_type == OP_NOP && do_addsub((int)cap->cmdchar, cap->count1, cap->arg) == OK) { - prep_redo_cmd(cap); + if (visual) { + ResetRedobuff(); + AppendCharToRedobuff(VIsual_mode); + if (VIsual_mode == 'V') { + AppendNumberToRedobuff(cap->oap->line_count); + AppendCharToRedobuff('j'); + } + AppendNumberToRedobuff(cap->count1); + if (cap->nchar != NUL) { + AppendCharToRedobuff(cap->nchar); + } + AppendCharToRedobuff(cap->cmdchar); + } else { + prep_redo_cmd(cap); + } } else { clearopbeep(cap->oap); } diff --git a/src/nvim/ops.c b/src/nvim/ops.c index af738d3fa9..78eebc520f 100644 --- a/src/nvim/ops.c +++ b/src/nvim/ops.c @@ -4213,7 +4213,7 @@ int do_addsub(int command, linenr_T Prenum1, bool g_cmd) int pre; // 'X' or 'x': hex; '0': octal; 'B' or 'b': bin static bool hexupper = false; // 0xABC unsigned long n; - long offset = 0; + unsigned long offset = 0; unsigned long oldn; char_u *ptr; int c; @@ -4226,9 +4226,11 @@ int do_addsub(int command, linenr_T Prenum1, bool g_cmd) int firstdigit; bool subtract; bool negative = false; + bool was_positive = true; bool visual = VIsual_active; int lnum = curwin->w_cursor.lnum; int lnume = curwin->w_cursor.lnum; + int startcol; dohex = (vim_strchr(curbuf->b_p_nf, 'x') != NULL); // "heX" dooct = (vim_strchr(curbuf->b_p_nf, 'o') != NULL); // "Octal" @@ -4255,13 +4257,16 @@ int do_addsub(int command, linenr_T Prenum1, bool g_cmd) curbuf->b_visual.vi_end = curwin->w_cursor; curbuf->b_visual.vi_mode = VIsual_mode; - col = VIsual.col; + if (VIsual_mode != 'v') { + startcol = VIsual.col < curwin->w_cursor.col + ? VIsual.col : curwin->w_cursor.col; + } else { + startcol = VIsual.col; + } + col = startcol; + lnum = VIsual.lnum; lnume = curwin->w_cursor.lnum; - if (ptr[col] == '-') { - negative = true; - col++; - } } else { ptr = get_cursor_line_ptr(); RLADDSUBFIX(ptr); @@ -4328,10 +4333,16 @@ int do_addsub(int command, linenr_T Prenum1, bool g_cmd) for (int i = lnum; i <= lnume; i++) { curwin->w_cursor.lnum = i; ptr = get_cursor_line_ptr(); - RLADDSUBFIX(ptr); if ((int)STRLEN(ptr) <= col) { - col = 0; + // try again on next line + continue; + } + if (visual && ptr[col] == '-') { + negative = true; + was_positive = false; + col++; } + RLADDSUBFIX(ptr); // If a number was found, and saving for undo works, replace the number. firstdigit = ptr[col]; RLADDSUBFIX(ptr); @@ -4424,6 +4435,12 @@ int do_addsub(int command, linenr_T Prenum1, bool g_cmd) } } + if (visual && !was_positive && !negative) { + // need to remove the '-' + col--; + length++; + } + // Delete the old number. curwin->w_cursor.col = col; todel = length; @@ -4452,8 +4469,7 @@ int do_addsub(int command, linenr_T Prenum1, bool g_cmd) // Allocate a bit too much. buf1 = xmalloc(length + NUMBUFLEN); ptr = buf1; - // do not add leading '-' for visual mode' - if (negative && !visual) { + if (negative && (!visual || (visual && was_positive))) { *ptr++ = '-'; } if (pre) { @@ -4483,21 +4499,16 @@ int do_addsub(int command, linenr_T Prenum1, bool g_cmd) buf2[pos] = '\0'; } else if (pre == 0) { - snprintf((char *)buf2, NUMBUFLEN, "%" PRIu64, (uint64_t)n + offset); + vim_snprintf((char *)buf2, ARRAY_SIZE(buf2), "%" PRIu64, (uint64_t)n); } else if (pre == '0') { - snprintf((char *)buf2, NUMBUFLEN, "%" PRIo64, (uint64_t)n + offset); + vim_snprintf((char *)buf2, ARRAY_SIZE(buf2), "%" PRIo64, (uint64_t)n); } else if (pre && hexupper) { - snprintf((char *)buf2, NUMBUFLEN, "%" PRIX64, (uint64_t)n + offset); + vim_snprintf((char *)buf2, ARRAY_SIZE(buf2), "%" PRIX64, (uint64_t)n); } else { - snprintf((char *)buf2, NUMBUFLEN, "%" PRIx64, (uint64_t)n + offset); + vim_snprintf((char *)buf2, ARRAY_SIZE(buf2), "%" PRIx64, (uint64_t)n); } length -= (int)STRLEN(buf2); - if (g_cmd) { - offset = subtract ? offset - (unsigned long) Prenum1 - : offset + (unsigned long) Prenum1; - } - // Adjust number of zeros to the new number of digits, so the // total length of the number remains the same. // Don't do this when @@ -4512,11 +4523,25 @@ int do_addsub(int command, linenr_T Prenum1, bool g_cmd) ins_str(buf1); // insert the new number xfree(buf1); } - curwin->w_cursor.col--; + + if (g_cmd) { + offset = (unsigned long)Prenum1; + g_cmd = 0; + } + // reset + subtract = false; + negative = false; + if (visual && VIsual_mode != Ctrl_V) { + col = 0; + } else { + col = startcol; + } + Prenum1 += offset; curwin->w_set_curswant = true; ptr = ml_get_buf(curbuf, curwin->w_cursor.lnum, true); RLADDSUBFIX(ptr); } + curwin->w_cursor.col--; return OK; } diff --git a/src/nvim/testdir/test_increment.in b/src/nvim/testdir/test_increment.in index 00e9ad0172..45ed23b9a5 100644 --- a/src/nvim/testdir/test_increment.in +++ b/src/nvim/testdir/test_increment.in @@ -6,6 +6,7 @@ Test cases 1) Ctrl-A on visually selected number Text: foobar-10 + Expected: 1) Ctrl-A on start of line: foobar-9 2) Ctrl-A on visually selected "-10": @@ -24,6 +25,7 @@ Text: 30 40 + Expected: 1) Ctrl-A on visually selected lines: 11 21 @@ -46,6 +48,7 @@ Text: 40 + Expected: 1) 2 g Ctrl-A on visually selected lines: 12 @@ -66,9 +69,122 @@ Text: 4) Ctrl-A on non-number Text: foobar-10 + Expected: 1) visually select foobar: foobar-10 +5) g<Ctrl-A> on letter +Test: +a +a +a +a + Expected: + 1) g Ctrl-A on visually selected lines + b + c + d + e + +6) g<Ctrl-A> on letter +Test: +z +z +z +z + Expected: + 1) g Ctrl-X on visually selected lines + y + x + w + v + +7) <Ctrl-A> on letter +Test: +2 +1 +0 +-1 +-2 + + Expected: + 1) Ctrl-A on visually selected lines + 3 + 2 + 1 + 0 + -1 + + 2) Ctrl-X on visually selected lines + 1 + 0 + -1 + -2 + -3 +8) Block increment on 0x9 +Text: +0x9 +0x9 + Expected: + 1) Ctrl-A on visually block selected region (cursor at beginning): + 0xa + 0xa + 2) Ctrl-A on visually block selected region (cursor at end) + 0xa + 0xa + +9) Increment and redo +Text: +2 +2 + +3 +3 + + Expected: + 1) 2 Ctrl-A on first 2 visually selected lines + 4 + 4 + 2) redo (.) on 3 + 5 + 5 +10) sequentially decrement 1 +Text: +1 +1 +1 +1 + Expected: + 1) g Ctrl-X on visually selected lines + 0 + -1 + -2 + -3 + +11) visually block selected indented lines +Text: + 1 +1 + 1 + 1 + Expexted: + 1) g Ctrl-A on block selected indented lines + 2 +1 + 3 + 4 + +12) visually selected several columns +Text: +0 0 +0 0 +0 0 + Expected: + 1) 'v' select last zero and first zeroes + 0 1 + 1 0 + 1 0 + STARTTEST :so small.vim :" @@ -77,16 +193,16 @@ STARTTEST :" :" Test 1 :/^S1=/+,/^E1=/-y a -:/^E1/+put a -:/^E1/+2put a -f-v$:/^E1/+3put a -f1v$:/^E1/+4put a -f-v$:/^E1/+5put a +:/^E1=/+put a +:/^E1=/+2put a +f-v$:/^E1=/+3put a +f1v$:/^E1=/+4put a +f-v$:/^E1=/+5put a f1v$ :" Test 22 :/^S2=/+,/^E2=/-y a -:/^E2/+put a +:/^E2=/+put a V3k$:.+put a V3k$ @@ -101,6 +217,49 @@ V6k2g :/^E4=/+put a vf- +:" Test 5 +:set nrformats+=alpha +:/^S5=/+,/^E5=/-y a +:/^E5=/+put a +v3kg + +:" Test 6 +:/^S6=/+,/^E6=/-y a +:/^E6=/+put a +v3kg + +:" Test 7 +:/^S7=/+,/^E7=/-y a +:/^E7=/+put a +V4k:.+put a +V4k + +:" Test 8 +:/^S8=/+,/^E8=/-y a +:/^E8=/+put a +kj$:.+put a +k$+ + +:" Test 9 +:/^S9=/+,/^E9=/-y a +:/^E9=/+put a +5kVj22j. + +:" Test 10 +:/^S10=/+,/^E10=/-y a +:/^E10=/+put a +V3kg + +: Test 11 +:/^S11=/+,/^E11=/-y a +:/^E11=/+put a +3kf13jg + +:" Test 12 +:/^S12=/+,/^E12=/-y a +:/^E12=/+put a +2k$v++ + :" Save the report :/^# Test 1/,$w! test.out :qa! @@ -142,5 +301,93 @@ foobar-10 E4===== + +# Test 5 +S5==== +a +a +a +a +E5==== + + +# Test 6 +S6==== +z +z +z +z +E6==== + + + +# Test 7 +S7==== +2 +1 +0 +-1 +-2 +E7==== + + + +# Test 8 +S8==== +0x9 +0x9 +E8==== + + + + +# Test 9 +S9==== +2 +2 + +3 +3 + +E9==== + + + + +# Test 10 +S10==== +1 +1 +1 +1 +E10==== + + + + +# Test 11 +S11==== + 1 +1 + 1 + 1 +E11==== + + + +# Test 12 +S12==== +0 0 +0 0 +0 0 +E12==== + + + + + + + + ENDTEST diff --git a/src/nvim/testdir/test_increment.ok b/src/nvim/testdir/test_increment.ok index 4a61ad1d1d..03a10cbaa0 100644 --- a/src/nvim/testdir/test_increment.ok +++ b/src/nvim/testdir/test_increment.ok @@ -62,5 +62,132 @@ E4===== foobar-10 + +# Test 5 +S5==== +a +a +a +a +E5==== + +b +c +d +e + +# Test 6 +S6==== +z +z +z +z +E6==== + +y +x +w +v + + +# Test 7 +S7==== +2 +1 +0 +-1 +-2 +E7==== + +3 +2 +1 +0 +-1 + +1 +0 +-1 +-2 +-3 + +# Test 8 +S8==== +0x9 +0x9 +E8==== + +0xa +0xa + +0xa +0xa + + +# Test 9 +S9==== +2 +2 + +3 +3 + +E9==== + +4 +4 + +5 +5 + + + + +# Test 10 +S10==== +1 +1 +1 +1 +E10==== + +0 +-1 +-2 +-3 + + + +# Test 11 +S11==== + 1 +1 + 1 + 1 +E11==== + + 2 +1 + 3 + 4 + + +# Test 12 +S12==== +0 0 +0 0 +0 0 +E12==== + +0 1 +1 0 +1 0 + + + + + + + ENDTEST diff --git a/src/nvim/version.c b/src/nvim/version.c index e5ff3a2651..f85547176c 100644 --- a/src/nvim/version.c +++ b/src/nvim/version.c @@ -369,7 +369,7 @@ static int included_patches[] = { // 768, // 767, // 766 NA - // 765, + 765, 764, // 763 NA // 762 NA |