To: vim_dev@googlegroups.com Subject: Patch 7.4.765 Fcc: outbox From: Bram Moolenaar Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ------------ Patch 7.4.765 (after 7.4.754) Problem: CTRL-A and CTRL-X in Visual mode do not always work well. Solution: Improvements for increment and decrement. (Christian Brabandt) Files: src/normal.c, src/ops.c, src/testdir/test_increment.in, src/testdir/test_increment.ok *** ../vim-7.4.764/src/normal.c 2015-06-25 13:57:20.029431114 +0200 --- src/normal.c 2015-07-03 11:43:43.250141166 +0200 *************** *** 4204,4210 **** int visual = VIsual_active; if (cap->oap->op_type == OP_NOP && do_addsub((int)cap->cmdchar, cap->count1, cap->arg) == OK) ! prep_redo_cmd(cap); else clearopbeep(cap->oap); if (visual) --- 4204,4227 ---- int visual = VIsual_active; if (cap->oap->op_type == OP_NOP && do_addsub((int)cap->cmdchar, cap->count1, cap->arg) == OK) ! { ! 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); if (visual) *** ../vim-7.4.764/src/ops.c 2015-06-25 13:57:20.033431073 +0200 --- src/ops.c 2015-07-03 12:31:42.315559376 +0200 *************** *** 5386,5392 **** int hex; /* 'X' or 'x': hex; '0': octal */ static int hexupper = FALSE; /* 0xABC */ unsigned long n; ! long offset = 0; /* line offset for Ctrl_V mode */ long_u oldn; char_u *ptr; int c; --- 5386,5392 ---- int hex; /* 'X' or 'x': hex; '0': octal */ static int hexupper = FALSE; /* 0xABC */ unsigned long n; ! unsigned long offset = 0; /* line offset for Ctrl_V mode */ long_u oldn; char_u *ptr; int c; *************** *** 5398,5407 **** --- 5398,5409 ---- int firstdigit; int subtract; int negative = FALSE; + int was_positive = TRUE; int visual = VIsual_active; int i; 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" */ *************** *** 5431,5444 **** curbuf->b_visual.vi_end = curwin->w_cursor; curbuf->b_visual.vi_mode = VIsual_mode; ! col = VIsual.col; lnum = VIsual.lnum; lnume = curwin->w_cursor.lnum; - if (ptr[col] == '-') - { - negative = TRUE; - col++; - } } else { --- 5433,5446 ---- curbuf->b_visual.vi_end = curwin->w_cursor; curbuf->b_visual.vi_mode = VIsual_mode; ! 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; } else { *************** *** 5481,5489 **** { curwin->w_cursor.lnum = i; ptr = ml_get_curline(); - RLADDSUBFIX(ptr); if ((int)STRLEN(ptr) <= col) ! col = 0; /* * If a number was found, and saving for undo works, replace the number. */ --- 5483,5498 ---- { curwin->w_cursor.lnum = i; ptr = ml_get_curline(); if ((int)STRLEN(ptr) <= col) ! /* 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. */ *************** *** 5598,5603 **** --- 5607,5620 ---- negative = FALSE; } + if (visual && !was_positive && !negative) + { + /* need to remove the '-' */ + col--; + length++; + } + + /* * Delete the old number. */ *************** *** 5634,5641 **** if (buf1 == NULL) return FAIL; ptr = buf1; ! /* do not add leading '-' for visual mode */ ! if (negative && !visual) { *ptr++ = '-'; } --- 5651,5657 ---- if (buf1 == NULL) return FAIL; ptr = buf1; ! if (negative && (!visual || (visual && was_positive))) { *ptr++ = '-'; } *************** *** 5654,5676 **** * Put the number characters in buf2[]. */ if (hex == 0) ! sprintf((char *)buf2, "%lu", n + offset); else if (hex == '0') ! sprintf((char *)buf2, "%lo", n + offset); else if (hex && hexupper) ! sprintf((char *)buf2, "%lX", n + offset); else ! sprintf((char *)buf2, "%lx", n + offset); length -= (int)STRLEN(buf2); - if (g_cmd) - { - if (subtract) - offset -= (unsigned long)Prenum1; - else - offset += (unsigned long)Prenum1; - } - /* * Adjust number of zeros to the new number of digits, so the * total length of the number remains the same. --- 5670,5684 ---- * Put the number characters in buf2[]. */ if (hex == 0) ! sprintf((char *)buf2, "%lu", n); else if (hex == '0') ! sprintf((char *)buf2, "%lo", n); else if (hex && hexupper) ! sprintf((char *)buf2, "%lX", n); else ! sprintf((char *)buf2, "%lx", n); length -= (int)STRLEN(buf2); /* * Adjust number of zeros to the new number of digits, so the * total length of the number remains the same. *************** *** 5685,5697 **** ins_str(buf1); /* insert the new number */ vim_free(buf1); } ! --curwin->w_cursor.col; curwin->w_set_curswant = TRUE; #ifdef FEAT_RIGHTLEFT ptr = ml_get_buf(curbuf, curwin->w_cursor.lnum, TRUE); RLADDSUBFIX(ptr); #endif } return OK; } --- 5693,5719 ---- ins_str(buf1); /* insert the new number */ vim_free(buf1); } ! ! 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; #ifdef FEAT_RIGHTLEFT ptr = ml_get_buf(curbuf, curwin->w_cursor.lnum, TRUE); RLADDSUBFIX(ptr); #endif } + --curwin->w_cursor.col; return OK; } *** ../vim-7.4.764/src/testdir/test_increment.in 2015-06-28 19:24:32.198911433 +0200 --- src/testdir/test_increment.in 2015-07-03 11:47:53.111483406 +0200 *************** *** 6,11 **** --- 6,12 ---- 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,29 **** --- 25,31 ---- 30 40 + Expected: 1) Ctrl-A on visually selected lines: 11 21 *************** *** 46,51 **** --- 48,54 ---- 40 + Expected: 1) 2 g Ctrl-A on visually selected lines: 12 *************** *** 66,74 **** --- 69,190 ---- 4) Ctrl-A on non-number Text: foobar-10 + Expected: 1) visually select foobar: foobar-10 + 5) g on letter + Test: + a + a + a + a + Expected: + 1) g Ctrl-A on visually selected lines + b + c + d + e + + 6) g on letter + Test: + z + z + z + z + Expected: + 1) g Ctrl-X on visually selected lines + y + x + w + v + + 7) 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,92 **** :" :" 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 f1v$ :" Test 22 :/^S2=/+,/^E2=/-y a ! :/^E2/+put a V3k$:.+put a V3k$ --- 193,208 ---- :" :" 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 f1v$ :" Test 22 :/^S2=/+,/^E2=/-y a ! :/^E2=/+put a V3k$:.+put a V3k$ *************** *** 101,106 **** --- 217,265 ---- :/^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,146 **** --- 301,393 ---- 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 *** ../vim-7.4.764/src/testdir/test_increment.ok 2015-06-25 13:57:20.033431073 +0200 --- src/testdir/test_increment.ok 2015-07-03 11:43:43.254141124 +0200 *************** *** 62,66 **** --- 62,193 ---- 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 *** ../vim-7.4.764/src/version.c 2015-06-28 19:24:32.198911433 +0200 --- src/version.c 2015-07-03 11:45:07.697242802 +0200 *************** *** 743,744 **** --- 743,746 ---- { /* Add new patch number below this line */ + /**/ + 765, /**/ -- hundred-and-one symptoms of being an internet addict: 171. You invent another person and chat with yourself in empty chat rooms. /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ /// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ \\\ an exciting new programming language -- http://www.Zimbu.org /// \\\ help me help AIDS victims -- http://ICCF-Holland.org ///