diff options
author | vanaigr <vanaigranov@gmail.com> | 2024-03-25 16:12:56 -0500 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-03-26 05:12:56 +0800 |
commit | 14839c5d18c2bef7bdd41944b059603a8589523e (patch) | |
tree | e48e021cb36184087bc012bcd0a0ed5fb1b7ca80 /test | |
parent | a7bbda121d035d050b449b4dc63bd6ae027e248d (diff) | |
download | rneovim-14839c5d18c2bef7bdd41944b059603a8589523e.tar.gz rneovim-14839c5d18c2bef7bdd41944b059603a8589523e.tar.bz2 rneovim-14839c5d18c2bef7bdd41944b059603a8589523e.zip |
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.
Diffstat (limited to 'test')
-rw-r--r-- | test/functional/editor/mode_insert_spec.lua | 143 |
1 files changed, 143 insertions, 0 deletions
diff --git a/test/functional/editor/mode_insert_spec.lua b/test/functional/editor/mode_insert_spec.lua index e96813b6f7..ebf118736f 100644 --- a/test/functional/editor/mode_insert_spec.lua +++ b/test/functional/editor/mode_insert_spec.lua @@ -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) |