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