1081 lines
23 KiB
Plaintext
1081 lines
23 KiB
Plaintext
|
To: vim_dev@googlegroups.com
|
|||
|
Subject: Patch 7.4.782
|
|||
|
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.782
|
|||
|
Problem: Still a few problems with CTRL-A and CTRL-X in Visual mode.
|
|||
|
Solution: Fix the reported problems. (Christian Brabandt)
|
|||
|
Files: src/charset.c, src/eval.c, src/ex_cmds.c, src/ex_getln.c,
|
|||
|
src/misc2.c, src/normal.c, src/ops.c, src/option.c,
|
|||
|
src/proto/charset.pro, src/testdir/test_increment.in,
|
|||
|
src/testdir/test_increment.ok
|
|||
|
|
|||
|
|
|||
|
*** ../vim-7.4.781/src/charset.c 2015-01-14 19:35:10.963756142 +0100
|
|||
|
--- src/charset.c 2015-07-17 12:48:43.296898014 +0200
|
|||
|
***************
|
|||
|
*** 1835,1843 ****
|
|||
|
* octal number.
|
|||
|
* If "dohex" is non-zero recognize hex numbers, when > 1 always assume
|
|||
|
* hex number.
|
|||
|
*/
|
|||
|
void
|
|||
|
! vim_str2nr(start, hexp, len, dooct, dohex, nptr, unptr)
|
|||
|
char_u *start;
|
|||
|
int *hexp; /* return: type of number 0 = decimal, 'x'
|
|||
|
or 'X' is hex, '0' = octal */
|
|||
|
--- 1835,1844 ----
|
|||
|
* octal number.
|
|||
|
* If "dohex" is non-zero recognize hex numbers, when > 1 always assume
|
|||
|
* hex number.
|
|||
|
+ * If maxlen > 0, check at a maximum maxlen chars
|
|||
|
*/
|
|||
|
void
|
|||
|
! vim_str2nr(start, hexp, len, dooct, dohex, nptr, unptr, maxlen)
|
|||
|
char_u *start;
|
|||
|
int *hexp; /* return: type of number 0 = decimal, 'x'
|
|||
|
or 'X' is hex, '0' = octal */
|
|||
|
***************
|
|||
|
*** 1846,1851 ****
|
|||
|
--- 1847,1853 ----
|
|||
|
int dohex; /* recognize hex number */
|
|||
|
long *nptr; /* return: signed result */
|
|||
|
unsigned long *unptr; /* return: unsigned result */
|
|||
|
+ int maxlen; /* max length of string to check */
|
|||
|
{
|
|||
|
char_u *ptr = start;
|
|||
|
int hex = 0; /* default is decimal */
|
|||
|
***************
|
|||
|
*** 1860,1869 ****
|
|||
|
}
|
|||
|
|
|||
|
/* Recognize hex and octal. */
|
|||
|
! if (ptr[0] == '0' && ptr[1] != '8' && ptr[1] != '9')
|
|||
|
{
|
|||
|
hex = ptr[1];
|
|||
|
! if (dohex && (hex == 'X' || hex == 'x') && vim_isxdigit(ptr[2]))
|
|||
|
ptr += 2; /* hexadecimal */
|
|||
|
else
|
|||
|
{
|
|||
|
--- 1862,1873 ----
|
|||
|
}
|
|||
|
|
|||
|
/* Recognize hex and octal. */
|
|||
|
! if (ptr[0] == '0' && ptr[1] != '8' && ptr[1] != '9'
|
|||
|
! && (maxlen == 0 || maxlen > 1))
|
|||
|
{
|
|||
|
hex = ptr[1];
|
|||
|
! if (dohex && (hex == 'X' || hex == 'x') && vim_isxdigit(ptr[2])
|
|||
|
! && (maxlen == 0 || maxlen > 2))
|
|||
|
ptr += 2; /* hexadecimal */
|
|||
|
else
|
|||
|
{
|
|||
|
***************
|
|||
|
*** 1880,1885 ****
|
|||
|
--- 1884,1891 ----
|
|||
|
}
|
|||
|
if (ptr[n] >= '0')
|
|||
|
hex = '0'; /* assume octal */
|
|||
|
+ if (n == maxlen)
|
|||
|
+ break;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
***************
|
|||
|
*** 1888,1893 ****
|
|||
|
--- 1894,1900 ----
|
|||
|
/*
|
|||
|
* Do the string-to-numeric conversion "manually" to avoid sscanf quirks.
|
|||
|
*/
|
|||
|
+ n = 1;
|
|||
|
if (hex == '0' || dooct > 1)
|
|||
|
{
|
|||
|
/* octal */
|
|||
|
***************
|
|||
|
*** 1895,1900 ****
|
|||
|
--- 1902,1909 ----
|
|||
|
{
|
|||
|
un = 8 * un + (unsigned long)(*ptr - '0');
|
|||
|
++ptr;
|
|||
|
+ if (n++ == maxlen)
|
|||
|
+ break;
|
|||
|
}
|
|||
|
}
|
|||
|
else if (hex != 0 || dohex > 1)
|
|||
|
***************
|
|||
|
*** 1904,1909 ****
|
|||
|
--- 1913,1920 ----
|
|||
|
{
|
|||
|
un = 16 * un + (unsigned long)hex2nr(*ptr);
|
|||
|
++ptr;
|
|||
|
+ if (n++ == maxlen)
|
|||
|
+ break;
|
|||
|
}
|
|||
|
}
|
|||
|
else
|
|||
|
***************
|
|||
|
*** 1913,1918 ****
|
|||
|
--- 1924,1931 ----
|
|||
|
{
|
|||
|
un = 10 * un + (unsigned long)(*ptr - '0');
|
|||
|
++ptr;
|
|||
|
+ if (n++ == maxlen)
|
|||
|
+ break;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
*** ../vim-7.4.781/src/eval.c 2015-07-10 17:56:18.219777154 +0200
|
|||
|
--- src/eval.c 2015-07-17 12:45:16.778860576 +0200
|
|||
|
***************
|
|||
|
*** 1615,1621 ****
|
|||
|
len = 0;
|
|||
|
else
|
|||
|
/* Recognize a number argument, the others must be strings. */
|
|||
|
! vim_str2nr(argv[i], NULL, &len, TRUE, TRUE, &n, NULL);
|
|||
|
if (len != 0 && len == (int)STRLEN(argv[i]))
|
|||
|
{
|
|||
|
argvars[i].v_type = VAR_NUMBER;
|
|||
|
--- 1615,1621 ----
|
|||
|
len = 0;
|
|||
|
else
|
|||
|
/* Recognize a number argument, the others must be strings. */
|
|||
|
! vim_str2nr(argv[i], NULL, &len, TRUE, TRUE, &n, NULL, 0);
|
|||
|
if (len != 0 && len == (int)STRLEN(argv[i]))
|
|||
|
{
|
|||
|
argvars[i].v_type = VAR_NUMBER;
|
|||
|
***************
|
|||
|
*** 5128,5134 ****
|
|||
|
else
|
|||
|
#endif
|
|||
|
{
|
|||
|
! vim_str2nr(*arg, NULL, &len, TRUE, TRUE, &n, NULL);
|
|||
|
*arg += len;
|
|||
|
if (evaluate)
|
|||
|
{
|
|||
|
--- 5128,5134 ----
|
|||
|
else
|
|||
|
#endif
|
|||
|
{
|
|||
|
! vim_str2nr(*arg, NULL, &len, TRUE, TRUE, &n, NULL, 0);
|
|||
|
*arg += len;
|
|||
|
if (evaluate)
|
|||
|
{
|
|||
|
***************
|
|||
|
*** 18233,18239 ****
|
|||
|
p = skipwhite(get_tv_string(&argvars[0]));
|
|||
|
if (*p == '+')
|
|||
|
p = skipwhite(p + 1);
|
|||
|
! vim_str2nr(p, NULL, NULL, base == 8 ? 2 : 0, base == 16 ? 2 : 0, &n, NULL);
|
|||
|
rettv->vval.v_number = n;
|
|||
|
}
|
|||
|
|
|||
|
--- 18233,18239 ----
|
|||
|
p = skipwhite(get_tv_string(&argvars[0]));
|
|||
|
if (*p == '+')
|
|||
|
p = skipwhite(p + 1);
|
|||
|
! vim_str2nr(p, NULL, NULL, base == 8 ? 2 : 0, base == 16 ? 2 : 0, &n, NULL, 0);
|
|||
|
rettv->vval.v_number = n;
|
|||
|
}
|
|||
|
|
|||
|
***************
|
|||
|
*** 21039,21045 ****
|
|||
|
case VAR_STRING:
|
|||
|
if (varp->vval.v_string != NULL)
|
|||
|
vim_str2nr(varp->vval.v_string, NULL, NULL,
|
|||
|
! TRUE, TRUE, &n, NULL);
|
|||
|
return n;
|
|||
|
case VAR_LIST:
|
|||
|
EMSG(_("E745: Using a List as a Number"));
|
|||
|
--- 21039,21045 ----
|
|||
|
case VAR_STRING:
|
|||
|
if (varp->vval.v_string != NULL)
|
|||
|
vim_str2nr(varp->vval.v_string, NULL, NULL,
|
|||
|
! TRUE, TRUE, &n, NULL, 0);
|
|||
|
return n;
|
|||
|
case VAR_LIST:
|
|||
|
EMSG(_("E745: Using a List as a Number"));
|
|||
|
*** ../vim-7.4.781/src/ex_cmds.c 2015-05-04 10:45:57.288481610 +0200
|
|||
|
--- src/ex_cmds.c 2015-07-17 12:45:16.782860538 +0200
|
|||
|
***************
|
|||
|
*** 500,506 ****
|
|||
|
nrs[lnum - eap->line1].start_col_nr = -MAXLNUM;
|
|||
|
else
|
|||
|
vim_str2nr(s, NULL, NULL, sort_oct, sort_hex,
|
|||
|
! &nrs[lnum - eap->line1].start_col_nr, NULL);
|
|||
|
*s2 = c;
|
|||
|
}
|
|||
|
else
|
|||
|
--- 500,506 ----
|
|||
|
nrs[lnum - eap->line1].start_col_nr = -MAXLNUM;
|
|||
|
else
|
|||
|
vim_str2nr(s, NULL, NULL, sort_oct, sort_hex,
|
|||
|
! &nrs[lnum - eap->line1].start_col_nr, NULL, 0);
|
|||
|
*s2 = c;
|
|||
|
}
|
|||
|
else
|
|||
|
*** ../vim-7.4.781/src/ex_getln.c 2015-06-25 18:20:30.437271806 +0200
|
|||
|
--- src/ex_getln.c 2015-07-17 12:45:16.782860538 +0200
|
|||
|
***************
|
|||
|
*** 5917,5923 ****
|
|||
|
*str = skipwhite(*str);
|
|||
|
if (**str == '-' || vim_isdigit(**str)) /* parse "from" part of range */
|
|||
|
{
|
|||
|
! vim_str2nr(*str, NULL, &len, FALSE, FALSE, &num, NULL);
|
|||
|
*str += len;
|
|||
|
*num1 = (int)num;
|
|||
|
first = TRUE;
|
|||
|
--- 5917,5923 ----
|
|||
|
*str = skipwhite(*str);
|
|||
|
if (**str == '-' || vim_isdigit(**str)) /* parse "from" part of range */
|
|||
|
{
|
|||
|
! vim_str2nr(*str, NULL, &len, FALSE, FALSE, &num, NULL, 0);
|
|||
|
*str += len;
|
|||
|
*num1 = (int)num;
|
|||
|
first = TRUE;
|
|||
|
***************
|
|||
|
*** 5926,5932 ****
|
|||
|
if (**str == ',') /* parse "to" part of range */
|
|||
|
{
|
|||
|
*str = skipwhite(*str + 1);
|
|||
|
! vim_str2nr(*str, NULL, &len, FALSE, FALSE, &num, NULL);
|
|||
|
if (len > 0)
|
|||
|
{
|
|||
|
*num2 = (int)num;
|
|||
|
--- 5926,5932 ----
|
|||
|
if (**str == ',') /* parse "to" part of range */
|
|||
|
{
|
|||
|
*str = skipwhite(*str + 1);
|
|||
|
! vim_str2nr(*str, NULL, &len, FALSE, FALSE, &num, NULL, 0);
|
|||
|
if (len > 0)
|
|||
|
{
|
|||
|
*num2 = (int)num;
|
|||
|
*** ../vim-7.4.781/src/misc2.c 2015-04-21 14:02:28.489694393 +0200
|
|||
|
--- src/misc2.c 2015-07-17 12:45:16.782860538 +0200
|
|||
|
***************
|
|||
|
*** 2813,2819 ****
|
|||
|
bp += 3; /* skip t_xx, xx may be '-' or '>' */
|
|||
|
else if (STRNICMP(bp, "char-", 5) == 0)
|
|||
|
{
|
|||
|
! vim_str2nr(bp + 5, NULL, &l, TRUE, TRUE, NULL, NULL);
|
|||
|
bp += l + 5;
|
|||
|
break;
|
|||
|
}
|
|||
|
--- 2813,2819 ----
|
|||
|
bp += 3; /* skip t_xx, xx may be '-' or '>' */
|
|||
|
else if (STRNICMP(bp, "char-", 5) == 0)
|
|||
|
{
|
|||
|
! vim_str2nr(bp + 5, NULL, &l, TRUE, TRUE, NULL, NULL, 0);
|
|||
|
bp += l + 5;
|
|||
|
break;
|
|||
|
}
|
|||
|
***************
|
|||
|
*** 2845,2851 ****
|
|||
|
&& VIM_ISDIGIT(last_dash[6]))
|
|||
|
{
|
|||
|
/* <Char-123> or <Char-033> or <Char-0x33> */
|
|||
|
! vim_str2nr(last_dash + 6, NULL, NULL, TRUE, TRUE, NULL, &n);
|
|||
|
key = (int)n;
|
|||
|
}
|
|||
|
else
|
|||
|
--- 2845,2851 ----
|
|||
|
&& VIM_ISDIGIT(last_dash[6]))
|
|||
|
{
|
|||
|
/* <Char-123> or <Char-033> or <Char-0x33> */
|
|||
|
! vim_str2nr(last_dash + 6, NULL, NULL, TRUE, TRUE, NULL, &n, 0);
|
|||
|
key = (int)n;
|
|||
|
}
|
|||
|
else
|
|||
|
*** ../vim-7.4.781/src/normal.c 2015-07-03 12:44:01.735748596 +0200
|
|||
|
--- src/normal.c 2015-07-17 12:49:38.748371068 +0200
|
|||
|
***************
|
|||
|
*** 40,45 ****
|
|||
|
--- 40,46 ----
|
|||
|
static void find_end_of_word __ARGS((pos_T *));
|
|||
|
static int get_mouse_class __ARGS((char_u *p));
|
|||
|
#endif
|
|||
|
+ static void prep_redo_visual __ARGS((cmdarg_T *cap));
|
|||
|
static void prep_redo_cmd __ARGS((cmdarg_T *cap));
|
|||
|
static void prep_redo __ARGS((int regname, long, int, int, int, int, int));
|
|||
|
static int checkclearop __ARGS((oparg_T *oap));
|
|||
|
***************
|
|||
|
*** 3613,3618 ****
|
|||
|
--- 3614,3656 ----
|
|||
|
}
|
|||
|
|
|||
|
/*
|
|||
|
+ * Add commands to reselect Visual mode into the redo buffer.
|
|||
|
+ */
|
|||
|
+ static void
|
|||
|
+ prep_redo_visual(cap)
|
|||
|
+ cmdarg_T *cap;
|
|||
|
+ {
|
|||
|
+ ResetRedobuff();
|
|||
|
+ AppendCharToRedobuff(VIsual_mode);
|
|||
|
+ if (VIsual_mode == 'V' && curbuf->b_visual.vi_end.lnum
|
|||
|
+ != curbuf->b_visual.vi_start.lnum)
|
|||
|
+ {
|
|||
|
+ AppendNumberToRedobuff(curbuf->b_visual.vi_end.lnum
|
|||
|
+ - curbuf->b_visual.vi_start.lnum);
|
|||
|
+ AppendCharToRedobuff('j');
|
|||
|
+ }
|
|||
|
+ else if (VIsual_mode == 'v' || VIsual_mode == Ctrl_V)
|
|||
|
+ {
|
|||
|
+ /* block visual mode or char visual mmode*/
|
|||
|
+ if (curbuf->b_visual.vi_end.lnum != curbuf->b_visual.vi_start.lnum)
|
|||
|
+ {
|
|||
|
+ AppendNumberToRedobuff(curbuf->b_visual.vi_end.lnum -
|
|||
|
+ curbuf->b_visual.vi_start.lnum);
|
|||
|
+ AppendCharToRedobuff('j');
|
|||
|
+ }
|
|||
|
+ if (curbuf->b_visual.vi_curswant == MAXCOL)
|
|||
|
+ AppendCharToRedobuff('$');
|
|||
|
+ else if (curbuf->b_visual.vi_end.col > curbuf->b_visual.vi_start.col)
|
|||
|
+ {
|
|||
|
+ AppendNumberToRedobuff(curbuf->b_visual.vi_end.col
|
|||
|
+ - curbuf->b_visual.vi_start.col - 1);
|
|||
|
+ AppendCharToRedobuff(' ');
|
|||
|
+ }
|
|||
|
+ }
|
|||
|
+ AppendNumberToRedobuff(cap->count1);
|
|||
|
+ }
|
|||
|
+
|
|||
|
+ /*
|
|||
|
* Prepare for redo of a normal command.
|
|||
|
*/
|
|||
|
static void
|
|||
|
***************
|
|||
|
*** 4207,4222 ****
|
|||
|
{
|
|||
|
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
|
|||
|
--- 4245,4253 ----
|
|||
|
{
|
|||
|
if (visual)
|
|||
|
{
|
|||
|
! prep_redo_visual(cap);
|
|||
|
! if (cap->arg)
|
|||
|
! AppendCharToRedobuff('g');
|
|||
|
AppendCharToRedobuff(cap->cmdchar);
|
|||
|
}
|
|||
|
else
|
|||
|
***************
|
|||
|
*** 4227,4233 ****
|
|||
|
if (visual)
|
|||
|
{
|
|||
|
VIsual_active = FALSE;
|
|||
|
! redraw_later(CLEAR);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
--- 4258,4265 ----
|
|||
|
if (visual)
|
|||
|
{
|
|||
|
VIsual_active = FALSE;
|
|||
|
! redo_VIsual_busy = FALSE;
|
|||
|
! redraw_later(INVERTED);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
*** ../vim-7.4.781/src/ops.c 2015-07-12 16:21:17.791908408 +0200
|
|||
|
--- src/ops.c 2015-07-17 12:58:11.083502711 +0200
|
|||
|
***************
|
|||
|
*** 5405,5410 ****
|
|||
|
--- 5405,5412 ----
|
|||
|
int lnume = curwin->w_cursor.lnum;
|
|||
|
int startcol = 0;
|
|||
|
int did_change = FALSE;
|
|||
|
+ pos_T t = curwin->w_cursor;
|
|||
|
+ int maxlen = 0;
|
|||
|
|
|||
|
dohex = (vim_strchr(curbuf->b_p_nf, 'x') != NULL); /* "heX" */
|
|||
|
dooct = (vim_strchr(curbuf->b_p_nf, 'o') != NULL); /* "Octal" */
|
|||
|
***************
|
|||
|
*** 5418,5438 ****
|
|||
|
{
|
|||
|
if (lt(curwin->w_cursor, VIsual))
|
|||
|
{
|
|||
|
- pos_T t;
|
|||
|
- t = curwin->w_cursor;
|
|||
|
curwin->w_cursor = VIsual;
|
|||
|
VIsual = t;
|
|||
|
}
|
|||
|
- if (VIsual_mode == 'V')
|
|||
|
- VIsual.col = 0;
|
|||
|
|
|||
|
ptr = ml_get(VIsual.lnum);
|
|||
|
RLADDSUBFIX(ptr);
|
|||
|
|
|||
|
/* store visual area for 'gv' */
|
|||
|
curbuf->b_visual.vi_start = VIsual;
|
|||
|
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
|
|||
|
--- 5420,5449 ----
|
|||
|
{
|
|||
|
if (lt(curwin->w_cursor, VIsual))
|
|||
|
{
|
|||
|
curwin->w_cursor = VIsual;
|
|||
|
VIsual = t;
|
|||
|
}
|
|||
|
|
|||
|
ptr = ml_get(VIsual.lnum);
|
|||
|
RLADDSUBFIX(ptr);
|
|||
|
+ if (VIsual_mode == 'V')
|
|||
|
+ {
|
|||
|
+ VIsual.col = 0;
|
|||
|
+ curwin->w_cursor.col = STRLEN(ptr);
|
|||
|
+ }
|
|||
|
+ else if (VIsual_mode == Ctrl_V &&
|
|||
|
+ VIsual.col > curwin->w_cursor.col)
|
|||
|
+ {
|
|||
|
+ t = VIsual;
|
|||
|
+ VIsual.col = curwin->w_cursor.col;
|
|||
|
+ curwin->w_cursor.col = t.col;
|
|||
|
+ }
|
|||
|
|
|||
|
/* store visual area for 'gv' */
|
|||
|
curbuf->b_visual.vi_start = VIsual;
|
|||
|
curbuf->b_visual.vi_end = curwin->w_cursor;
|
|||
|
curbuf->b_visual.vi_mode = VIsual_mode;
|
|||
|
+ curbuf->b_visual.vi_curswant = curwin->w_curswant;
|
|||
|
|
|||
|
if (VIsual_mode != 'v')
|
|||
|
startcol = VIsual.col < curwin->w_cursor.col ? VIsual.col
|
|||
|
***************
|
|||
|
*** 5482,5517 ****
|
|||
|
|
|||
|
for (i = lnum; i <= lnume; i++)
|
|||
|
{
|
|||
|
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.
|
|||
|
*/
|
|||
|
firstdigit = ptr[col];
|
|||
|
- RLADDSUBFIX(ptr);
|
|||
|
if ((!VIM_ISDIGIT(firstdigit) && !(doalp && ASCII_ISALPHA(firstdigit)))
|
|||
|
|| u_save_cursor() != OK)
|
|||
|
{
|
|||
|
if (lnum < lnume)
|
|||
|
/* Try again on next line */
|
|||
|
continue;
|
|||
|
beep_flush();
|
|||
|
return FAIL;
|
|||
|
}
|
|||
|
|
|||
|
- ptr = ml_get_curline();
|
|||
|
- RLADDSUBFIX(ptr);
|
|||
|
-
|
|||
|
if (doalp && ASCII_ISALPHA(firstdigit))
|
|||
|
{
|
|||
|
/* decrement or increment alphabetic character */
|
|||
|
--- 5493,5552 ----
|
|||
|
|
|||
|
for (i = lnum; i <= lnume; i++)
|
|||
|
{
|
|||
|
+ t = curwin->w_cursor;
|
|||
|
curwin->w_cursor.lnum = i;
|
|||
|
ptr = ml_get_curline();
|
|||
|
+ RLADDSUBFIX(ptr);
|
|||
|
if ((int)STRLEN(ptr) <= col)
|
|||
|
/* try again on next line */
|
|||
|
continue;
|
|||
|
+ if (visual)
|
|||
|
+ {
|
|||
|
+ if (doalp) /* search for ascii chars */
|
|||
|
+ {
|
|||
|
+ while (!ASCII_ISALPHA(ptr[col]) && ptr[col])
|
|||
|
+ col++;
|
|||
|
+ }
|
|||
|
+ /* skip to first digit, but allow for leading '-' */
|
|||
|
+ else if (dohex)
|
|||
|
+ {
|
|||
|
+ while (!(vim_isxdigit(ptr[col]) || (ptr[col] == '-'
|
|||
|
+ && vim_isxdigit(ptr[col+1]))) && ptr[col])
|
|||
|
+ col++;
|
|||
|
+ }
|
|||
|
+ else /* decimal */
|
|||
|
+ {
|
|||
|
+ while (!(vim_isdigit(ptr[col]) || (ptr[col] == '-'
|
|||
|
+ && vim_isdigit(ptr[col+1]))) && ptr[col])
|
|||
|
+ col++;
|
|||
|
+ }
|
|||
|
+ }
|
|||
|
if (visual && ptr[col] == '-')
|
|||
|
{
|
|||
|
negative = TRUE;
|
|||
|
was_positive = FALSE;
|
|||
|
col++;
|
|||
|
}
|
|||
|
/*
|
|||
|
* If a number was found, and saving for undo works, replace the number.
|
|||
|
*/
|
|||
|
firstdigit = ptr[col];
|
|||
|
if ((!VIM_ISDIGIT(firstdigit) && !(doalp && ASCII_ISALPHA(firstdigit)))
|
|||
|
|| u_save_cursor() != OK)
|
|||
|
{
|
|||
|
if (lnum < lnume)
|
|||
|
+ {
|
|||
|
+ if (visual && VIsual_mode != Ctrl_V)
|
|||
|
+ col = 0;
|
|||
|
+ else
|
|||
|
+ col = startcol;
|
|||
|
/* Try again on next line */
|
|||
|
continue;
|
|||
|
+ }
|
|||
|
beep_flush();
|
|||
|
return FAIL;
|
|||
|
}
|
|||
|
|
|||
|
if (doalp && ASCII_ISALPHA(firstdigit))
|
|||
|
{
|
|||
|
/* decrement or increment alphabetic character */
|
|||
|
***************
|
|||
|
*** 5560,5568 ****
|
|||
|
--col;
|
|||
|
negative = TRUE;
|
|||
|
}
|
|||
|
-
|
|||
|
/* get the number value (unsigned) */
|
|||
|
! vim_str2nr(ptr + col, &hex, &length, dooct, dohex, NULL, &n);
|
|||
|
|
|||
|
/* ignore leading '-' for hex and octal numbers */
|
|||
|
if (hex && negative)
|
|||
|
--- 5595,5621 ----
|
|||
|
--col;
|
|||
|
negative = TRUE;
|
|||
|
}
|
|||
|
/* get the number value (unsigned) */
|
|||
|
! if (visual && VIsual_mode != 'V')
|
|||
|
! {
|
|||
|
! if (VIsual_mode == 'v')
|
|||
|
! {
|
|||
|
! if (i == lnum)
|
|||
|
! maxlen = (lnum == lnume
|
|||
|
! ? curwin->w_cursor.col - col + 1
|
|||
|
! : (int)STRLEN(ptr) - col);
|
|||
|
! else
|
|||
|
! maxlen = (i == lnume ? curwin->w_cursor.col - col + 1
|
|||
|
! : (int)STRLEN(ptr) - col);
|
|||
|
! }
|
|||
|
! else if (VIsual_mode == Ctrl_V)
|
|||
|
! maxlen = (curbuf->b_visual.vi_curswant == MAXCOL
|
|||
|
! ? (int)STRLEN(ptr) - col
|
|||
|
! : curwin->w_cursor.col - col + 1);
|
|||
|
! }
|
|||
|
!
|
|||
|
! vim_str2nr(ptr + col, &hex, &length, dooct, dohex, NULL, &n,
|
|||
|
! maxlen);
|
|||
|
|
|||
|
/* ignore leading '-' for hex and octal numbers */
|
|||
|
if (hex && negative)
|
|||
|
***************
|
|||
|
*** 5609,5615 ****
|
|||
|
negative = FALSE;
|
|||
|
}
|
|||
|
|
|||
|
! if (visual && !was_positive && !negative)
|
|||
|
{
|
|||
|
/* need to remove the '-' */
|
|||
|
col--;
|
|||
|
--- 5662,5668 ----
|
|||
|
negative = FALSE;
|
|||
|
}
|
|||
|
|
|||
|
! if (visual && !was_positive && !negative && col > 0)
|
|||
|
{
|
|||
|
/* need to remove the '-' */
|
|||
|
col--;
|
|||
|
***************
|
|||
|
*** 5695,5700 ****
|
|||
|
--- 5748,5757 ----
|
|||
|
STRCAT(buf1, buf2);
|
|||
|
ins_str(buf1); /* insert the new number */
|
|||
|
vim_free(buf1);
|
|||
|
+ if (lnum < lnume)
|
|||
|
+ curwin->w_cursor.col = t.col;
|
|||
|
+ else if (did_change && curwin->w_cursor.col)
|
|||
|
+ --curwin->w_cursor.col;
|
|||
|
}
|
|||
|
|
|||
|
if (g_cmd)
|
|||
|
***************
|
|||
|
*** 5705,5710 ****
|
|||
|
--- 5762,5768 ----
|
|||
|
/* reset */
|
|||
|
subtract = FALSE;
|
|||
|
negative = FALSE;
|
|||
|
+ was_positive = TRUE;
|
|||
|
if (visual && VIsual_mode == Ctrl_V)
|
|||
|
col = startcol;
|
|||
|
else
|
|||
|
***************
|
|||
|
*** 5716,5723 ****
|
|||
|
RLADDSUBFIX(ptr);
|
|||
|
#endif
|
|||
|
}
|
|||
|
! if (did_change && curwin->w_cursor.col > 0)
|
|||
|
! --curwin->w_cursor.col;
|
|||
|
return OK;
|
|||
|
}
|
|||
|
|
|||
|
--- 5774,5782 ----
|
|||
|
RLADDSUBFIX(ptr);
|
|||
|
#endif
|
|||
|
}
|
|||
|
! if (visual)
|
|||
|
! /* cursor at the top of the selection */
|
|||
|
! curwin->w_cursor = VIsual;
|
|||
|
return OK;
|
|||
|
}
|
|||
|
|
|||
|
*** ../vim-7.4.781/src/option.c 2015-07-10 18:18:35.579206260 +0200
|
|||
|
--- src/option.c 2015-07-17 12:45:16.786860499 +0200
|
|||
|
***************
|
|||
|
*** 4561,4567 ****
|
|||
|
{
|
|||
|
/* Allow negative (for 'undolevels'), octal and
|
|||
|
* hex numbers. */
|
|||
|
! vim_str2nr(arg, NULL, &i, TRUE, TRUE, &value, NULL);
|
|||
|
if (arg[i] != NUL && !vim_iswhite(arg[i]))
|
|||
|
{
|
|||
|
errmsg = e_invarg;
|
|||
|
--- 4561,4567 ----
|
|||
|
{
|
|||
|
/* Allow negative (for 'undolevels'), octal and
|
|||
|
* hex numbers. */
|
|||
|
! vim_str2nr(arg, NULL, &i, TRUE, TRUE, &value, NULL, 0);
|
|||
|
if (arg[i] != NUL && !vim_iswhite(arg[i]))
|
|||
|
{
|
|||
|
errmsg = e_invarg;
|
|||
|
*** ../vim-7.4.781/src/proto/charset.pro 2014-06-25 14:39:35.110348584 +0200
|
|||
|
--- src/proto/charset.pro 2015-07-17 12:45:22.098810018 +0200
|
|||
|
***************
|
|||
|
*** 49,55 ****
|
|||
|
char_u *skiptowhite_esc __ARGS((char_u *p));
|
|||
|
long getdigits __ARGS((char_u **pp));
|
|||
|
int vim_isblankline __ARGS((char_u *lbuf));
|
|||
|
! void vim_str2nr __ARGS((char_u *start, int *hexp, int *len, int dooct, int dohex, long *nptr, unsigned long *unptr));
|
|||
|
int hex2nr __ARGS((int c));
|
|||
|
int hexhex2nr __ARGS((char_u *p));
|
|||
|
int rem_backslash __ARGS((char_u *str));
|
|||
|
--- 49,55 ----
|
|||
|
char_u *skiptowhite_esc __ARGS((char_u *p));
|
|||
|
long getdigits __ARGS((char_u **pp));
|
|||
|
int vim_isblankline __ARGS((char_u *lbuf));
|
|||
|
! void vim_str2nr __ARGS((char_u *start, int *hexp, int *len, int dooct, int dohex, long *nptr, unsigned long *unptr, int strlen));
|
|||
|
int hex2nr __ARGS((int c));
|
|||
|
int hexhex2nr __ARGS((char_u *p));
|
|||
|
int rem_backslash __ARGS((char_u *str));
|
|||
|
*** ../vim-7.4.781/src/testdir/test_increment.in 2015-07-03 12:44:01.735748596 +0200
|
|||
|
--- src/testdir/test_increment.in 2015-07-17 12:45:27.426759384 +0200
|
|||
|
***************
|
|||
|
*** 185,190 ****
|
|||
|
--- 185,267 ----
|
|||
|
1 0
|
|||
|
1 0
|
|||
|
|
|||
|
+ 13) visually selected part of columns
|
|||
|
+ Text:
|
|||
|
+ max: 100px
|
|||
|
+ max: 200px
|
|||
|
+ max: 300px
|
|||
|
+ max: 400px
|
|||
|
+ Expected:
|
|||
|
+ 1) 'v' on first two numbers Ctrl-A
|
|||
|
+ max: 110px
|
|||
|
+ max: 220px
|
|||
|
+ max: 330px
|
|||
|
+ max: 400px
|
|||
|
+ 2) 'v' on first two numbers Ctrl-X
|
|||
|
+ max: 90px
|
|||
|
+ max: 190px
|
|||
|
+ max: 290px
|
|||
|
+ max: 400px
|
|||
|
+
|
|||
|
+ 14) redo in block mode
|
|||
|
+ Text:
|
|||
|
+ 1 1
|
|||
|
+ 1 1
|
|||
|
+ Expected:
|
|||
|
+ 1) Ctrl-a on first column, redo on second column
|
|||
|
+ 2 2
|
|||
|
+ 2 2
|
|||
|
+
|
|||
|
+ 15) block select single numbers
|
|||
|
+ Text:
|
|||
|
+ 101
|
|||
|
+ Expected:
|
|||
|
+ 1) Ctrl-a on visually selected zero
|
|||
|
+ 111
|
|||
|
+
|
|||
|
+ 16) increment right aligned numbers
|
|||
|
+ Text:
|
|||
|
+ 1
|
|||
|
+ 19
|
|||
|
+ 119
|
|||
|
+ Expected:
|
|||
|
+ 1) Ctrl-a on line selected region
|
|||
|
+ 2
|
|||
|
+ 20
|
|||
|
+ 120
|
|||
|
+
|
|||
|
+ 17) block-wise increment and redo
|
|||
|
+ Text:
|
|||
|
+ 100
|
|||
|
+ 1
|
|||
|
+
|
|||
|
+ 100
|
|||
|
+ 1
|
|||
|
+
|
|||
|
+ Expected:
|
|||
|
+ 1) Ctrl-V j $ on first block, afterwards '.' on second
|
|||
|
+ 101
|
|||
|
+ 2
|
|||
|
+
|
|||
|
+ 101
|
|||
|
+ 2
|
|||
|
+
|
|||
|
+ 18) repeat of g<Ctrl-a>
|
|||
|
+ Text:
|
|||
|
+ 0
|
|||
|
+ 0
|
|||
|
+ 0
|
|||
|
+ 0
|
|||
|
+
|
|||
|
+ Expected:
|
|||
|
+ 1) V 4j g<ctrl-a>, repeat twice afterwards with .
|
|||
|
+ 3
|
|||
|
+ 6
|
|||
|
+ 9
|
|||
|
+ 12
|
|||
|
+
|
|||
|
+
|
|||
|
+
|
|||
|
STARTTEST
|
|||
|
:so small.vim
|
|||
|
:"
|
|||
|
***************
|
|||
|
*** 200,215 ****
|
|||
|
f-v$:/^E1=/+5put a
|
|||
|
f1v$
|
|||
|
|
|||
|
! :" Test 22
|
|||
|
:/^S2=/+,/^E2=/-y a
|
|||
|
:/^E2=/+put a
|
|||
|
! V3k$:.+put a
|
|||
|
V3k$
|
|||
|
|
|||
|
:" Test 3
|
|||
|
:/^S3=/+,/^E3=/-y a
|
|||
|
:/^E3=/+put a
|
|||
|
! V6k2g:.+put a
|
|||
|
V6k2g
|
|||
|
|
|||
|
:" Test 4
|
|||
|
--- 277,292 ----
|
|||
|
f-v$:/^E1=/+5put a
|
|||
|
f1v$
|
|||
|
|
|||
|
! :" Test 2
|
|||
|
:/^S2=/+,/^E2=/-y a
|
|||
|
:/^E2=/+put a
|
|||
|
! V3k$3j:.+put a
|
|||
|
V3k$
|
|||
|
|
|||
|
:" Test 3
|
|||
|
:/^S3=/+,/^E3=/-y a
|
|||
|
:/^E3=/+put a
|
|||
|
! V6k2g6j:.+put a
|
|||
|
V6k2g
|
|||
|
|
|||
|
:" Test 4
|
|||
|
***************
|
|||
|
*** 229,249 ****
|
|||
|
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
|
|||
|
--- 306,327 ----
|
|||
|
v3kg
|
|||
|
|
|||
|
:" Test 7
|
|||
|
+ :set nrformats&vim
|
|||
|
:/^S7=/+,/^E7=/-y a
|
|||
|
:/^E7=/+put a
|
|||
|
! V4k4j:.+put a
|
|||
|
V4k
|
|||
|
|
|||
|
:" Test 8
|
|||
|
:/^S8=/+,/^E8=/-y a
|
|||
|
:/^E8=/+put a
|
|||
|
! kj$j:.+put a
|
|||
|
k$+
|
|||
|
|
|||
|
:" Test 9
|
|||
|
:/^S9=/+,/^E9=/-y a
|
|||
|
:/^E9=/+put a
|
|||
|
! 5kVj23j.
|
|||
|
|
|||
|
:" Test 10
|
|||
|
:/^S10=/+,/^E10=/-y a
|
|||
|
***************
|
|||
|
*** 260,265 ****
|
|||
|
--- 338,374 ----
|
|||
|
:/^E12=/+put a
|
|||
|
2k$v++
|
|||
|
|
|||
|
+ :" Test 13
|
|||
|
+ :/^S13=/+,/^E13=/-y a
|
|||
|
+ :/^E13=/+put a
|
|||
|
+ 3kf1l2j3j:.+put a
|
|||
|
+ 3kf1l2j
|
|||
|
+
|
|||
|
+ :" Test 14
|
|||
|
+ :/^S14=/+,/^E14=/-y a
|
|||
|
+ :/^E14=/+put a
|
|||
|
+ kw.
|
|||
|
+
|
|||
|
+ :" Test 15
|
|||
|
+ :/^S15=/+,/^E15=/-y a
|
|||
|
+ :/^E15=/+put a
|
|||
|
+ lv
|
|||
|
+
|
|||
|
+ :" Test 16
|
|||
|
+ :/^S16=/+,/^E16=/-y a
|
|||
|
+ :/^E16=/+put a
|
|||
|
+ V3k
|
|||
|
+
|
|||
|
+ :" Test 17
|
|||
|
+ :/^S17=/+,/^E17=/-y a
|
|||
|
+ :/^E17=/+put a
|
|||
|
+ 4kj$2j.
|
|||
|
+
|
|||
|
+ :" Test 18
|
|||
|
+ :/^S18=/+,/^E18=/-y a
|
|||
|
+ :/^E18=/+put a
|
|||
|
+ V3kg..
|
|||
|
+
|
|||
|
:" Save the report
|
|||
|
:/^# Test 1/,$w! test.out
|
|||
|
:qa!
|
|||
|
***************
|
|||
|
*** 384,389 ****
|
|||
|
--- 493,549 ----
|
|||
|
|
|||
|
|
|||
|
|
|||
|
+ # Test 13
|
|||
|
+ S13====
|
|||
|
+ max: 100px
|
|||
|
+ max: 200px
|
|||
|
+ max: 300px
|
|||
|
+ max: 400px
|
|||
|
+ E13====
|
|||
|
+
|
|||
|
+
|
|||
|
+
|
|||
|
+ # Test 14
|
|||
|
+ S14====
|
|||
|
+ 1 1
|
|||
|
+ 1 1
|
|||
|
+ E14====
|
|||
|
+
|
|||
|
+
|
|||
|
+
|
|||
|
+ # Test 15
|
|||
|
+ S15====
|
|||
|
+ 101
|
|||
|
+ E15====
|
|||
|
+
|
|||
|
+
|
|||
|
+
|
|||
|
+ # Test 16
|
|||
|
+ S16====
|
|||
|
+ 1
|
|||
|
+ 19
|
|||
|
+ 119
|
|||
|
+ E16====
|
|||
|
+
|
|||
|
+
|
|||
|
+
|
|||
|
+ # Test 17
|
|||
|
+ S17====
|
|||
|
+ 100
|
|||
|
+ 1
|
|||
|
+
|
|||
|
+ 100
|
|||
|
+ 1
|
|||
|
+ E17====
|
|||
|
+
|
|||
|
+
|
|||
|
+ # Test 18
|
|||
|
+ S18====
|
|||
|
+ 0
|
|||
|
+ 0
|
|||
|
+ 0
|
|||
|
+ 0
|
|||
|
+ E18====
|
|||
|
|
|||
|
|
|||
|
|
|||
|
*** ../vim-7.4.781/src/testdir/test_increment.ok 2015-07-03 12:44:01.739748554 +0200
|
|||
|
--- src/testdir/test_increment.ok 2015-07-17 12:45:34.094696017 +0200
|
|||
|
***************
|
|||
|
*** 184,190 ****
|
|||
|
1 0
|
|||
|
|
|||
|
|
|||
|
!
|
|||
|
|
|||
|
|
|||
|
|
|||
|
--- 184,264 ----
|
|||
|
1 0
|
|||
|
|
|||
|
|
|||
|
! # Test 13
|
|||
|
! S13====
|
|||
|
! max: 100px
|
|||
|
! max: 200px
|
|||
|
! max: 300px
|
|||
|
! max: 400px
|
|||
|
! E13====
|
|||
|
!
|
|||
|
! max: 110px
|
|||
|
! max: 210px
|
|||
|
! max: 310px
|
|||
|
! max: 400px
|
|||
|
!
|
|||
|
! max: 90px
|
|||
|
! max: 190px
|
|||
|
! max: 290px
|
|||
|
! max: 400px
|
|||
|
!
|
|||
|
! # Test 14
|
|||
|
! S14====
|
|||
|
! 1 1
|
|||
|
! 1 1
|
|||
|
! E14====
|
|||
|
!
|
|||
|
! 2 2
|
|||
|
! 2 2
|
|||
|
!
|
|||
|
!
|
|||
|
! # Test 15
|
|||
|
! S15====
|
|||
|
! 101
|
|||
|
! E15====
|
|||
|
!
|
|||
|
! 111
|
|||
|
!
|
|||
|
!
|
|||
|
! # Test 16
|
|||
|
! S16====
|
|||
|
! 1
|
|||
|
! 19
|
|||
|
! 119
|
|||
|
! E16====
|
|||
|
!
|
|||
|
! 2
|
|||
|
! 20
|
|||
|
! 120
|
|||
|
!
|
|||
|
!
|
|||
|
! # Test 17
|
|||
|
! S17====
|
|||
|
! 100
|
|||
|
! 1
|
|||
|
!
|
|||
|
! 100
|
|||
|
! 1
|
|||
|
! E17====
|
|||
|
!
|
|||
|
! 101
|
|||
|
! 2
|
|||
|
!
|
|||
|
! 101
|
|||
|
! 1
|
|||
|
!
|
|||
|
! # Test 18
|
|||
|
! S18====
|
|||
|
! 0
|
|||
|
! 0
|
|||
|
! 0
|
|||
|
! 0
|
|||
|
! E18====
|
|||
|
!
|
|||
|
! 3
|
|||
|
! 6
|
|||
|
! 9
|
|||
|
! 12
|
|||
|
|
|||
|
|
|||
|
|
|||
|
*** ../vim-7.4.781/src/version.c 2015-07-12 17:52:50.728095726 +0200
|
|||
|
--- src/version.c 2015-07-17 12:46:37.590092608 +0200
|
|||
|
***************
|
|||
|
*** 743,744 ****
|
|||
|
--- 743,746 ----
|
|||
|
{ /* Add new patch number below this line */
|
|||
|
+ /**/
|
|||
|
+ 782,
|
|||
|
/**/
|
|||
|
|
|||
|
--
|
|||
|
hundred-and-one symptoms of being an internet addict:
|
|||
|
226. You sit down at the computer right after dinner and your spouse
|
|||
|
says "See you in the morning."
|
|||
|
|
|||
|
/// 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 ///
|