| To: vim_dev@googlegroups.com |
| Subject: Patch 7.4.765 |
| Fcc: outbox |
| From: Bram Moolenaar <Bram@moolenaar.net> |
| 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 |
| |
| |
| |
| |
| |
| *** 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) |
| |
| |
| |
| *** 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; |
| } |
| |
| |
| |
| |
| *** 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<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,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 |
| |
| |
| |
| |
| *** 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 |
| |
| |
| |
| |
| *** 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 /// |