diff options
author | Bram Moolenaar <Bram@vim.org> | 2022-04-01 12:06:31 +0100 |
---|---|---|
committer | Bram Moolenaar <Bram@vim.org> | 2022-04-01 12:06:31 +0100 |
commit | 782c6744b49b30d9460ed00d4773666e42e07163 (patch) | |
tree | bf703612f9646593492f7dbc275896791095d39e | |
parent | 96e08e028cbcda23dccf83de6b71b3c6bf1f9d4a (diff) | |
download | vim-git-782c6744b49b30d9460ed00d4773666e42e07163.tar.gz |
patch 8.2.4660: cursorcolumn is sometimes not correctv8.2.4660
Problem: Cursorcolumn is sometimes not correct.
Solution: Recompute the cursor column when entering Insert mode and the
cursor is on a character wider than a screen cell.
-rw-r--r-- | src/edit.c | 13 | ||||
-rw-r--r-- | src/testdir/dumps/Test_cursorcolumn_insert_on_tab_1.dump | 8 | ||||
-rw-r--r-- | src/testdir/dumps/Test_cursorcolumn_insert_on_tab_2.dump | 8 | ||||
-rw-r--r-- | src/testdir/test_highlight.vim | 22 | ||||
-rw-r--r-- | src/version.c | 2 |
5 files changed, 48 insertions, 5 deletions
diff --git a/src/edit.c b/src/edit.c index 0edd38be4..c52583a8b 100644 --- a/src/edit.c +++ b/src/edit.c @@ -293,11 +293,14 @@ edit( conceal_check_cursor_line(cursor_line_was_concealed); #endif - /* - * Need to recompute the cursor position, it might move when the cursor is - * on a TAB or special character. - */ - curs_columns(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(ml_get_cursor()) > 1) + { + curwin->w_valid &= ~VALID_VIRTCOL; + curs_columns(TRUE); + } /* * Enable langmap or IME, indicated by 'iminsert'. diff --git a/src/testdir/dumps/Test_cursorcolumn_insert_on_tab_1.dump b/src/testdir/dumps/Test_cursorcolumn_insert_on_tab_1.dump new file mode 100644 index 000000000..7a691e82a --- /dev/null +++ b/src/testdir/dumps/Test_cursorcolumn_insert_on_tab_1.dump @@ -0,0 +1,8 @@ +|1+0&#ffffff0|2|3|4|5|6|7|8+0&#e0e0e08|9+0&#ffffff0| @65 +|a| @5> |b| @65 +|~+0#4040ff13&| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +| +0#0000000&@56|2|,|2|-|8| @8|A|l@1| diff --git a/src/testdir/dumps/Test_cursorcolumn_insert_on_tab_2.dump b/src/testdir/dumps/Test_cursorcolumn_insert_on_tab_2.dump new file mode 100644 index 000000000..29d6b1951 --- /dev/null +++ b/src/testdir/dumps/Test_cursorcolumn_insert_on_tab_2.dump @@ -0,0 +1,8 @@ +|1+0&#ffffff0|2+0&#e0e0e08|3+0&#ffffff0|4|5|6|7|8|9| @65 +|a> @6|b| @65 +|~+0#4040ff13&| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +|-+2#0000000&@1| |I|N|S|E|R|T| |-@1| +0&&@44|2|,|2| @10|A|l@1| diff --git a/src/testdir/test_highlight.vim b/src/testdir/test_highlight.vim index b07ba1174..4b8cd86fa 100644 --- a/src/testdir/test_highlight.vim +++ b/src/testdir/test_highlight.vim @@ -592,6 +592,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 diff --git a/src/version.c b/src/version.c index c6f444696..e6398a07d 100644 --- a/src/version.c +++ b/src/version.c @@ -751,6 +751,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 4660, +/**/ 4659, /**/ 4658, |