Merge pull request #17953 from zeertzjq/vim-8.2.4660

vim-patch:8.2.4660: cursorcolumn is sometimes not correct
This commit is contained in:
zeertzjq 2022-04-01 20:37:45 +08:00 committed by GitHub
commit fce0d54eb2
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 100 additions and 6 deletions

View File

@ -390,9 +390,13 @@ static void insert_enter(InsertState *s)
trigger_modechanged();
stop_insert_mode = false;
// Need to recompute the cursor position, it might move when the cursor is
// on a TAB or special character.
curs_columns(curwin, true);
// Need to recompute the cursor position, it might move when the cursor
// is on a TAB or special character.
// ptr2cells() treats a TAB character as double-width.
if (ptr2cells(get_cursor_pos_ptr()) > 1) {
curwin->w_valid &= ~VALID_VIRTCOL;
curs_columns(curwin, true);
}
// Enable langmap or IME, indicated by 'iminsert'.
// Note that IME may enabled/disabled without us noticing here, thus the

View File

@ -597,6 +597,28 @@ func Test_cursorline_with_visualmode()
call delete('Xtest_cursorline_with_visualmode')
endfunc
func Test_cursorcolumn_insert_on_tab()
CheckScreendump
let lines =<< trim END
call setline(1, ['123456789', "a\tb"])
set cursorcolumn
call cursor(2, 2)
END
call writefile(lines, 'Xcuc_insert_on_tab')
let buf = RunVimInTerminal('-S Xcuc_insert_on_tab', #{rows: 8})
call TermWait(buf)
call VerifyScreenDump(buf, 'Test_cursorcolumn_insert_on_tab_1', {})
call term_sendkeys(buf, 'i')
call TermWait(buf)
call VerifyScreenDump(buf, 'Test_cursorcolumn_insert_on_tab_2', {})
call StopVimInTerminal(buf)
call delete('Xcuc_insert_on_tab')
endfunc
func Test_cursorcolumn_callback()
CheckScreendump
CheckFeature timers

View File

@ -1306,14 +1306,48 @@ describe('CursorLine and CursorLineNr highlights', function()
end)
describe('CursorColumn highlight', function()
before_each(clear)
it('is updated if cursor is moved from timer', function()
local screen = Screen.new(50, 8)
local screen
before_each(function()
clear()
screen = Screen.new(50, 8)
screen:set_default_attr_ids({
[1] = {background = Screen.colors.Gray90}, -- CursorColumn
[2] = {bold = true, foreground = Screen.colors.Blue1}, -- NonText
[3] = {bold = true}, -- ModeMsg
})
screen:attach()
end)
it('is updated when pressing "i" on a TAB character', function()
exec([[
call setline(1, ['123456789', "a\tb"])
set cursorcolumn
call cursor(2, 2)
]])
screen:expect([[
1234567{1:8}9 |
a ^ b |
{2:~ }|
{2:~ }|
{2:~ }|
{2:~ }|
{2:~ }|
|
]])
feed('i')
screen:expect([[
1{1:2}3456789 |
a^ b |
{2:~ }|
{2:~ }|
{2:~ }|
{2:~ }|
{2:~ }|
{3:-- INSERT --} |
]])
end)
it('is updated if cursor is moved from timer', function()
exec([[
call setline(1, ['aaaaa', 'bbbbb', 'ccccc', 'ddddd'])
set cursorcolumn

View File

@ -256,6 +256,40 @@ describe('Screen', function()
]])
end)
end) -- a region of text (implicit concealing)
it("cursor position is correct when entering Insert mode with cocu=ni #13916", function()
insert([[foobarfoobarfoobar]])
-- move to end of line
feed("$")
command("set concealcursor=ni")
command("syn match Foo /foobar/ conceal cchar=&")
screen:expect([[
{1:&&&}^ |
{0:~ }|
{0:~ }|
{0:~ }|
{0:~ }|
{0:~ }|
{0:~ }|
{0:~ }|
{0:~ }|
|
]])
feed("i")
-- cursor should stay in place, not jump to column 16
screen:expect([[
{1:&&&}^ |
{0:~ }|
{0:~ }|
{0:~ }|
{0:~ }|
{0:~ }|
{0:~ }|
{0:~ }|
{0:~ }|
{4:-- INSERT --} |
]])
end)
end) -- match and conceal
describe("let the conceal level be", function()