Patch 9.0.0178
Problem:    Cursor position wrong with virtual text before Tab.
Solution:   Use the byte length, not the cell with, to compare the column.
            Correct tab size after text prop. (closes #10866)
Files:      src/charset.c, src/testdir/test_textprop.vim
            src/testdir/dumps/Test_prop_before_tab_01.dump,
            src/testdir/dumps/Test_prop_before_tab_02.dump,
            src/testdir/dumps/Test_prop_before_tab_03.dump,
            src/testdir/dumps/Test_prop_before_tab_04.dump,
            src/testdir/dumps/Test_prop_before_tab_05.dump,
            src/testdir/dumps/Test_prop_before_tab_06.dump,
            src/testdir/dumps/Test_prop_before_tab_07.dump,
            src/testdir/dumps/Test_prop_before_tab_08.dump,
            src/testdir/dumps/Test_prop_before_tab_09.dump,
            src/testdir/dumps/Test_prop_before_tab_10.dump


*** ../vim-9.0.0177/src/charset.c       2022-08-08 11:07:25.264222469 +0100
--- src/charset.c       2022-08-09 16:37:42.304299105 +0100
***************
*** 1130,1136 ****
  # 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;
--- 1130,1137 ----
  # ifdef FEAT_PROP_POPUP
      if (cts->cts_has_prop_with_text && *line != NUL)
      {
!       int         tab_size = size;
!       int         charlen = mb_ptr2len(s);
        int         i;
        int         col = (int)(s - line);
        garray_T    *gap = &wp->w_buffer->b_textprop_text;
***************
*** 1143,1149 ****
            // 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 + normal_size)
                       || (tp->tp_col == MAXCOL && (s[0] == NUL || s[1] == NUL)
                                                   && cts->cts_with_trailing))
                    && -tp->tp_id - 1 < gap->ga_len)
--- 1144,1150 ----
            // 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 + charlen)
                       || (tp->tp_col == MAXCOL && (s[0] == NUL || s[1] == NUL)
                                                   && cts->cts_with_trailing))
                    && -tp->tp_id - 1 < gap->ga_len)
***************
*** 1179,1184 ****
--- 1180,1192 ----
                    }
                    cts->cts_cur_text_width += cells;
                    size += cells;
+                   if (*s == TAB)
+                   {
+                       // tab size changes because of the inserted text
+                       size -= tab_size;
+                       tab_size = win_chartabsize(wp, s, vcol + size);
+                       size += tab_size;
+                   }
                }
            }
            if (tp->tp_col != MAXCOL && tp->tp_col - 1 > col)
***************
*** 1525,1535 ****
        *end = vcol + incr - 1;
      if (cursor != NULL)
      {
- #ifdef FEAT_PROP_POPUP
-       if ((State & MODE_INSERT) == 0)
-           // cursor is after inserted text
-           vcol += cts.cts_cur_text_width;
- #endif
        if (*ptr == TAB
                && (State & MODE_NORMAL)
                && !wp->w_p_list
--- 1533,1538 ----
***************
*** 1539,1545 ****
--- 1542,1555 ----
                )
            *cursor = vcol + incr - 1;      // cursor at end
        else
+       {
+ #ifdef FEAT_PROP_POPUP
+           if ((State & MODE_INSERT) == 0)
+               // cursor is after inserted text
+               vcol += cts.cts_cur_text_width;
+ #endif
            *cursor = vcol + head;          // cursor at start
+       }
      }
  }
  
*** ../vim-9.0.0177/src/testdir/test_textprop.vim       2022-08-08 
18:12:27.616094206 +0100
--- src/testdir/test_textprop.vim       2022-08-09 16:53:00.990615870 +0100
***************
*** 974,983 ****
--- 974,985 ----
    call assert_equal(1489, line2byte(400))
    bwipe!
  
+ call ch_logfile('logfile', 'w')
    " Add many lines so that the data block is split.
    " With and without props should give the same result.
    call Run_test_with_line2byte(0)
    call Run_test_with_line2byte(1)
+ call ch_logfile('', 'w')
  
    call prop_type_delete('comment')
  endfunc
***************
*** 1893,1898 ****
--- 1895,1940 ----
    call delete('XscriptPropAfterTab')
  endfunc
  
