aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJan Edmund Lazo <jan.lazo@mail.utoronto.ca>2021-04-28 09:06:05 -0400
committerJan Edmund Lazo <jan.lazo@mail.utoronto.ca>2021-04-28 21:29:57 -0400
commit04a4bbbe56fd6cbc164730cb9beab4ec6fefe3b0 (patch)
tree3c139284691ccf4f656af694de365e4a74813d8e /src
parent65821cc1b94e3beb2de19e1bb8def3fe6e82bc1f (diff)
downloadrneovim-04a4bbbe56fd6cbc164730cb9beab4ec6fefe3b0.tar.gz
rneovim-04a4bbbe56fd6cbc164730cb9beab4ec6fefe3b0.tar.bz2
rneovim-04a4bbbe56fd6cbc164730cb9beab4ec6fefe3b0.zip
vim-patch:8.2.0860: cannot use CTRL-A and CTRL-X on unsigned numbers
Problem: Cannot use CTRL-A and CTRL-X on unsigned numbers. Solution: Add "unsigned" to 'nrformats'. (Naruhiko Nishino, closes vim/vim#6144) https://github.com/vim/vim/commit/aaad995f8384a77a64efba6846c9c4ac99de0953
Diffstat (limited to 'src')
-rw-r--r--src/nvim/ops.c65
-rw-r--r--src/nvim/option.c3
-rw-r--r--src/nvim/testdir/test_increment.vim46
3 files changed, 85 insertions, 29 deletions
diff --git a/src/nvim/ops.c b/src/nvim/ops.c
index 190ca2e93b..54d73b6ae7 100644
--- a/src/nvim/ops.c
+++ b/src/nvim/ops.c
@@ -4731,12 +4731,7 @@ int do_addsub(int op_type, pos_T *pos, int length, linenr_T Prenum1)
char_u *ptr;
int c;
int todel;
- bool dohex;
- bool dooct;
- bool dobin;
- bool doalp;
int firstdigit;
- bool subtract;
bool negative = false;
bool was_positive = true;
bool visual = VIsual_active;
@@ -4747,10 +4742,12 @@ int do_addsub(int op_type, pos_T *pos, int length, linenr_T Prenum1)
pos_T endpos;
colnr_T save_coladd = 0;
- dohex = (vim_strchr(curbuf->b_p_nf, 'x') != NULL); // "heX"
- dooct = (vim_strchr(curbuf->b_p_nf, 'o') != NULL); // "Octal"
- dobin = (vim_strchr(curbuf->b_p_nf, 'b') != NULL); // "Bin"
- doalp = (vim_strchr(curbuf->b_p_nf, 'p') != NULL); // "alPha"
+ const bool do_hex = vim_strchr(curbuf->b_p_nf, 'x') != NULL; // "heX"
+ const bool do_oct = vim_strchr(curbuf->b_p_nf, 'o') != NULL; // "Octal"
+ const bool do_bin = vim_strchr(curbuf->b_p_nf, 'b') != NULL; // "Bin"
+ const bool do_alpha = vim_strchr(curbuf->b_p_nf, 'p') != NULL; // "alPha"
+ // "Unsigned"
+ const bool do_unsigned = vim_strchr(curbuf->b_p_nf, 'u') != NULL;
if (virtual_active()) {
save_coladd = pos->coladd;
@@ -4767,21 +4764,21 @@ int do_addsub(int op_type, pos_T *pos, int length, linenr_T Prenum1)
// First check if we are on a hexadecimal number, after the "0x".
if (!VIsual_active) {
- if (dobin) {
+ if (do_bin) {
while (col > 0 && ascii_isbdigit(ptr[col])) {
col--;
col -= utf_head_off(ptr, ptr + col);
}
}
- if (dohex) {
+ if (do_hex) {
while (col > 0 && ascii_isxdigit(ptr[col])) {
col--;
col -= utf_head_off(ptr, ptr + col);
}
}
- if (dobin
- && dohex
+ if (do_bin
+ && do_hex
&& !((col > 0
&& (ptr[col] == 'X' || ptr[col] == 'x')
&& ptr[col - 1] == '0'
@@ -4797,13 +4794,13 @@ int do_addsub(int op_type, pos_T *pos, int length, linenr_T Prenum1)
}
}
- if ((dohex
+ if ((do_hex
&& col > 0
&& (ptr[col] == 'X' || ptr[col] == 'x')
&& ptr[col - 1] == '0'
&& !utf_head_off(ptr, ptr + col - 1)
&& ascii_isxdigit(ptr[col + 1]))
- || (dobin
+ || (do_bin
&& col > 0
&& (ptr[col] == 'B' || ptr[col] == 'b')
&& ptr[col - 1] == '0'
@@ -4818,13 +4815,13 @@ int do_addsub(int op_type, pos_T *pos, int length, linenr_T Prenum1)
while (ptr[col] != NUL
&& !ascii_isdigit(ptr[col])
- && !(doalp && ASCII_ISALPHA(ptr[col]))) {
+ && !(do_alpha && ASCII_ISALPHA(ptr[col]))) {
col++;
}
while (col > 0
&& ascii_isdigit(ptr[col - 1])
- && !(doalp && ASCII_ISALPHA(ptr[col]))) {
+ && !(do_alpha && ASCII_ISALPHA(ptr[col]))) {
col--;
}
}
@@ -4832,7 +4829,7 @@ int do_addsub(int op_type, pos_T *pos, int length, linenr_T Prenum1)
if (visual) {
while (ptr[col] != NUL && length > 0 && !ascii_isdigit(ptr[col])
- && !(doalp && ASCII_ISALPHA(ptr[col]))) {
+ && !(do_alpha && ASCII_ISALPHA(ptr[col]))) {
int mb_len = utfc_ptr2len(ptr + col);
col += mb_len;
@@ -4844,7 +4841,8 @@ int do_addsub(int op_type, pos_T *pos, int length, linenr_T Prenum1)
}
if (col > pos->col && ptr[col - 1] == '-'
- && !utf_head_off(ptr, ptr + col - 1)) {
+ && !utf_head_off(ptr, ptr + col - 1)
+ && !do_unsigned) {
negative = true;
was_positive = false;
}
@@ -4852,12 +4850,12 @@ int do_addsub(int op_type, pos_T *pos, int length, linenr_T Prenum1)
// If a number was found, and saving for undo works, replace the number.
firstdigit = ptr[col];
- if (!ascii_isdigit(firstdigit) && !(doalp && ASCII_ISALPHA(firstdigit))) {
+ if (!ascii_isdigit(firstdigit) && !(do_alpha && ASCII_ISALPHA(firstdigit))) {
beep_flush();
goto theend;
}
- if (doalp && ASCII_ISALPHA(firstdigit)) {
+ if (do_alpha && ASCII_ISALPHA(firstdigit)) {
// decrement or increment alphabetic character
if (op_type == OP_NR_SUB) {
if (CharOrd(firstdigit) < Prenum1) {
@@ -4889,7 +4887,9 @@ int do_addsub(int op_type, pos_T *pos, int length, linenr_T Prenum1)
curwin->w_cursor.col = col;
} else {
if (col > 0 && ptr[col - 1] == '-'
- && !utf_head_off(ptr, ptr + col - 1) && !visual) {
+ && !utf_head_off(ptr, ptr + col - 1)
+ && !visual
+ && !do_unsigned) {
// negative number
col--;
negative = true;
@@ -4903,9 +4903,9 @@ int do_addsub(int op_type, pos_T *pos, int length, linenr_T Prenum1)
}
vim_str2nr(ptr + col, &pre, &length,
- 0 + (dobin ? STR2NR_BIN : 0)
- + (dooct ? STR2NR_OCT : 0)
- + (dohex ? STR2NR_HEX : 0),
+ 0 + (do_bin ? STR2NR_BIN : 0)
+ + (do_oct ? STR2NR_OCT : 0)
+ + (do_hex ? STR2NR_HEX : 0),
NULL, &n, maxlen);
// ignore leading '-' for hex, octal and bin numbers
@@ -4916,7 +4916,7 @@ int do_addsub(int op_type, pos_T *pos, int length, linenr_T Prenum1)
}
// add or subtract
- subtract = false;
+ bool subtract = false;
if (op_type == OP_NR_SUB) {
subtract ^= true;
}
@@ -4948,6 +4948,17 @@ int do_addsub(int op_type, pos_T *pos, int length, linenr_T Prenum1)
}
}
+ if (do_unsigned && negative) {
+ if (subtract) {
+ // sticking at zero.
+ n = (uvarnumber_T)0;
+ } else {
+ // sticking at 2^64 - 1.
+ n = (uvarnumber_T)(-1);
+ }
+ negative = false;
+ }
+
if (visual && !was_positive && !negative && col > 0) {
// need to remove the '-'
col--;
@@ -5029,7 +5040,7 @@ int do_addsub(int op_type, pos_T *pos, int length, linenr_T Prenum1)
// total length of the number remains the same.
// Don't do this when
// the result may look like an octal number.
- if (firstdigit == '0' && !(dooct && pre == 0)) {
+ if (firstdigit == '0' && !(do_oct && pre == 0)) {
while (length-- > 0) {
*ptr++ = '0';
}
diff --git a/src/nvim/option.c b/src/nvim/option.c
index 666c526a18..a811d749b9 100644
--- a/src/nvim/option.c
+++ b/src/nvim/option.c
@@ -292,7 +292,8 @@ typedef struct vimoption {
static char *(p_ambw_values[]) = { "single", "double", NULL };
static char *(p_bg_values[]) = { "light", "dark", NULL };
-static char *(p_nf_values[]) = { "bin", "octal", "hex", "alpha", NULL };
+static char *(p_nf_values[]) = { "bin", "octal", "hex", "alpha",
+ "unsigned", NULL };
static char *(p_ff_values[]) = { FF_UNIX, FF_DOS, FF_MAC, NULL };
static char *(p_wak_values[]) = { "yes", "menu", "no", NULL };
static char *(p_mousem_values[]) = { "extend", "popup", "popup_setpos",
diff --git a/src/nvim/testdir/test_increment.vim b/src/nvim/testdir/test_increment.vim
index f81f8edbde..6d08cd40a8 100644
--- a/src/nvim/testdir/test_increment.vim
+++ b/src/nvim/testdir/test_increment.vim
@@ -1,4 +1,4 @@
-" Tests for using Ctrl-A/Ctrl-X on visual selections
+" Tests for using Ctrl-A/Ctrl-X
func SetUp()
new dummy
@@ -779,6 +779,50 @@ func Test_increment_empty_line()
bwipe!
endfunc
+" Try incrementing/decrementing a number when nrformats contains unsigned
+func Test_increment_unsigned()
+ set nrformats+=unsigned
+
+ call setline(1, '0')
+ exec "norm! gg0\<C-X>"
+ call assert_equal('0', getline(1))
+
+ call setline(1, '3')
+ exec "norm! gg010\<C-X>"
+ call assert_equal('0', getline(1))
+
+ call setline(1, '-0')
+ exec "norm! gg0\<C-X>"
+ call assert_equal("-0", getline(1))
+
+ call setline(1, '-11')
+ exec "norm! gg08\<C-X>"
+ call assert_equal('-3', getline(1))
+
+ " NOTE: 18446744073709551615 == 2^64 - 1
+ call setline(1, '18446744073709551615')
+ exec "norm! gg0\<C-A>"
+ call assert_equal('18446744073709551615', getline(1))
+
+ call setline(1, '-18446744073709551615')
+ exec "norm! gg0\<C-A>"
+ call assert_equal('-18446744073709551615', getline(1))
+
+ call setline(1, '-18446744073709551614')
+ exec "norm! gg08\<C-A>"
+ call assert_equal('-18446744073709551615', getline(1))
+
+ call setline(1, '-1')
+ exec "norm! gg0\<C-A>"
+ call assert_equal('-2', getline(1))
+
+ call setline(1, '-3')
+ exec "norm! gg08\<C-A>"
+ call assert_equal('-11', getline(1))
+
+ set nrformats-=unsigned
+endfunc
+
func Test_normal_increment_with_virtualedit()
set virtualedit=all