]> granicus.if.org Git - vim/commitdiff
patch 9.0.0482: "g0" moves to wrong location with virtual text "above" v9.0.0482
authorBram Moolenaar <Bram@vim.org>
Fri, 16 Sep 2022 19:51:14 +0000 (20:51 +0100)
committerBram Moolenaar <Bram@vim.org>
Fri, 16 Sep 2022 19:51:14 +0000 (20:51 +0100)
Problem:    "g0" moves to wrong location with virtual text "above".
Solution:   Compensate for the extra columns. (closes #11141)  Also fix "g$"

src/move.c
src/normal.c
src/proto/move.pro
src/testdir/dumps/Test_prop_with_text_above_1a.dump [new file with mode: 0644]
src/testdir/dumps/Test_prop_with_text_above_1b.dump [new file with mode: 0644]
src/testdir/test_textprop.vim
src/version.c

index 4b823ba574f29d15a8a726a808d6dba93e2e477e..2ef7a9ce36783eba9ac89f0dd30a4dbbf0be7cd4 100644 (file)
@@ -470,19 +470,29 @@ check_top_offset(void)
     return FALSE;
 }
 
+/*
+ * Update w_curswant.
+ */
     void
-update_curswant(void)
+update_curswant_force(void)
 {
-    if (curwin->w_set_curswant)
-    {
-       validate_virtcol();
-       curwin->w_curswant = curwin->w_virtcol
+    validate_virtcol();
+    curwin->w_curswant = curwin->w_virtcol
 #ifdef FEAT_PROP_POPUP
-                               - curwin->w_virtcol_first_char
+       - curwin->w_virtcol_first_char
 #endif
-                               ;
-       curwin->w_set_curswant = FALSE;
-    }
+       ;
+    curwin->w_set_curswant = FALSE;
+}
+
+/*
+ * Update w_curswant if w_set_curswant is set.
+ */
+    void
+update_curswant(void)
+{
+    if (curwin->w_set_curswant)
+       update_curswant_force();
 }
 
 /*
index 8351685d1d4ef7393f999c8c7bbadc140be93880..35f7610c310c6ad2a68ebf413e052b7c54fc9ef8 100644 (file)
@@ -5491,9 +5491,8 @@ nv_visual(cmdarg_T *cap)
            {
                if (resel_VIsual_line_count <= 1)
                {
-                   validate_virtcol();
-                   curwin->w_curswant = curwin->w_virtcol
-                                       + resel_VIsual_vcol * cap->count0 - 1;
+                   update_curswant_force();
+                   curwin->w_curswant += resel_VIsual_vcol * cap->count0 - 1;
                }
                else
                    curwin->w_curswant = resel_VIsual_vcol;
@@ -5506,9 +5505,8 @@ nv_visual(cmdarg_T *cap)
            }
            else if (VIsual_mode == Ctrl_V)
            {
-               validate_virtcol();
-               curwin->w_curswant = curwin->w_virtcol
-                                       + resel_VIsual_vcol * cap->count0 - 1;
+               update_curswant_force();
+               curwin->w_curswant += + resel_VIsual_vcol * cap->count0 - 1;
                coladvance(curwin->w_curswant);
            }
            else
@@ -5735,13 +5733,19 @@ nv_g_home_m_cmd(cmdarg_T *cap)
     cap->oap->inclusive = FALSE;
     if (curwin->w_p_wrap && curwin->w_width != 0)
     {
-       int             width1 = curwin->w_width - curwin_col_off();
-       int             width2 = width1 + curwin_col_off2();
+       int     width1 = curwin->w_width - curwin_col_off();
+       int     width2 = width1 + curwin_col_off2();
+       int     virtcol;
 
        validate_virtcol();
+       virtcol = curwin->w_virtcol
+#ifdef FEAT_PROP_POPUP
+           - curwin->w_virtcol_first_char
+#endif
+           ;
        i = 0;
-       if (curwin->w_virtcol >= (colnr_T)width1 && width2 > 0)
-           i = (curwin->w_virtcol - width1) / width2 * width2 + width1;
+       if (virtcol >= (colnr_T)width1 && width2 > 0)
+           i = (virtcol - width1) / width2 * width2 + width1;
     }
     else
        i = curwin->w_leftcol;
@@ -5815,24 +5819,32 @@ nv_g_dollar_cmd(cmdarg_T *cap)
        {
            int         width1 = curwin->w_width - col_off;
            int         width2 = width1 + curwin_col_off2();
+           int         virtcol;
 
            validate_virtcol();
+           virtcol = curwin->w_virtcol
+#ifdef FEAT_PROP_POPUP
+               - curwin->w_virtcol_first_char
+#endif
+               ;
            i = width1 - 1;
-           if (curwin->w_virtcol >= (colnr_T)width1)
-               i += ((curwin->w_virtcol - width1) / width2 + 1)
+           if (virtcol >= (colnr_T)width1)
+               i += ((virtcol - width1) / width2 + 1)
                    * width2;
            coladvance((colnr_T)i);
 
            // Make sure we stick in this column.
-           validate_virtcol();
-           curwin->w_curswant = curwin->w_virtcol;
-           curwin->w_set_curswant = FALSE;
+           update_curswant_force();
            if (curwin->w_cursor.col > 0 && curwin->w_p_wrap)
            {
                // Check for landing on a character that got split at
                // the end of the line.  We do not want to advance to
                // the next screen line.
-               if (curwin->w_virtcol > (colnr_T)i)
+               if (curwin->w_virtcol
+#ifdef FEAT_PROP_POPUP
+                       - curwin->w_virtcol_first_char
+#endif
+                                               > (colnr_T)i)
                    --curwin->w_cursor.col;
            }
        }
@@ -5860,9 +5872,7 @@ nv_g_dollar_cmd(cmdarg_T *cap)
        }
 
        // Make sure we stick in this column.
-       validate_virtcol();
-       curwin->w_curswant = curwin->w_virtcol;
-       curwin->w_set_curswant = FALSE;
+       update_curswant_force();
     }
 }
 
index f9787d6a6fefe1871ae3f48cf00fbbb3a8272b09..de8bf51e12cf2967a17808e03b5ab88fbd87fcc3 100644 (file)
@@ -2,6 +2,7 @@
 void redraw_for_cursorline(win_T *wp);
 void update_topline_redraw(void);
 void update_topline(void);
+void update_curswant_force(void);
 void update_curswant(void);
 void check_cursor_moved(win_T *wp);
 void changed_window_setting(void);
diff --git a/src/testdir/dumps/Test_prop_with_text_above_1a.dump b/src/testdir/dumps/Test_prop_with_text_above_1a.dump
new file mode 100644 (file)
index 0000000..c56d88f
--- /dev/null
@@ -0,0 +1,9 @@
+|f+0&#ffff4012|i|r|s|t| |t|h|i|n|g| |a|b|o|v|e| @42
+|s+0&#ffd7ff255|e|c|o|n|d| |t|h|i|n|g| |a|b|o|v|e| @41
+|o+0&#ffffff0|n|e| |t|w>o| @52
+|t|h|r|e@1| |f|o|u|r| @49
+@3|a+0&#ffff4012|n|o|t|h|e|r| |t|h|i|n|g| @43
+|f+0&#ffffff0|i|v|e| |s|i|x| @51
+|~+0#4040ff13&| @58
+|~| @58
+| +0#0000000&@41|1|,|7|-|1|2|7| @6|A|l@1| 
diff --git a/src/testdir/dumps/Test_prop_with_text_above_1b.dump b/src/testdir/dumps/Test_prop_with_text_above_1b.dump
new file mode 100644 (file)
index 0000000..d2d9c7b
--- /dev/null
@@ -0,0 +1,9 @@
+|f+0&#ffff4012|i|r|s|t| |t|h|i|n|g| |a|b|o|v|e| @42
+|s+0&#ffd7ff255|e|c|o|n|d| |t|h|i|n|g| |a|b|o|v|e| @41
+>o+0&#ffffff0|n|e| |t|w|o| @52
+|t|h|r|e@1| |f|o|u|r| @49
+@3|a+0&#ffff4012|n|o|t|h|e|r| |t|h|i|n|g| @43
+|f+0&#ffffff0|i|v|e| |s|i|x| @51
+|~+0#4040ff13&| @58
+|~| @58
+| +0#0000000&@41|1|,|1|-|1|2|1| @6|A|l@1| 
index d45409ebc506a1375f8a415932be5d2fae8442ef..259ff9c3668c7ebc1ce84dabe7d7c60e282c0721 100644 (file)
@@ -2869,6 +2869,11 @@ func Test_props_with_text_above()
   let buf = RunVimInTerminal('-S XscriptPropsWithTextAbove', #{rows: 9, cols: 60})
   call VerifyScreenDump(buf, 'Test_prop_with_text_above_1', {})
 
+  call term_sendkeys(buf, "ggg$")
+  call VerifyScreenDump(buf, 'Test_prop_with_text_above_1a', {})
+  call term_sendkeys(buf, "g0")
+  call VerifyScreenDump(buf, 'Test_prop_with_text_above_1b', {})
+
   call term_sendkeys(buf, "ggI")
   call VerifyScreenDump(buf, 'Test_prop_with_text_above_2', {})
   call term_sendkeys(buf, "inserted \<Esc>")
index 8f6988b8388634ff8873f4f8997fb929befc45db..19f9e00ec97d28524edf66ff893458940385471e 100644 (file)
@@ -703,6 +703,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    482,
 /**/
     481,
 /**/