diff options
author | zeertzjq <zeertzjq@outlook.com> | 2023-08-05 22:42:34 +0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-08-05 22:42:34 +0800 |
commit | ef44e597294e4d0d9128ef69b6aa7481a54e17cb (patch) | |
tree | 5c3e7fd203cf36f768806ecb2aa31e6f5c2edd3c | |
parent | 42630923fc00633d806af97c1792b2ed4a71e1cc (diff) | |
download | rneovim-ef44e597294e4d0d9128ef69b6aa7481a54e17cb.tar.gz rneovim-ef44e597294e4d0d9128ef69b6aa7481a54e17cb.tar.bz2 rneovim-ef44e597294e4d0d9128ef69b6aa7481a54e17cb.zip |
fix(inccommand): don't set an invalid 'undolevels' value (#24575)
Problem: Cannot break undo by setting 'undolevels' to itself in
'inccommand' preview callback.
Solution: Don't set an invalid 'undolevels' value.
Co-authored-by: Michael Henry <drmikehenry@drmikehenry.com>
-rw-r--r-- | src/nvim/ex_getln.c | 2 | ||||
-rw-r--r-- | test/functional/ui/inccommand_user_spec.lua | 38 |
2 files changed, 36 insertions, 4 deletions
diff --git a/src/nvim/ex_getln.c b/src/nvim/ex_getln.c index ece6257c4a..87e45cbb66 100644 --- a/src/nvim/ex_getln.c +++ b/src/nvim/ex_getln.c @@ -2357,7 +2357,7 @@ static void cmdpreview_prepare(CpInfo *cpinfo) set_put(ptr_t, &saved_bufs, buf); u_clearall(buf); - buf->b_p_ul = LONG_MAX; // Make sure we can undo all changes + buf->b_p_ul = INT_MAX; // Make sure we can undo all changes } CpWinInfo cp_wininfo; diff --git a/test/functional/ui/inccommand_user_spec.lua b/test/functional/ui/inccommand_user_spec.lua index 62c4cac709..da7508fad1 100644 --- a/test/functional/ui/inccommand_user_spec.lua +++ b/test/functional/ui/inccommand_user_spec.lua @@ -239,7 +239,8 @@ describe("'inccommand' for user commands", function() [1] = {background = Screen.colors.Yellow1}, [2] = {foreground = Screen.colors.Blue1, bold = true}, [3] = {reverse = true}, - [4] = {reverse = true, bold = true} + [4] = {reverse = true, bold = true}, + [5] = {foreground = Screen.colors.Blue}, }) screen:attach() exec_lua(setup_replace_cmd) @@ -458,9 +459,8 @@ describe("'inccommand' for user commands", function() assert_alive() end) - it('breaking undo chain in Insert mode works properly #20248', function() + local function test_preview_break_undo() command('set inccommand=nosplit') - command('inoremap . .<C-G>u') exec_lua([[ vim.api.nvim_create_user_command('Test', function() end, { nargs = 1, @@ -490,6 +490,26 @@ describe("'inccommand' for user commands", function() {2:~ }| :Test a.a.a.a.^ | ]]) + feed('<C-V><Esc>u') + screen:expect([[ + text on line 1 | + more text on line 2 | + oh no, even more text | + will the text ever stop | + oh well | + did the text stop | + why won't it stop | + make the text stop | + a.a.a. | + {2:~ }| + {2:~ }| + {2:~ }| + {2:~ }| + {2:~ }| + {2:~ }| + {2:~ }| + :Test a.a.a.a.{5:^[}u^ | + ]]) feed('<Esc>') screen:expect([[ text on line 1 | @@ -510,6 +530,18 @@ describe("'inccommand' for user commands", function() {2:~ }| | ]]) + end + + describe('breaking undo chain in Insert mode works properly', function() + it('when using i_CTRL-G_u #20248', function() + command('inoremap . .<C-G>u') + test_preview_break_undo() + end) + + it('when setting &l:undolevels to itself #24575', function() + command('inoremap . .<Cmd>let &l:undolevels = &l:undolevels<CR>') + test_preview_break_undo() + end) end) end) |