To: vim_dev@googlegroups.com Subject: Patch 9.0.0297 Fcc: outbox From: Bram Moolenaar Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ------------ Patch 9.0.0297 Problem: Cursor position wrong after right aligned virtual text. (Iizuka Masashi) Solution: Take the width of the column offset into account. (closes #10997) Also fix virtual text positioning. Files: src/charset.c, src/drawline.c, src/testdir/test_textprop.vim, src/testdir/dumps/Test_prop_right_align_twice_3.dump *** ../vim-9.0.0296/src/charset.c 2022-08-23 18:39:14.756797669 +0100 --- src/charset.c 2022-08-28 16:24:46.327837824 +0100 *************** *** 1187,1193 **** for (i = 0; i < cts->cts_text_prop_count; ++i) { ! textprop_T *tp = cts->cts_text_props + i; // Watch out for the text being deleted. "cts_text_props" is a // copy, the text prop may actually have been removed from the line. --- 1187,1194 ---- for (i = 0; i < cts->cts_text_prop_count; ++i) { ! textprop_T *tp = cts->cts_text_props + i; ! int col_off = win_col_off(wp); // Watch out for the text being deleted. "cts_text_props" is a // copy, the text prop may actually have been removed from the line. *************** *** 1209,1215 **** int n_extra = (int)STRLEN(p); cells = text_prop_position(wp, tp, ! (vcol + size) % wp->w_width, &n_extra, &p, NULL, NULL); #ifdef FEAT_LINEBREAK no_sbr = TRUE; // don't use 'showbreak' now --- 1210,1216 ---- int n_extra = (int)STRLEN(p); cells = text_prop_position(wp, tp, ! (vcol + size) % (wp->w_width - col_off) + col_off, &n_extra, &p, NULL, NULL); #ifdef FEAT_LINEBREAK no_sbr = TRUE; // don't use 'showbreak' now *** ../vim-9.0.0296/src/drawline.c 2022-08-23 18:39:14.756797669 +0100 --- src/drawline.c 2022-08-28 16:35:47.088573767 +0100 *************** *** 302,307 **** --- 302,308 ---- int padding = tp->tp_col == MAXCOL && tp->tp_len > 1 ? tp->tp_len - 1 : 0; int col_with_padding = vcol + (below ? 0 : padding); + int col_off = 0; int room = wp->w_width - col_with_padding; int added = room; int n_used = *n_extra; *************** *** 324,330 **** if (right && (wrap || room < PROP_TEXT_MIN_CELLS)) { // right-align on next line instead of wrapping if possible ! added = wp->w_width - strsize + room; if (added < 0) added = 0; else --- 325,332 ---- if (right && (wrap || room < PROP_TEXT_MIN_CELLS)) { // right-align on next line instead of wrapping if possible ! col_off = win_col_off(wp) + win_col_off2(wp); ! added = wp->w_width - col_off - strsize + room; if (added < 0) added = 0; else *************** *** 386,392 **** *p_extra = l; *n_extra = n_used + added + padding; *n_attr = mb_charlen(*p_extra); ! *n_attr_skip = added + padding; } } } --- 388,394 ---- *p_extra = l; *n_extra = n_used + added + padding; *n_attr = mb_charlen(*p_extra); ! *n_attr_skip = added + padding + col_off; } } } *** ../vim-9.0.0296/src/testdir/test_textprop.vim 2022-08-24 12:24:04.295387720 +0100 --- src/testdir/test_textprop.vim 2022-08-28 16:30:41.288362320 +0100 *************** *** 2574,2584 **** let lines =<< trim END call setline(1, ["some text some text some text some text", 'line two']) ! call prop_type_add( 'MyErrorText', #{ highlight: 'ErrorMsg' } ) ! call prop_type_add( 'MyPadding', #{ highlight: 'DiffChange' } ) ! call prop_add( 1, 0, #{ type: 'MyPadding', text: ' nothing here', text_wrap: 'wrap'} ) ! call prop_add( 1, 0, #{ type: 'MyErrorText', text: 'Some error', text_wrap: 'wrap', text_align: 'right' } ) ! call prop_add( 1, 0, #{ type: 'MyErrorText', text: 'Another error', text_wrap: 'wrap', text_align: 'right' } ) normal G$ END call writefile(lines, 'XscriptPropsRightAlign') --- 2574,2584 ---- let lines =<< trim END call setline(1, ["some text some text some text some text", 'line two']) ! call prop_type_add('MyErrorText', #{ highlight: 'ErrorMsg'}) ! call prop_type_add('MyPadding', #{ highlight: 'DiffChange'}) ! call prop_add(1, 0, #{type: 'MyPadding', text: ' nothing here', text_wrap: 'wrap'}) ! call prop_add(1, 0, #{type: 'MyErrorText', text: 'Some error', text_wrap: 'wrap', text_align: 'right'}) ! call prop_add(1, 0, #{type: 'MyErrorText', text: 'Another error', text_wrap: 'wrap', text_align: 'right'}) normal G$ END call writefile(lines, 'XscriptPropsRightAlign') *************** *** 2588,2593 **** --- 2588,2596 ---- call term_sendkeys(buf, "ggisome more text\G$") call VerifyScreenDump(buf, 'Test_prop_right_align_twice_2', {}) + call term_sendkeys(buf, ":set signcolumn=yes\") + call VerifyScreenDump(buf, 'Test_prop_right_align_twice_3', {}) + call StopVimInTerminal(buf) call delete('XscriptPropsRightAlign') endfunc *** ../vim-9.0.0296/src/testdir/dumps/Test_prop_right_align_twice_3.dump 2022-08-28 16:38:27.816633507 +0100 --- src/testdir/dumps/Test_prop_right_align_twice_3.dump 2022-08-28 16:35:55.804577736 +0100 *************** *** 0 **** --- 1,8 ---- + | +0#0000e05#a8a8a8255@1|s+0#0000000#ffffff0|o|m|e| |m|o|r|e| |t|e|x|t|s|o|m|e| |t|e|x|t| |s|o|m|e| |t|e|x|t| |s|o|m|e| |t|e|x|t| |s|o|m|e| |t|e|x|t| +0&#ffd7ff255|n|o|t|h|i|n|g| |h|e|r|e| +0&#ffffff0@6 + | +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@62|S+0#ffffff16#e000002|o|m|e| |e|r@1|o|r + | +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@59|A+0#ffffff16#e000002|n|o|t|h|e|r| |e|r@1|o|r + | +0#0000e05#a8a8a8255@1|l+0#0000000#ffffff0|i|n|e| |t|w>o| @64 + |~+0#4040ff13&| @73 + |~| @73 + |~| @73 + | +0#0000000&@56|2|,|8| @10|A|l@1| *** ../vim-9.0.0296/src/version.c 2022-08-28 14:39:34.355253105 +0100 --- src/version.c 2022-08-28 16:36:54.488602136 +0100 *************** *** 709,710 **** --- 709,712 ---- { /* Add new patch number below this line */ + /**/ + 297, /**/ -- JOHN CLEESE PLAYED: SECOND SOLDIER WITH A KEEN INTEREST IN BIRDS, LARGE MAN WITH DEAD BODY, BLACK KNIGHT, MR NEWT (A VILLAGE BLACKSMITH INTERESTED IN BURNING WITCHES), A QUITE EXTRAORDINARILY RUDE FRENCHMAN, TIM THE WIZARD, SIR LAUNCELOT "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 ///