blob: 19c99b55ea1c121942f7ca49885fcd7641109f76 [file] [log] [blame]
Bram Moolenaar9cf4b502018-07-23 04:12:03 +02001" Tests for parsing the modeline.
2
Bram Moolenaar6d91bcb2020-08-12 18:50:36 +02003source check.vim
4
Bram Moolenaarcd96eef2018-07-23 04:49:23 +02005func Test_modeline_invalid()
Bram Moolenaar9691f822018-11-03 19:06:25 +01006 " This was reading allocated memory in the past.
Bram Moolenaar9cf4b502018-07-23 04:12:03 +02007 call writefile(['vi:0', 'nothing'], 'Xmodeline')
Bram Moolenaar9691f822018-11-03 19:06:25 +01008 let modeline = &modeline
9 set modeline
Bram Moolenaar9cf4b502018-07-23 04:12:03 +020010 call assert_fails('split Xmodeline', 'E518:')
Bram Moolenaar916a8182018-11-25 02:18:29 +010011
Bram Moolenaare74331d2019-12-17 19:22:40 +010012 " Missing end colon (ignored).
13 call writefile(['// vim: set ts=2'], 'Xmodeline')
14 edit Xmodeline_version
15 call assert_equal(8, &ts)
16 bwipe!
17
18 " Missing colon at beginning (ignored).
19 call writefile(['// vim set ts=2:'], 'Xmodeline')
20 edit Xmodeline_version
21 call assert_equal(8, &ts)
22 bwipe!
23
24 " Missing space after vim (ignored).
25 call writefile(['// vim:ts=2:'], 'Xmodeline')
26 edit Xmodeline_version
27 call assert_equal(8, &ts)
28 bwipe!
29
Bram Moolenaar9691f822018-11-03 19:06:25 +010030 let &modeline = modeline
Bram Moolenaar9cf4b502018-07-23 04:12:03 +020031 bwipe!
Bram Moolenaar7624af02018-07-24 04:51:20 +020032 call delete('Xmodeline')
Bram Moolenaar9cf4b502018-07-23 04:12:03 +020033endfunc
Bram Moolenaar916a8182018-11-25 02:18:29 +010034
35func Test_modeline_filetype()
36 call writefile(['vim: set ft=c :', 'nothing'], 'Xmodeline_filetype')
37 let modeline = &modeline
38 set modeline
39 filetype plugin on
40 split Xmodeline_filetype
41 call assert_equal("c", &filetype)
42 call assert_equal(1, b:did_ftplugin)
43 call assert_equal("ccomplete#Complete", &ofu)
44
45 bwipe!
46 call delete('Xmodeline_filetype')
47 let &modeline = modeline
48 filetype plugin off
49endfunc
50
51func Test_modeline_syntax()
52 call writefile(['vim: set syn=c :', 'nothing'], 'Xmodeline_syntax')
53 let modeline = &modeline
54 set modeline
55 syntax enable
56 split Xmodeline_syntax
57 call assert_equal("c", &syntax)
58 call assert_equal("c", b:current_syntax)
59
60 bwipe!
61 call delete('Xmodeline_syntax')
62 let &modeline = modeline
63 syntax off
64endfunc
65
66func Test_modeline_keymap()
Bram Moolenaar6d91bcb2020-08-12 18:50:36 +020067 CheckFeature keymap
Bram Moolenaar916a8182018-11-25 02:18:29 +010068 call writefile(['vim: set keymap=greek :', 'nothing'], 'Xmodeline_keymap')
69 let modeline = &modeline
70 set modeline
71 split Xmodeline_keymap
72 call assert_equal("greek", &keymap)
73 call assert_match('greek\|grk', b:keymap_name)
74
75 bwipe!
76 call delete('Xmodeline_keymap')
77 let &modeline = modeline
78 set keymap= iminsert=0 imsearch=-1
79endfunc
80
Bram Moolenaare74331d2019-12-17 19:22:40 +010081func Test_modeline_version()
82 let modeline = &modeline
83 set modeline
84
85 " Test with vim:{vers}: (version {vers} or later).
86 call writefile(['// vim' .. v:version .. ': ts=2:'], 'Xmodeline_version')
87 edit Xmodeline_version
88 call assert_equal(2, &ts)
89 bwipe!
90
91 call writefile(['// vim' .. (v:version - 100) .. ': ts=2:'], 'Xmodeline_version')
92 edit Xmodeline_version
93 call assert_equal(2, &ts)
94 bwipe!
95
96 call writefile(['// vim' .. (v:version + 100) .. ': ts=2:'], 'Xmodeline_version')
97 edit Xmodeline_version
98 call assert_equal(8, &ts)
99 bw!
100
101 " Test with vim>{vers}: (version after {vers}).
102 call writefile(['// vim>' .. v:version .. ': ts=2:'], 'Xmodeline_version')
103 edit Xmodeline_version
104 call assert_equal(8, &ts)
105 bwipe!
106
107 call writefile(['// vim>' .. (v:version - 100) .. ': ts=2:'], 'Xmodeline_version')
108 edit Xmodeline_version
109 call assert_equal(2, &ts)
110 bwipe!
111
112 call writefile(['// vim>' .. (v:version + 100) .. ': ts=2:'], 'Xmodeline_version')
113 edit Xmodeline_version
114 call assert_equal(8, &ts)
115 bwipe!
116
117 " Test with vim<{vers}: (version before {vers}).
118 call writefile(['// vim<' .. v:version .. ': ts=2:'], 'Xmodeline_version')
119 edit Xmodeline_version
120 call assert_equal(8, &ts)
121 bwipe!
122
123 call writefile(['// vim<' .. (v:version - 100) .. ': ts=2:'], 'Xmodeline_version')
124 edit Xmodeline_version
125 call assert_equal(8, &ts)
126 bwipe!
127
128 call writefile(['// vim<' .. (v:version + 100) .. ': ts=2:'], 'Xmodeline_version')
129 edit Xmodeline_version
130 call assert_equal(2, &ts)
131 bwipe!
132
133 " Test with vim={vers}: (version {vers} only).
134 call writefile(['// vim=' .. v:version .. ': ts=2:'], 'Xmodeline_version')
135 edit Xmodeline_version
136 call assert_equal(2, &ts)
137 bwipe!
138
139 call writefile(['// vim=' .. (v:version - 100) .. ': ts=2:'], 'Xmodeline_version')
140 edit Xmodeline_version
141 call assert_equal(8, &ts)
142 bwipe!
143
144 call writefile(['// vim=' .. (v:version + 100) .. ': ts=2:'], 'Xmodeline_version')
145 edit Xmodeline_version
146 call assert_equal(8, &ts)
147 bwipe!
148
149 let &modeline = modeline
150 call delete('Xmodeline_version')
151endfunc
152
153func Test_modeline_colon()
154 let modeline = &modeline
155 set modeline
156
157 call writefile(['// vim: set showbreak=\: ts=2: sw=2'], 'Xmodeline_colon')
158 edit Xmodeline_colon
159
160 " backlash colon should become colon.
161 call assert_equal(':', &showbreak)
162
163 " 'ts' should be set.
164 " 'sw' should be ignored because it is after the end colon.
165 call assert_equal(2, &ts)
166 call assert_equal(8, &sw)
167
168 let &modeline = modeline
169 call delete('Xmodeline_colon')
170endfunc
171
Bram Moolenaar110289e2019-05-23 15:38:06 +0200172func s:modeline_fails(what, text, error)
Bram Moolenaar6d91bcb2020-08-12 18:50:36 +0200173 call CheckOption(a:what)
Bram Moolenaar916a8182018-11-25 02:18:29 +0100174 let fname = "Xmodeline_fails_" . a:what
175 call writefile(['vim: set ' . a:text . ' :', 'nothing'], fname)
176 let modeline = &modeline
177 set modeline
178 filetype plugin on
179 syntax enable
Bram Moolenaar110289e2019-05-23 15:38:06 +0200180 call assert_fails('split ' . fname, a:error)
Bram Moolenaar916a8182018-11-25 02:18:29 +0100181 call assert_equal("", &filetype)
182 call assert_equal("", &syntax)
183
184 bwipe!
185 call delete(fname)
186 let &modeline = modeline
187 filetype plugin off
188 syntax off
189endfunc
190
191func Test_modeline_filetype_fails()
Bram Moolenaar110289e2019-05-23 15:38:06 +0200192 call s:modeline_fails('filetype', 'ft=evil$CMD', 'E474:')
Bram Moolenaar916a8182018-11-25 02:18:29 +0100193endfunc
194
195func Test_modeline_syntax_fails()
Bram Moolenaar110289e2019-05-23 15:38:06 +0200196 call s:modeline_fails('syntax', 'syn=evil$CMD', 'E474:')
Bram Moolenaar916a8182018-11-25 02:18:29 +0100197endfunc
198
199func Test_modeline_keymap_fails()
Bram Moolenaar110289e2019-05-23 15:38:06 +0200200 call s:modeline_fails('keymap', 'keymap=evil$CMD', 'E474:')
201endfunc
202
203func Test_modeline_fails_always()
204 call s:modeline_fails('backupdir', 'backupdir=Something()', 'E520:')
205 call s:modeline_fails('cdpath', 'cdpath=Something()', 'E520:')
206 call s:modeline_fails('charconvert', 'charconvert=Something()', 'E520:')
207 call s:modeline_fails('completefunc', 'completefunc=Something()', 'E520:')
208 call s:modeline_fails('cscopeprg', 'cscopeprg=Something()', 'E520:')
209 call s:modeline_fails('diffexpr', 'diffexpr=Something()', 'E520:')
210 call s:modeline_fails('directory', 'directory=Something()', 'E520:')
211 call s:modeline_fails('equalprg', 'equalprg=Something()', 'E520:')
212 call s:modeline_fails('errorfile', 'errorfile=Something()', 'E520:')
213 call s:modeline_fails('exrc', 'exrc=Something()', 'E520:')
214 call s:modeline_fails('formatprg', 'formatprg=Something()', 'E520:')
215 call s:modeline_fails('fsync', 'fsync=Something()', 'E520:')
216 call s:modeline_fails('grepprg', 'grepprg=Something()', 'E520:')
217 call s:modeline_fails('helpfile', 'helpfile=Something()', 'E520:')
218 call s:modeline_fails('imactivatefunc', 'imactivatefunc=Something()', 'E520:')
219 call s:modeline_fails('imstatusfunc', 'imstatusfunc=Something()', 'E520:')
220 call s:modeline_fails('imstyle', 'imstyle=Something()', 'E520:')
221 call s:modeline_fails('keywordprg', 'keywordprg=Something()', 'E520:')
222 call s:modeline_fails('langmap', 'langmap=Something()', 'E520:')
223 call s:modeline_fails('luadll', 'luadll=Something()', 'E520:')
224 call s:modeline_fails('makeef', 'makeef=Something()', 'E520:')
225 call s:modeline_fails('makeprg', 'makeprg=Something()', 'E520:')
Bram Moolenaar07607392019-05-26 19:20:43 +0200226 call s:modeline_fails('mkspellmem', 'mkspellmem=Something()', 'E520:')
Bram Moolenaar110289e2019-05-23 15:38:06 +0200227 call s:modeline_fails('mzschemedll', 'mzschemedll=Something()', 'E520:')
228 call s:modeline_fails('mzschemegcdll', 'mzschemegcdll=Something()', 'E520:')
Bram Moolenaar7e800c62019-05-23 17:08:49 +0200229 call s:modeline_fails('modelineexpr', 'modelineexpr', 'E520:')
Bram Moolenaar110289e2019-05-23 15:38:06 +0200230 call s:modeline_fails('omnifunc', 'omnifunc=Something()', 'E520:')
231 call s:modeline_fails('operatorfunc', 'operatorfunc=Something()', 'E520:')
232 call s:modeline_fails('perldll', 'perldll=Something()', 'E520:')
233 call s:modeline_fails('printdevice', 'printdevice=Something()', 'E520:')
234 call s:modeline_fails('patchexpr', 'patchexpr=Something()', 'E520:')
235 call s:modeline_fails('printexpr', 'printexpr=Something()', 'E520:')
236 call s:modeline_fails('pythondll', 'pythondll=Something()', 'E520:')
Bram Moolenaare09244e2019-05-23 17:35:55 +0200237 call s:modeline_fails('pythonhome', 'pythonhome=Something()', 'E520:')
Bram Moolenaar110289e2019-05-23 15:38:06 +0200238 call s:modeline_fails('pythonthreedll', 'pythonthreedll=Something()', 'E520:')
239 call s:modeline_fails('pythonthreehome', 'pythonthreehome=Something()', 'E520:')
240 call s:modeline_fails('pyxversion', 'pyxversion=Something()', 'E520:')
241 call s:modeline_fails('rubydll', 'rubydll=Something()', 'E520:')
242 call s:modeline_fails('runtimepath', 'runtimepath=Something()', 'E520:')
243 call s:modeline_fails('secure', 'secure=Something()', 'E520:')
244 call s:modeline_fails('shell', 'shell=Something()', 'E520:')
245 call s:modeline_fails('shellcmdflag', 'shellcmdflag=Something()', 'E520:')
246 call s:modeline_fails('shellpipe', 'shellpipe=Something()', 'E520:')
247 call s:modeline_fails('shellquote', 'shellquote=Something()', 'E520:')
248 call s:modeline_fails('shellredir', 'shellredir=Something()', 'E520:')
249 call s:modeline_fails('shellxquote', 'shellxquote=Something()', 'E520:')
250 call s:modeline_fails('spellfile', 'spellfile=Something()', 'E520:')
251 call s:modeline_fails('spellsuggest', 'spellsuggest=Something()', 'E520:')
252 call s:modeline_fails('tcldll', 'tcldll=Something()', 'E520:')
253 call s:modeline_fails('titleold', 'titleold=Something()', 'E520:')
254 call s:modeline_fails('viewdir', 'viewdir=Something()', 'E520:')
255 call s:modeline_fails('viminfo', 'viminfo=Something()', 'E520:')
256 call s:modeline_fails('viminfofile', 'viminfofile=Something()', 'E520:')
257 call s:modeline_fails('winptydll', 'winptydll=Something()', 'E520:')
258 call s:modeline_fails('undodir', 'undodir=Something()', 'E520:')
259 " only check a few terminal options
260 call s:modeline_fails('t_AB', 't_AB=Something()', 'E520:')
261 call s:modeline_fails('t_ce', 't_ce=Something()', 'E520:')
262 call s:modeline_fails('t_sr', 't_sr=Something()', 'E520:')
263 call s:modeline_fails('t_8b', 't_8b=Something()', 'E520:')
264endfunc
265
266func Test_modeline_fails_modelineexpr()
267 call s:modeline_fails('balloonexpr', 'balloonexpr=Something()', 'E992:')
268 call s:modeline_fails('foldexpr', 'foldexpr=Something()', 'E992:')
269 call s:modeline_fails('foldtext', 'foldtext=Something()', 'E992:')
270 call s:modeline_fails('formatexpr', 'formatexpr=Something()', 'E992:')
271 call s:modeline_fails('guitablabel', 'guitablabel=Something()', 'E992:')
272 call s:modeline_fails('iconstring', 'iconstring=Something()', 'E992:')
273 call s:modeline_fails('includeexpr', 'includeexpr=Something()', 'E992:')
274 call s:modeline_fails('indentexpr', 'indentexpr=Something()', 'E992:')
275 call s:modeline_fails('rulerformat', 'rulerformat=Something()', 'E992:')
276 call s:modeline_fails('statusline', 'statusline=Something()', 'E992:')
277 call s:modeline_fails('tabline', 'tabline=Something()', 'E992:')
278 call s:modeline_fails('titlestring', 'titlestring=Something()', 'E992:')
Bram Moolenaar916a8182018-11-25 02:18:29 +0100279endfunc
Bram Moolenaar51258742020-05-03 17:19:33 +0200280
281func Test_modeline_setoption_verbose()
282 let modeline = &modeline
283 set modeline
284
285 let lines =<< trim END
286 1 vim:ts=2
287 2 two
288 3 three
289 4 four
290 5 five
291 6 six
292 7 seven
293 8 eight
294 END
295 call writefile(lines, 'Xmodeline')
296 edit Xmodeline
297 let info = split(execute('verbose set tabstop?'), "\n")
298 call assert_match('^\s*Last set from modeline line 1$', info[-1])
299 bwipe!
300
301 let lines =<< trim END
302 1 one
303 2 two
304 3 three
305 4 vim:ts=4
306 5 five
307 6 six
308 7 seven
309 8 eight
310 END
311 call writefile(lines, 'Xmodeline')
312 edit Xmodeline
313 let info = split(execute('verbose set tabstop?'), "\n")
314 call assert_match('^\s*Last set from modeline line 4$', info[-1])
315 bwipe!
316
317 let lines =<< trim END
318 1 one
319 2 two
320 3 three
321 4 four
322 5 five
323 6 six
324 7 seven
325 8 vim:ts=8
326 END
327 call writefile(lines, 'Xmodeline')
328 edit Xmodeline
329 let info = split(execute('verbose set tabstop?'), "\n")
330 call assert_match('^\s*Last set from modeline line 8$', info[-1])
331 bwipe!
332
333 let &modeline = modeline
334 call delete('Xmodeline')
335endfunc
Bram Moolenaar6d91bcb2020-08-12 18:50:36 +0200336
Yegappan Lakshmanan2d6d7182021-06-13 21:52:48 +0200337" Test for the 'modeline' default value in compatible and non-compatible modes
338" for root and non-root accounts
339func Test_modeline_default()
340 set compatible
341 call assert_false(&modeline)
342 set nocompatible
343 call assert_equal(IsRoot() ? 0 : 1, &modeline)
344 set compatible&vi
345 call assert_false(&modeline)
346 set compatible&vim
347 call assert_equal(IsRoot() ? 0 : 1, &modeline)
348 set compatible& modeline&
349endfunc
350
351" Some options cannot be set from the modeline when 'diff' option is set
352func Test_modeline_diff_buffer()
353 call writefile(['vim: diff foldmethod=marker wrap'], 'Xfile')
354 set foldmethod& nowrap
355 new Xfile
356 call assert_equal('manual', &foldmethod)
357 call assert_false(&wrap)
358 set wrap&
359 call delete('Xfile')
360 bw
361endfunc
362
Bram Moolenaar6d91bcb2020-08-12 18:50:36 +0200363" vim: shiftwidth=2 sts=2 expandtab