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>
This commit is contained in:
zeertzjq 2023-08-05 22:42:34 +08:00 committed by GitHub
parent 42630923fc
commit ef44e59729
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 36 additions and 4 deletions

View File

@ -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;

View File

@ -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)