]> git.ipfire.org Git - thirdparty/vim.git/commitdiff
patch 9.0.1597: cursor ends up below the window after a put v9.0.1597
authorBram Moolenaar <Bram@vim.org>
Thu, 1 Jun 2023 18:27:08 +0000 (19:27 +0100)
committerBram Moolenaar <Bram@vim.org>
Thu, 1 Jun 2023 18:27:08 +0000 (19:27 +0100)
Problem:    Cursor ends up below the window after a put.
Solution:   Mark w_crow and w_botline invalid when changing the cursor line.
            (closes #12465)

src/eval.c
src/move.c
src/register.c
src/testdir/dumps/Test_put_in_last_displayed_line_1.dump [new file with mode: 0644]
src/testdir/test_put.vim
src/version.c

index b8d954d6a2e47a47f162215a979f707db3030ef7..89141bfe3ee7eb5f5c73fd2ff7a6936a7f0adb5f 100644 (file)
@@ -6322,6 +6322,10 @@ var2fpos(
 
     if (name[0] == 'w' && dollar_lnum)
     {
+       // the "w_valid" flags are not reset when moving the cursor, but they
+       // do matter for update_topline() and validate_botline().
+       check_cursor_moved(curwin);
+
        pos.col = 0;
        if (name[1] == '0')             // "w0": first visible line
        {
index e435bb08bb11a18b3b0b9891a902184bfd0f986d..a1139199e6c64857962472dbb956ed13f834ee57 100644 (file)
@@ -715,19 +715,21 @@ set_topline(win_T *wp, linenr_T lnum)
 /*
  * Call this function when the length of the cursor line (in screen
  * characters) has changed, and the change is before the cursor.
+ * If the line length changed the number of screen lines might change,
+ * requiring updating w_topline.  That may also invalidate w_crow.
  * Need to take care of w_botline separately!
  */
     void
 changed_cline_bef_curs(void)
 {
-    curwin->w_valid &= ~(VALID_WROW|VALID_WCOL|VALID_VIRTCOL
+    curwin->w_valid &= ~(VALID_WROW|VALID_WCOL|VALID_VIRTCOL|VALID_CROW
                                                |VALID_CHEIGHT|VALID_TOPLINE);
 }
 
     void
 changed_cline_bef_curs_win(win_T *wp)
 {
-    wp->w_valid &= ~(VALID_WROW|VALID_WCOL|VALID_VIRTCOL
+    wp->w_valid &= ~(VALID_WROW|VALID_WCOL|VALID_VIRTCOL|VALID_CROW
                                                |VALID_CHEIGHT|VALID_TOPLINE);
 }
 
index e481d843c249eec9679b572016a1d4168c167153..9a23be859280a1ca68e89c1a33b862d81134841b 100644 (file)
@@ -2098,6 +2098,7 @@ do_put(
                    {
                        // make sure curwin->w_virtcol is updated
                        changed_cline_bef_curs();
+                       invalidate_botline();
                        curwin->w_cursor.col += (colnr_T)(totlen - 1);
                    }
                    if (VIsual_active)
diff --git a/src/testdir/dumps/Test_put_in_last_displayed_line_1.dump b/src/testdir/dumps/Test_put_in_last_displayed_line_1.dump
new file mode 100644 (file)
index 0000000..3d094f5
--- /dev/null
@@ -0,0 +1,10 @@
+|2+0&#ffffff0| @73
+|3| @73
+|4| @73
+|5| @73
+|6| @73
+|7| @73
+|8| @73
+|9|x@73
+@73>x| 
+@57|1|0|,|1|4|9| @7|B|o|t| 
index 4b514bb7546550d7e71a90a34c533051f3b16e6f..72479ac7d4779e722b3768f68d8301c3c9399a40 100644 (file)
@@ -262,5 +262,23 @@ func Test_put_other_window()
   call StopVimInTerminal(buf)
 endfunc
 
+func Test_put_in_last_displayed_line()
+  CheckRunVimInTerminal
+
+  let lines =<< trim END
+      vim9script
+      autocmd CursorMoved * eval line('w$')
+      @a = 'x'->repeat(&columns * 2 - 2)
+      range(&lines)->setline(1)
+      feedkeys('G"ap')
+  END
+  call writefile(lines, 'Xtest_put_last_line', 'D')
+  let buf = RunVimInTerminal('-S Xtest_put_last_line', #{rows: 10})
+
+  call VerifyScreenDump(buf, 'Test_put_in_last_displayed_line_1', {})
+
+  call StopVimInTerminal(buf)
+endfunc
+
 
 " vim: shiftwidth=2 sts=2 expandtab
index 132a0d96f9f8989bd050f7a3814b5ef238d9a04b..11b962d7e07a1a3406b3d6af36680f64eb40758c 100644 (file)
@@ -695,6 +695,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    1597,
 /**/
     1596,
 /**/