summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2019-09-20 17:00:17 +0200
committerBram Moolenaar <Bram@vim.org>2019-09-20 17:00:17 +0200
commitbffba7f7042f6082e75b42484b15f66087b01941 (patch)
tree3fcb97d519845afa946d27dbd41b03456a2d33c8
parent589edb340454e7f1b19358f129287a636d53d0e1 (diff)
downloadvim-git-bffba7f7042f6082e75b42484b15f66087b01941.tar.gz
patch 8.1.2060: "precedes" in 'listchars' not used properlyv8.1.2060
Problem: "precedes" in 'listchars' not used properly. Solution: Correctly handle the "precedes" char in list mode for long lines. (Christian Brabandt, closes #4953)
-rw-r--r--runtime/doc/options.txt6
-rw-r--r--src/drawline.c4
-rw-r--r--src/testdir/test_display.vim55
-rw-r--r--src/testdir/view_util.vim1
-rw-r--r--src/version.c2
5 files changed, 64 insertions, 4 deletions
diff --git a/runtime/doc/options.txt b/runtime/doc/options.txt
index 9f3d1dae6..1dd74919b 100644
--- a/runtime/doc/options.txt
+++ b/runtime/doc/options.txt
@@ -4842,9 +4842,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
screen.
*lcs-precedes*
- precedes:c Character to show in the first column, when 'wrap'
- is off and there is text preceding the character
- visible in the first column.
+ precedes:c Character to show in the first visible column of the
+ physical line, when there is text preceding the
+ character visible in the first column.
*lcs-conceal*
conceal:c Character to show in place of concealed text, when
'conceallevel' is set to 1.
diff --git a/src/drawline.c b/src/drawline.c
index 39ec5ed40..5916458be 100644
--- a/src/drawline.c
+++ b/src/drawline.c
@@ -2482,7 +2482,9 @@ win_line(
// special character (via 'listchars' option "precedes:<char>".
if (lcs_prec_todo != NUL
&& 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)
#ifdef FEAT_DIFF
&& filler_todo <= 0
#endif
diff --git a/src/testdir/test_display.vim b/src/testdir/test_display.vim
index 6856759ec..f500dc789 100644
--- a/src/testdir/test_display.vim
+++ b/src/testdir/test_display.vim
@@ -103,3 +103,58 @@ func Test_scroll_without_region()
call StopVimInTerminal(buf)
call delete('Xtestscroll')
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
diff --git a/src/testdir/view_util.vim b/src/testdir/view_util.vim
index 72786da1b..1cdce2160 100644
--- a/src/testdir/view_util.vim
+++ b/src/testdir/view_util.vim
@@ -54,6 +54,7 @@ endfunction
function! NewWindow(height, width) abort
exe a:height . 'new'
exe a:width . 'vsp'
+ set winfixwidth winfixheight
redraw!
endfunction
diff --git a/src/version.c b/src/version.c
index eb2631d21..76873d762 100644
--- a/src/version.c
+++ b/src/version.c
@@ -758,6 +758,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 2060,
+/**/
2059,
/**/
2058,