diff options
author | Jan Edmund Lazo <jan.lazo@mail.utoronto.ca> | 2021-04-28 09:06:05 -0400 |
---|---|---|
committer | Jan Edmund Lazo <jan.lazo@mail.utoronto.ca> | 2021-04-28 21:29:57 -0400 |
commit | 04a4bbbe56fd6cbc164730cb9beab4ec6fefe3b0 (patch) | |
tree | 3c139284691ccf4f656af694de365e4a74813d8e /src | |
parent | 65821cc1b94e3beb2de19e1bb8def3fe6e82bc1f (diff) | |
download | rneovim-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.c | 65 | ||||
-rw-r--r-- | src/nvim/option.c | 3 | ||||
-rw-r--r-- | src/nvim/testdir/test_increment.vim | 46 |
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 |