# HG changeset patch # User Bram Moolenaar # Date 1669582803 -3600 # Node ID 6ebd92646276a008395227d318fcc565e79ced5d # Parent 4dd9809b5c9cac602f6dc9a3f9c7dc55abfe1479 patch 9.0.0962: virtual text below cannot be placed below empty lines Commit: https://github.com/vim/vim/commit/38854b565acba39eff36cf3c6396c911bf072bdc Author: porygonisaduck Date: Sun Nov 27 20:55:05 2022 +0000 patch 9.0.0962: virtual text below cannot be placed below empty lines Problem: Virtual text below cannot be placed below empty lines. Solution: Add one character. (James Alvarado, closes https://github.com/vim/vim/issues/11606, closes https://github.com/vim/vim/issues/11520) diff --git a/src/drawline.c b/src/drawline.c --- a/src/drawline.c +++ b/src/drawline.c @@ -621,7 +621,7 @@ textprop_size_after_trunc( text_prop_position( win_T *wp, textprop_T *tp, - int vcol UNUSED, // current text column + int vcol, // current text column int scr_col, // current screen column int *n_extra, // nr of bytes for virtual text char_u **p_extra, // virtual text @@ -633,7 +633,7 @@ text_prop_position( int below = (tp->tp_flags & TP_FLAG_ALIGN_BELOW); int wrap = (tp->tp_flags & TP_FLAG_WRAP); int padding = tp->tp_col == MAXCOL && tp->tp_len > 1 - ? tp->tp_len - 1 : 0; + ? tp->tp_len - 1 : 0; int col_with_padding = scr_col + (below ? 0 : padding); int room = wp->w_width - col_with_padding; int before = room; // spaces before the text @@ -661,11 +661,16 @@ text_prop_position( // Right-align: fill with before if (right) before -= cells; + + // Below-align: empty line add one character + if (below && vcol == 0 && col_with_padding == 0 + && wp->w_width == before) + col_with_padding = 1; + if (before < 0 || !(right || below) - || (below - ? (col_with_padding <= col_off || !wp->w_p_wrap) - : (n_used < *n_extra))) + || (below ? (col_with_padding <= col_off || !wp->w_p_wrap) + : (n_used < *n_extra))) { if (right && (wrap || (room < PROP_TEXT_MIN_CELLS && wp->w_p_wrap))) diff --git a/src/testdir/dumps/Test_prop_below_after_empty_1.dump b/src/testdir/dumps/Test_prop_below_after_empty_1.dump new file mode 100644 --- /dev/null +++ b/src/testdir/dumps/Test_prop_below_after_empty_1.dump @@ -0,0 +1,8 @@ +>v+0&#ffffff0|i|m|9|s|c|r|i|p|t| @49 +@60 +@1|T+0#ffffff16#e000002|h|e| |q|u|i|c|k| |b|r|o|w|n| |f|o|x| |j|u|m|p|s| |o|v|e|r| |t|h|e| |l|a|z|y| |d|o|g| +0#0000000#ffffff0@15 +|t|h|r|e@1| @54 +@60 +|T+0&#ffd7ff255|h|e| |s|l|o|w| |f|o|x| |b|u|m|p|s| |i|n|t|o| |t|h|e| |l|a|z|y| |d|o|g| +0&#ffffff0@23 +|~+0#4040ff13&| @58 +| +0#0000000&@41|1|,|1| @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 @@ -2714,6 +2714,39 @@ func Test_props_with_text_after_below_tr call StopVimInTerminal(buf) endfunc +func Test_prop_with_text_below_after_empty() + CheckRunVimInTerminal + + let lines =<< trim END + vim9script + + setline(1, ['vim9script', '', 'three', '']) + + # Add text prop below empty line 2 with padding. + prop_type_add('test', {highlight: 'ErrorMsg'}) + prop_add(2, 0, { + type: 'test', + text: 'The quick brown fox jumps over the lazy dog', + text_align: 'below', + text_padding_left: 1, + }) + + # Add text prop below empty line 4 without padding. + prop_type_add('other', {highlight: 'DiffChange'}) + prop_add(4, 0, { + type: 'other', + text: 'The slow fox bumps into the lazy dog', + text_align: 'below', + text_padding_left: 0, + }) + END + call writefile(lines, 'XscriptPropBelowAfterEmpty', 'D') + let buf = RunVimInTerminal('-S XscriptPropBelowAfterEmpty', #{rows: 8, cols: 60}) + call VerifyScreenDump(buf, 'Test_prop_below_after_empty_1', {}) + + call StopVimInTerminal(buf) +endfunc + func Test_prop_with_text_below_after_match() CheckRunVimInTerminal diff --git a/src/version.c b/src/version.c --- a/src/version.c +++ b/src/version.c @@ -696,6 +696,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 962, +/**/ 961, /**/ 960,