mirror of
https://github.com/neovim/neovim.git
synced 2025-12-16 03:15:39 +00:00
fix(edit): backspace adds extra spaces for inline virtual text (#28005)
Problem: Backspace adds extra spaces for inline virtual text. Solution: Ignore virtual text and wrapping when backspacing.
This commit is contained in:
@@ -8,6 +8,7 @@ local command = helpers.command
|
||||
local eq = helpers.eq
|
||||
local eval = helpers.eval
|
||||
local curbuf_contents = helpers.curbuf_contents
|
||||
local api = helpers.api
|
||||
|
||||
describe('insert-mode', function()
|
||||
before_each(function()
|
||||
@@ -221,4 +222,146 @@ describe('insert-mode', function()
|
||||
]],
|
||||
}
|
||||
end)
|
||||
|
||||
describe('backspace', function()
|
||||
local function set_lines(line_b, line_e, ...)
|
||||
api.nvim_buf_set_lines(0, line_b, line_e, true, { ... })
|
||||
end
|
||||
local function s(count)
|
||||
return (' '):rep(count)
|
||||
end
|
||||
|
||||
local function test_cols(expected_cols)
|
||||
local cols = { { helpers.fn.col('.'), helpers.fn.virtcol('.') } }
|
||||
for _ = 2, #expected_cols do
|
||||
feed('<BS>')
|
||||
table.insert(cols, { helpers.fn.col('.'), helpers.fn.virtcol('.') })
|
||||
end
|
||||
eq(expected_cols, cols)
|
||||
end
|
||||
|
||||
it('works with tabs and spaces', function()
|
||||
local screen = Screen.new(30, 2)
|
||||
screen:attach()
|
||||
command('setl ts=4 sw=4')
|
||||
set_lines(0, 1, '\t' .. s(4) .. '\t' .. s(9) .. '\t a')
|
||||
feed('$i')
|
||||
test_cols({
|
||||
{ 18, 26 },
|
||||
{ 17, 25 },
|
||||
{ 15, 21 },
|
||||
{ 11, 17 },
|
||||
{ 7, 13 },
|
||||
{ 6, 9 },
|
||||
{ 2, 5 },
|
||||
{ 1, 1 },
|
||||
})
|
||||
end)
|
||||
|
||||
it('works with varsofttabstop', function()
|
||||
local screen = Screen.new(30, 2)
|
||||
screen:attach()
|
||||
command('setl vsts=6,2,5,3')
|
||||
set_lines(0, 1, 'a\t' .. s(4) .. '\t a')
|
||||
feed('$i')
|
||||
test_cols({
|
||||
{ 9, 18 },
|
||||
{ 8, 17 },
|
||||
{ 8, 14 },
|
||||
{ 3, 9 },
|
||||
{ 7, 7 },
|
||||
{ 2, 2 },
|
||||
{ 1, 1 },
|
||||
})
|
||||
end)
|
||||
|
||||
it('works with tab as ^I', function()
|
||||
local screen = Screen.new(30, 2)
|
||||
screen:attach()
|
||||
command('set list listchars=space:.')
|
||||
command('setl ts=4 sw=4')
|
||||
set_lines(0, 1, '\t' .. s(4) .. '\t' .. s(9) .. '\t a')
|
||||
feed('$i')
|
||||
test_cols({
|
||||
{ 18, 21 },
|
||||
{ 15, 17 },
|
||||
{ 11, 13 },
|
||||
{ 7, 9 },
|
||||
{ 4, 5 },
|
||||
{ 1, 1 },
|
||||
})
|
||||
end)
|
||||
|
||||
it('works in replace mode', function()
|
||||
local screen = Screen.new(50, 2)
|
||||
screen:attach()
|
||||
command('setl ts=8 sw=8 sts=8')
|
||||
set_lines(0, 1, '\t' .. s(4) .. '\t' .. s(9) .. '\t a')
|
||||
feed('$R')
|
||||
test_cols({
|
||||
{ 18, 34 },
|
||||
{ 17, 33 },
|
||||
{ 15, 25 },
|
||||
{ 7, 17 },
|
||||
{ 2, 9 },
|
||||
{ 1, 8 }, -- last screen cell of first tab is at vcol 8
|
||||
})
|
||||
end)
|
||||
|
||||
it('works with breakindent', function()
|
||||
local screen = Screen.new(17, 4)
|
||||
screen:attach()
|
||||
command('setl ts=4 sw=4 bri briopt=min:5')
|
||||
set_lines(0, 1, '\t' .. s(4) .. '\t' .. s(9) .. '\t a')
|
||||
feed('$i')
|
||||
test_cols({
|
||||
{ 18, 50 },
|
||||
{ 17, 49 },
|
||||
{ 15, 33 },
|
||||
{ 11, 17 },
|
||||
{ 7, 13 },
|
||||
{ 6, 9 },
|
||||
{ 2, 5 },
|
||||
{ 1, 1 },
|
||||
})
|
||||
end)
|
||||
|
||||
it('works with inline virtual text', function()
|
||||
local screen = Screen.new(50, 2)
|
||||
screen:attach()
|
||||
command('setl ts=4 sw=4')
|
||||
set_lines(0, 1, '\t' .. s(4) .. '\t' .. s(9) .. '\t a')
|
||||
local ns = api.nvim_create_namespace('')
|
||||
local vt_opts = { virt_text = { { 'text' } }, virt_text_pos = 'inline' }
|
||||
api.nvim_buf_set_extmark(0, ns, 0, 2, vt_opts)
|
||||
feed('$i')
|
||||
test_cols({
|
||||
{ 18, 30 },
|
||||
{ 17, 29 },
|
||||
{ 15, 25 },
|
||||
{ 11, 21 },
|
||||
{ 7, 17 },
|
||||
{ 6, 13 },
|
||||
{ 2, 9 },
|
||||
{ 1, 5 },
|
||||
})
|
||||
end)
|
||||
|
||||
it("works with 'revins'", function()
|
||||
local screen = Screen.new(30, 3)
|
||||
screen:attach()
|
||||
command('setl ts=4 sw=4 revins')
|
||||
set_lines(0, 1, ('a'):rep(16), s(3) .. '\t' .. s(4) .. '\t a')
|
||||
feed('j$i')
|
||||
test_cols({
|
||||
{ 11, 14 },
|
||||
{ 10, 13 },
|
||||
{ 9, 9 },
|
||||
{ 5, 5 },
|
||||
{ 1, 1 },
|
||||
{ 1, 1 }, -- backspace on empty line does nothing
|
||||
})
|
||||
eq(2, api.nvim_win_get_cursor(0)[1])
|
||||
end)
|
||||
end)
|
||||
end)
|
||||
|
||||
Reference in New Issue
Block a user