1209d3874SBram Moolenaar" Tests for 'listchars' display with 'list' and :list
2209d3874SBram Moolenaar
341fb723eSBram Moolenaarsource check.vim
4209d3874SBram Moolenaarsource view_util.vim
541fb723eSBram Moolenaarsource screendump.vim
6209d3874SBram Moolenaar
7209d3874SBram Moolenaarfunc Test_listchars()
8209d3874SBram Moolenaar  enew!
9209d3874SBram Moolenaar  set ff=unix
10209d3874SBram Moolenaar  set list
11209d3874SBram Moolenaar
12209d3874SBram Moolenaar  set listchars+=tab:>-,space:.,trail:<
13209d3874SBram Moolenaar  call append(0, [
14209d3874SBram Moolenaar	      \ '	aa	',
15209d3874SBram Moolenaar	      \ '  bb	  ',
16209d3874SBram Moolenaar	      \ '   cccc	 ',
17209d3874SBram Moolenaar	      \ 'dd        ee  	',
18209d3874SBram Moolenaar	      \ ' '
19209d3874SBram Moolenaar	      \ ])
20209d3874SBram Moolenaar  let expected = [
21209d3874SBram Moolenaar	      \ '>-------aa>-----$',
22209d3874SBram Moolenaar	      \ '..bb>---<<$',
23209d3874SBram Moolenaar	      \ '...cccc><$',
24209d3874SBram Moolenaar	      \ 'dd........ee<<>-$',
25209d3874SBram Moolenaar	      \ '<$'
26209d3874SBram Moolenaar	      \ ]
27209d3874SBram Moolenaar  redraw!
28209d3874SBram Moolenaar  for i in range(1, 5)
29209d3874SBram Moolenaar    call cursor(i, 1)
30f92e58caSBram Moolenaar    call assert_equal([expected[i - 1]], ScreenLines(i, '$'->virtcol()))
31209d3874SBram Moolenaar  endfor
32209d3874SBram Moolenaar
33209d3874SBram Moolenaar  set listchars-=trail:<
34209d3874SBram Moolenaar  let expected = [
35209d3874SBram Moolenaar	      \ '>-------aa>-----$',
36209d3874SBram Moolenaar	      \ '..bb>---..$',
37209d3874SBram Moolenaar	      \ '...cccc>.$',
38209d3874SBram Moolenaar	      \ 'dd........ee..>-$',
39209d3874SBram Moolenaar	      \ '.$'
40209d3874SBram Moolenaar	      \ ]
41209d3874SBram Moolenaar  redraw!
42209d3874SBram Moolenaar  for i in range(1, 5)
43209d3874SBram Moolenaar    call cursor(i, 1)
44209d3874SBram Moolenaar    call assert_equal([expected[i - 1]], ScreenLines(i, virtcol('$')))
45209d3874SBram Moolenaar  endfor
46209d3874SBram Moolenaar
4783a52171SBram Moolenaar  " tab with 3rd character.
4883a52171SBram Moolenaar  set listchars-=tab:>-
4983a52171SBram Moolenaar  set listchars+=tab:<=>,trail:-
5083a52171SBram Moolenaar  let expected = [
5183a52171SBram Moolenaar	      \ '<======>aa<====>$',
5283a52171SBram Moolenaar	      \ '..bb<==>--$',
5383a52171SBram Moolenaar	      \ '...cccc>-$',
5483a52171SBram Moolenaar	      \ 'dd........ee--<>$',
5583a52171SBram Moolenaar	      \ '-$'
5683a52171SBram Moolenaar	      \ ]
5783a52171SBram Moolenaar  redraw!
5883a52171SBram Moolenaar  for i in range(1, 5)
5983a52171SBram Moolenaar    call cursor(i, 1)
6083a52171SBram Moolenaar    call assert_equal([expected[i - 1]], ScreenLines(i, virtcol('$')))
6183a52171SBram Moolenaar  endfor
6283a52171SBram Moolenaar
6369cbbecfSBram Moolenaar  " tab with 3rd character and linebreak set
6469cbbecfSBram Moolenaar  set listchars-=tab:<=>
6569cbbecfSBram Moolenaar  set listchars+=tab:<·>
6669cbbecfSBram Moolenaar  set linebreak
6769cbbecfSBram Moolenaar  let expected = [
6869cbbecfSBram Moolenaar	      \ '<······>aa<····>$',
6969cbbecfSBram Moolenaar	      \ '..bb<··>--$',
7069cbbecfSBram Moolenaar	      \ '...cccc>-$',
7169cbbecfSBram Moolenaar	      \ 'dd........ee--<>$',
7269cbbecfSBram Moolenaar	      \ '-$'
7369cbbecfSBram Moolenaar	      \ ]
7469cbbecfSBram Moolenaar  redraw!
7569cbbecfSBram Moolenaar  for i in range(1, 5)
7669cbbecfSBram Moolenaar    call cursor(i, 1)
7769cbbecfSBram Moolenaar    call assert_equal([expected[i - 1]], ScreenLines(i, virtcol('$')))
7869cbbecfSBram Moolenaar  endfor
7969cbbecfSBram Moolenaar  set nolinebreak
8069cbbecfSBram Moolenaar  set listchars-=tab:<·>
8169cbbecfSBram Moolenaar  set listchars+=tab:<=>
8269cbbecfSBram Moolenaar
8383a52171SBram Moolenaar  set listchars-=trail:-
8483a52171SBram Moolenaar  let expected = [
8583a52171SBram Moolenaar	      \ '<======>aa<====>$',
8683a52171SBram Moolenaar	      \ '..bb<==>..$',
8783a52171SBram Moolenaar	      \ '...cccc>.$',
8883a52171SBram Moolenaar	      \ 'dd........ee..<>$',
8983a52171SBram Moolenaar	      \ '.$'
9083a52171SBram Moolenaar	      \ ]
9183a52171SBram Moolenaar  redraw!
9283a52171SBram Moolenaar  for i in range(1, 5)
9383a52171SBram Moolenaar    call cursor(i, 1)
9483a52171SBram Moolenaar    call assert_equal([expected[i - 1]], ScreenLines(i, virtcol('$')))
9583a52171SBram Moolenaar  endfor
9683a52171SBram Moolenaar
9783a52171SBram Moolenaar  set listchars-=tab:<=>
9883a52171SBram Moolenaar  set listchars+=tab:>-
99209d3874SBram Moolenaar  set listchars+=trail:<
100209d3874SBram Moolenaar  set nolist
101209d3874SBram Moolenaar  normal ggdG
102209d3874SBram Moolenaar  call append(0, [
103209d3874SBram Moolenaar	      \ '  fff	  ',
104209d3874SBram Moolenaar	      \ '	gg	',
105209d3874SBram Moolenaar	      \ '     h	',
106209d3874SBram Moolenaar	      \ 'iii    	  ',
107209d3874SBram Moolenaar	      \ ])
108209d3874SBram Moolenaar  let l = split(execute("%list"), "\n")
109209d3874SBram Moolenaar  call assert_equal([
110209d3874SBram Moolenaar	      \ '..fff>--<<$',
111209d3874SBram Moolenaar	      \ '>-------gg>-----$',
112209d3874SBram Moolenaar	      \ '.....h>-$',
113209d3874SBram Moolenaar	      \ 'iii<<<<><<$', '$'], l)
114209d3874SBram Moolenaar
11591478ae4SBram Moolenaar  " Test lead and trail
11691478ae4SBram Moolenaar  normal ggdG
11791478ae4SBram Moolenaar  set listchars&
11891478ae4SBram Moolenaar  set listchars+=lead:>,trail:<,space:x
11991478ae4SBram Moolenaar  set list
12091478ae4SBram Moolenaar
12191478ae4SBram Moolenaar  call append(0, [
12291478ae4SBram Moolenaar	      \ '    ffff    ',
12391478ae4SBram Moolenaar	      \ '          gg',
12491478ae4SBram Moolenaar	      \ 'h           ',
12591478ae4SBram Moolenaar	      \ '            ',
12691478ae4SBram Moolenaar	      \ '    0  0    ',
12791478ae4SBram Moolenaar	      \ ])
12891478ae4SBram Moolenaar
12991478ae4SBram Moolenaar  let expected = [
13091478ae4SBram Moolenaar	      \ '>>>>ffff<<<<$',
13191478ae4SBram Moolenaar	      \ '>>>>>>>>>>gg$',
13291478ae4SBram Moolenaar	      \ 'h<<<<<<<<<<<$',
13391478ae4SBram Moolenaar	      \ '<<<<<<<<<<<<$',
13491478ae4SBram Moolenaar	      \ '>>>>0xx0<<<<$',
13591478ae4SBram Moolenaar              \ '$'
13691478ae4SBram Moolenaar	      \ ]
13791478ae4SBram Moolenaar  redraw!
13891478ae4SBram Moolenaar  for i in range(1, 5)
13991478ae4SBram Moolenaar    call cursor(i, 1)
14091478ae4SBram Moolenaar    call assert_equal([expected[i - 1]], ScreenLines(i, virtcol('$')))
14191478ae4SBram Moolenaar  endfor
14291478ae4SBram Moolenaar
14391478ae4SBram Moolenaar  call assert_equal(expected, split(execute("%list"), "\n"))
144895d966eSBram Moolenaar
145f14b8ba1Szeertzjq  " Test multispace
146f14b8ba1Szeertzjq  normal ggdG
147f14b8ba1Szeertzjq  set listchars&
148f14b8ba1Szeertzjq  set listchars+=multispace:yYzZ
149f14b8ba1Szeertzjq  set list
150f14b8ba1Szeertzjq
151f14b8ba1Szeertzjq  call append(0, [
152f14b8ba1Szeertzjq	      \ '    ffff    ',
153f14b8ba1Szeertzjq	      \ '  i i     gg',
154f14b8ba1Szeertzjq	      \ ' h          ',
155f14b8ba1Szeertzjq	      \ '          j ',
156f14b8ba1Szeertzjq	      \ '    0  0    ',
157f14b8ba1Szeertzjq	      \ ])
158f14b8ba1Szeertzjq
159f14b8ba1Szeertzjq  let expected = [
160f14b8ba1Szeertzjq	      \ 'yYzZffffyYzZ$',
161f14b8ba1Szeertzjq	      \ 'yYi iyYzZygg$',
162f14b8ba1Szeertzjq	      \ ' hyYzZyYzZyY$',
163f14b8ba1Szeertzjq	      \ 'yYzZyYzZyYj $',
164f14b8ba1Szeertzjq	      \ 'yYzZ0yY0yYzZ$',
165f14b8ba1Szeertzjq              \ '$'
166f14b8ba1Szeertzjq	      \ ]
167f14b8ba1Szeertzjq  redraw!
168f14b8ba1Szeertzjq  for i in range(1, 5)
169f14b8ba1Szeertzjq    call cursor(i, 1)
170f14b8ba1Szeertzjq    call assert_equal([expected[i - 1]], ScreenLines(i, virtcol('$')))
171f14b8ba1Szeertzjq  endfor
172f14b8ba1Szeertzjq
173f14b8ba1Szeertzjq  call assert_equal(expected, split(execute("%list"), "\n"))
174f14b8ba1Szeertzjq
175f14b8ba1Szeertzjq  " the last occurrence of 'multispace:' is used
176f14b8ba1Szeertzjq  set listchars+=space:x,multispace:XyY
177f14b8ba1Szeertzjq
178f14b8ba1Szeertzjq  let expected = [
179f14b8ba1Szeertzjq	      \ 'XyYXffffXyYX$',
180f14b8ba1Szeertzjq	      \ 'XyixiXyYXygg$',
181f14b8ba1Szeertzjq	      \ 'xhXyYXyYXyYX$',
182f14b8ba1Szeertzjq	      \ 'XyYXyYXyYXjx$',
183f14b8ba1Szeertzjq	      \ 'XyYX0Xy0XyYX$',
184f14b8ba1Szeertzjq              \ '$'
185f14b8ba1Szeertzjq	      \ ]
186f14b8ba1Szeertzjq  redraw!
187f14b8ba1Szeertzjq  for i in range(1, 5)
188f14b8ba1Szeertzjq    call cursor(i, 1)
189f14b8ba1Szeertzjq    call assert_equal([expected[i - 1]], ScreenLines(i, virtcol('$')))
190f14b8ba1Szeertzjq  endfor
191f14b8ba1Szeertzjq
192f14b8ba1Szeertzjq  call assert_equal(expected, split(execute("%list"), "\n"))
193f14b8ba1Szeertzjq
194f14b8ba1Szeertzjq  set listchars+=lead:>,trail:<
195f14b8ba1Szeertzjq
196f14b8ba1Szeertzjq  let expected = [
197f14b8ba1Szeertzjq	      \ '>>>>ffff<<<<$',
198f14b8ba1Szeertzjq	      \ '>>ixiXyYXygg$',
199f14b8ba1Szeertzjq	      \ '>h<<<<<<<<<<$',
200f14b8ba1Szeertzjq	      \ '>>>>>>>>>>j<$',
201f14b8ba1Szeertzjq	      \ '>>>>0Xy0<<<<$',
202f14b8ba1Szeertzjq              \ '$'
203f14b8ba1Szeertzjq	      \ ]
204f14b8ba1Szeertzjq  redraw!
205f14b8ba1Szeertzjq  for i in range(1, 5)
206f14b8ba1Szeertzjq    call cursor(i, 1)
207f14b8ba1Szeertzjq    call assert_equal([expected[i - 1]], ScreenLines(i, virtcol('$')))
208f14b8ba1Szeertzjq  endfor
209f14b8ba1Szeertzjq
210f14b8ba1Szeertzjq  call assert_equal(expected, split(execute("%list"), "\n"))
211f14b8ba1Szeertzjq
212f14b8ba1Szeertzjq  " removing 'multispace:'
213f14b8ba1Szeertzjq  set listchars-=multispace:XyY
214f14b8ba1Szeertzjq  set listchars-=multispace:yYzZ
215f14b8ba1Szeertzjq
216f14b8ba1Szeertzjq  let expected = [
217f14b8ba1Szeertzjq	      \ '>>>>ffff<<<<$',
218f14b8ba1Szeertzjq	      \ '>>ixixxxxxgg$',
219f14b8ba1Szeertzjq	      \ '>h<<<<<<<<<<$',
220f14b8ba1Szeertzjq	      \ '>>>>>>>>>>j<$',
221f14b8ba1Szeertzjq	      \ '>>>>0xx0<<<<$',
222f14b8ba1Szeertzjq              \ '$'
223f14b8ba1Szeertzjq	      \ ]
224f14b8ba1Szeertzjq  redraw!
225f14b8ba1Szeertzjq  for i in range(1, 5)
226f14b8ba1Szeertzjq    call cursor(i, 1)
227f14b8ba1Szeertzjq    call assert_equal([expected[i - 1]], ScreenLines(i, virtcol('$')))
228f14b8ba1Szeertzjq  endfor
229f14b8ba1Szeertzjq
230f14b8ba1Szeertzjq  call assert_equal(expected, split(execute("%list"), "\n"))
231f14b8ba1Szeertzjq
232895d966eSBram Moolenaar  " test nbsp
233895d966eSBram Moolenaar  normal ggdG
234895d966eSBram Moolenaar  set listchars=nbsp:X,trail:Y
235895d966eSBram Moolenaar  set list
236895d966eSBram Moolenaar  " Non-breaking space
237895d966eSBram Moolenaar  let nbsp = nr2char(0xa0)
238f1387285SBram Moolenaar  call append(0, [ ">" .. nbsp .. "<" ])
239895d966eSBram Moolenaar
240895d966eSBram Moolenaar  let expected = '>X< '
241895d966eSBram Moolenaar
242895d966eSBram Moolenaar  redraw!
243895d966eSBram Moolenaar  call cursor(1, 1)
244895d966eSBram Moolenaar  call assert_equal([expected], ScreenLines(1, virtcol('$')))
245895d966eSBram Moolenaar
246895d966eSBram Moolenaar  set listchars=nbsp:X
247895d966eSBram Moolenaar  redraw!
248895d966eSBram Moolenaar  call cursor(1, 1)
249895d966eSBram Moolenaar  call assert_equal([expected], ScreenLines(1, virtcol('$')))
250895d966eSBram Moolenaar
251a5c6a0b6SBram Moolenaar  " test extends
252a5c6a0b6SBram Moolenaar  normal ggdG
253a5c6a0b6SBram Moolenaar  set listchars=extends:Z
254a5c6a0b6SBram Moolenaar  set nowrap
255a5c6a0b6SBram Moolenaar  set nolist
256a5c6a0b6SBram Moolenaar  call append(0, [ repeat('A', &columns + 1) ])
257a5c6a0b6SBram Moolenaar
258a5c6a0b6SBram Moolenaar  let expected = repeat('A', &columns)
259a5c6a0b6SBram Moolenaar
260a5c6a0b6SBram Moolenaar  redraw!
261a5c6a0b6SBram Moolenaar  call cursor(1, 1)
262a5c6a0b6SBram Moolenaar  call assert_equal([expected], ScreenLines(1, &columns))
263a5c6a0b6SBram Moolenaar
264a5c6a0b6SBram Moolenaar  set list
265a5c6a0b6SBram Moolenaar  let expected = expected[:-2] . 'Z'
266a5c6a0b6SBram Moolenaar  redraw!
267a5c6a0b6SBram Moolenaar  call cursor(1, 1)
268a5c6a0b6SBram Moolenaar  call assert_equal([expected], ScreenLines(1, &columns))
269a5c6a0b6SBram Moolenaar
270209d3874SBram Moolenaar  enew!
271209d3874SBram Moolenaar  set listchars& ff&
272209d3874SBram Moolenaarendfunc
2735f8069bbSBram Moolenaar
274e5e4e22cSBram Moolenaar" Test that unicode listchars characters get properly inserted
275e5e4e22cSBram Moolenaarfunc Test_listchars_unicode()
276e5e4e22cSBram Moolenaar  enew!
277e5e4e22cSBram Moolenaar  let oldencoding=&encoding
278e5e4e22cSBram Moolenaar  set encoding=utf-8
279e5e4e22cSBram Moolenaar  set ff=unix
280e5e4e22cSBram Moolenaar
281f14b8ba1Szeertzjq  set listchars=eol:⇔,space:␣,multispace:≡≢≣,nbsp:≠,tab:←↔→
282e5e4e22cSBram Moolenaar  set list
283e5e4e22cSBram Moolenaar
284e5e4e22cSBram Moolenaar  let nbsp = nr2char(0xa0)
285f1387285SBram Moolenaar  call append(0, ["        a\tb c" .. nbsp .. "d  "])
286f14b8ba1Szeertzjq  let expected = ['≡≢≣≡≢≣≡≢a←↔↔↔↔↔→b␣c≠d≡≢⇔']
287e5e4e22cSBram Moolenaar  redraw!
288e5e4e22cSBram Moolenaar  call cursor(1, 1)
289e5e4e22cSBram Moolenaar  call assert_equal(expected, ScreenLines(1, virtcol('$')))
290f14b8ba1Szeertzjq
29193ff6720SBram Moolenaar  set listchars=eol:\\u21d4,space:\\u2423,multispace:≡\\u2262\\U00002263,nbsp:\\U00002260,tab:←↔\\u2192
29293ff6720SBram Moolenaar  redraw!
29393ff6720SBram Moolenaar  call assert_equal(expected, ScreenLines(1, virtcol('$')))
29493ff6720SBram Moolenaar
295f14b8ba1Szeertzjq  set listchars+=lead:⇨,trail:⇦
296f14b8ba1Szeertzjq  let expected = ['⇨⇨⇨⇨⇨⇨⇨⇨a←↔↔↔↔↔→b␣c≠d⇦⇦⇔']
297f14b8ba1Szeertzjq  redraw!
298f14b8ba1Szeertzjq  call cursor(1, 1)
299f14b8ba1Szeertzjq  call assert_equal(expected, ScreenLines(1, virtcol('$')))
300f14b8ba1Szeertzjq
301e5e4e22cSBram Moolenaar  let &encoding=oldencoding
302e5e4e22cSBram Moolenaar  enew!
303e5e4e22cSBram Moolenaar  set listchars& ff&
304e5e4e22cSBram Moolenaarendfunction
305e5e4e22cSBram Moolenaar
306f14b8ba1Szeertzjqfunc Test_listchars_invalid()
307f14b8ba1Szeertzjq  enew!
308f14b8ba1Szeertzjq  set ff=unix
309f14b8ba1Szeertzjq
310f14b8ba1Szeertzjq  set listchars&
311f14b8ba1Szeertzjq  set list
312f14b8ba1Szeertzjq  set ambiwidth=double
313f14b8ba1Szeertzjq
314f14b8ba1Szeertzjq  " No colon
315f14b8ba1Szeertzjq  call assert_fails('set listchars=x', 'E474:')
316f14b8ba1Szeertzjq  call assert_fails('set listchars=x', 'E474:')
317f14b8ba1Szeertzjq  call assert_fails('set listchars=multispace', 'E474:')
318f14b8ba1Szeertzjq
319f14b8ba1Szeertzjq  " Too short
320f14b8ba1Szeertzjq  call assert_fails('set listchars=space:', 'E474:')
321f14b8ba1Szeertzjq  call assert_fails('set listchars=tab:x', 'E474:')
322f14b8ba1Szeertzjq  call assert_fails('set listchars=multispace:', 'E474:')
323f14b8ba1Szeertzjq
324f14b8ba1Szeertzjq  " One occurrence too short
325f14b8ba1Szeertzjq  call assert_fails('set listchars=space:,space:x', 'E474:')
326f14b8ba1Szeertzjq  call assert_fails('set listchars=space:x,space:', 'E474:')
327f14b8ba1Szeertzjq  call assert_fails('set listchars=tab:x,tab:xx', 'E474:')
328f14b8ba1Szeertzjq  call assert_fails('set listchars=tab:xx,tab:x', 'E474:')
329f14b8ba1Szeertzjq  call assert_fails('set listchars=multispace:,multispace:x', 'E474:')
330f14b8ba1Szeertzjq  call assert_fails('set listchars=multispace:x,multispace:', 'E474:')
331f14b8ba1Szeertzjq
332f14b8ba1Szeertzjq  " Too long
333f14b8ba1Szeertzjq  call assert_fails('set listchars=space:xx', 'E474:')
334f14b8ba1Szeertzjq  call assert_fails('set listchars=tab:xxxx', 'E474:')
335f14b8ba1Szeertzjq
336f14b8ba1Szeertzjq  " Has non-single width character
337f14b8ba1Szeertzjq  call assert_fails('set listchars=space:·', 'E474:')
338f14b8ba1Szeertzjq  call assert_fails('set listchars=tab:·x', 'E474:')
339f14b8ba1Szeertzjq  call assert_fails('set listchars=tab:x·', 'E474:')
340f14b8ba1Szeertzjq  call assert_fails('set listchars=tab:xx·', 'E474:')
341f14b8ba1Szeertzjq  call assert_fails('set listchars=multispace:·', 'E474:')
342f14b8ba1Szeertzjq  call assert_fails('set listchars=multispace:xxx·', 'E474:')
343f14b8ba1Szeertzjq
344f14b8ba1Szeertzjq  enew!
345f14b8ba1Szeertzjq  set ambiwidth& listchars& ff&
346f14b8ba1Szeertzjqendfunction
347f14b8ba1Szeertzjq
348e5e4e22cSBram Moolenaar" Tests that space characters following composing character won't get replaced
349e5e4e22cSBram Moolenaar" by listchars.
3505f8069bbSBram Moolenaarfunc Test_listchars_composing()
3515f8069bbSBram Moolenaar  enew!
3525f8069bbSBram Moolenaar  let oldencoding=&encoding
3535f8069bbSBram Moolenaar  set encoding=utf-8
3545f8069bbSBram Moolenaar  set ff=unix
3555f8069bbSBram Moolenaar  set list
3565f8069bbSBram Moolenaar
357e5e4e22cSBram Moolenaar  set listchars=eol:$,space:_,nbsp:=
358e5e4e22cSBram Moolenaar
359e5e4e22cSBram Moolenaar  let nbsp1 = nr2char(0xa0)
360e5e4e22cSBram Moolenaar  let nbsp2 = nr2char(0x202f)
3615f8069bbSBram Moolenaar  call append(0, [
362f1387285SBram Moolenaar        \ "  \u3099\t \u309A" .. nbsp1 .. nbsp1 .. "\u0302" .. nbsp2 .. nbsp2 .. "\u0302",
3635f8069bbSBram Moolenaar        \ ])
3645f8069bbSBram Moolenaar  let expected = [
365f1387285SBram Moolenaar        \ "_ \u3099^I \u309A=" .. nbsp1 .. "\u0302=" .. nbsp2 .. "\u0302$"
3665f8069bbSBram Moolenaar        \ ]
3675f8069bbSBram Moolenaar  redraw!
3685f8069bbSBram Moolenaar  call cursor(1, 1)
369e5e4e22cSBram Moolenaar  call assert_equal(expected, ScreenLines(1, virtcol('$')))
3705f8069bbSBram Moolenaar  let &encoding=oldencoding
371e5e4e22cSBram Moolenaar  enew!
3725f8069bbSBram Moolenaar  set listchars& ff&
3735f8069bbSBram Moolenaarendfunction
3746d91bcb4SBram Moolenaar
375eed9d462SBram Moolenaar" Check for the value of the 'listchars' option
376eed9d462SBram Moolenaarfunc s:CheckListCharsValue(expected)
377eed9d462SBram Moolenaar  call assert_equal(a:expected, &listchars)
378eed9d462SBram Moolenaar  call assert_equal(a:expected, getwinvar(0, '&listchars'))
379eed9d462SBram Moolenaarendfunc
380eed9d462SBram Moolenaar
381eed9d462SBram Moolenaar" Test for using a window local value for 'listchars'
382eed9d462SBram Moolenaarfunc Test_listchars_window_local()
383eed9d462SBram Moolenaar  %bw!
384eed9d462SBram Moolenaar  set list listchars&
385eed9d462SBram Moolenaar  new
386eed9d462SBram Moolenaar  " set a local value for 'listchars'
387eed9d462SBram Moolenaar  setlocal listchars=tab:+-,eol:#
388eed9d462SBram Moolenaar  call s:CheckListCharsValue('tab:+-,eol:#')
389eed9d462SBram Moolenaar  " When local value is reset, global value should be used
390eed9d462SBram Moolenaar  setlocal listchars=
391eed9d462SBram Moolenaar  call s:CheckListCharsValue('eol:$')
392eed9d462SBram Moolenaar  " Use 'setlocal <' to copy global value
393eed9d462SBram Moolenaar  setlocal listchars=space:.,extends:>
394eed9d462SBram Moolenaar  setlocal listchars<
395eed9d462SBram Moolenaar  call s:CheckListCharsValue('eol:$')
396eed9d462SBram Moolenaar  " Use 'set <' to copy global value
397eed9d462SBram Moolenaar  setlocal listchars=space:.,extends:>
398eed9d462SBram Moolenaar  set listchars<
399eed9d462SBram Moolenaar  call s:CheckListCharsValue('eol:$')
400eed9d462SBram Moolenaar  " Changing global setting should not change the local setting
401eed9d462SBram Moolenaar  setlocal listchars=space:.,extends:>
402eed9d462SBram Moolenaar  setglobal listchars=tab:+-,eol:#
403eed9d462SBram Moolenaar  call s:CheckListCharsValue('space:.,extends:>')
404eed9d462SBram Moolenaar  " when split opening a new window, local value should be copied
405eed9d462SBram Moolenaar  split
406eed9d462SBram Moolenaar  call s:CheckListCharsValue('space:.,extends:>')
407eed9d462SBram Moolenaar  " clearing local value in one window should not change the other window
408eed9d462SBram Moolenaar  set listchars&
409eed9d462SBram Moolenaar  call s:CheckListCharsValue('eol:$')
410eed9d462SBram Moolenaar  close
411eed9d462SBram Moolenaar  call s:CheckListCharsValue('space:.,extends:>')
412eed9d462SBram Moolenaar
413eed9d462SBram Moolenaar  " use different values for 'listchars' items in two different windows
414eed9d462SBram Moolenaar  call setline(1, ["\t  one  two  "])
415eed9d462SBram Moolenaar  setlocal listchars=tab:<->,lead:_,space:.,trail:@,eol:#
416eed9d462SBram Moolenaar  split
417eed9d462SBram Moolenaar  setlocal listchars=tab:[.],lead:#,space:_,trail:.,eol:&
418eed9d462SBram Moolenaar  split
419eed9d462SBram Moolenaar  set listchars=tab:+-+,lead:^,space:>,trail:<,eol:%
420eed9d462SBram Moolenaar  call assert_equal(['+------+^^one>>two<<%'], ScreenLines(1, virtcol('$')))
421eed9d462SBram Moolenaar  close
422eed9d462SBram Moolenaar  call assert_equal(['[......]##one__two..&'], ScreenLines(1, virtcol('$')))
423eed9d462SBram Moolenaar  close
424eed9d462SBram Moolenaar  call assert_equal(['<------>__one..two@@#'], ScreenLines(1, virtcol('$')))
425eed9d462SBram Moolenaar  " changing the global setting should not change the local value
426eed9d462SBram Moolenaar  setglobal listchars=tab:[.],lead:#,space:_,trail:.,eol:&
427eed9d462SBram Moolenaar  call assert_equal(['<------>__one..two@@#'], ScreenLines(1, virtcol('$')))
428eed9d462SBram Moolenaar  set listchars<
429eed9d462SBram Moolenaar  call assert_equal(['[......]##one__two..&'], ScreenLines(1, virtcol('$')))
430eed9d462SBram Moolenaar
431eed9d462SBram Moolenaar  " Using setglobal in a window with local setting should not affect the
432eed9d462SBram Moolenaar  " window. But should impact other windows using the global setting.
433eed9d462SBram Moolenaar  enew! | only
434eed9d462SBram Moolenaar  call setline(1, ["\t  one  two  "])
435eed9d462SBram Moolenaar  set listchars=tab:[.],lead:#,space:_,trail:.,eol:&
436eed9d462SBram Moolenaar  split
437eed9d462SBram Moolenaar  setlocal listchars=tab:+-+,lead:^,space:>,trail:<,eol:%
438eed9d462SBram Moolenaar  split
439eed9d462SBram Moolenaar  setlocal listchars=tab:<->,lead:_,space:.,trail:@,eol:#
440eed9d462SBram Moolenaar  setglobal listchars=tab:{.},lead:-,space:=,trail:#,eol:$
441eed9d462SBram Moolenaar  call assert_equal(['<------>__one..two@@#'], ScreenLines(1, virtcol('$')))
442eed9d462SBram Moolenaar  close
443eed9d462SBram Moolenaar  call assert_equal(['+------+^^one>>two<<%'], ScreenLines(1, virtcol('$')))
444eed9d462SBram Moolenaar  close
445eed9d462SBram Moolenaar  call assert_equal(['{......}--one==two##$'], ScreenLines(1, virtcol('$')))
446eed9d462SBram Moolenaar
447eed9d462SBram Moolenaar  " Setting the global setting to the default value should not impact a window
448*7a33ebfcSzeertzjq  " using a local setting.
449eed9d462SBram Moolenaar  split
450eed9d462SBram Moolenaar  setlocal listchars=tab:<->,lead:_,space:.,trail:@,eol:#
451eed9d462SBram Moolenaar  setglobal listchars&vim
452eed9d462SBram Moolenaar  call assert_equal(['<------>__one..two@@#'], ScreenLines(1, virtcol('$')))
453eed9d462SBram Moolenaar  close
454eed9d462SBram Moolenaar  call assert_equal(['^I  one  two  $'], ScreenLines(1, virtcol('$')))
455eed9d462SBram Moolenaar
456eed9d462SBram Moolenaar  " Setting the local setting to the default value should not impact a window
457*7a33ebfcSzeertzjq  " using a global setting.
458eed9d462SBram Moolenaar  set listchars=tab:{.},lead:-,space:=,trail:#,eol:$
459eed9d462SBram Moolenaar  split
460eed9d462SBram Moolenaar  setlocal listchars=tab:<->,lead:_,space:.,trail:@,eol:#
461eed9d462SBram Moolenaar  call assert_equal(['<------>__one..two@@#'], ScreenLines(1, virtcol('$')))
462eed9d462SBram Moolenaar  setlocal listchars&vim
463eed9d462SBram Moolenaar  call assert_equal(['^I  one  two  $'], ScreenLines(1, virtcol('$')))
464eed9d462SBram Moolenaar  close
465eed9d462SBram Moolenaar  call assert_equal(['{......}--one==two##$'], ScreenLines(1, virtcol('$')))
466eed9d462SBram Moolenaar
467eed9d462SBram Moolenaar  " Using set in a window with a local setting should change it to use the
468*7a33ebfcSzeertzjq  " global setting and also impact other windows using the global setting.
469eed9d462SBram Moolenaar  split
470eed9d462SBram Moolenaar  setlocal listchars=tab:<->,lead:_,space:.,trail:@,eol:#
471eed9d462SBram Moolenaar  call assert_equal(['<------>__one..two@@#'], ScreenLines(1, virtcol('$')))
472eed9d462SBram Moolenaar  set listchars=tab:+-+,lead:^,space:>,trail:<,eol:%
473eed9d462SBram Moolenaar  call assert_equal(['+------+^^one>>two<<%'], ScreenLines(1, virtcol('$')))
474eed9d462SBram Moolenaar  close
475eed9d462SBram Moolenaar  call assert_equal(['+------+^^one>>two<<%'], ScreenLines(1, virtcol('$')))
476eed9d462SBram Moolenaar
47704ea7e90SBram Moolenaar  " Setting invalid value for a local setting should not impact the local and
478*7a33ebfcSzeertzjq  " global settings.
47904ea7e90SBram Moolenaar  split
48004ea7e90SBram Moolenaar  setlocal listchars=tab:<->,lead:_,space:.,trail:@,eol:#
48104ea7e90SBram Moolenaar  let cmd = 'setlocal listchars=tab:{.},lead:-,space:=,trail:#,eol:$,x'
48204ea7e90SBram Moolenaar  call assert_fails(cmd, 'E474:')
48304ea7e90SBram Moolenaar  call assert_equal(['<------>__one..two@@#'], ScreenLines(1, virtcol('$')))
48404ea7e90SBram Moolenaar  close
48504ea7e90SBram Moolenaar  call assert_equal(['+------+^^one>>two<<%'], ScreenLines(1, virtcol('$')))
48604ea7e90SBram Moolenaar
48704ea7e90SBram Moolenaar  " Setting invalid value for a global setting should not impact the local and
488*7a33ebfcSzeertzjq  " global settings.
48904ea7e90SBram Moolenaar  split
49004ea7e90SBram Moolenaar  setlocal listchars=tab:<->,lead:_,space:.,trail:@,eol:#
49104ea7e90SBram Moolenaar  let cmd = 'setglobal listchars=tab:{.},lead:-,space:=,trail:#,eol:$,x'
49204ea7e90SBram Moolenaar  call assert_fails(cmd, 'E474:')
49304ea7e90SBram Moolenaar  call assert_equal(['<------>__one..two@@#'], ScreenLines(1, virtcol('$')))
49404ea7e90SBram Moolenaar  close
49504ea7e90SBram Moolenaar  call assert_equal(['+------+^^one>>two<<%'], ScreenLines(1, virtcol('$')))
49604ea7e90SBram Moolenaar
497*7a33ebfcSzeertzjq  " Closing window with local lcs-multispace should not cause a memory leak.
498*7a33ebfcSzeertzjq  setlocal listchars=multispace:---+
499*7a33ebfcSzeertzjq  split
500*7a33ebfcSzeertzjq  call s:CheckListCharsValue('multispace:---+')
501*7a33ebfcSzeertzjq  close
502*7a33ebfcSzeertzjq
503eed9d462SBram Moolenaar  %bw!
504eed9d462SBram Moolenaar  set list& listchars&
505eed9d462SBram Moolenaarendfunc
506eed9d462SBram Moolenaar
50741fb723eSBram Moolenaarfunc Test_listchars_foldcolumn()
50841fb723eSBram Moolenaar  CheckScreendump
50941fb723eSBram Moolenaar
51041fb723eSBram Moolenaar  let lines =<< trim END
51141fb723eSBram Moolenaar      call setline(1, ['aaa', '', 'a', 'aaaaaa'])
51241fb723eSBram Moolenaar      vsplit
51341fb723eSBram Moolenaar      vsplit
51441fb723eSBram Moolenaar      windo set signcolumn=yes foldcolumn=1 winminwidth=0 nowrap list listchars=extends:>,precedes:<
51541fb723eSBram Moolenaar  END
51641fb723eSBram Moolenaar  call writefile(lines, 'XTest_listchars')
51741fb723eSBram Moolenaar
51841fb723eSBram Moolenaar  let buf = RunVimInTerminal('-S XTest_listchars', {'rows': 10, 'cols': 60})
51941fb723eSBram Moolenaar
52041fb723eSBram Moolenaar  call term_sendkeys(buf, "13\<C-W>>")
52141fb723eSBram Moolenaar  call VerifyScreenDump(buf, 'Test_listchars_01', {})
52241fb723eSBram Moolenaar  call term_sendkeys(buf, "\<C-W>>")
52341fb723eSBram Moolenaar  call VerifyScreenDump(buf, 'Test_listchars_02', {})
52441fb723eSBram Moolenaar  call term_sendkeys(buf, "\<C-W>>")
52541fb723eSBram Moolenaar  call VerifyScreenDump(buf, 'Test_listchars_03', {})
52641fb723eSBram Moolenaar  call term_sendkeys(buf, "\<C-W>>")
52741fb723eSBram Moolenaar  call VerifyScreenDump(buf, 'Test_listchars_04', {})
52841fb723eSBram Moolenaar  call term_sendkeys(buf, "\<C-W>>")
52941fb723eSBram Moolenaar  call VerifyScreenDump(buf, 'Test_listchars_05', {})
53030441bb3SBram Moolenaar  call term_sendkeys(buf, "\<C-W>h")
53130441bb3SBram Moolenaar  call term_sendkeys(buf, ":set nowrap foldcolumn=4\<CR>")
53230441bb3SBram Moolenaar  call term_sendkeys(buf, "15\<C-W><")
53330441bb3SBram Moolenaar  call VerifyScreenDump(buf, 'Test_listchars_06', {})
53430441bb3SBram Moolenaar  call term_sendkeys(buf, "4\<C-W><")
53530441bb3SBram Moolenaar  call VerifyScreenDump(buf, 'Test_listchars_07', {})
53641fb723eSBram Moolenaar
53741fb723eSBram Moolenaar  " clean up
53841fb723eSBram Moolenaar  call StopVimInTerminal(buf)
53941fb723eSBram Moolenaar  call delete('XTest_listchars')
54041fb723eSBram Moolenaarendfunc
54141fb723eSBram Moolenaar
54241fb723eSBram Moolenaar
5436d91bcb4SBram Moolenaar" vim: shiftwidth=2 sts=2 expandtab
544