]> granicus.if.org Git - vim/commitdiff
patch 9.0.0168: cursor positioned wrong with two virtual text properties v9.0.0168
authorBram Moolenaar <Bram@vim.org>
Mon, 8 Aug 2022 10:07:47 +0000 (11:07 +0100)
committerBram Moolenaar <Bram@vim.org>
Mon, 8 Aug 2022 10:07:47 +0000 (11:07 +0100)
Problem:    Cursor positioned wrong with two virtual text properties close
            together. (Ben Jackson)
Solution:   Add the original size, not the computed one. (closes #10864)

src/charset.c
src/testdir/dumps/Test_prop_inserts_text_1.dump
src/testdir/dumps/Test_prop_inserts_text_2.dump
src/testdir/dumps/Test_prop_inserts_text_3.dump
src/testdir/dumps/Test_prop_inserts_text_4.dump
src/testdir/dumps/Test_prop_inserts_text_5.dump [new file with mode: 0644]
src/testdir/dumps/Test_prop_inserts_text_6.dump [new file with mode: 0644]
src/testdir/test_textprop.vim
src/version.c

index 27213e93a94d7e19a68f244d30d22d49b687fc0e..7a18a97d410694ca6e0d828df67bba74c1bea3d8 100644 (file)
@@ -1130,6 +1130,7 @@ win_lbr_chartabsize(
 # ifdef FEAT_PROP_POPUP
     if (cts->cts_has_prop_with_text && *line != NUL)
     {
+       int         normal_size = size;
        int         i;
        int         col = (int)(s - line);
        garray_T    *gap = &wp->w_buffer->b_textprop_text;
@@ -1141,7 +1142,8 @@ win_lbr_chartabsize(
            // Watch out for the text being deleted.  "cts_text_props" is a
            // copy, the text prop may actually have been removed from the line.
            if (tp->tp_id < 0
-                   && ((tp->tp_col - 1 >= col && tp->tp_col - 1 < col + size)
+                   && ((tp->tp_col - 1 >= col
+                                        && tp->tp_col - 1 < col + normal_size)
                       || (tp->tp_col == MAXCOL && (s[0] == NUL || s[1] == NUL)
                                                   && cts->cts_with_trailing))
                    && -tp->tp_id - 1 < gap->ga_len)
@@ -1152,7 +1154,6 @@ win_lbr_chartabsize(
                {
                    int cells = vim_strsize(p);
 
-                   added = wp->w_width - (vcol + size) % wp->w_width;
                    if (tp->tp_col == MAXCOL)
                    {
                        int below = (tp->tp_flags & TP_FLAG_ALIGN_BELOW);
@@ -1163,8 +1164,11 @@ win_lbr_chartabsize(
                        // Keep in sync with where textprop_size_after_trunc()
                        // is called in win_line().
                        if (!wrap)
+                       {
+                           added = wp->w_width - (vcol + size) % wp->w_width;
                            cells = textprop_size_after_trunc(wp,
                                                     below, added, p, &n_used);
+                       }
                        // right-aligned does not really matter here, same as
                        // "after"
                        if (below)
index 95e2d7a70fbf9cb17a4d3c1ef55aba452506e666..2cd71f6fe15a291b90a9975a5ad95df04706762c 100644 (file)
@@ -1,6 +1,8 @@
 |i+0&#ffffff0|n|s|e|r|t| |s|o|m|e| |t|e|x|t| |S+0#ffffff16#e000002|O|M|E| |h+0#0000000#ffffff0|e|r|e| |a|n|d| |o|t|h|e|r| |t|e|x|t| |O+0&#ffff4012|T|H|E|R| |t+0&#ffffff0|h|e|r|e| |a|n|d| |s|o
 |m|e| |m|o|r|e| |t|e|x|t| |a|f|t|e|r| |M+0&#5fd7ff255|O|R|E| |w+0&#ffffff0|r|a|p@1|i|n>g| @27
 |p|r|e|s+0&#e0e0e08|ö|m|e|和*&|平|t+&|é|x|t|p+0&#ffffff0|o|s|t| @40
+|F|o@1| |f|o@1| |=| |{| |.+0#0000e05&|x|=|1+0#0000000&|,| |.+0#0000e05&|y|=|2+0#0000000&| |}|;| @34
 |e+0#ffffff16#e000002|m|p|t|y| |l|i|n|e| +0#0000000#ffffff0@49
 |~+0#4040ff13&| @58
+|~| @58
 | +0#0000000&@41|1|,|7|6|-|9|2| @6|A|l@1| 
index d61bf1b5b9037e44d32e2550bf91440f3892f5ff..095e232d64fbeb4888ea2637a0a9e22a16798846 100644 (file)
@@ -1,6 +1,8 @@
 | +0#0000e05#a8a8a8255@1|i+0#0000000#ffffff0|n|s|e|r|t| |s|o|m|e| |t|e|x|t| |S+0#ffffff16#e000002|O|M|E| |h+0#0000000#ffffff0|e|r|e| |a|n|d| |o|t|h|e|r| |t|e|x|t| |O+0&#ffff4012|T|H|E|R| |t+0&#ffffff0|h|e|r|e| |a|n|d| 
 | +0#0000e05#a8a8a8255@1|s+0#0000000#ffffff0|o|m|e| |m|o|r|e| |t|e|x|t| |a|f|t|e|r| |M+0&#5fd7ff255|O|R|E| |w+0&#ffffff0|r|a|p@1|i|n>g| @23
 | +0#0000e05#a8a8a8255@1|p+0#0000000#ffffff0|r|e|s+0&#e0e0e08|ö|m|e|和*&|平|t+&|é|x|t|p+0&#ffffff0|o|s|t| @38
+| +0#0000e05#a8a8a8255@1|F+0#0000000#ffffff0|o@1| |f|o@1| |=| |{| |.+0#0000e05&|x|=|1+0#0000000&|,| |.+0#0000e05&|y|=|2+0#0000000&| |}|;| @32
 | +0#0000e05#a8a8a8255@1|e+0#ffffff16#e000002|m|p|t|y| |l|i|n|e| +0#0000000#ffffff0@47
 |~+0#4040ff13&| @58
+|~| @58
 | +0#0000000&@41|1|,|7|6|-|9|2| @6|A|l@1| 
index c7685d9a87e7dace74128c1ccbe59506373464e1..b438142cfecb2ca8a96d0c5df4458387faadb192 100644 (file)
@@ -1,6 +1,8 @@
 | +0#0000e05#a8a8a8255@1|i+0#0000000#ffffff0|n|s|e|r|t| |s|o|m|e| |t|e|x|t| |S+0#ffffff16#e000002|O|M|E| |h+0#0000000#ffffff0|e|r|e| |a|n|d| |o|t|h|e|r| |t|e|x|t| |O+0&#ffff4012|T|H|E|R| |t+0&#ffffff0|h|e|r|e| |a|n|d| 
 | +0#0000e05#a8a8a8255@1|s+0#0000000#ffffff0|o|m|e| |m|o|r|e| |t|e|x|t| |a|f|t|e|r| |M+0&#5fd7ff255|O|R|E| |w+0&#ffffff0|r|a|p@1|i|n|g| @23
 | +0#0000e05#a8a8a8255@1|p+0#0000000#ffffff0|r|e|s+0&#e0e0e08|ö|m|e|和*&|平|t+&|é|x|t|p+0&#ffffff0|o|s>t| @38
+| +0#0000e05#a8a8a8255@1|F+0#0000000#ffffff0|o@1| |f|o@1| |=| |{| |.+0#0000e05&|x|=|1+0#0000000&|,| |.+0#0000e05&|y|=|2+0#0000000&| |}|;| @32
 | +0#0000e05#a8a8a8255@1|e+0#ffffff16#e000002|m|p|t|y| |l|i|n|e| +0#0000000#ffffff0@47
 |~+0#4040ff13&| @58
+|~| @58
 | +0#0000000&@41|2|,|7|-|1|9| @7|A|l@1| 
index 6f94b85af822bf305d18e3c39f191d2f7c737d1b..8c3a022a082f9fab98633aed5500e20f33ca4024 100644 (file)
@@ -1,6 +1,8 @@
 | +0#0000e05#a8a8a8255@1|i+0#0000000#ffffff0|n|s|e|r|t| |s|o|m|e| |t|e|x|t| |S+0#ffffff16#e000002|O|M|E| |h+0#0000000#ffffff0|e|r|e| |a|n|d| |o|t|h|e|r| |t|e|x|t| |O+0&#ffff4012|T|H|E|R| |t+0&#ffffff0|h|e|r|e| |a|n|d| 
 | +0#0000e05#a8a8a8255@1|s+0#0000000#ffffff0|o|m|e| |m|o|r|e| |t|e|x|t| |a|f|t|e|r| |M+0&#5fd7ff255|O|R|E| |w+0&#ffffff0|r|a|p@1|i|n|g| @23
 | +0#0000e05#a8a8a8255@1|p+0#0000000#ffffff0|r|e|s+0&#e0e0e08|ö|m|e|和*&|平|t+&|é|x|t|p+0&#ffffff0|o|s|t| @38
-| +0#0000e05#a8a8a8255@1>e+0#ffffff16#e000002|m|p|t|y| |l|i|n|e| +0#0000000#ffffff0@47
+| +0#0000e05#a8a8a8255@1|F+0#0000000#ffffff0|o@1| |f|o@1| |=| |{| |.+0#0000e05&|x|=>1+0#0000000&|,| |.+0#0000e05&|y|=|2+0#0000000&| |}|;| @32
+| +0#0000e05#a8a8a8255@1|e+0#ffffff16#e000002|m|p|t|y| |l|i|n|e| +0#0000000#ffffff0@47
 |~+0#4040ff13&| @58
-| +0#0000000&@41|3|,|0|-|1| @8|A|l@1| 
+|~| @58
+| +0#0000000&@41|3|,|1|3|-|1|6| @6|A|l@1| 
diff --git a/src/testdir/dumps/Test_prop_inserts_text_5.dump b/src/testdir/dumps/Test_prop_inserts_text_5.dump
new file mode 100644 (file)
index 0000000..c7e1c57
--- /dev/null
@@ -0,0 +1,8 @@
+| +0#0000e05#a8a8a8255@1|i+0#0000000#ffffff0|n|s|e|r|t| |s|o|m|e| |t|e|x|t| |S+0#ffffff16#e000002|O|M|E| |h+0#0000000#ffffff0|e|r|e| |a|n|d| |o|t|h|e|r| |t|e|x|t| |O+0&#ffff4012|T|H|E|R| |t+0&#ffffff0|h|e|r|e| |a|n|d| 
+| +0#0000e05#a8a8a8255@1|s+0#0000000#ffffff0|o|m|e| |m|o|r|e| |t|e|x|t| |a|f|t|e|r| |M+0&#5fd7ff255|O|R|E| |w+0&#ffffff0|r|a|p@1|i|n|g| @23
+| +0#0000e05#a8a8a8255@1|p+0#0000000#ffffff0|r|e|s+0&#e0e0e08|ö|m|e|和*&|平|t+&|é|x|t|p+0&#ffffff0|o|s|t| @38
+| +0#0000e05#a8a8a8255@1|F+0#0000000#ffffff0|o@1| |f|o@1| |=| |{| |.+0#0000e05&|x|=|1+0#0000000&|,| |.+0#0000e05&|y|=>2+0#0000000&| |}|;| @32
+| +0#0000e05#a8a8a8255@1|e+0#ffffff16#e000002|m|p|t|y| |l|i|n|e| +0#0000000#ffffff0@47
+|~+0#4040ff13&| @58
+|~| @58
+| +0#0000000&@41|3|,|1|6|-|2@1| @6|A|l@1| 
diff --git a/src/testdir/dumps/Test_prop_inserts_text_6.dump b/src/testdir/dumps/Test_prop_inserts_text_6.dump
new file mode 100644 (file)
index 0000000..acef485
--- /dev/null
@@ -0,0 +1,8 @@
+| +0#0000e05#a8a8a8255@1|i+0#0000000#ffffff0|n|s|e|r|t| |s|o|m|e| |t|e|x|t| |S+0#ffffff16#e000002|O|M|E| |h+0#0000000#ffffff0|e|r|e| |a|n|d| |o|t|h|e|r| |t|e|x|t| |O+0&#ffff4012|T|H|E|R| |t+0&#ffffff0|h|e|r|e| |a|n|d| 
+| +0#0000e05#a8a8a8255@1|s+0#0000000#ffffff0|o|m|e| |m|o|r|e| |t|e|x|t| |a|f|t|e|r| |M+0&#5fd7ff255|O|R|E| |w+0&#ffffff0|r|a|p@1|i|n|g| @23
+| +0#0000e05#a8a8a8255@1|p+0#0000000#ffffff0|r|e|s+0&#e0e0e08|ö|m|e|和*&|平|t+&|é|x|t|p+0&#ffffff0|o|s|t| @38
+| +0#0000e05#a8a8a8255@1|F+0#0000000#ffffff0|o@1| |f|o@1| |=| |{| |.+0#0000e05&|x|=|1+0#0000000&|,| |.+0#0000e05&|y|=|2+0#0000000&| |}|;| @32
+| +0#0000e05#a8a8a8255@1>e+0#ffffff16#e000002|m|p|t|y| |l|i|n|e| +0#0000000#ffffff0@47
+|~+0#4040ff13&| @58
+|~| @58
+| +0#0000000&@41|4|,|0|-|1| @8|A|l@1| 
index 61e8598278c15bf03acdb62ea4c5648db576e1e1..5ff87b4f10762e91950516f0944c1eeb4fd63cc7 100644 (file)
@@ -2317,11 +2317,16 @@ func Test_prop_inserts_text()
       call prop_type_add('multibyte', #{highlight: 'Visual'})
       call prop_add(2, 4, #{type: 'multibyte', text: 'söme和平téxt'})
 
-      call setline(3, '')
-      call prop_add(3, 1, #{type: 'someprop', text: 'empty line'})
+      call setline(3, 'Foo foo = { 1, 2 };')
+      call prop_type_add( 'testprop', #{highlight: 'Comment'})
+      call prop_add(3, 13, #{type: 'testprop', text: '.x='})
+      call prop_add(3, 16, #{type: 'testprop', text: '.y='})
+
+      call setline(4, '')
+      call prop_add(4, 1, #{type: 'someprop', text: 'empty line'})
   END
   call writefile(lines, 'XscriptPropsWithText')
-  let buf = RunVimInTerminal('-S XscriptPropsWithText', #{rows: 6, cols: 60})
+  let buf = RunVimInTerminal('-S XscriptPropsWithText', #{rows: 8, cols: 60})
   call VerifyScreenDump(buf, 'Test_prop_inserts_text_1', {})
 
   call term_sendkeys(buf, ":set signcolumn=yes\<CR>")
@@ -2330,8 +2335,13 @@ func Test_prop_inserts_text()
   call term_sendkeys(buf, "2G$")
   call VerifyScreenDump(buf, 'Test_prop_inserts_text_3', {})
 
-  call term_sendkeys(buf, "3G")
+  call term_sendkeys(buf, "3Gf1")
   call VerifyScreenDump(buf, 'Test_prop_inserts_text_4', {})
+  call term_sendkeys(buf, "f2")
+  call VerifyScreenDump(buf, 'Test_prop_inserts_text_5', {})
+
+  call term_sendkeys(buf, "4G")
+  call VerifyScreenDump(buf, 'Test_prop_inserts_text_6', {})
 
   call StopVimInTerminal(buf)
   call delete('XscriptPropsWithText')
index 4bab4a58dc02773007080f98c963ede1dd3c8185..2f34ffe2c2f7669097abd8a5583b2539601dce65 100644 (file)
@@ -735,6 +735,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    168,
 /**/
     167,
 /**/