+ func Test_prop_before_tab()
+   CheckRunVimInTerminal
+ 
+   let lines =<< trim END
+       call setline(1, ["\tx"]->repeat(6))
+       call prop_type_add('test', #{highlight: 'Search'})
+       call prop_add(1, 1, #{type: 'test', text: '123'})
+       call prop_add(2, 1, #{type: 'test', text: '1234567'})
+       call prop_add(3, 1, #{type: 'test', text: '12345678'})
+       call prop_add(4, 1, #{type: 'test', text: '123456789'})
+       call prop_add(5, 2, #{type: 'test', text: 'ABC'})
+       call prop_add(6, 3, #{type: 'test', text: 'ABC'})
+       normal gg0
+   END
+   call writefile(lines, 'XscriptPropBeforeTab')
+   let buf = RunVimInTerminal('-S XscriptPropBeforeTab', #{rows: 8})
+   call VerifyScreenDump(buf, 'Test_prop_before_tab_01', {})
+   call term_sendkeys(buf, "$")
+   call VerifyScreenDump(buf, 'Test_prop_before_tab_02', {})
+   call term_sendkeys(buf, "j0")
+   call VerifyScreenDump(buf, 'Test_prop_before_tab_03', {})
+   call term_sendkeys(buf, "$")
+   call VerifyScreenDump(buf, 'Test_prop_before_tab_04', {})
+   call term_sendkeys(buf, "j0")
+   call VerifyScreenDump(buf, 'Test_prop_before_tab_05', {})
+   call term_sendkeys(buf, "$")
+   call VerifyScreenDump(buf, 'Test_prop_before_tab_06', {})
+   call term_sendkeys(buf, "j0")
+   call VerifyScreenDump(buf, 'Test_prop_before_tab_07', {})
+   call term_sendkeys(buf, "$")
+   call VerifyScreenDump(buf, 'Test_prop_before_tab_08', {})
+   call term_sendkeys(buf, "j")
+   call VerifyScreenDump(buf, 'Test_prop_before_tab_09', {})
+   call term_sendkeys(buf, "j")
+   call VerifyScreenDump(buf, 'Test_prop_before_tab_10', {})
+ 
+   call StopVimInTerminal(buf)
+   call delete('XscriptPropBeforeTab')
+ endfunc
+ 
  func Test_prop_after_linebreak()
    CheckRunVimInTerminal
  
*** ../vim-9.0.0177/src/testdir/dumps/Test_prop_before_tab_01.dump      
2022-08-09 16:54:24.321544235 +0100
--- src/testdir/dumps/Test_prop_before_tab_01.dump      2022-08-09 
16:53:17.378393417 +0100
***************
*** 0 ****
--- 1,8 ----
+ |1+0&#ffff4012|2|3| +0&#ffffff0@3> |x| @65
+ |1+0&#ffff4012|2|3|4|5|6|7| +0&#ffffff0|x| @65
+ |1+0&#ffff4012|2|3|4|5|6|7|8| +0&#ffffff0@7|x| @57
+ |1+0&#ffff4012|2|3|4|5|6|7|8|9| +0&#ffffff0@6|x| @57
+ @8|A+0&#ffff4012|B|C|x+0&#ffffff0| @62
+ @8|x|A+0&#ffff4012|B|C| +0&#ffffff0@62
+ |~+0#4040ff13&| @73
+ | +0#0000000&@56|1|,|1|-|8| @8|A|l@1| 
*** ../vim-9.0.0177/src/testdir/dumps/Test_prop_before_tab_02.dump      
2022-08-09 16:54:24.325544187 +0100
--- src/testdir/dumps/Test_prop_before_tab_02.dump      2022-08-09 
16:53:18.530378004 +0100
***************
*** 0 ****
--- 1,8 ----
+ |1+0&#ffff4012|2|3| +0&#ffffff0@4>x| @65
+ |1+0&#ffff4012|2|3|4|5|6|7| +0&#ffffff0|x| @65
+ |1+0&#ffff4012|2|3|4|5|6|7|8| +0&#ffffff0@7|x| @57
+ |1+0&#ffff4012|2|3|4|5|6|7|8|9| +0&#ffffff0@6|x| @57
+ @8|A+0&#ffff4012|B|C|x+0&#ffffff0| @62
+ @8|x|A+0&#ffff4012|B|C| +0&#ffffff0@62
+ |~+0#4040ff13&| @73
+ | +0#0000000&@56|1|,|2|-|9| @8|A|l@1| 
*** ../vim-9.0.0177/src/testdir/dumps/Test_prop_before_tab_03.dump      
2022-08-09 16:54:24.329544140 +0100
--- src/testdir/dumps/Test_prop_before_tab_03.dump      2022-08-09 
16:53:19.682362621 +0100
***************
*** 0 ****
--- 1,8 ----
+ |1+0&#ffff4012|2|3| +0&#ffffff0@4|x| @65
+ |1+0&#ffff4012|2|3|4|5|6|7> +0&#ffffff0|x| @65
+ |1+0&#ffff4012|2|3|4|5|6|7|8| +0&#ffffff0@7|x| @57
+ |1+0&#ffff4012|2|3|4|5|6|7|8|9| +0&#ffffff0@6|x| @57
+ @8|A+0&#ffff4012|B|C|x+0&#ffffff0| @62
+ @8|x|A+0&#ffff4012|B|C| +0&#ffffff0@62
+ |~+0#4040ff13&| @73
+ | +0#0000000&@56|2|,|1|-|8| @8|A|l@1| 
*** ../vim-9.0.0177/src/testdir/dumps/Test_prop_before_tab_04.dump      
2022-08-09 16:54:24.333544092 +0100
--- src/testdir/dumps/Test_prop_before_tab_04.dump      2022-08-09 
16:53:20.838347212 +0100
***************
*** 0 ****
--- 1,8 ----
+ |1+0&#ffff4012|2|3| +0&#ffffff0@4|x| @65
+ |1+0&#ffff4012|2|3|4|5|6|7| +0&#ffffff0>x| @65
+ |1+0&#ffff4012|2|3|4|5|6|7|8| +0&#ffffff0@7|x| @57
+ |1+0&#ffff4012|2|3|4|5|6|7|8|9| +0&#ffffff0@6|x| @57
+ @8|A+0&#ffff4012|B|C|x+0&#ffffff0| @62
+ @8|x|A+0&#ffff4012|B|C| +0&#ffffff0@62
+ |~+0#4040ff13&| @73
+ | +0#0000000&@56|2|,|2|-|9| @8|A|l@1| 
*** ../vim-9.0.0177/src/testdir/dumps/Test_prop_before_tab_05.dump      
2022-08-09 16:54:24.337544045 +0100
--- src/testdir/dumps/Test_prop_before_tab_05.dump      2022-08-09 
16:53:21.990331886 +0100
***************
*** 0 ****
--- 1,8 ----
+ |1+0&#ffff4012|2|3| +0&#ffffff0@4|x| @65
+ |1+0&#ffff4012|2|3|4|5|6|7| +0&#ffffff0|x| @65
+ |1+0&#ffff4012|2|3|4|5|6|7|8| +0&#ffffff0@6> |x| @57
+ |1+0&#ffff4012|2|3|4|5|6|7|8|9| +0&#ffffff0@6|x| @57
+ @8|A+0&#ffff4012|B|C|x+0&#ffffff0| @62
+ @8|x|A+0&#ffff4012|B|C| +0&#ffffff0@62
+ |~+0#4040ff13&| @73
+ | +0#0000000&@56|3|,|1|-|1|6| @7|A|l@1| 
*** ../vim-9.0.0177/src/testdir/dumps/Test_prop_before_tab_06.dump      
2022-08-09 16:54:24.341543995 +0100
--- src/testdir/dumps/Test_prop_before_tab_06.dump      2022-08-09 
16:53:23.146316538 +0100
***************
*** 0 ****
--- 1,8 ----
+ |1+0&#ffff4012|2|3| +0&#ffffff0@4|x| @65
+ |1+0&#ffff4012|2|3|4|5|6|7| +0&#ffffff0|x| @65
+ |1+0&#ffff4012|2|3|4|5|6|7|8| +0&#ffffff0@7>x| @57
+ |1+0&#ffff4012|2|3|4|5|6|7|8|9| +0&#ffffff0@6|x| @57
+ @8|A+0&#ffff4012|B|C|x+0&#ffffff0| @62
+ @8|x|A+0&#ffff4012|B|C| +0&#ffffff0@62
+ |~+0#4040ff13&| @73
+ | +0#0000000&@56|3|,|2|-|1|7| @7|A|l@1| 
*** ../vim-9.0.0177/src/testdir/dumps/Test_prop_before_tab_07.dump      
2022-08-09 16:54:24.345543947 +0100
--- src/testdir/dumps/Test_prop_before_tab_07.dump      2022-08-09 
16:53:24.298301273 +0100
***************
*** 0 ****
--- 1,8 ----
+ |1+0&#ffff4012|2|3| +0&#ffffff0@4|x| @65
+ |1+0&#ffff4012|2|3|4|5|6|7| +0&#ffffff0|x| @65
+ |1+0&#ffff4012|2|3|4|5|6|7|8| +0&#ffffff0@7|x| @57
+ |1+0&#ffff4012|2|3|4|5|6|7|8|9| +0&#ffffff0@5> |x| @57
+ @8|A+0&#ffff4012|B|C|x+0&#ffffff0| @62
+ @8|x|A+0&#ffff4012|B|C| +0&#ffffff0@62
+ |~+0#4040ff13&| @73
+ | +0#0000000&@56|4|,|1|-|1|6| @7|A|l@1| 
*** ../vim-9.0.0177/src/testdir/dumps/Test_prop_before_tab_08.dump      
2022-08-09 16:54:24.349543899 +0100
--- src/testdir/dumps/Test_prop_before_tab_08.dump      2022-08-09 
16:53:25.450286035 +0100
***************
*** 0 ****
--- 1,8 ----
+ |1+0&#ffff4012|2|3| +0&#ffffff0@4|x| @65
+ |1+0&#ffff4012|2|3|4|5|6|7| +0&#ffffff0|x| @65
+ |1+0&#ffff4012|2|3|4|5|6|7|8| +0&#ffffff0@7|x| @57
+ |1+0&#ffff4012|2|3|4|5|6|7|8|9| +0&#ffffff0@6>x| @57
+ @8|A+0&#ffff4012|B|C|x+0&#ffffff0| @62
+ @8|x|A+0&#ffff4012|B|C| +0&#ffffff0@62
+ |~+0#4040ff13&| @73
+ | +0#0000000&@56|4|,|2|-|1|7| @7|A|l@1| 
*** ../vim-9.0.0177/src/testdir/dumps/Test_prop_before_tab_09.dump      
2022-08-09 16:54:24.353543852 +0100
--- src/testdir/dumps/Test_prop_before_tab_09.dump      2022-08-09 
16:53:26.602270825 +0100
***************
*** 0 ****
--- 1,8 ----
+ |1+0&#ffff4012|2|3| +0&#ffffff0@4|x| @65
+ |1+0&#ffff4012|2|3|4|5|6|7| +0&#ffffff0|x| @65
+ |1+0&#ffff4012|2|3|4|5|6|7|8| +0&#ffffff0@7|x| @57
+ |1+0&#ffff4012|2|3|4|5|6|7|8|9| +0&#ffffff0@6|x| @57
+ @8|A+0&#ffff4012|B|C>x+0&#ffffff0| @62
+ @8|x|A+0&#ffff4012|B|C| +0&#ffffff0@62
+ |~+0#4040ff13&| @73
+ | +0#0000000&@56|5|,|2|-|1|2| @7|A|l@1| 
*** ../vim-9.0.0177/src/testdir/dumps/Test_prop_before_tab_10.dump      
2022-08-09 16:54:24.357543804 +0100
--- src/testdir/dumps/Test_prop_before_tab_10.dump      2022-08-09 
16:53:27.758255590 +0100
***************
*** 0 ****
--- 1,8 ----
+ |1+0&#ffff4012|2|3| +0&#ffffff0@4|x| @65
+ |1+0&#ffff4012|2|3|4|5|6|7| +0&#ffffff0|x| @65
+ |1+0&#ffff4012|2|3|4|5|6|7|8| +0&#ffffff0@7|x| @57
+ |1+0&#ffff4012|2|3|4|5|6|7|8|9| +0&#ffffff0@6|x| @57
+ @8|A+0&#ffff4012|B|C|x+0&#ffffff0| @62
+ @8>x|A+0&#ffff4012|B|C| +0&#ffffff0@62
+ |~+0#4040ff13&| @73
+ | +0#0000000&@56|6|,|2|-|9| @8|A|l@1| 
*** ../vim-9.0.0177/src/version.c       2022-08-09 14:19:36.879541842 +0100
--- src/version.c       2022-08-09 15:58:19.651961940 +0100
***************
*** 737,738 ****
--- 737,740 ----
  {   /* Add new patch number below this line */
+ /**/
+     178,
  /**/

-- 
ARTHUR: (as the MAN next to him is squashed by a sheep) Knights!  Run away!
   Midst echoing shouts of "run away" the KNIGHTS retreat to cover with the odd
   cow or goose hitting them still.  The KNIGHTS crouch down under cover.
                 "Monty Python and the Holy Grail" PYTHON (MONTY) PICTURES LTD

 /// Bram Moolenaar -- [email protected] -- http://www.Moolenaar.net   \\\
///                                                                      \\\
\\\        sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ ///
 \\\            help me help AIDS victims -- http://ICCF-Holland.org    ///

-- 
-- 
You received this message from the "vim_dev" maillist.
Do not top-post! Type your reply below the text you are replying to.
For more information, visit http://www.vim.org/maillist.php

--- 
You received this message because you are subscribed to the Google Groups 
"vim_dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/vim_dev/20220809155611.B1AF81C0EC3%40moolenaar.net.

Raspunde prin e-mail lui