To: vim_dev@googlegroups.com Subject: Patch 9.0.0178 Fcc: outbox From: Bram Moolenaar Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ------------ 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 -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ /// \\\ \\\ sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ /// \\\ help me help AIDS victims -- http://ICCF-Holland.org ///