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