]> granicus.if.org Git - vim/commitdiff
patch 8.2.4660: cursorcolumn is sometimes not correct v8.2.4660
authorBram Moolenaar <Bram@vim.org>
Fri, 1 Apr 2022 11:06:31 +0000 (12:06 +0100)
committerBram Moolenaar <Bram@vim.org>
Fri, 1 Apr 2022 11:06:31 +0000 (12:06 +0100)
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.

src/edit.c
src/testdir/dumps/Test_cursorcolumn_insert_on_tab_1.dump [new file with mode: 0644]
src/testdir/dumps/Test_cursorcolumn_insert_on_tab_2.dump [new file with mode: 0644]
src/testdir/test_highlight.vim
src/version.c

index 0edd38be4c8ec3f561cd31aa4bccb7e8ccf49789..c52583a8b6f8076680c8221a8e08ecf5f3f50b20 100644 (file)
@@ -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 (file)
index 0000000..7a691e8
--- /dev/null
@@ -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 (file)
index 0000000..29d6b19
--- /dev/null
@@ -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| 
index b07ba1174a446d4e6198b277e532710f16ff4946..4b8cd86fafd0ca8a30a408f991355aae8cf6d5fe 100644 (file)
@@ -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
index c6f444696a70682d53fc1db0fb281bd8a217053d..e6398a07deaee1c0aa60e93b68850674c087faab 100644 (file)
@@ -750,6 +750,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    4660,
 /**/
     4659,
 /**/