forked from aniani/vim
patch 9.0.0210: 'list' mode does not work properly with virtual text
Problem: 'list' mode does not work properly with virtual text. Solution: Show the "$" at the right position. (closes #10913)
This commit is contained in:
parent
677a39fdf6
commit
c3a483fc3c
@ -1186,6 +1186,11 @@ win_lbr_chartabsize(
|
|||||||
int len = (int)STRLEN(p);
|
int len = (int)STRLEN(p);
|
||||||
int n_used = len;
|
int n_used = len;
|
||||||
|
|
||||||
|
// The "$" for 'list' mode will go between the EOL and
|
||||||
|
// the text prop, account for that.
|
||||||
|
if (wp->w_p_list && wp->w_lcs_chars.eol != NUL)
|
||||||
|
++vcol;
|
||||||
|
|
||||||
// Keep in sync with where textprop_size_after_trunc()
|
// Keep in sync with where textprop_size_after_trunc()
|
||||||
// is called in win_line().
|
// is called in win_line().
|
||||||
if (!wrap)
|
if (!wrap)
|
||||||
|
@ -1639,6 +1639,13 @@ win_line(
|
|||||||
& TP_FLAG_ALIGN_BELOW)))
|
& TP_FLAG_ALIGN_BELOW)))
|
||||||
: bcol >= text_props[text_prop_next].tp_col - 1))
|
: bcol >= text_props[text_prop_next].tp_col - 1))
|
||||||
{
|
{
|
||||||
|
if (text_props[text_prop_next].tp_col == MAXCOL
|
||||||
|
&& *ptr == NUL && wp->w_p_list && lcs_eol_one > 0)
|
||||||
|
{
|
||||||
|
// first display the '$' after the line
|
||||||
|
text_prop_follows = TRUE;
|
||||||
|
break;
|
||||||
|
}
|
||||||
if (text_props[text_prop_next].tp_col == MAXCOL
|
if (text_props[text_prop_next].tp_col == MAXCOL
|
||||||
|| bcol <= text_props[text_prop_next].tp_col - 1
|
|| bcol <= text_props[text_prop_next].tp_col - 1
|
||||||
+ text_props[text_prop_next].tp_len)
|
+ text_props[text_prop_next].tp_len)
|
||||||
@ -1755,6 +1762,16 @@ win_line(
|
|||||||
? wlv.col == 0 || !wp->w_p_wrap
|
? wlv.col == 0 || !wp->w_p_wrap
|
||||||
: n_used < wlv.n_extra))
|
: n_used < wlv.n_extra))
|
||||||
added = 0;
|
added = 0;
|
||||||
|
|
||||||
|
// With 'nowrap' add one to show the
|
||||||
|
// "extends" character if needed (it
|
||||||
|
// doesn't show it the text just fits).
|
||||||
|
if (!wp->w_p_wrap
|
||||||
|
&& n_used < wlv.n_extra
|
||||||
|
&& wp->w_lcs_chars.ext != NUL
|
||||||
|
&& wp->w_p_list)
|
||||||
|
++n_used;
|
||||||
|
|
||||||
// add 1 for NUL, 2 for when '…' is used
|
// add 1 for NUL, 2 for when '…' is used
|
||||||
l = alloc(n_used + added + 3);
|
l = alloc(n_used + added + 3);
|
||||||
if (l != NULL)
|
if (l != NULL)
|
||||||
@ -2728,16 +2745,10 @@ win_line(
|
|||||||
{
|
{
|
||||||
// In virtualedit, visual selections may extend
|
// In virtualedit, visual selections may extend
|
||||||
// beyond end of line.
|
// beyond end of line.
|
||||||
if (area_highlighting && virtual_active()
|
if (!(area_highlighting && virtual_active()
|
||||||
&& tocol != MAXCOL && wlv.vcol < tocol)
|
&& tocol != MAXCOL && wlv.vcol < tocol))
|
||||||
wlv.n_extra = 0;
|
|
||||||
else
|
|
||||||
{
|
|
||||||
wlv.p_extra = at_end_str;
|
wlv.p_extra = at_end_str;
|
||||||
wlv.n_extra = 1;
|
wlv.n_extra = 0;
|
||||||
wlv.c_extra = NUL;
|
|
||||||
wlv.c_final = NUL;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
if (wp->w_p_list && wp->w_lcs_chars.eol > 0)
|
if (wp->w_p_list && wp->w_lcs_chars.eol > 0)
|
||||||
c = wp->w_lcs_chars.eol;
|
c = wp->w_lcs_chars.eol;
|
||||||
@ -3218,8 +3229,8 @@ win_line(
|
|||||||
#endif
|
#endif
|
||||||
wlv.col == wp->w_width - 1)
|
wlv.col == wp->w_width - 1)
|
||||||
&& (*ptr != NUL
|
&& (*ptr != NUL
|
||||||
|| (wp->w_p_list && lcs_eol_one > 0)
|
|| lcs_eol_one > 0
|
||||||
|| (wlv.n_extra && (wlv.c_extra != NUL
|
|| (wlv.n_extra > 0 && (wlv.c_extra != NUL
|
||||||
|| *wlv.p_extra != NUL))))
|
|| *wlv.p_extra != NUL))))
|
||||||
{
|
{
|
||||||
c = wp->w_lcs_chars.ext;
|
c = wp->w_lcs_chars.ext;
|
||||||
|
8
src/testdir/dumps/Test_prop_insert_list_mode_1.dump
Normal file
8
src/testdir/dumps/Test_prop_insert_list_mode_1.dump
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
|T+0&#ffffff0|h|i|s| |i|s| |a| |l|i|n|e| |w|i|t|h| |q|u|i|t|e| |a| |b|i|t| |o|f| |t|e|x|t| |h|e|r|e|.|$+0#4040ff13&|T+0#ffffff16#ff404010|h|e| |q|u|i|c|k| |b|r|o|…
|
||||||
|
>s+0#0000000#ffffff0|e|c|o|n|d| |l|i|n|e|$+0#4040ff13&| +0#0000000&@47
|
||||||
|
|t|h|i|r|d| |l|i|n|e|$+0#4040ff13&| +0#0000000&@48
|
||||||
|
|~+0#4040ff13&| @58
|
||||||
|
|~| @58
|
||||||
|
|~| @58
|
||||||
|
|~| @58
|
||||||
|
| +0#0000000&@41|2|,|1| @10|A|l@1|
|
8
src/testdir/dumps/Test_prop_insert_list_mode_2.dump
Normal file
8
src/testdir/dumps/Test_prop_insert_list_mode_2.dump
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
|T+0&#ffffff0|h|i|s| |i|s| |a| |l|i|n|e| |w|i|t|h| |q|u|i|t|e| |a| |b|i|t| |o|f| |t|e|x|t| |h|e|r|e|.|$+0#4040ff13&|T+0#ffffff16#ff404010|h|e| |q|u|i|c|k| |b|r|o|»+0#4040ff13#ffffff0
|
||||||
|
>s+0#0000000&|e|c|o|n|d| |l|i|n|e|$+0#4040ff13&| +0#0000000&@47
|
||||||
|
|t|h|i|r|d| |l|i|n|e|$+0#4040ff13&| +0#0000000&@48
|
||||||
|
|~+0#4040ff13&| @58
|
||||||
|
|~| @58
|
||||||
|
|~| @58
|
||||||
|
|~| @58
|
||||||
|
|:+0#0000000&|s|e|t| |n|o|w|r|a|p| @30|2|,|1| @10|A|l@1|
|
8
src/testdir/dumps/Test_prop_insert_list_mode_3.dump
Normal file
8
src/testdir/dumps/Test_prop_insert_list_mode_3.dump
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
>o+0&#ffffff0|f| |t|e|x|t| |h|e|r|e|.|$+0#4040ff13&| +0#0000000&@2|T+0#ffffff16#ff404010|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
|
||||||
|
|s+0#0000000#ffffff0|e|c|o|n|d| |l|i|n|e|$+0#4040ff13&| +0#0000000&@47
|
||||||
|
|t|h|i|r|d| |l|i|n|e|$+0#4040ff13&| +0#0000000&@48
|
||||||
|
|~+0#4040ff13&| @58
|
||||||
|
|~| @58
|
||||||
|
|~| @58
|
||||||
|
|~| @58
|
||||||
|
|:+0#0000000&|s|e|t| |n|o|w|r|a|p| @30|1|,|1| @10|A|l@1|
|
@ -2969,4 +2969,34 @@ func Test_insert_text_start_incl()
|
|||||||
call delete('XscriptPropsStartIncl')
|
call delete('XscriptPropsStartIncl')
|
||||||
endfunc
|
endfunc
|
||||||
|
|
||||||
|
func Test_insert_text_list_mode()
|
||||||
|
CheckRunVimInTerminal
|
||||||
|
|
||||||
|
let lines =<< trim END
|
||||||
|
vim9script
|
||||||
|
setline(1, ['This is a line with quite a bit of text here.',
|
||||||
|
'second line', 'third line'])
|
||||||
|
set list listchars+=extends:»
|
||||||
|
prop_type_add('Prop1', {highlight: 'Error'})
|
||||||
|
prop_add(1, 0, {
|
||||||
|
type: 'Prop1',
|
||||||
|
text: 'The quick brown fox jumps over the lazy dog',
|
||||||
|
text_align: 'right'
|
||||||
|
})
|
||||||
|
END
|
||||||
|
call writefile(lines, 'XscriptPropsListMode')
|
||||||
|
let buf = RunVimInTerminal('-S XscriptPropsListMode', #{rows: 8, cols: 60})
|
||||||
|
call term_sendkeys(buf, "ggj")
|
||||||
|
call VerifyScreenDump(buf, 'Test_prop_insert_list_mode_1', {})
|
||||||
|
|
||||||
|
call term_sendkeys(buf, ":set nowrap\<CR>")
|
||||||
|
call VerifyScreenDump(buf, 'Test_prop_insert_list_mode_2', {})
|
||||||
|
|
||||||
|
call term_sendkeys(buf, "ggd32l")
|
||||||
|
call VerifyScreenDump(buf, 'Test_prop_insert_list_mode_3', {})
|
||||||
|
|
||||||
|
call StopVimInTerminal(buf)
|
||||||
|
call delete('XscriptPropsListMode')
|
||||||
|
endfunc
|
||||||
|
|
||||||
" vim: shiftwidth=2 sts=2 expandtab
|
" vim: shiftwidth=2 sts=2 expandtab
|
||||||
|
@ -735,6 +735,8 @@ static char *(features[]) =
|
|||||||
|
|
||||||
static int included_patches[] =
|
static int included_patches[] =
|
||||||
{ /* Add new patch number below this line */
|
{ /* Add new patch number below this line */
|
||||||
|
/**/
|
||||||
|
210,
|
||||||
/**/
|
/**/
|
||||||
209,
|
209,
|
||||||
/**/
|
/**/
|
||||||
|
Loading…
x
Reference in New Issue
Block a user