1300af82eSBram Moolenaar" Test 'statusline' 2300af82eSBram Moolenaar" 3300af82eSBram Moolenaar" Not tested yet: 4300af82eSBram Moolenaar" %N 5300af82eSBram Moolenaar 6300af82eSBram Moolenaarsource view_util.vim 75a4c3082SBram Moolenaarsource check.vim 8dbe5d361SBram Moolenaarsource screendump.vim 9300af82eSBram Moolenaar 10300af82eSBram Moolenaarfunc s:get_statusline() 11300af82eSBram Moolenaar return ScreenLines(&lines - 1, &columns)[0] 12300af82eSBram Moolenaarendfunc 13300af82eSBram Moolenaar 14300af82eSBram Moolenaarfunc StatuslineWithCaughtError() 15a742e084SBram Moolenaar let s:func_in_statusline_called = 1 16a742e084SBram Moolenaar try 17a742e084SBram Moolenaar call eval('unknown expression') 18a742e084SBram Moolenaar catch 19a742e084SBram Moolenaar endtry 20a742e084SBram Moolenaar return '' 21300af82eSBram Moolenaarendfunc 22a742e084SBram Moolenaar 23300af82eSBram Moolenaarfunc StatuslineWithError() 24a742e084SBram Moolenaar let s:func_in_statusline_called = 1 25a742e084SBram Moolenaar call eval('unknown expression') 26a742e084SBram Moolenaar return '' 27300af82eSBram Moolenaarendfunc 28a742e084SBram Moolenaar 29300af82eSBram Moolenaar" Function used to display syntax group. 30300af82eSBram Moolenaarfunc SyntaxItem() 311c6fd1e1SBram Moolenaar call assert_equal(s:expected_curbuf, g:actual_curbuf) 321c6fd1e1SBram Moolenaar call assert_equal(s:expected_curwin, g:actual_curwin) 33300af82eSBram Moolenaar return synIDattr(synID(line("."), col("."),1), "name") 34300af82eSBram Moolenaarendfunc 35300af82eSBram Moolenaar 36300af82eSBram Moolenaarfunc Test_caught_error_in_statusline() 37a742e084SBram Moolenaar let s:func_in_statusline_called = 0 38a742e084SBram Moolenaar set laststatus=2 39a742e084SBram Moolenaar let statusline = '%{StatuslineWithCaughtError()}' 40a742e084SBram Moolenaar let &statusline = statusline 41a742e084SBram Moolenaar redrawstatus 42a742e084SBram Moolenaar call assert_true(s:func_in_statusline_called) 43a742e084SBram Moolenaar call assert_equal(statusline, &statusline) 44a742e084SBram Moolenaar set statusline= 45300af82eSBram Moolenaarendfunc 46a742e084SBram Moolenaar 47300af82eSBram Moolenaarfunc Test_statusline_will_be_disabled_with_error() 48a742e084SBram Moolenaar let s:func_in_statusline_called = 0 49a742e084SBram Moolenaar set laststatus=2 50a742e084SBram Moolenaar let statusline = '%{StatuslineWithError()}' 51a742e084SBram Moolenaar try 52a742e084SBram Moolenaar let &statusline = statusline 53a742e084SBram Moolenaar redrawstatus 54a742e084SBram Moolenaar catch 55a742e084SBram Moolenaar endtry 56a742e084SBram Moolenaar call assert_true(s:func_in_statusline_called) 57a742e084SBram Moolenaar call assert_equal('', &statusline) 58a742e084SBram Moolenaar set statusline= 59300af82eSBram Moolenaarendfunc 60300af82eSBram Moolenaar 61300af82eSBram Moolenaarfunc Test_statusline() 625a4c3082SBram Moolenaar CheckFeature quickfix 635a4c3082SBram Moolenaar 644014e2ceSBram Moolenaar " %a: Argument list ({current} of {max}) 654014e2ceSBram Moolenaar set statusline=%a 664014e2ceSBram Moolenaar call assert_match('^\s*$', s:get_statusline()) 674014e2ceSBram Moolenaar arglocal a1 a2 684014e2ceSBram Moolenaar rewind 694014e2ceSBram Moolenaar call assert_match('^ (1 of 2)\s*$', s:get_statusline()) 704014e2ceSBram Moolenaar next 714014e2ceSBram Moolenaar call assert_match('^ (2 of 2)\s*$', s:get_statusline()) 724014e2ceSBram Moolenaar e Xstatusline 734014e2ceSBram Moolenaar call assert_match('^ ((2) of 2)\s*$', s:get_statusline()) 744014e2ceSBram Moolenaar 75300af82eSBram Moolenaar only 76300af82eSBram Moolenaar set laststatus=2 77300af82eSBram Moolenaar set splitbelow 78316c1679SBram Moolenaar call setline(1, range(1, 10000)) 79300af82eSBram Moolenaar 80300af82eSBram Moolenaar " %b: Value of character under cursor. 81300af82eSBram Moolenaar " %B: As above, in hexadecimal. 82316c1679SBram Moolenaar call cursor(9000, 1) 83300af82eSBram Moolenaar set statusline=%b,%B 84316c1679SBram Moolenaar call assert_match('^57,39\s*$', s:get_statusline()) 85300af82eSBram Moolenaar 86300af82eSBram Moolenaar " %o: Byte number in file of byte under cursor, first byte is 1. 87300af82eSBram Moolenaar " %O: As above, in hexadecimal. 88300af82eSBram Moolenaar set statusline=%o,%O 89300af82eSBram Moolenaar set fileformat=dos 90316c1679SBram Moolenaar call assert_match('^52888,CE98\s*$', s:get_statusline()) 91300af82eSBram Moolenaar set fileformat=mac 92316c1679SBram Moolenaar call assert_match('^43889,AB71\s*$', s:get_statusline()) 93300af82eSBram Moolenaar set fileformat=unix 94316c1679SBram Moolenaar call assert_match('^43889,AB71\s*$', s:get_statusline()) 95300af82eSBram Moolenaar set fileformat& 96300af82eSBram Moolenaar 97300af82eSBram Moolenaar " %f: Path to the file in the buffer, as typed or relative to current dir. 98300af82eSBram Moolenaar set statusline=%f 99300af82eSBram Moolenaar call assert_match('^Xstatusline\s*$', s:get_statusline()) 100300af82eSBram Moolenaar 101300af82eSBram Moolenaar " %F: Full path to the file in the buffer. 102300af82eSBram Moolenaar set statusline=%F 103300af82eSBram Moolenaar call assert_match('/testdir/Xstatusline\s*$', s:get_statusline()) 104300af82eSBram Moolenaar 105832adf9bSBram Moolenaar " Test for min and max width with %(. For some reason, if this test is moved 106832adf9bSBram Moolenaar " after the below test for the help buffer flag, then the code to truncate 107832adf9bSBram Moolenaar " the string is not executed. 108832adf9bSBram Moolenaar set statusline=%015(%f%) 109832adf9bSBram Moolenaar call assert_match('^ Xstatusline\s*$', s:get_statusline()) 110832adf9bSBram Moolenaar set statusline=%.6(%f%) 111832adf9bSBram Moolenaar call assert_match('^<sline\s*$', s:get_statusline()) 112832adf9bSBram Moolenaar set statusline=%14f 113832adf9bSBram Moolenaar call assert_match('^ Xstatusline\s*$', s:get_statusline()) 114832adf9bSBram Moolenaar set statusline=%.4L 115832adf9bSBram Moolenaar call assert_match('^10>3\s*$', s:get_statusline()) 116832adf9bSBram Moolenaar 117300af82eSBram Moolenaar " %h: Help buffer flag, text is "[help]". 118300af82eSBram Moolenaar " %H: Help buffer flag, text is ",HLP". 119300af82eSBram Moolenaar set statusline=%h,%H 120300af82eSBram Moolenaar call assert_match('^,\s*$', s:get_statusline()) 121300af82eSBram Moolenaar help 122300af82eSBram Moolenaar call assert_match('^\[Help\],HLP\s*$', s:get_statusline()) 123300af82eSBram Moolenaar helpclose 124300af82eSBram Moolenaar 125300af82eSBram Moolenaar " %k: Value of "b:keymap_name" or 'keymap' 126300af82eSBram Moolenaar " when :lmap mappings are being used: <keymap>" 127300af82eSBram Moolenaar set statusline=%k 128300af82eSBram Moolenaar if has('keymap') 129300af82eSBram Moolenaar set keymap=esperanto 130300af82eSBram Moolenaar call assert_match('^<Eo>\s*$', s:get_statusline()) 131300af82eSBram Moolenaar set keymap& 132300af82eSBram Moolenaar else 133300af82eSBram Moolenaar call assert_match('^\s*$', s:get_statusline()) 134300af82eSBram Moolenaar endif 135300af82eSBram Moolenaar 136300af82eSBram Moolenaar " %l: Line number. 137300af82eSBram Moolenaar " %L: Number of line in buffer. 138300af82eSBram Moolenaar " %c: Column number. 139300af82eSBram Moolenaar set statusline=%l/%L,%c 140316c1679SBram Moolenaar call assert_match('^9000/10000,1\s*$', s:get_statusline()) 141300af82eSBram Moolenaar 142300af82eSBram Moolenaar " %m: Modified flag, text is "[+]", "[-]" if 'modifiable' is off. 143300af82eSBram Moolenaar " %M: Modified flag, text is ",+" or ",-". 144300af82eSBram Moolenaar set statusline=%m%M 145300af82eSBram Moolenaar call assert_match('^\[+\],+\s*$', s:get_statusline()) 146300af82eSBram Moolenaar set nomodifiable 147300af82eSBram Moolenaar call assert_match('^\[+-\],+-\s*$', s:get_statusline()) 148300af82eSBram Moolenaar write 149300af82eSBram Moolenaar call assert_match('^\[-\],-\s*$', s:get_statusline()) 150300af82eSBram Moolenaar set modifiable& 151300af82eSBram Moolenaar call assert_match('^\s*$', s:get_statusline()) 152300af82eSBram Moolenaar 153300af82eSBram Moolenaar " %n: Buffer number. 154300af82eSBram Moolenaar set statusline=%n 155300af82eSBram Moolenaar call assert_match('^'.bufnr('%').'\s*$', s:get_statusline()) 156300af82eSBram Moolenaar 157300af82eSBram Moolenaar " %p: Percentage through file in lines as in CTRL-G. 158300af82eSBram Moolenaar " %P: Percentage through file of displayed window. 159300af82eSBram Moolenaar set statusline=%p,%P 160300af82eSBram Moolenaar 0 161300af82eSBram Moolenaar call assert_match('^0,Top\s*$', s:get_statusline()) 162300af82eSBram Moolenaar norm G 163300af82eSBram Moolenaar call assert_match('^100,Bot\s*$', s:get_statusline()) 164316c1679SBram Moolenaar 9000 165300af82eSBram Moolenaar " Don't check the exact percentage as it depends on the window size 166300af82eSBram Moolenaar call assert_match('^90,\(Top\|Bot\|\d\+%\)\s*$', s:get_statusline()) 167300af82eSBram Moolenaar 168300af82eSBram Moolenaar " %q: "[Quickfix List]", "[Location List]" or empty. 169300af82eSBram Moolenaar set statusline=%q 170300af82eSBram Moolenaar call assert_match('^\s*$', s:get_statusline()) 171300af82eSBram Moolenaar copen 172300af82eSBram Moolenaar call assert_match('^\[Quickfix List\]\s*$', s:get_statusline()) 173300af82eSBram Moolenaar cclose 174300af82eSBram Moolenaar lexpr getline(1, 2) 175300af82eSBram Moolenaar lopen 176300af82eSBram Moolenaar call assert_match('^\[Location List\]\s*$', s:get_statusline()) 177300af82eSBram Moolenaar lclose 178300af82eSBram Moolenaar 179300af82eSBram Moolenaar " %r: Readonly flag, text is "[RO]". 180300af82eSBram Moolenaar " %R: Readonly flag, text is ",RO". 181300af82eSBram Moolenaar set statusline=%r,%R 182300af82eSBram Moolenaar call assert_match('^,\s*$', s:get_statusline()) 183300af82eSBram Moolenaar help 184300af82eSBram Moolenaar call assert_match('^\[RO\],RO\s*$', s:get_statusline()) 185300af82eSBram Moolenaar helpclose 186300af82eSBram Moolenaar 187300af82eSBram Moolenaar " %t: File name (tail) of file in the buffer. 188300af82eSBram Moolenaar set statusline=%t 189300af82eSBram Moolenaar call assert_match('^Xstatusline\s*$', s:get_statusline()) 190300af82eSBram Moolenaar 191300af82eSBram Moolenaar " %v: Virtual column number. 192300af82eSBram Moolenaar " %V: Virtual column number as -{num}. Not displayed if equal to 'c'. 193316c1679SBram Moolenaar call cursor(9000, 2) 194300af82eSBram Moolenaar set statusline=%v,%V 195300af82eSBram Moolenaar call assert_match('^2,\s*$', s:get_statusline()) 196300af82eSBram Moolenaar set virtualedit=all 197300af82eSBram Moolenaar norm 10| 198300af82eSBram Moolenaar call assert_match('^10,-10\s*$', s:get_statusline()) 199300af82eSBram Moolenaar set virtualedit& 200300af82eSBram Moolenaar 201300af82eSBram Moolenaar " %w: Preview window flag, text is "[Preview]". 202300af82eSBram Moolenaar " %W: Preview window flag, text is ",PRV". 203300af82eSBram Moolenaar set statusline=%w%W 204300af82eSBram Moolenaar call assert_match('^\s*$', s:get_statusline()) 205300af82eSBram Moolenaar pedit 206300af82eSBram Moolenaar wincmd j 207300af82eSBram Moolenaar call assert_match('^\[Preview\],PRV\s*$', s:get_statusline()) 208300af82eSBram Moolenaar pclose 209300af82eSBram Moolenaar 210300af82eSBram Moolenaar " %y: Type of file in the buffer, e.g., "[vim]". See 'filetype'. 211300af82eSBram Moolenaar " %Y: Type of file in the buffer, e.g., ",VIM". See 'filetype'. 212300af82eSBram Moolenaar set statusline=%y\ %Y 213300af82eSBram Moolenaar call assert_match('^\s*$', s:get_statusline()) 214300af82eSBram Moolenaar setfiletype vim 215300af82eSBram Moolenaar call assert_match('^\[vim\] VIM\s*$', s:get_statusline()) 216300af82eSBram Moolenaar 217300af82eSBram Moolenaar " %=: Separation point between left and right aligned items. 218300af82eSBram Moolenaar set statusline=foo%=bar 219300af82eSBram Moolenaar call assert_match('^foo\s\+bar\s*$', s:get_statusline()) 220300af82eSBram Moolenaar 221300af82eSBram Moolenaar " Test min/max width, leading zeroes, left/right justify. 222300af82eSBram Moolenaar set statusline=%04B 223316c1679SBram Moolenaar call cursor(9000, 1) 224316c1679SBram Moolenaar call assert_match('^0039\s*$', s:get_statusline()) 225300af82eSBram Moolenaar set statusline=#%4B# 226316c1679SBram Moolenaar call assert_match('^# 39#\s*$', s:get_statusline()) 227300af82eSBram Moolenaar set statusline=#%-4B# 228316c1679SBram Moolenaar call assert_match('^#39 #\s*$', s:get_statusline()) 229300af82eSBram Moolenaar set statusline=%.6f 230300af82eSBram Moolenaar call assert_match('^<sline\s*$', s:get_statusline()) 231300af82eSBram Moolenaar 232300af82eSBram Moolenaar " %<: Where to truncate. 233316c1679SBram Moolenaar " First check with when %< should not truncate with many columns 234316c1679SBram Moolenaar exe 'set statusline=a%<b' . repeat('c', &columns - 3) . 'd' 235316c1679SBram Moolenaar call assert_match('^abc\+d$', s:get_statusline()) 236316c1679SBram Moolenaar exe 'set statusline=a' . repeat('b', &columns - 2) . '%<c' 237316c1679SBram Moolenaar call assert_match('^ab\+c$', s:get_statusline()) 238316c1679SBram Moolenaar " Then check when %< should truncate when there with too few columns. 239316c1679SBram Moolenaar exe 'set statusline=a%<b' . repeat('c', &columns - 2) . 'd' 240316c1679SBram Moolenaar call assert_match('^a<c\+d$', s:get_statusline()) 241316c1679SBram Moolenaar exe 'set statusline=a' . repeat('b', &columns - 1) . '%<c' 242316c1679SBram Moolenaar call assert_match('^ab\+>$', s:get_statusline()) 243300af82eSBram Moolenaar 244300af82eSBram Moolenaar "%{: Evaluate expression between '%{' and '}' and substitute result. 245300af82eSBram Moolenaar syntax on 2461c6fd1e1SBram Moolenaar let s:expected_curbuf = string(bufnr('')) 2471c6fd1e1SBram Moolenaar let s:expected_curwin = string(win_getid()) 248300af82eSBram Moolenaar set statusline=%{SyntaxItem()} 249300af82eSBram Moolenaar call assert_match('^vimNumber\s*$', s:get_statusline()) 250300af82eSBram Moolenaar s/^/"/ 251300af82eSBram Moolenaar call assert_match('^vimLineComment\s*$', s:get_statusline()) 252300af82eSBram Moolenaar syntax off 253300af82eSBram Moolenaar 25430e3de21Sshadmansaleh "%{%expr%}: evaluates enxpressions present in result of expr 25530e3de21Sshadmansaleh func! Inner_eval() 25630e3de21Sshadmansaleh return '%n some other text' 25730e3de21Sshadmansaleh endfunc 25830e3de21Sshadmansaleh func! Outer_eval() 25930e3de21Sshadmansaleh return 'some text %{%Inner_eval()%}' 26030e3de21Sshadmansaleh endfunc 26130e3de21Sshadmansaleh set statusline=%{%Outer_eval()%} 26230e3de21Sshadmansaleh call assert_match('^some text ' . bufnr() . ' some other text\s*$', s:get_statusline()) 26330e3de21Sshadmansaleh delfunc Inner_eval 26430e3de21Sshadmansaleh delfunc Outer_eval 26530e3de21Sshadmansaleh 26630e3de21Sshadmansaleh "%{%expr%}: Doesn't get stuck in recursion 26730e3de21Sshadmansaleh func! Recurse_eval() 26830e3de21Sshadmansaleh return '%{%Recurse_eval()%}' 26930e3de21Sshadmansaleh endfunc 27030e3de21Sshadmansaleh set statusline=%{%Recurse_eval()%} 27130e3de21Sshadmansaleh call assert_match('^%{%Recurse_eval()%}\s*$', s:get_statusline()) 27230e3de21Sshadmansaleh delfunc Recurse_eval 27330e3de21Sshadmansaleh 274300af82eSBram Moolenaar "%(: Start of item group. 275300af82eSBram Moolenaar set statusline=ab%(cd%q%)de 276300af82eSBram Moolenaar call assert_match('^abde\s*$', s:get_statusline()) 277300af82eSBram Moolenaar copen 2781ef9bbe2SBram Moolenaar call assert_match('^abcd\[Quickfix List]de\s*$', s:get_statusline()) 279300af82eSBram Moolenaar cclose 280300af82eSBram Moolenaar 281300af82eSBram Moolenaar " %#: Set highlight group. The name must follow and then a # again. 282300af82eSBram Moolenaar set statusline=ab%#Todo#cd%#Error#ef 283300af82eSBram Moolenaar call assert_match('^abcdef\s*$', s:get_statusline()) 284300af82eSBram Moolenaar let sa1=screenattr(&lines - 1, 1) 285300af82eSBram Moolenaar let sa2=screenattr(&lines - 1, 3) 286300af82eSBram Moolenaar let sa3=screenattr(&lines - 1, 5) 287300af82eSBram Moolenaar call assert_notequal(sa1, sa2) 288300af82eSBram Moolenaar call assert_notequal(sa1, sa3) 289300af82eSBram Moolenaar call assert_notequal(sa2, sa3) 290300af82eSBram Moolenaar call assert_equal(sa1, screenattr(&lines - 1, 2)) 291300af82eSBram Moolenaar call assert_equal(sa2, screenattr(&lines - 1, 4)) 292300af82eSBram Moolenaar call assert_equal(sa3, screenattr(&lines - 1, 6)) 293300af82eSBram Moolenaar call assert_equal(sa3, screenattr(&lines - 1, 7)) 294300af82eSBram Moolenaar 295300af82eSBram Moolenaar " %*: Set highlight group to User{N} 296300af82eSBram Moolenaar set statusline=a%1*b%0*c 297300af82eSBram Moolenaar call assert_match('^abc\s*$', s:get_statusline()) 298300af82eSBram Moolenaar let sa1=screenattr(&lines - 1, 1) 299300af82eSBram Moolenaar let sa2=screenattr(&lines - 1, 2) 300300af82eSBram Moolenaar let sa3=screenattr(&lines - 1, 3) 301300af82eSBram Moolenaar call assert_equal(sa1, sa3) 302300af82eSBram Moolenaar call assert_notequal(sa1, sa2) 303300af82eSBram Moolenaar 3046b89dbb5SBram Moolenaar " An empty group that contains highlight changes 3056b89dbb5SBram Moolenaar let g:a = '' 3066b89dbb5SBram Moolenaar set statusline=ab%(cd%1*%{g:a}%*%)de 3076b89dbb5SBram Moolenaar call assert_match('^abde\s*$', s:get_statusline()) 3086b89dbb5SBram Moolenaar let sa1=screenattr(&lines - 1, 1) 3096b89dbb5SBram Moolenaar let sa2=screenattr(&lines - 1, 4) 3106b89dbb5SBram Moolenaar call assert_equal(sa1, sa2) 3116b89dbb5SBram Moolenaar let g:a = 'X' 3126b89dbb5SBram Moolenaar call assert_match('^abcdXde\s*$', s:get_statusline()) 3136b89dbb5SBram Moolenaar let sa1=screenattr(&lines - 1, 1) 3146b89dbb5SBram Moolenaar let sa2=screenattr(&lines - 1, 5) 3156b89dbb5SBram Moolenaar let sa3=screenattr(&lines - 1, 7) 3166b89dbb5SBram Moolenaar call assert_equal(sa1, sa3) 3176b89dbb5SBram Moolenaar call assert_notequal(sa1, sa2) 3186b89dbb5SBram Moolenaar 3196b89dbb5SBram Moolenaar let g:a = '' 3206b89dbb5SBram Moolenaar set statusline=ab%1*%(cd%*%{g:a}%1*%)de 3216b89dbb5SBram Moolenaar call assert_match('^abde\s*$', s:get_statusline()) 3226b89dbb5SBram Moolenaar let sa1=screenattr(&lines - 1, 1) 3236b89dbb5SBram Moolenaar let sa2=screenattr(&lines - 1, 4) 3246b89dbb5SBram Moolenaar call assert_notequal(sa1, sa2) 3256b89dbb5SBram Moolenaar let g:a = 'X' 3266b89dbb5SBram Moolenaar call assert_match('^abcdXde\s*$', s:get_statusline()) 3276b89dbb5SBram Moolenaar let sa1=screenattr(&lines - 1, 1) 3286b89dbb5SBram Moolenaar let sa2=screenattr(&lines - 1, 3) 3296b89dbb5SBram Moolenaar let sa3=screenattr(&lines - 1, 5) 3306b89dbb5SBram Moolenaar let sa4=screenattr(&lines - 1, 7) 3316b89dbb5SBram Moolenaar call assert_notequal(sa1, sa2) 3326b89dbb5SBram Moolenaar call assert_equal(sa1, sa3) 3336b89dbb5SBram Moolenaar call assert_equal(sa2, sa4) 3346b89dbb5SBram Moolenaar 3356b89dbb5SBram Moolenaar " An empty group that contains highlight changes and doesn't reset them 3366b89dbb5SBram Moolenaar let g:a = '' 3376b89dbb5SBram Moolenaar set statusline=ab%(cd%1*%{g:a}%)de 3386b89dbb5SBram Moolenaar call assert_match('^abcdde\s*$', s:get_statusline()) 3396b89dbb5SBram Moolenaar let sa1=screenattr(&lines - 1, 1) 3406b89dbb5SBram Moolenaar let sa2=screenattr(&lines - 1, 5) 3416b89dbb5SBram Moolenaar call assert_notequal(sa1, sa2) 3426b89dbb5SBram Moolenaar let g:a = 'X' 3436b89dbb5SBram Moolenaar call assert_match('^abcdXde\s*$', s:get_statusline()) 3446b89dbb5SBram Moolenaar let sa1=screenattr(&lines - 1, 1) 3456b89dbb5SBram Moolenaar let sa2=screenattr(&lines - 1, 5) 3466b89dbb5SBram Moolenaar let sa3=screenattr(&lines - 1, 7) 3476b89dbb5SBram Moolenaar call assert_notequal(sa1, sa2) 3486b89dbb5SBram Moolenaar call assert_equal(sa2, sa3) 3496b89dbb5SBram Moolenaar 3506b89dbb5SBram Moolenaar let g:a = '' 3516b89dbb5SBram Moolenaar set statusline=ab%1*%(cd%*%{g:a}%)de 3526b89dbb5SBram Moolenaar call assert_match('^abcdde\s*$', s:get_statusline()) 3536b89dbb5SBram Moolenaar let sa1=screenattr(&lines - 1, 1) 3546b89dbb5SBram Moolenaar let sa2=screenattr(&lines - 1, 3) 3556b89dbb5SBram Moolenaar let sa3=screenattr(&lines - 1, 5) 3566b89dbb5SBram Moolenaar call assert_notequal(sa1, sa2) 3576b89dbb5SBram Moolenaar call assert_equal(sa1, sa3) 3586b89dbb5SBram Moolenaar let g:a = 'X' 3596b89dbb5SBram Moolenaar call assert_match('^abcdXde\s*$', s:get_statusline()) 3606b89dbb5SBram Moolenaar let sa1=screenattr(&lines - 1, 1) 3616b89dbb5SBram Moolenaar let sa2=screenattr(&lines - 1, 3) 3626b89dbb5SBram Moolenaar let sa3=screenattr(&lines - 1, 5) 3636b89dbb5SBram Moolenaar let sa4=screenattr(&lines - 1, 7) 3646b89dbb5SBram Moolenaar call assert_notequal(sa1, sa2) 3656b89dbb5SBram Moolenaar call assert_equal(sa1, sa3) 3666b89dbb5SBram Moolenaar call assert_equal(sa1, sa4) 3676b89dbb5SBram Moolenaar 368235dddf1SBram Moolenaar let g:a = '' 369235dddf1SBram Moolenaar set statusline=%#Error#{%(\ %{g:a}\ %)} 370235dddf1SBram Moolenaar call assert_match('^{}\s*$', s:get_statusline()) 371235dddf1SBram Moolenaar let g:a = 'X' 372235dddf1SBram Moolenaar call assert_match('^{ X }\s*$', s:get_statusline()) 373235dddf1SBram Moolenaar 374300af82eSBram Moolenaar " %%: a percent sign. 375300af82eSBram Moolenaar set statusline=10%% 376300af82eSBram Moolenaar call assert_match('^10%\s*$', s:get_statusline()) 377300af82eSBram Moolenaar 378300af82eSBram Moolenaar " %!: evaluated expression is used as the option value 379300af82eSBram Moolenaar set statusline=%!2*3+1 380300af82eSBram Moolenaar call assert_match('7\s*$', s:get_statusline()) 381300af82eSBram Moolenaar 3821c6fd1e1SBram Moolenaar func GetNested() 3831c6fd1e1SBram Moolenaar call assert_equal(string(win_getid()), g:actual_curwin) 3841c6fd1e1SBram Moolenaar call assert_equal(string(bufnr('')), g:actual_curbuf) 3851c6fd1e1SBram Moolenaar return 'nested' 3861c6fd1e1SBram Moolenaar endfunc 3871c6fd1e1SBram Moolenaar func GetStatusLine() 3881c6fd1e1SBram Moolenaar call assert_equal(win_getid(), g:statusline_winid) 3891c6fd1e1SBram Moolenaar return 'the %{GetNested()} line' 3901c6fd1e1SBram Moolenaar endfunc 3911c6fd1e1SBram Moolenaar set statusline=%!GetStatusLine() 3921c6fd1e1SBram Moolenaar call assert_match('the nested line', s:get_statusline()) 3931c6fd1e1SBram Moolenaar call assert_false(exists('g:actual_curwin')) 3941c6fd1e1SBram Moolenaar call assert_false(exists('g:actual_curbuf')) 3951c6fd1e1SBram Moolenaar call assert_false(exists('g:statusline_winid')) 3961c6fd1e1SBram Moolenaar delfunc GetNested 3971c6fd1e1SBram Moolenaar delfunc GetStatusLine 3981c6fd1e1SBram Moolenaar 3998133cc6bSBram Moolenaar " Test statusline works with 80+ items 4008133cc6bSBram Moolenaar function! StatusLabel() 4018133cc6bSBram Moolenaar redrawstatus 4028133cc6bSBram Moolenaar return '[label]' 4038133cc6bSBram Moolenaar endfunc 4048133cc6bSBram Moolenaar let statusline = '%{StatusLabel()}' 4058133cc6bSBram Moolenaar for i in range(150) 4068133cc6bSBram Moolenaar let statusline .= '%#TabLine' . (i % 2 == 0 ? 'Fill' : 'Sel') . '#' . string(i)[0] 4078133cc6bSBram Moolenaar endfor 4088133cc6bSBram Moolenaar let &statusline = statusline 4098133cc6bSBram Moolenaar redrawstatus 4108133cc6bSBram Moolenaar set statusline& 4118133cc6bSBram Moolenaar delfunc StatusLabel 4128133cc6bSBram Moolenaar 4138133cc6bSBram Moolenaar 414300af82eSBram Moolenaar " Check statusline in current and non-current window 415300af82eSBram Moolenaar " with the 'fillchars' option. 416300af82eSBram Moolenaar set fillchars=stl:^,stlnc:=,vert:\|,fold:-,diff:- 417300af82eSBram Moolenaar vsplit 418300af82eSBram Moolenaar set statusline=x%=y 419300af82eSBram Moolenaar call assert_match('^x^\+y^x=\+y$', s:get_statusline()) 420300af82eSBram Moolenaar set fillchars& 421300af82eSBram Moolenaar close 422300af82eSBram Moolenaar 423300af82eSBram Moolenaar %bw! 424300af82eSBram Moolenaar call delete('Xstatusline') 425300af82eSBram Moolenaar set statusline& 426300af82eSBram Moolenaar set laststatus& 427300af82eSBram Moolenaar set splitbelow& 428300af82eSBram Moolenaarendfunc 429dee50a51SBram Moolenaar 430dee50a51SBram Moolenaarfunc Test_statusline_visual() 431dee50a51SBram Moolenaar func CallWordcount() 432dee50a51SBram Moolenaar call wordcount() 433dee50a51SBram Moolenaar endfunc 434dee50a51SBram Moolenaar new x1 435dee50a51SBram Moolenaar setl statusline=count=%{CallWordcount()} 436dee50a51SBram Moolenaar " buffer must not be empty 437dee50a51SBram Moolenaar call setline(1, 'hello') 438dee50a51SBram Moolenaar 439dee50a51SBram Moolenaar " window with more lines than x1 440dee50a51SBram Moolenaar new x2 441dee50a51SBram Moolenaar call setline(1, range(10)) 442dee50a51SBram Moolenaar $ 443dee50a51SBram Moolenaar " Visual mode in line below liast line in x1 should not give ml_get error 444dee50a51SBram Moolenaar call feedkeys("\<C-V>", "xt") 445dee50a51SBram Moolenaar redraw 446dee50a51SBram Moolenaar 447dee50a51SBram Moolenaar delfunc CallWordcount 448dee50a51SBram Moolenaar bwipe! x1 449dee50a51SBram Moolenaar bwipe! x2 450dee50a51SBram Moolenaarendfunc 451dbe5d361SBram Moolenaar 452dbe5d361SBram Moolenaarfunc Test_statusline_removed_group() 453dbe5d361SBram Moolenaar CheckScreendump 454dbe5d361SBram Moolenaar 455dbe5d361SBram Moolenaar let lines =<< trim END 456dbe5d361SBram Moolenaar scriptencoding utf-8 457dbe5d361SBram Moolenaar set laststatus=2 458dbe5d361SBram Moolenaar let &statusline = '%#StatColorHi2#%(✓%#StatColorHi2#%) Q≡' 459dbe5d361SBram Moolenaar END 460dbe5d361SBram Moolenaar call writefile(lines, 'XTest_statusline') 461dbe5d361SBram Moolenaar 462dbe5d361SBram Moolenaar let buf = RunVimInTerminal('-S XTest_statusline', {'rows': 10, 'cols': 50}) 4636a2c5a7dSBram Moolenaar call TermWait(buf, 50) 464dbe5d361SBram Moolenaar call VerifyScreenDump(buf, 'Test_statusline_1', {}) 465dbe5d361SBram Moolenaar 466dbe5d361SBram Moolenaar " clean up 467dbe5d361SBram Moolenaar call StopVimInTerminal(buf) 468dbe5d361SBram Moolenaar call delete('XTest_statusline') 469dbe5d361SBram Moolenaarendfunc 470832adf9bSBram Moolenaar 471ce0b7571SBram Moolenaarfunc Test_statusline_using_mode() 472ce0b7571SBram Moolenaar CheckScreendump 473ce0b7571SBram Moolenaar 474ce0b7571SBram Moolenaar let lines =<< trim END 475d8db8383SBram Moolenaar setlocal statusline=-%{mode()}- 476d8db8383SBram Moolenaar split 477d8db8383SBram Moolenaar setlocal statusline=+%{mode()}+ 478ce0b7571SBram Moolenaar END 479ce0b7571SBram Moolenaar call writefile(lines, 'XTest_statusline') 480ce0b7571SBram Moolenaar 481d8db8383SBram Moolenaar let buf = RunVimInTerminal('-S XTest_statusline', {'rows': 7, 'cols': 50}) 482ce0b7571SBram Moolenaar call VerifyScreenDump(buf, 'Test_statusline_mode_1', {}) 483ce0b7571SBram Moolenaar 484ce0b7571SBram Moolenaar call term_sendkeys(buf, ":") 485ce0b7571SBram Moolenaar call VerifyScreenDump(buf, 'Test_statusline_mode_2', {}) 486ce0b7571SBram Moolenaar 487ce0b7571SBram Moolenaar " clean up 488d8db8383SBram Moolenaar call term_sendkeys(buf, "close\<CR>") 489ce0b7571SBram Moolenaar call StopVimInTerminal(buf) 490ce0b7571SBram Moolenaar call delete('XTest_statusline') 491ce0b7571SBram Moolenaarendfunc 492ce0b7571SBram Moolenaar 493668008beSBram Moolenaarfunc Test_statusline_after_split_vsplit() 494668008beSBram Moolenaar only 495668008beSBram Moolenaar 496668008beSBram Moolenaar " Make the status line of each window show the window number. 497668008beSBram Moolenaar set ls=2 stl=%{winnr()} 498668008beSBram Moolenaar 499668008beSBram Moolenaar split | redraw 500668008beSBram Moolenaar vsplit | redraw 501668008beSBram Moolenaar 502668008beSBram Moolenaar " The status line of the third window should read '3' here. 503668008beSBram Moolenaar call assert_equal('3', nr2char(screenchar(&lines - 1, 1))) 504668008beSBram Moolenaar 505668008beSBram Moolenaar only 506668008beSBram Moolenaar set ls& stl& 507668008beSBram Moolenaarendfunc 508668008beSBram Moolenaar 509008bff96SBram Moolenaar" Test using a multibyte character for 'stl' and 'stlnc' items in 'fillchars' 510008bff96SBram Moolenaar" with a custom 'statusline' 511008bff96SBram Moolenaarfunc Test_statusline_mbyte_fillchar() 512008bff96SBram Moolenaar only 513008bff96SBram Moolenaar set laststatus=2 514008bff96SBram Moolenaar set fillchars=vert:\|,fold:-,stl:━,stlnc:═ 515008bff96SBram Moolenaar set statusline=a%=b 516008bff96SBram Moolenaar call assert_match('^a\+━\+b$', s:get_statusline()) 517008bff96SBram Moolenaar vnew 518008bff96SBram Moolenaar call assert_match('^a\+━\+b━a\+═\+b$', s:get_statusline()) 519008bff96SBram Moolenaar wincmd w 520008bff96SBram Moolenaar call assert_match('^a\+═\+b═a\+━\+b$', s:get_statusline()) 521008bff96SBram Moolenaar set statusline& fillchars& laststatus& 522008bff96SBram Moolenaar %bw! 523008bff96SBram Moolenaarendfunc 524668008beSBram Moolenaar 525*826bfe4bSBram Moolenaar" Used to write beyond allocated memory. This assumes MAXPATHL is 4096 bytes. 526*826bfe4bSBram Moolenaarfunc Test_statusline_verylong_filename() 527*826bfe4bSBram Moolenaar let fname = repeat('x', 4090) 528*826bfe4bSBram Moolenaar exe "new " .. fname 529*826bfe4bSBram Moolenaar set buftype=help 530*826bfe4bSBram Moolenaar set previewwindow 531*826bfe4bSBram Moolenaar redraw 532*826bfe4bSBram Moolenaar bwipe! 533*826bfe4bSBram Moolenaarendfunc 534*826bfe4bSBram Moolenaar 535832adf9bSBram Moolenaar" vim: shiftwidth=2 sts=2 expandtab 536