blob: de943f24666f1fa6be8cef33d54401ecea0a0fa6 [file] [log] [blame]
Bram Moolenaar300af822017-03-06 20:28:10 +01001" Test 'statusline'
2"
3" Not tested yet:
4" %a
5" %N
6" %T
7" %X
Bram Moolenaar300af822017-03-06 20:28:10 +01008
9source view_util.vim
10
11func s:get_statusline()
12 return ScreenLines(&lines - 1, &columns)[0]
13endfunc
14
15func StatuslineWithCaughtError()
Bram Moolenaara742e082016-04-05 21:10:38 +020016 let s:func_in_statusline_called = 1
17 try
18 call eval('unknown expression')
19 catch
20 endtry
21 return ''
Bram Moolenaar300af822017-03-06 20:28:10 +010022endfunc
Bram Moolenaara742e082016-04-05 21:10:38 +020023
Bram Moolenaar300af822017-03-06 20:28:10 +010024func StatuslineWithError()
Bram Moolenaara742e082016-04-05 21:10:38 +020025 let s:func_in_statusline_called = 1
26 call eval('unknown expression')
27 return ''
Bram Moolenaar300af822017-03-06 20:28:10 +010028endfunc
Bram Moolenaara742e082016-04-05 21:10:38 +020029
Bram Moolenaar300af822017-03-06 20:28:10 +010030" Function used to display syntax group.
31func SyntaxItem()
32 return synIDattr(synID(line("."),col("."),1),"name")
33endfunc
34
35func Test_caught_error_in_statusline()
Bram Moolenaara742e082016-04-05 21:10:38 +020036 let s:func_in_statusline_called = 0
37 set laststatus=2
38 let statusline = '%{StatuslineWithCaughtError()}'
39 let &statusline = statusline
40 redrawstatus
41 call assert_true(s:func_in_statusline_called)
42 call assert_equal(statusline, &statusline)
43 set statusline=
Bram Moolenaar300af822017-03-06 20:28:10 +010044endfunc
Bram Moolenaara742e082016-04-05 21:10:38 +020045
Bram Moolenaar300af822017-03-06 20:28:10 +010046func Test_statusline_will_be_disabled_with_error()
Bram Moolenaara742e082016-04-05 21:10:38 +020047 let s:func_in_statusline_called = 0
48 set laststatus=2
49 let statusline = '%{StatuslineWithError()}'
50 try
51 let &statusline = statusline
52 redrawstatus
53 catch
54 endtry
55 call assert_true(s:func_in_statusline_called)
56 call assert_equal('', &statusline)
57 set statusline=
Bram Moolenaar300af822017-03-06 20:28:10 +010058endfunc
59
60func Test_statusline()
61 new Xstatusline
62 only
63 set laststatus=2
64 set splitbelow
65 call setline(1, range(1, 200))
66
67 " %b: Value of character under cursor.
68 " %B: As above, in hexadecimal.
69 call cursor(180, 2)
70 set statusline=%b,%B
71 call assert_match('^56,38\s*$', s:get_statusline())
72
73 " %o: Byte number in file of byte under cursor, first byte is 1.
74 " %O: As above, in hexadecimal.
75 set statusline=%o,%O
76 set fileformat=dos
77 call assert_match('^789,315\s*$', s:get_statusline())
78 set fileformat=mac
79 call assert_match('^610,262\s*$', s:get_statusline())
80 set fileformat=unix
81 call assert_match('^610,262\s*$', s:get_statusline())
82 set fileformat&
83
84 " %f: Path to the file in the buffer, as typed or relative to current dir.
85 set statusline=%f
86 call assert_match('^Xstatusline\s*$', s:get_statusline())
87
88 " %F: Full path to the file in the buffer.
89 set statusline=%F
90 call assert_match('/testdir/Xstatusline\s*$', s:get_statusline())
91
92 " %h: Help buffer flag, text is "[help]".
93 " %H: Help buffer flag, text is ",HLP".
94 set statusline=%h,%H
95 call assert_match('^,\s*$', s:get_statusline())
96 help
97 call assert_match('^\[Help\],HLP\s*$', s:get_statusline())
98 helpclose
99
100 " %k: Value of "b:keymap_name" or 'keymap'
101 " when :lmap mappings are being used: <keymap>"
102 set statusline=%k
103 if has('keymap')
104 set keymap=esperanto
105 call assert_match('^<Eo>\s*$', s:get_statusline())
106 set keymap&
107 else
108 call assert_match('^\s*$', s:get_statusline())
109 endif
110
111 " %l: Line number.
112 " %L: Number of line in buffer.
113 " %c: Column number.
114 set statusline=%l/%L,%c
115 call assert_match('^180/200,2\s*$', s:get_statusline())
116
117 " %m: Modified flag, text is "[+]", "[-]" if 'modifiable' is off.
118 " %M: Modified flag, text is ",+" or ",-".
119 set statusline=%m%M
120 call assert_match('^\[+\],+\s*$', s:get_statusline())
121 set nomodifiable
122 call assert_match('^\[+-\],+-\s*$', s:get_statusline())
123 write
124 call assert_match('^\[-\],-\s*$', s:get_statusline())
125 set modifiable&
126 call assert_match('^\s*$', s:get_statusline())
127
128 " %n: Buffer number.
129 set statusline=%n
130 call assert_match('^'.bufnr('%').'\s*$', s:get_statusline())
131
132 " %p: Percentage through file in lines as in CTRL-G.
133 " %P: Percentage through file of displayed window.
134 set statusline=%p,%P
135 0
136 call assert_match('^0,Top\s*$', s:get_statusline())
137 norm G
138 call assert_match('^100,Bot\s*$', s:get_statusline())
139 180
140 " Don't check the exact percentage as it depends on the window size
141 call assert_match('^90,\(Top\|Bot\|\d\+%\)\s*$', s:get_statusline())
142
143 " %q: "[Quickfix List]", "[Location List]" or empty.
144 set statusline=%q
145 call assert_match('^\s*$', s:get_statusline())
146 copen
147 call assert_match('^\[Quickfix List\]\s*$', s:get_statusline())
148 cclose
149 lexpr getline(1, 2)
150 lopen
151 call assert_match('^\[Location List\]\s*$', s:get_statusline())
152 lclose
153
154 " %r: Readonly flag, text is "[RO]".
155 " %R: Readonly flag, text is ",RO".
156 set statusline=%r,%R
157 call assert_match('^,\s*$', s:get_statusline())
158 help
159 call assert_match('^\[RO\],RO\s*$', s:get_statusline())
160 helpclose
161
162 " %t: File name (tail) of file in the buffer.
163 set statusline=%t
164 call assert_match('^Xstatusline\s*$', s:get_statusline())
165
166 " %v: Virtual column number.
167 " %V: Virtual column number as -{num}. Not displayed if equal to 'c'.
168 call cursor(180, 2)
169 set statusline=%v,%V
170 call assert_match('^2,\s*$', s:get_statusline())
171 set virtualedit=all
172 norm 10|
173 call assert_match('^10,-10\s*$', s:get_statusline())
174 set virtualedit&
175
176 " %w: Preview window flag, text is "[Preview]".
177 " %W: Preview window flag, text is ",PRV".
178 set statusline=%w%W
179 call assert_match('^\s*$', s:get_statusline())
180 pedit
181 wincmd j
182 call assert_match('^\[Preview\],PRV\s*$', s:get_statusline())
183 pclose
184
185 " %y: Type of file in the buffer, e.g., "[vim]". See 'filetype'.
186 " %Y: Type of file in the buffer, e.g., ",VIM". See 'filetype'.
187 set statusline=%y\ %Y
188 call assert_match('^\s*$', s:get_statusline())
189 setfiletype vim
190 call assert_match('^\[vim\] VIM\s*$', s:get_statusline())
191
192 " %=: Separation point between left and right aligned items.
193 set statusline=foo%=bar
194 call assert_match('^foo\s\+bar\s*$', s:get_statusline())
195
196 " Test min/max width, leading zeroes, left/right justify.
197 set statusline=%04B
198 call cursor(180, 2)
199 call assert_match('^0038\s*$', s:get_statusline())
200 set statusline=#%4B#
201 call assert_match('^# 38#\s*$', s:get_statusline())
202 set statusline=#%-4B#
203 call assert_match('^#38 #\s*$', s:get_statusline())
204 set statusline=%.6f
205 call assert_match('^<sline\s*$', s:get_statusline())
206
207 " %<: Where to truncate.
208 exe 'set statusline=a%<b' . repeat('c', 1000) . 'd'
209 call assert_match('^a<c*d$', s:get_statusline())
210 exe 'set statusline=a' . repeat('b', 1000) . '%<c'
211 call assert_match('^ab*>$', s:get_statusline())
212
213 "%{: Evaluate expression between '%{' and '}' and substitute result.
214 syntax on
215 set statusline=%{SyntaxItem()}
216 call assert_match('^vimNumber\s*$', s:get_statusline())
217 s/^/"/
218 call assert_match('^vimLineComment\s*$', s:get_statusline())
219 syntax off
220
221 "%(: Start of item group.
222 set statusline=ab%(cd%q%)de
223 call assert_match('^abde\s*$', s:get_statusline())
224 copen
Bram Moolenaar1ef9bbe2017-06-17 20:08:20 +0200225 call assert_match('^abcd\[Quickfix List]de\s*$', s:get_statusline())
Bram Moolenaar300af822017-03-06 20:28:10 +0100226 cclose
227
228 " %#: Set highlight group. The name must follow and then a # again.
229 set statusline=ab%#Todo#cd%#Error#ef
230 call assert_match('^abcdef\s*$', s:get_statusline())
231 let sa1=screenattr(&lines - 1, 1)
232 let sa2=screenattr(&lines - 1, 3)
233 let sa3=screenattr(&lines - 1, 5)
234 call assert_notequal(sa1, sa2)
235 call assert_notequal(sa1, sa3)
236 call assert_notequal(sa2, sa3)
237 call assert_equal(sa1, screenattr(&lines - 1, 2))
238 call assert_equal(sa2, screenattr(&lines - 1, 4))
239 call assert_equal(sa3, screenattr(&lines - 1, 6))
240 call assert_equal(sa3, screenattr(&lines - 1, 7))
241
242 " %*: Set highlight group to User{N}
243 set statusline=a%1*b%0*c
244 call assert_match('^abc\s*$', s:get_statusline())
245 let sa1=screenattr(&lines - 1, 1)
246 let sa2=screenattr(&lines - 1, 2)
247 let sa3=screenattr(&lines - 1, 3)
248 call assert_equal(sa1, sa3)
249 call assert_notequal(sa1, sa2)
250
Bram Moolenaar6b89dbb2017-10-22 14:22:16 +0200251 " An empty group that contains highlight changes
252 let g:a = ''
253 set statusline=ab%(cd%1*%{g:a}%*%)de
254 call assert_match('^abde\s*$', s:get_statusline())
255 let sa1=screenattr(&lines - 1, 1)
256 let sa2=screenattr(&lines - 1, 4)
257 call assert_equal(sa1, sa2)
258 let g:a = 'X'
259 call assert_match('^abcdXde\s*$', s:get_statusline())
260 let sa1=screenattr(&lines - 1, 1)
261 let sa2=screenattr(&lines - 1, 5)
262 let sa3=screenattr(&lines - 1, 7)
263 call assert_equal(sa1, sa3)
264 call assert_notequal(sa1, sa2)
265
266 let g:a = ''
267 set statusline=ab%1*%(cd%*%{g:a}%1*%)de
268 call assert_match('^abde\s*$', s:get_statusline())
269 let sa1=screenattr(&lines - 1, 1)
270 let sa2=screenattr(&lines - 1, 4)
271 call assert_notequal(sa1, sa2)
272 let g:a = 'X'
273 call assert_match('^abcdXde\s*$', s:get_statusline())
274 let sa1=screenattr(&lines - 1, 1)
275 let sa2=screenattr(&lines - 1, 3)
276 let sa3=screenattr(&lines - 1, 5)
277 let sa4=screenattr(&lines - 1, 7)
278 call assert_notequal(sa1, sa2)
279 call assert_equal(sa1, sa3)
280 call assert_equal(sa2, sa4)
281
282 " An empty group that contains highlight changes and doesn't reset them
283 let g:a = ''
284 set statusline=ab%(cd%1*%{g:a}%)de
285 call assert_match('^abcdde\s*$', s:get_statusline())
286 let sa1=screenattr(&lines - 1, 1)
287 let sa2=screenattr(&lines - 1, 5)
288 call assert_notequal(sa1, sa2)
289 let g:a = 'X'
290 call assert_match('^abcdXde\s*$', s:get_statusline())
291 let sa1=screenattr(&lines - 1, 1)
292 let sa2=screenattr(&lines - 1, 5)
293 let sa3=screenattr(&lines - 1, 7)
294 call assert_notequal(sa1, sa2)
295 call assert_equal(sa2, sa3)
296
297 let g:a = ''
298 set statusline=ab%1*%(cd%*%{g:a}%)de
299 call assert_match('^abcdde\s*$', s:get_statusline())
300 let sa1=screenattr(&lines - 1, 1)
301 let sa2=screenattr(&lines - 1, 3)
302 let sa3=screenattr(&lines - 1, 5)
303 call assert_notequal(sa1, sa2)
304 call assert_equal(sa1, sa3)
305 let g:a = 'X'
306 call assert_match('^abcdXde\s*$', s:get_statusline())
307 let sa1=screenattr(&lines - 1, 1)
308 let sa2=screenattr(&lines - 1, 3)
309 let sa3=screenattr(&lines - 1, 5)
310 let sa4=screenattr(&lines - 1, 7)
311 call assert_notequal(sa1, sa2)
312 call assert_equal(sa1, sa3)
313 call assert_equal(sa1, sa4)
314
Bram Moolenaar300af822017-03-06 20:28:10 +0100315 " %%: a percent sign.
316 set statusline=10%%
317 call assert_match('^10%\s*$', s:get_statusline())
318
319 " %!: evaluated expression is used as the option value
320 set statusline=%!2*3+1
321 call assert_match('7\s*$', s:get_statusline())
322
323 " Check statusline in current and non-current window
324 " with the 'fillchars' option.
325 set fillchars=stl:^,stlnc:=,vert:\|,fold:-,diff:-
326 vsplit
327 set statusline=x%=y
328 call assert_match('^x^\+y^x=\+y$', s:get_statusline())
329 set fillchars&
330 close
331
332 %bw!
333 call delete('Xstatusline')
334 set statusline&
335 set laststatus&
336 set splitbelow&
337endfunc