# HG changeset patch # User Bram Moolenaar # Date 1660416303 -7200 # Node ID bf965640744dc590408600f238047d5b08c91c7e # Parent d5b0ffaa08f44049bfc56bbb1940fd19ab97b8a7 patch 9.0.0200: cursor wrong if 'nowrap' and two right aligned text props Commit: https://github.com/vim/vim/commit/8f369fb1ab7debeeda0fec69c379c528d162d9c5 Author: Bram Moolenaar Date: Sat Aug 13 19:35:05 2022 +0100 patch 9.0.0200: cursor wrong if 'nowrap' and two right aligned text props Problem: cursor in a wrong positoin if 'wrap' is off and using two right aligned text props in one line. Solution: Count an extra line for a right aligned text property after a below or right aligned text property. (issue #10909) diff --git a/src/testdir/dumps/Test_prop_with_text_after_nowrap_1.dump b/src/testdir/dumps/Test_prop_with_text_after_nowrap_1.dump --- a/src/testdir/dumps/Test_prop_with_text_after_nowrap_1.dump +++ b/src/testdir/dumps/Test_prop_with_text_after_nowrap_1.dump @@ -3,7 +3,9 @@ |t|w|o| @56 |a+0&#ffff4012|n|o|t|h|e|r| +0&#ffffff0@52 |O+0#ffffff16#e000002|n|e| |M|o|r|e| |H|e|r|e| +0#0000000#ffffff0@46 -|t|h|r|e>e| @54 +|t|h|r|e>e| @41|r+0&#ffff4012|i|g|h|t| |a|l|i|g|n|e|d +| +0&#ffffff0@41|a+0&#ffff4012|l|s|o| |r|i|g|h|t| |a|l|i|g|n|e|d +|f+0&#ffffff0|o|u|r| @55 |~+0#4040ff13&| @58 |~| @58 |~| @58 diff --git a/src/testdir/dumps/Test_prop_with_text_after_nowrap_2.dump b/src/testdir/dumps/Test_prop_with_text_after_nowrap_2.dump --- a/src/testdir/dumps/Test_prop_with_text_after_nowrap_2.dump +++ b/src/testdir/dumps/Test_prop_with_text_after_nowrap_2.dump @@ -3,7 +3,9 @@ | +0#0000e05#a8a8a8255@4|t+0#0000000#ffffff0|w|o| @51 | +0#0000e05#a8a8a8255@4|a+0#0000000#ffff4012|n|o|t|h|e|r| +0&#ffffff0@47 | +0#0000e05#a8a8a8255@4|O+0#ffffff16#e000002|n|e| |M|o|r|e| |H|e|r|e| +0#0000000#ffffff0@41 -| +0#0000e05#a8a8a8255@4|t+0#0000000#ffffff0|h|r|e>e| @49 +| +0#0000e05#a8a8a8255@4|t+0#0000000#ffffff0|h|r|e>e| @36|r+0&#ffff4012|i|g|h|t| |a|l|i|g|n|e|d +| +0#0000e05#a8a8a8255@4| +0#0000000#ffffff0@36|a+0&#ffff4012|l|s|o| |r|i|g|h|t| |a|l|i|g|n|e|d +| +0#0000e05#a8a8a8255@4|f+0#0000000#ffffff0|o|u|r| @50 |~+0#4040ff13&| @58 |~| @58 |~| @58 diff --git a/src/testdir/dumps/Test_prop_with_text_after_nowrap_3.dump b/src/testdir/dumps/Test_prop_with_text_after_nowrap_3.dump new file mode 100644 --- /dev/null +++ b/src/testdir/dumps/Test_prop_with_text_after_nowrap_3.dump @@ -0,0 +1,12 @@ +| +0#0000e05#a8a8a8255@4|o+0#0000000#ffffff0|n|e| +0&#ffd7ff255|A|f|t|e|r| |t|h|e| |t|e|x|t| +0&#ffffff0@26|r+0&#ffd7ff255|i|g|h|t| |h|e|r|e +| +0#0000e05#a8a8a8255@4| +0#ffffff16#e000002|B|e|l|o|w| |t|h|e| |l|i|n|e| | +0#0000000#ffffff0@38 +| +0#0000e05#a8a8a8255@4|t+0#0000000#ffffff0|w|o| @51 +| +0#0000e05#a8a8a8255@4|a+0#0000000#ffff4012|n|o|t|h|e|r| +0&#ffffff0@47 +| +0#0000e05#a8a8a8255@4|O+0#ffffff16#e000002|n|e| |M|o|r|e| |H|e|r|e| +0#0000000#ffffff0@41 +| +0#0000e05#a8a8a8255@4|t+0#0000000#ffffff0|h|r|e@1| @36|r+0&#ffff4012|i|g|h|t| |a|l|i|g|n|e|d +| +0#0000e05#a8a8a8255@4| +0#0000000#ffffff0@36|a+0&#ffff4012|l|s|o| |r|i|g|h|t| |a|l|i|g|n|e|d +| +0#0000e05#a8a8a8255@4|f+0#0000000#ffffff0|o|u>r| @50 +|~+0#4040ff13&| @58 +|~| @58 +|~| @58 +| +0#0000000&@41|4|,|4| @10|A|l@1| diff --git a/src/testdir/test_textprop.vim b/src/testdir/test_textprop.vim --- a/src/testdir/test_textprop.vim +++ b/src/testdir/test_textprop.vim @@ -2743,7 +2743,7 @@ func Test_props_with_text_after_nowrap() let lines =<< trim END set nowrap - call setline(1, ['one', 'two', 'three']) + call setline(1, ['one', 'two', 'three', 'four']) call prop_type_add('belowprop', #{highlight: 'ErrorMsg'}) call prop_type_add('anotherprop', #{highlight: 'Search'}) call prop_type_add('someprop', #{highlight: 'DiffChange'}) @@ -2752,15 +2752,21 @@ func Test_props_with_text_after_nowrap() call prop_add(2, 0, #{type: 'belowprop', text: 'One More Here', text_align: 'below'}) call prop_add(1, 0, #{type: 'someprop', text: 'right here', text_align: 'right'}) call prop_add(1, 0, #{type: 'someprop', text: ' After the text', text_align: 'after'}) - normal G$ + normal 3G$ + + call prop_add(3, 0, #{type: 'anotherprop', text: 'right aligned', text_align: 'right'}) + call prop_add(3, 0, #{type: 'anotherprop', text: 'also right aligned', text_align: 'right'}) END call writefile(lines, 'XscriptPropsAfterNowrap') - let buf = RunVimInTerminal('-S XscriptPropsAfterNowrap', #{rows: 10, cols: 60}) + let buf = RunVimInTerminal('-S XscriptPropsAfterNowrap', #{rows: 12, cols: 60}) call VerifyScreenDump(buf, 'Test_prop_with_text_after_nowrap_1', {}) call term_sendkeys(buf, ":set signcolumn=yes foldcolumn=3\") call VerifyScreenDump(buf, 'Test_prop_with_text_after_nowrap_2', {}) + call term_sendkeys(buf, "j") + call VerifyScreenDump(buf, 'Test_prop_with_text_after_nowrap_3', {}) + call StopVimInTerminal(buf) call delete('XscriptPropsAfterNowrap') endfunc diff --git a/src/textprop.c b/src/textprop.c --- a/src/textprop.c +++ b/src/textprop.c @@ -590,6 +590,8 @@ get_text_props(buf_T *buf, linenr_T lnum /* * Return the number of text properties with "below" alignment in line "lnum". + * A "right" aligned property also goes below after a "below" or other "right" + * aligned property. */ int prop_count_below(buf_T *buf, linenr_T lnum) @@ -599,14 +601,25 @@ prop_count_below(buf_T *buf, linenr_T ln int result = 0; textprop_T prop; int i; + int next_right_goes_below = FALSE; if (count == 0) return 0; for (i = 0; i < count; ++i) { mch_memmove(&prop, props + i * sizeof(prop), sizeof(prop)); - if (prop.tp_col == MAXCOL && (prop.tp_flags & TP_FLAG_ALIGN_BELOW)) - ++result; + if (prop.tp_col == MAXCOL) + { + if ((prop.tp_flags & TP_FLAG_ALIGN_BELOW) + || (next_right_goes_below + && (prop.tp_flags & TP_FLAG_ALIGN_RIGHT))) + { + next_right_goes_below = TRUE; + ++result; + } + else if (prop.tp_flags & TP_FLAG_ALIGN_RIGHT) + next_right_goes_below = TRUE; + } } return result; } diff --git a/src/version.c b/src/version.c --- a/src/version.c +++ b/src/version.c @@ -736,6 +736,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 200, +/**/ 199, /**/ 198,