Merge #11034 from zwegner/precedes

Fix "precedes" listchar behavior in wrap mode
This commit is contained in:
Justin M. Keyes
2019-09-21 23:48:08 -07:00
committed by GitHub
5 changed files with 87 additions and 9 deletions

View File

@@ -3698,9 +3698,9 @@ A jump table for the options with a short description can be found at |Q_op|.
off and the line continues beyond the right of the off and the line continues beyond the right of the
screen. screen.
*lcs-precedes* *lcs-precedes*
precedes:c Character to show in the first column, when 'wrap' precedes:c Character to show in the first visible column of the
is off and there is text preceding the character physical line, when there is text preceding the
visible in the first column. character visible in the first column.
*lcs-conceal* *lcs-conceal*
conceal:c Character to show in place of concealed text, when conceal:c Character to show in place of concealed text, when
'conceallevel' is set to 1. A space when omitted. 'conceallevel' is set to 1. A space when omitted.

View File

@@ -3756,14 +3756,12 @@ win_line (
char_attr = hl_combine_attr(char_attr, extra_attr); char_attr = hl_combine_attr(char_attr, extra_attr);
} }
/* // Handle the case where we are in column 0 but not on the first
* Handle the case where we are in column 0 but not on the first // character of the line and the user wants us to show us a
* character of the line and the user wants us to show us a // special character (via 'listchars' option "precedes:<char>".
* special character (via 'listchars' option "precedes:<char>".
*/
if (lcs_prec_todo != NUL if (lcs_prec_todo != NUL
&& wp->w_p_list && wp->w_p_list
&& (wp->w_p_wrap ? wp->w_skipcol > 0 : wp->w_leftcol > 0) && (wp->w_p_wrap ? (wp->w_skipcol > 0 && row == 0) : wp->w_leftcol > 0)
&& filler_todo <= 0 && filler_todo <= 0
&& draw_state > WL_NR && draw_state > WL_NR
&& c != NUL) { && c != NUL) {

View File

@@ -69,3 +69,58 @@ func! Test_display_foldtext_mbyte()
set foldtext& fillchars& foldmethod& fdc& set foldtext& fillchars& foldmethod& fdc&
bw! bw!
endfunc endfunc
func Test_display_listchars_precedes()
call NewWindow(10, 10)
" Need a physical line that wraps over the complete
" window size
call append(0, repeat('aaa aaa aa ', 10))
call append(1, repeat(['bbb bbb bbb bbb'], 2))
" remove blank trailing line
$d
set list nowrap
call cursor(1, 1)
" move to end of line and scroll 2 characters back
norm! $2zh
let lines=ScreenLines([1,4], winwidth(0)+1)
let expect = [
\ " aaa aa $ |",
\ "$ |",
\ "$ |",
\ "~ |",
\ ]
call assert_equal(expect, lines)
set list listchars+=precedes:< nowrap
call cursor(1, 1)
" move to end of line and scroll 2 characters back
norm! $2zh
let lines = ScreenLines([1,4], winwidth(0)+1)
let expect = [
\ "<aaa aa $ |",
\ "< |",
\ "< |",
\ "~ |",
\ ]
call assert_equal(expect, lines)
set wrap
call cursor(1, 1)
" the complete line should be displayed in the window
norm! $
let lines = ScreenLines([1,10], winwidth(0)+1)
let expect = [
\ "<aaa aaa a|",
\ "a aaa aaa |",
\ "aa aaa aaa|",
\ " aa aaa aa|",
\ "a aa aaa a|",
\ "aa aa aaa |",
\ "aaa aa aaa|",
\ " aaa aa aa|",
\ "a aaa aa a|",
\ "aa aaa aa |",
\ ]
call assert_equal(expect, lines)
set list& listchars& wrap&
bw!
endfunc

View File

@@ -42,6 +42,7 @@ endfunction
function! NewWindow(height, width) abort function! NewWindow(height, width) abort
exe a:height . 'new' exe a:height . 'new'
exe a:width . 'vsp' exe a:width . 'vsp'
set winfixwidth winfixheight
redraw! redraw!
endfunction endfunction

View File

@@ -657,6 +657,30 @@ describe("'listchars' highlight", function()
]]) ]])
end) end)
it("'listchar' with wrap", function()
screen:set_default_attr_ids({
[0] = {bold=true, foreground=Screen.colors.Blue},
})
feed_command('set wrap')
feed_command('set listchars=eol:¬,precedes:< list')
feed('90ia<esc>')
screen:expect([[
{0:<}aaaaaaaaaaaaaaaaaaa|
aaaaaaaaaaaaaaaaaaaa|
aaaaaaaaaaaaaaaaaaaa|
aaaaaaaaa^a{0:¬} |
|
]])
feed('0')
screen:expect([[
^aaaaaaaaaaaaaaaaaaaa|
aaaaaaaaaaaaaaaaaaaa|
aaaaaaaaaaaaaaaaaaaa|
aaaaaaaaaaaaaaaaaaaa|
|
]])
end)
it("'listchar' in visual mode", function() it("'listchar' in visual mode", function()
screen:set_default_attr_ids({ screen:set_default_attr_ids({
[1] = {background=Screen.colors.Grey90}, [1] = {background=Screen.colors.Grey90},