xref: /vim-8.2.3635/runtime/filetype.vim (revision a9f22201)
1" Vim support file to detect file types
2"
3" Maintainer:	Bram Moolenaar <[email protected]>
4" Last Change:	2013 Jun 01
5
6" Listen very carefully, I will say this only once
7if exists("did_load_filetypes")
8  finish
9endif
10let did_load_filetypes = 1
11
12" Line continuation is used here, remove 'C' from 'cpoptions'
13let s:cpo_save = &cpo
14set cpo&vim
15
16augroup filetypedetect
17
18" Ignored extensions
19if exists("*fnameescape")
20au BufNewFile,BufRead ?\+.orig,?\+.bak,?\+.old,?\+.new,?\+.dpkg-dist,?\+.dpkg-old,?\+.dpkg-new,?\+.dpkg-bak,?\+.rpmsave,?\+.rpmnew
21	\ exe "doau filetypedetect BufRead " . fnameescape(expand("<afile>:r"))
22au BufNewFile,BufRead *~
23	\ let s:name = expand("<afile>") |
24	\ let s:short = substitute(s:name, '\~$', '', '') |
25	\ if s:name != s:short && s:short != "" |
26	\   exe "doau filetypedetect BufRead " . fnameescape(s:short) |
27	\ endif |
28	\ unlet! s:name s:short
29au BufNewFile,BufRead ?\+.in
30	\ if expand("<afile>:t") != "configure.in" |
31	\   exe "doau filetypedetect BufRead " . fnameescape(expand("<afile>:r")) |
32	\ endif
33elseif &verbose > 0
34  echomsg "Warning: some filetypes will not be recognized because this version of Vim does not have fnameescape()"
35endif
36
37" Pattern used to match file names which should not be inspected.
38" Currently finds compressed files.
39if !exists("g:ft_ignore_pat")
40  let g:ft_ignore_pat = '\.\(Z\|gz\|bz2\|zip\|tgz\)$'
41endif
42
43" Function used for patterns that end in a star: don't set the filetype if the
44" file name matches ft_ignore_pat.
45func! s:StarSetf(ft)
46  if expand("<amatch>") !~ g:ft_ignore_pat
47    exe 'setf ' . a:ft
48  endif
49endfunc
50
51" Abaqus or Trasys
52au BufNewFile,BufRead *.inp			call s:Check_inp()
53
54func! s:Check_inp()
55  if getline(1) =~ '^\*'
56    setf abaqus
57  else
58    let n = 1
59    if line("$") > 500
60      let nmax = 500
61    else
62      let nmax = line("$")
63    endif
64    while n <= nmax
65      if getline(n) =~? "^header surface data"
66	setf trasys
67	break
68      endif
69      let n = n + 1
70    endwhile
71  endif
72endfunc
73
74" A-A-P recipe
75au BufNewFile,BufRead *.aap			setf aap
76
77" A2ps printing utility
78au BufNewFile,BufRead */etc/a2ps.cfg,*/etc/a2ps/*.cfg,a2psrc,.a2psrc setf a2ps
79
80" ABAB/4
81au BufNewFile,BufRead *.abap			setf abap
82
83" ABC music notation
84au BufNewFile,BufRead *.abc			setf abc
85
86" ABEL
87au BufNewFile,BufRead *.abl			setf abel
88
89" AceDB
90au BufNewFile,BufRead *.wrm			setf acedb
91
92" Ada (83, 9X, 95)
93au BufNewFile,BufRead *.adb,*.ads,*.ada		setf ada
94if has("vms")
95  au BufNewFile,BufRead *.gpr,*.ada_m,*.adc	setf ada
96else
97  au BufNewFile,BufRead *.gpr			setf ada
98endif
99
100" AHDL
101au BufNewFile,BufRead *.tdf			setf ahdl
102
103" AMPL
104au BufNewFile,BufRead *.run			setf ampl
105
106" Ant
107au BufNewFile,BufRead build.xml			setf ant
108
109" Apache style config file
110au BufNewFile,BufRead proftpd.conf*		call s:StarSetf('apachestyle')
111
112" Apache config file
113au BufNewFile,BufRead .htaccess,*/etc/httpd/*.conf		setf apache
114
115" XA65 MOS6510 cross assembler
116au BufNewFile,BufRead *.a65			setf a65
117
118" Applescript
119au BufNewFile,BufRead *.scpt			setf applescript
120
121" Applix ELF
122au BufNewFile,BufRead *.am
123	\ if expand("<afile>") !~? 'Makefile.am\>' | setf elf | endif
124
125" ALSA configuration
126au BufNewFile,BufRead .asoundrc,*/usr/share/alsa/alsa.conf,*/etc/asound.conf setf alsaconf
127
128" Arc Macro Language
129au BufNewFile,BufRead *.aml			setf aml
130
131" APT config file
132au BufNewFile,BufRead apt.conf                 setf aptconf
133au BufNewFile,BufRead */.aptitude/config       setf aptconf
134au BufNewFile,BufRead */etc/apt/apt.conf.d/{[-_[:alnum:]]\+,[-_.[:alnum:]]\+.conf} setf aptconf
135
136" Arch Inventory file
137au BufNewFile,BufRead .arch-inventory,=tagging-method	setf arch
138
139" ART*Enterprise (formerly ART-IM)
140au BufNewFile,BufRead *.art			setf art
141
142" AsciiDoc
143au BufNewFile,BufRead *.asciidoc		setf asciidoc
144
145" ASN.1
146au BufNewFile,BufRead *.asn,*.asn1		setf asn
147
148" Active Server Pages (with Visual Basic Script)
149au BufNewFile,BufRead *.asa
150	\ if exists("g:filetype_asa") |
151	\   exe "setf " . g:filetype_asa |
152	\ else |
153	\   setf aspvbs |
154	\ endif
155
156" Active Server Pages (with Perl or Visual Basic Script)
157au BufNewFile,BufRead *.asp
158	\ if exists("g:filetype_asp") |
159	\   exe "setf " . g:filetype_asp |
160	\ elseif getline(1) . getline(2) . getline(3) =~? "perlscript" |
161	\   setf aspperl |
162	\ else |
163	\   setf aspvbs |
164	\ endif
165
166" Grub (must be before catch *.lst)
167au BufNewFile,BufRead */boot/grub/menu.lst,*/boot/grub/grub.conf,*/etc/grub.conf setf grub
168
169" Assembly (all kinds)
170" *.lst is not pure assembly, it has two extra columns (address, byte codes)
171au BufNewFile,BufRead *.asm,*.[sS],*.[aA],*.mac,*.lst	call s:FTasm()
172
173" This function checks for the kind of assembly that is wanted by the user, or
174" can be detected from the first five lines of the file.
175func! s:FTasm()
176  " make sure b:asmsyntax exists
177  if !exists("b:asmsyntax")
178    let b:asmsyntax = ""
179  endif
180
181  if b:asmsyntax == ""
182    call s:FTasmsyntax()
183  endif
184
185  " if b:asmsyntax still isn't set, default to asmsyntax or GNU
186  if b:asmsyntax == ""
187    if exists("g:asmsyntax")
188      let b:asmsyntax = g:asmsyntax
189    else
190      let b:asmsyntax = "asm"
191    endif
192  endif
193
194  exe "setf " . fnameescape(b:asmsyntax)
195endfunc
196
197func! s:FTasmsyntax()
198  " see if file contains any asmsyntax=foo overrides. If so, change
199  " b:asmsyntax appropriately
200  let head = " ".getline(1)." ".getline(2)." ".getline(3)." ".getline(4).
201	\" ".getline(5)." "
202  let match = matchstr(head, '\sasmsyntax=\zs[a-zA-Z0-9]\+\ze\s')
203  if match != ''
204    let b:asmsyntax = match
205  elseif ((head =~? '\.title') || (head =~? '\.ident') || (head =~? '\.macro') || (head =~? '\.subtitle') || (head =~? '\.library'))
206    let b:asmsyntax = "vmasm"
207  endif
208endfunc
209
210" Macro (VAX)
211au BufNewFile,BufRead *.mar			setf vmasm
212
213" Atlas
214au BufNewFile,BufRead *.atl,*.as		setf atlas
215
216" Autoit v3
217au BufNewFile,BufRead *.au3			setf autoit
218
219" Autohotkey
220au BufNewFile,BufRead *.ahk			setf autohotkey
221
222" Automake
223au BufNewFile,BufRead [mM]akefile.am,GNUmakefile.am	setf automake
224
225" Autotest .at files are actually m4
226au BufNewFile,BufRead *.at			setf m4
227
228" Avenue
229au BufNewFile,BufRead *.ave			setf ave
230
231" Awk
232au BufNewFile,BufRead *.awk			setf awk
233
234" B
235au BufNewFile,BufRead *.mch,*.ref,*.imp		setf b
236
237" BASIC or Visual Basic
238au BufNewFile,BufRead *.bas			call s:FTVB("basic")
239
240" Check if one of the first five lines contains "VB_Name".  In that case it is
241" probably a Visual Basic file.  Otherwise it's assumed to be "alt" filetype.
242func! s:FTVB(alt)
243  if getline(1).getline(2).getline(3).getline(4).getline(5) =~? 'VB_Name\|Begin VB\.\(Form\|MDIForm\|UserControl\)'
244    setf vb
245  else
246    exe "setf " . a:alt
247  endif
248endfunc
249
250" Visual Basic Script (close to Visual Basic) or Visual Basic .NET
251au BufNewFile,BufRead *.vb,*.vbs,*.dsm,*.ctl	setf vb
252
253" IBasic file (similar to QBasic)
254au BufNewFile,BufRead *.iba,*.ibi		setf ibasic
255
256" FreeBasic file (similar to QBasic)
257au BufNewFile,BufRead *.fb,*.bi			setf freebasic
258
259" Batch file for MSDOS.
260au BufNewFile,BufRead *.bat,*.sys		setf dosbatch
261" *.cmd is close to a Batch file, but on OS/2 Rexx files also use *.cmd.
262au BufNewFile,BufRead *.cmd
263	\ if getline(1) =~ '^/\*' | setf rexx | else | setf dosbatch | endif
264
265" Batch file for 4DOS
266au BufNewFile,BufRead *.btm			call s:FTbtm()
267func! s:FTbtm()
268  if exists("g:dosbatch_syntax_for_btm") && g:dosbatch_syntax_for_btm
269    setf dosbatch
270  else
271    setf btm
272  endif
273endfunc
274
275" BC calculator
276au BufNewFile,BufRead *.bc			setf bc
277
278" BDF font
279au BufNewFile,BufRead *.bdf			setf bdf
280
281" BibTeX bibliography database file
282au BufNewFile,BufRead *.bib			setf bib
283
284" BibTeX Bibliography Style
285au BufNewFile,BufRead *.bst			setf bst
286
287" BIND configuration
288au BufNewFile,BufRead named.conf,rndc.conf	setf named
289
290" BIND zone
291au BufNewFile,BufRead named.root		setf bindzone
292au BufNewFile,BufRead *.db			call s:BindzoneCheck('')
293
294func! s:BindzoneCheck(default)
295  if getline(1).getline(2).getline(3).getline(4) =~ '^; <<>> DiG [0-9.]\+ <<>>\|BIND.*named\|$ORIGIN\|$TTL\|IN\s\+SOA'
296    setf bindzone
297  elseif a:default != ''
298    exe 'setf ' . a:default
299  endif
300endfunc
301
302" Blank
303au BufNewFile,BufRead *.bl			setf blank
304
305" Blkid cache file
306au BufNewFile,BufRead */etc/blkid.tab,*/etc/blkid.tab.old   setf xml
307
308" C or lpc
309au BufNewFile,BufRead *.c			call s:FTlpc()
310
311func! s:FTlpc()
312  if exists("g:lpc_syntax_for_c")
313    let lnum = 1
314    while lnum <= 12
315      if getline(lnum) =~# '^\(//\|inherit\|private\|protected\|nosave\|string\|object\|mapping\|mixed\)'
316	setf lpc
317	return
318      endif
319      let lnum = lnum + 1
320    endwhile
321  endif
322  setf c
323endfunc
324
325" Calendar
326au BufNewFile,BufRead calendar			setf calendar
327
328" C#
329au BufNewFile,BufRead *.cs			setf cs
330
331" CSDL
332au BufNewFile,BufRead *.csdl			setf csdl
333
334" Cabal
335au BufNewFile,BufRead *.cabal			setf cabal
336
337" Cdrdao TOC
338au BufNewFile,BufRead *.toc			setf cdrtoc
339
340" Cdrdao config
341au BufNewFile,BufRead */etc/cdrdao.conf,*/etc/defaults/cdrdao,*/etc/default/cdrdao,.cdrdao	setf cdrdaoconf
342
343" Cfengine
344au BufNewFile,BufRead cfengine.conf		setf cfengine
345
346" ChaiScript
347au BufRead,BufNewFile *.chai			setf chaiscript
348
349" Comshare Dimension Definition Language
350au BufNewFile,BufRead *.cdl			setf cdl
351
352" Conary Recipe
353au BufNewFile,BufRead *.recipe			setf conaryrecipe
354
355" Controllable Regex Mutilator
356au BufNewFile,BufRead *.crm			setf crm
357
358" Cyn++
359au BufNewFile,BufRead *.cyn			setf cynpp
360
361" Cynlib
362" .cc and .cpp files can be C++ or Cynlib.
363au BufNewFile,BufRead *.cc
364	\ if exists("cynlib_syntax_for_cc")|setf cynlib|else|setf cpp|endif
365au BufNewFile,BufRead *.cpp
366	\ if exists("cynlib_syntax_for_cpp")|setf cynlib|else|setf cpp|endif
367
368" C++
369au BufNewFile,BufRead *.cxx,*.c++,*.hh,*.hxx,*.hpp,*.ipp,*.moc,*.tcc,*.inl setf cpp
370if has("fname_case")
371  au BufNewFile,BufRead *.C,*.H setf cpp
372endif
373
374" .h files can be C, Ch C++, ObjC or ObjC++.
375" Set c_syntax_for_h if you want C, ch_syntax_for_h if you want Ch. ObjC is
376" detected automatically.
377au BufNewFile,BufRead *.h			call s:FTheader()
378
379func! s:FTheader()
380  if match(getline(1, min([line("$"), 200])), '^@\(interface\|end\|class\)') > -1
381    if exists("g:c_syntax_for_h")
382      setf objc
383    else
384      setf objcpp
385    endif
386  elseif exists("g:c_syntax_for_h")
387    setf c
388  elseif exists("g:ch_syntax_for_h")
389    setf ch
390  else
391    setf cpp
392  endif
393endfunc
394
395" Ch (CHscript)
396au BufNewFile,BufRead *.chf			setf ch
397
398" TLH files are C++ headers generated by Visual C++'s #import from typelibs
399au BufNewFile,BufRead *.tlh			setf cpp
400
401" Cascading Style Sheets
402au BufNewFile,BufRead *.css			setf css
403
404" Century Term Command Scripts (*.cmd too)
405au BufNewFile,BufRead *.con			setf cterm
406
407" Changelog
408au BufNewFile,BufRead changelog.Debian,changelog.dch,NEWS.Debian,NEWS.dch
409					\	setf debchangelog
410
411au BufNewFile,BufRead [cC]hange[lL]og
412	\  if getline(1) =~ '; urgency='
413	\|   setf debchangelog
414	\| else
415	\|   setf changelog
416	\| endif
417
418au BufNewFile,BufRead NEWS
419	\  if getline(1) =~ '; urgency='
420	\|   setf debchangelog
421	\| endif
422
423" CHILL
424au BufNewFile,BufRead *..ch			setf chill
425
426" Changes for WEB and CWEB or CHILL
427au BufNewFile,BufRead *.ch			call s:FTchange()
428
429" This function checks if one of the first ten lines start with a '@'.  In
430" that case it is probably a change file.
431" If the first line starts with # or ! it's probably a ch file.
432" If a line has "main", "include", "//" ir "/*" it's probably ch.
433" Otherwise CHILL is assumed.
434func! s:FTchange()
435  let lnum = 1
436  while lnum <= 10
437    if getline(lnum)[0] == '@'
438      setf change
439      return
440    endif
441    if lnum == 1 && (getline(1)[0] == '#' || getline(1)[0] == '!')
442      setf ch
443      return
444    endif
445    if getline(lnum) =~ "MODULE"
446      setf chill
447      return
448    endif
449    if getline(lnum) =~ 'main\s*(\|#\s*include\|//'
450      setf ch
451      return
452    endif
453    let lnum = lnum + 1
454  endwhile
455  setf chill
456endfunc
457
458" ChordPro
459au BufNewFile,BufRead *.chopro,*.crd,*.cho,*.crdpro,*.chordpro	setf chordpro
460
461" Clean
462au BufNewFile,BufRead *.dcl,*.icl		setf clean
463
464" Clever
465au BufNewFile,BufRead *.eni			setf cl
466
467" Clever or dtd
468au BufNewFile,BufRead *.ent			call s:FTent()
469
470func! s:FTent()
471  " This function checks for valid cl syntax in the first five lines.
472  " Look for either an opening comment, '#', or a block start, '{".
473  " If not found, assume SGML.
474  let lnum = 1
475  while lnum < 6
476    let line = getline(lnum)
477    if line =~ '^\s*[#{]'
478      setf cl
479      return
480    elseif line !~ '^\s*$'
481      " Not a blank line, not a comment, and not a block start,
482      " so doesn't look like valid cl code.
483      break
484    endif
485    let lnum = lnum + 1
486  endw
487  setf dtd
488endfunc
489
490" Clipper (or FoxPro; could also be eviews)
491au BufNewFile,BufRead *.prg
492	\ if exists("g:filetype_prg") |
493	\   exe "setf " . g:filetype_prg |
494	\ else |
495	\   setf clipper |
496	\ endif
497
498" Clojure
499au BufNewFile,BufRead *.clj,*.cljs		setf clojure
500
501" Cmake
502au BufNewFile,BufRead CMakeLists.txt,*.cmake,*.cmake.in		setf cmake
503
504" Cmusrc
505au BufNewFile,BufRead */.cmus/{autosave,rc,command-history,*.theme} setf cmusrc
506au BufNewFile,BufRead */cmus/{rc,*.theme}			setf cmusrc
507
508" Cobol
509au BufNewFile,BufRead *.cbl,*.cob,*.lib	setf cobol
510"   cobol or zope form controller python script? (heuristic)
511au BufNewFile,BufRead *.cpy
512	\ if getline(1) =~ '^##' |
513	\   setf python |
514	\ else |
515	\   setf cobol |
516	\ endif
517
518" Coco/R
519au BufNewFile,BufRead *.atg			setf coco
520
521" Cold Fusion
522au BufNewFile,BufRead *.cfm,*.cfi,*.cfc		setf cf
523
524" Configure scripts
525au BufNewFile,BufRead configure.in,configure.ac setf config
526
527" CUDA  Cumpute Unified Device Architecture
528au BufNewFile,BufRead *.cu			setf cuda
529
530" WildPackets EtherPeek Decoder
531au BufNewFile,BufRead *.dcd			setf dcd
532
533" Enlightenment configuration files
534au BufNewFile,BufRead *enlightenment/*.cfg	setf c
535
536" Eterm
537au BufNewFile,BufRead *Eterm/*.cfg		setf eterm
538
539" Lynx config files
540au BufNewFile,BufRead lynx.cfg			setf lynx
541
542" Quake
543au BufNewFile,BufRead *baseq[2-3]/*.cfg,*id1/*.cfg	setf quake
544au BufNewFile,BufRead *quake[1-3]/*.cfg			setf quake
545
546" Quake C
547au BufNewFile,BufRead *.qc			setf c
548
549" Configure files
550au BufNewFile,BufRead *.cfg			setf cfg
551
552" Cucumber
553au BufNewFile,BufRead *.feature			setf cucumber
554
555" Communicating Sequential Processes
556au BufNewFile,BufRead *.csp,*.fdr		setf csp
557
558" CUPL logic description and simulation
559au BufNewFile,BufRead *.pld			setf cupl
560au BufNewFile,BufRead *.si			setf cuplsim
561
562" Debian Control
563au BufNewFile,BufRead */debian/control		setf debcontrol
564au BufNewFile,BufRead control
565	\  if getline(1) =~ '^Source:'
566	\|   setf debcontrol
567	\| endif
568
569" Debian Sources.list
570au BufNewFile,BufRead */etc/apt/sources.list		setf debsources
571au BufNewFile,BufRead */etc/apt/sources.list.d/*.list	setf debsources
572
573" Deny hosts
574au BufNewFile,BufRead denyhosts.conf		setf denyhosts
575
576" dnsmasq(8) configuration files
577au BufNewFile,BufRead */etc/dnsmasq.conf	setf dnsmasq
578
579" ROCKLinux package description
580au BufNewFile,BufRead *.desc			setf desc
581
582" the D language or dtrace
583au BufNewFile,BufRead *.d			call s:DtraceCheck()
584
585func! s:DtraceCheck()
586  let lines = getline(1, min([line("$"), 100]))
587  if match(lines, '^module\>\|^import\>') > -1
588    " D files often start with a module and/or import statement.
589    setf d
590  elseif match(lines, '^#!\S\+dtrace\|#pragma\s\+D\s\+option\|:\S\{-}:\S\{-}:') > -1
591    setf dtrace
592  else
593    setf d
594  endif
595endfunc
596
597" Desktop files
598au BufNewFile,BufRead *.desktop,.directory	setf desktop
599
600" Dict config
601au BufNewFile,BufRead dict.conf,.dictrc		setf dictconf
602
603" Dictd config
604au BufNewFile,BufRead dictd.conf		setf dictdconf
605
606" Diff files
607au BufNewFile,BufRead *.diff,*.rej,*.patch	setf diff
608
609" Dircolors
610au BufNewFile,BufRead .dir_colors,.dircolors,*/etc/DIR_COLORS	setf dircolors
611
612" Diva (with Skill) or InstallShield
613au BufNewFile,BufRead *.rul
614	\ if getline(1).getline(2).getline(3).getline(4).getline(5).getline(6) =~? 'InstallShield' |
615	\   setf ishd |
616	\ else |
617	\   setf diva |
618	\ endif
619
620" DCL (Digital Command Language - vms) or DNS zone file
621au BufNewFile,BufRead *.com			call s:BindzoneCheck('dcl')
622
623" DOT
624au BufNewFile,BufRead *.dot			setf dot
625
626" Dylan - lid files
627au BufNewFile,BufRead *.lid			setf dylanlid
628
629" Dylan - intr files (melange)
630au BufNewFile,BufRead *.intr			setf dylanintr
631
632" Dylan
633au BufNewFile,BufRead *.dylan			setf dylan
634
635" Microsoft Module Definition
636au BufNewFile,BufRead *.def			setf def
637
638" Dracula
639au BufNewFile,BufRead *.drac,*.drc,*lvs,*lpe	setf dracula
640
641" Datascript
642au BufNewFile,BufRead *.ds			setf datascript
643
644" dsl
645au BufNewFile,BufRead *.dsl			setf dsl
646
647" DTD (Document Type Definition for XML)
648au BufNewFile,BufRead *.dtd			setf dtd
649
650" DTS/DSTI (device tree files)
651au BufNewFile,BufRead *.dts,*.dtsi		setf dts
652
653" EDIF (*.edf,*.edif,*.edn,*.edo)
654au BufNewFile,BufRead *.ed\(f\|if\|n\|o\)	setf edif
655
656" Embedix Component Description
657au BufNewFile,BufRead *.ecd			setf ecd
658
659" Eiffel or Specman
660au BufNewFile,BufRead *.e,*.E			call s:FTe()
661
662" Elinks configuration
663au BufNewFile,BufRead */etc/elinks.conf,*/.elinks/elinks.conf	setf elinks
664
665func! s:FTe()
666  let n = 1
667  while n < 100 && n < line("$")
668    if getline(n) =~ "^\\s*\\(<'\\|'>\\)\\s*$"
669      setf specman
670      return
671    endif
672    let n = n + 1
673  endwhile
674  setf eiffel
675endfunc
676
677" ERicsson LANGuage; Yaws is erlang too
678au BufNewFile,BufRead *.erl,*.hrl,*.yaws	setf erlang
679
680" Elm Filter Rules file
681au BufNewFile,BufRead filter-rules		setf elmfilt
682
683" ESMTP rc file
684au BufNewFile,BufRead *esmtprc			setf esmtprc
685
686" ESQL-C
687au BufNewFile,BufRead *.ec,*.EC			setf esqlc
688
689" Esterel
690au BufNewFile,BufRead *.strl			setf esterel
691
692" Essbase script
693au BufNewFile,BufRead *.csc			setf csc
694
695" Exim
696au BufNewFile,BufRead exim.conf			setf exim
697
698" Expect
699au BufNewFile,BufRead *.exp			setf expect
700
701" Exports
702au BufNewFile,BufRead exports			setf exports
703
704" Falcon
705au BufNewFile,BufRead *.fal			setf falcon
706
707" Fantom
708au BufNewFile,BufRead *.fan,*.fwt		setf fan
709
710" Factor
711au BufNewFile,BufRead *.factor			setf factor
712
713" Fetchmail RC file
714au BufNewFile,BufRead .fetchmailrc		setf fetchmail
715
716" FlexWiki - disabled, because it has side effects when a .wiki file
717" is not actually FlexWiki
718"au BufNewFile,BufRead *.wiki			setf flexwiki
719
720" Focus Executable
721au BufNewFile,BufRead *.fex,*.focexec		setf focexec
722
723" Focus Master file (but not for auto.master)
724au BufNewFile,BufRead auto.master		setf conf
725au BufNewFile,BufRead *.mas,*.master		setf master
726
727" Forth
728au BufNewFile,BufRead *.fs,*.ft			setf forth
729
730" Reva Forth
731au BufNewFile,BufRead *.frt			setf reva
732
733" Fortran
734if has("fname_case")
735  au BufNewFile,BufRead *.F,*.FOR,*.FPP,*.FTN,*.F77,*.F90,*.F95,*.F03,*.F08	 setf fortran
736endif
737au BufNewFile,BufRead   *.f,*.for,*.fortran,*.fpp,*.ftn,*.f77,*.f90,*.f95,*.f03,*.f08  setf fortran
738
739" Framescript
740au BufNewFile,BufRead *.fsl			setf framescript
741
742" FStab
743au BufNewFile,BufRead fstab,mtab		setf fstab
744
745" GDB command files
746au BufNewFile,BufRead .gdbinit			setf gdb
747
748" GDMO
749au BufNewFile,BufRead *.mo,*.gdmo		setf gdmo
750
751" Gedcom
752au BufNewFile,BufRead *.ged,lltxxxxx.txt	setf gedcom
753
754" Git
755au BufNewFile,BufRead *.git/COMMIT_EDITMSG	setf gitcommit
756au BufNewFile,BufRead *.git/MERGE_MSG		setf gitcommit
757au BufNewFile,BufRead *.git/config,.gitconfig,.gitmodules setf gitconfig
758au BufNewFile,BufRead *.git/modules/**/COMMIT_EDITMSG setf gitcommit
759au BufNewFile,BufRead *.git/modules/**/config	setf gitconfig
760au BufNewFile,BufRead */.config/git/config	setf gitconfig
761au BufNewFile,BufRead git-rebase-todo		setf gitrebase
762au BufNewFile,BufRead .msg.[0-9]*
763      \ if getline(1) =~ '^From.*# This line is ignored.$' |
764      \   setf gitsendemail |
765      \ endif
766au BufNewFile,BufRead *.git/**
767      \ if getline(1) =~ '^\x\{40\}\>\|^ref: ' |
768      \   setf git |
769      \ endif
770
771" Gkrellmrc
772au BufNewFile,BufRead gkrellmrc,gkrellmrc_?	setf gkrellmrc
773
774" GP scripts (2.0 and onward)
775au BufNewFile,BufRead *.gp,.gprc		setf gp
776
777" GPG
778au BufNewFile,BufRead */.gnupg/options		setf gpg
779au BufNewFile,BufRead */.gnupg/gpg.conf		setf gpg
780au BufNewFile,BufRead */usr/**/gnupg/options.skel setf gpg
781
782" gnash(1) configuration files
783au BufNewFile,BufRead gnashrc,.gnashrc,gnashpluginrc,.gnashpluginrc setf gnash
784
785" Gitolite
786au BufNewFile,BufRead gitolite.conf		setf gitolite
787au BufNewFile,BufRead */gitolite-admin/conf/*	call s:StarSetf('gitolite')
788au BufNewFile,BufRead {,.}gitolite.rc,example.gitolite.rc	setf perl
789
790" Gnuplot scripts
791au BufNewFile,BufRead *.gpi			setf gnuplot
792
793" GrADS scripts
794au BufNewFile,BufRead *.gs			setf grads
795
796" Gretl
797au BufNewFile,BufRead *.gretl			setf gretl
798
799" Groovy
800au BufNewFile,BufRead *.groovy			setf groovy
801
802" GNU Server Pages
803au BufNewFile,BufRead *.gsp			setf gsp
804
805" Group file
806au BufNewFile,BufRead */etc/group,*/etc/group-,*/etc/group.edit,*/etc/gshadow,*/etc/gshadow-,*/etc/gshadow.edit,*/var/backups/group.bak,*/var/backups/gshadow.bak  setf group
807
808" GTK RC
809au BufNewFile,BufRead .gtkrc,gtkrc		setf gtkrc
810
811" Haml
812au BufNewFile,BufRead *.haml			setf haml
813
814" Hamster Classic | Playground files
815au BufNewFile,BufRead *.hsc,*.hsm		setf hamster
816
817" Haskell
818au BufNewFile,BufRead *.hs,*.hs-boot		setf haskell
819au BufNewFile,BufRead *.lhs			setf lhaskell
820au BufNewFile,BufRead *.chs			setf chaskell
821
822" Haste
823au BufNewFile,BufRead *.ht			setf haste
824au BufNewFile,BufRead *.htpp			setf hastepreproc
825
826" Hercules
827au BufNewFile,BufRead *.vc,*.ev,*.rs,*.sum,*.errsum	setf hercules
828
829" HEX (Intel)
830au BufNewFile,BufRead *.hex,*.h32		setf hex
831
832" Tilde (must be before HTML)
833au BufNewFile,BufRead *.t.html			setf tilde
834
835" HTML (.shtml and .stm for server side)
836au BufNewFile,BufRead *.html,*.htm,*.shtml,*.stm  call s:FThtml()
837
838" Distinguish between HTML, XHTML and Django
839func! s:FThtml()
840  let n = 1
841  while n < 10 && n < line("$")
842    if getline(n) =~ '\<DTD\s\+XHTML\s'
843      setf xhtml
844      return
845    endif
846    if getline(n) =~ '{%\s*\(extends\|block\)\>'
847      setf htmldjango
848      return
849    endif
850    let n = n + 1
851  endwhile
852  setf html
853endfunc
854
855" HTML with Ruby - eRuby
856au BufNewFile,BufRead *.erb,*.rhtml		setf eruby
857
858" HTML with M4
859au BufNewFile,BufRead *.html.m4			setf htmlm4
860
861" HTML Cheetah template
862au BufNewFile,BufRead *.tmpl			setf htmlcheetah
863
864" Host config
865au BufNewFile,BufRead */etc/host.conf		setf hostconf
866
867" Hosts access
868au BufNewFile,BufRead */etc/hosts.allow,*/etc/hosts.deny  setf hostsaccess
869
870" Hyper Builder
871au BufNewFile,BufRead *.hb			setf hb
872
873" Icon
874au BufNewFile,BufRead *.icn			setf icon
875
876" IDL (Interface Description Language)
877au BufNewFile,BufRead *.idl			call s:FTidl()
878
879" Distinguish between standard IDL and MS-IDL
880func! s:FTidl()
881  let n = 1
882  while n < 50 && n < line("$")
883    if getline(n) =~ '^\s*import\s\+"\(unknwn\|objidl\)\.idl"'
884      setf msidl
885      return
886    endif
887    let n = n + 1
888  endwhile
889  setf idl
890endfunc
891
892" Microsoft IDL (Interface Description Language)  Also *.idl
893" MOF = WMI (Windows Management Instrumentation) Managed Object Format
894au BufNewFile,BufRead *.odl,*.mof		setf msidl
895
896" Icewm menu
897au BufNewFile,BufRead */.icewm/menu		setf icemenu
898
899" Indent profile (must come before IDL *.pro!)
900au BufNewFile,BufRead .indent.pro		setf indent
901au BufNewFile,BufRead indent.pro		call s:ProtoCheck('indent')
902
903" IDL (Interactive Data Language)
904au BufNewFile,BufRead *.pro			call s:ProtoCheck('idlang')
905
906" Distinguish between "default" and Cproto prototype file. */
907func! s:ProtoCheck(default)
908  " Cproto files have a comment in the first line and a function prototype in
909  " the second line, it always ends in ";".  Indent files may also have
910  " comments, thus we can't match comments to see the difference.
911  " IDL files can have a single ';' in the second line, require at least one
912  " chacter before the ';'.
913  if getline(2) =~ '.;$'
914    setf cpp
915  else
916    exe 'setf ' . a:default
917  endif
918endfunc
919
920
921" Indent RC
922au BufNewFile,BufRead indentrc			setf indent
923
924" Inform
925au BufNewFile,BufRead *.inf,*.INF		setf inform
926
927" Initng
928au BufNewFile,BufRead */etc/initng/**/*.i,*.ii	setf initng
929
930" Ipfilter
931au BufNewFile,BufRead ipf.conf,ipf6.conf,ipf.rules	setf ipfilter
932
933" Informix 4GL (source - canonical, include file, I4GL+M4 preproc.)
934au BufNewFile,BufRead *.4gl,*.4gh,*.m4gl	setf fgl
935
936" .INI file for MSDOS
937au BufNewFile,BufRead *.ini			setf dosini
938
939" SysV Inittab
940au BufNewFile,BufRead inittab			setf inittab
941
942" Inno Setup
943au BufNewFile,BufRead *.iss			setf iss
944
945" JAL
946au BufNewFile,BufRead *.jal,*.JAL		setf jal
947
948" Jam
949au BufNewFile,BufRead *.jpl,*.jpr		setf jam
950
951" Java
952au BufNewFile,BufRead *.java,*.jav		setf java
953
954" JavaCC
955au BufNewFile,BufRead *.jj,*.jjt		setf javacc
956
957" JavaScript, ECMAScript
958au BufNewFile,BufRead *.js,*.javascript,*.es,*.jsx,*.json   setf javascript
959
960" Java Server Pages
961au BufNewFile,BufRead *.jsp			setf jsp
962
963" Java Properties resource file (note: doesn't catch font.properties.pl)
964au BufNewFile,BufRead *.properties,*.properties_??,*.properties_??_??	setf jproperties
965au BufNewFile,BufRead *.properties_??_??_*	call s:StarSetf('jproperties')
966
967" Jess
968au BufNewFile,BufRead *.clp			setf jess
969
970" Jgraph
971au BufNewFile,BufRead *.jgr			setf jgraph
972
973" Jovial
974au BufNewFile,BufRead *.jov,*.j73,*.jovial	setf jovial
975
976" Kixtart
977au BufNewFile,BufRead *.kix			setf kix
978
979" Kimwitu[++]
980au BufNewFile,BufRead *.k			setf kwt
981
982" KDE script
983au BufNewFile,BufRead *.ks			setf kscript
984
985" Kconfig
986au BufNewFile,BufRead Kconfig,Kconfig.debug	setf kconfig
987
988" Lace (ISE)
989au BufNewFile,BufRead *.ace,*.ACE		setf lace
990
991" Latte
992au BufNewFile,BufRead *.latte,*.lte		setf latte
993
994" Limits
995au BufNewFile,BufRead */etc/limits,*/etc/*limits.conf,*/etc/*limits.d/*.conf	setf limits
996
997" LambdaProlog (*.mod too, see Modsim)
998au BufNewFile,BufRead *.sig			setf lprolog
999
1000" LDAP LDIF
1001au BufNewFile,BufRead *.ldif			setf ldif
1002
1003" Ld loader
1004au BufNewFile,BufRead *.ld			setf ld
1005
1006" Lex
1007au BufNewFile,BufRead *.lex,*.l			setf lex
1008
1009" Libao
1010au BufNewFile,BufRead */etc/libao.conf,*/.libao	setf libao
1011
1012" Libsensors
1013au BufNewFile,BufRead */etc/sensors.conf,*/etc/sensors3.conf	setf sensors
1014
1015" LFTP
1016au BufNewFile,BufRead lftp.conf,.lftprc,*lftp/rc	setf lftp
1017
1018" Lifelines (or Lex for C++!)
1019au BufNewFile,BufRead *.ll			setf lifelines
1020
1021" Lilo: Linux loader
1022au BufNewFile,BufRead lilo.conf			setf lilo
1023
1024" Lisp (*.el = ELisp, *.cl = Common Lisp, *.jl = librep Lisp)
1025if has("fname_case")
1026  au BufNewFile,BufRead *.lsp,*.lisp,*.el,*.cl,*.jl,*.L,.emacs,.sawfishrc setf lisp
1027else
1028  au BufNewFile,BufRead *.lsp,*.lisp,*.el,*.cl,*.jl,.emacs,.sawfishrc setf lisp
1029endif
1030
1031" SBCL implementation of Common Lisp
1032au BufNewFile,BufRead sbclrc,.sbclrc		setf lisp
1033
1034" Liquid
1035au BufNewFile,BufRead *.liquid			setf liquid
1036
1037" Lite
1038au BufNewFile,BufRead *.lite,*.lt		setf lite
1039
1040" LiteStep RC files
1041au BufNewFile,BufRead */LiteStep/*/*.rc		setf litestep
1042
1043" Login access
1044au BufNewFile,BufRead */etc/login.access	setf loginaccess
1045
1046" Login defs
1047au BufNewFile,BufRead */etc/login.defs		setf logindefs
1048
1049" Logtalk
1050au BufNewFile,BufRead *.lgt			setf logtalk
1051
1052" LOTOS
1053au BufNewFile,BufRead *.lot,*.lotos		setf lotos
1054
1055" Lout (also: *.lt)
1056au BufNewFile,BufRead *.lou,*.lout		setf lout
1057
1058" Lua
1059au BufNewFile,BufRead *.lua			setf lua
1060
1061" Linden Scripting Language (Second Life)
1062au BufNewFile,BufRead *.lsl			setf lsl
1063
1064" Lynx style file (or LotusScript!)
1065au BufNewFile,BufRead *.lss			setf lss
1066
1067" M4
1068au BufNewFile,BufRead *.m4
1069	\ if expand("<afile>") !~? 'html.m4$\|fvwm2rc' | setf m4 | endif
1070
1071" MaGic Point
1072au BufNewFile,BufRead *.mgp			setf mgp
1073
1074" Mail (for Elm, trn, mutt, muttng, rn, slrn)
1075au BufNewFile,BufRead snd.\d\+,.letter,.letter.\d\+,.followup,.article,.article.\d\+,pico.\d\+,mutt{ng,}-*-\w\+,mutt[[:alnum:]_-]\{6\},ae\d\+.txt,/tmp/SLRN[0-9A-Z.]\+,*.eml setf mail
1076
1077" Mail aliases
1078au BufNewFile,BufRead */etc/mail/aliases,*/etc/aliases	setf mailaliases
1079
1080" Mailcap configuration file
1081au BufNewFile,BufRead .mailcap,mailcap		setf mailcap
1082
1083" Makefile
1084au BufNewFile,BufRead *[mM]akefile,*.mk,*.mak,*.dsp setf make
1085
1086" MakeIndex
1087au BufNewFile,BufRead *.ist,*.mst		setf ist
1088
1089" Mallard
1090au BufNewFile,BufRead *.page			setf mallard
1091
1092" Manpage
1093au BufNewFile,BufRead *.man			setf man
1094
1095" Man config
1096au BufNewFile,BufRead */etc/man.conf,man.config	setf manconf
1097
1098" Maple V
1099au BufNewFile,BufRead *.mv,*.mpl,*.mws		setf maple
1100
1101" Map (UMN mapserver config file)
1102au BufNewFile,BufRead *.map			setf map
1103
1104" Markdown
1105au BufNewFile,BufRead *.markdown,*.mdown,*.mkd,*.mkdn,*.mdwn,README.md  setf markdown
1106
1107" Mason
1108au BufNewFile,BufRead *.mason,*.mhtml		setf mason
1109
1110" Matlab or Objective C
1111au BufNewFile,BufRead *.m			call s:FTm()
1112
1113func! s:FTm()
1114  let n = 1
1115  while n < 10
1116    let line = getline(n)
1117    if line =~ '^\s*\(#\s*\(include\|import\)\>\|/\*\|//\)'
1118      setf objc
1119      return
1120    endif
1121    if line =~ '^\s*%'
1122      setf matlab
1123      return
1124    endif
1125    if line =~ '^\s*(\*'
1126      setf mma
1127      return
1128    endif
1129    let n = n + 1
1130  endwhile
1131  if exists("g:filetype_m")
1132    exe "setf " . g:filetype_m
1133  else
1134    setf matlab
1135  endif
1136endfunc
1137
1138" Mathematica notebook
1139au BufNewFile,BufRead *.nb			setf mma
1140
1141" Maya Extension Language
1142au BufNewFile,BufRead *.mel			setf mel
1143
1144" Mercurial (hg) commit file
1145au BufNewFile,BufRead hg-editor-*.txt		setf hgcommit
1146
1147" Mercurial config (looks like generic config file)
1148au BufNewFile,BufRead *.hgrc,*hgrc		setf cfg
1149
1150" Messages (logs mostly)
1151au BufNewFile,BufRead */log/{auth,cron,daemon,debug,kern,lpr,mail,messages,news/news,syslog,user}{,.log,.err,.info,.warn,.crit,.notice}{,.[0-9]*,-[0-9]*} setf messages
1152
1153" Metafont
1154au BufNewFile,BufRead *.mf			setf mf
1155
1156" MetaPost
1157au BufNewFile,BufRead *.mp			setf mp
1158
1159" MGL
1160au BufNewFile,BufRead *.mgl			setf mgl
1161
1162" MMIX or VMS makefile
1163au BufNewFile,BufRead *.mms			call s:FTmms()
1164
1165" Symbian meta-makefile definition (MMP)
1166au BufNewFile,BufRead *.mmp			setf mmp
1167
1168func! s:FTmms()
1169  let n = 1
1170  while n < 10
1171    let line = getline(n)
1172    if line =~ '^\s*\(%\|//\)' || line =~ '^\*'
1173      setf mmix
1174      return
1175    endif
1176    if line =~ '^\s*#'
1177      setf make
1178      return
1179    endif
1180    let n = n + 1
1181  endwhile
1182  setf mmix
1183endfunc
1184
1185
1186" Modsim III (or LambdaProlog)
1187au BufNewFile,BufRead *.mod
1188	\ if getline(1) =~ '\<module\>' |
1189	\   setf lprolog |
1190	\ else |
1191	\   setf modsim3 |
1192	\ endif
1193
1194" Modula 2
1195au BufNewFile,BufRead *.m2,*.DEF,*.MOD,*.md,*.mi setf modula2
1196
1197" Modula 3 (.m3, .i3, .mg, .ig)
1198au BufNewFile,BufRead *.[mi][3g]		setf modula3
1199
1200" Monk
1201au BufNewFile,BufRead *.isc,*.monk,*.ssc,*.tsc	setf monk
1202
1203" MOO
1204au BufNewFile,BufRead *.moo			setf moo
1205
1206" Modconf
1207au BufNewFile,BufRead */etc/modules.conf,*/etc/modules,*/etc/conf.modules setf modconf
1208
1209" Mplayer config
1210au BufNewFile,BufRead mplayer.conf,*/.mplayer/config	setf mplayerconf
1211
1212" Moterola S record
1213au BufNewFile,BufRead *.s19,*.s28,*.s37		setf srec
1214
1215" Mrxvtrc
1216au BufNewFile,BufRead mrxvtrc,.mrxvtrc		setf mrxvtrc
1217
1218" Msql
1219au BufNewFile,BufRead *.msql			setf msql
1220
1221" Mysql
1222au BufNewFile,BufRead *.mysql			setf mysql
1223
1224" Mutt setup files (must be before catch *.rc)
1225au BufNewFile,BufRead */etc/Muttrc.d/*		call s:StarSetf('muttrc')
1226
1227" M$ Resource files
1228au BufNewFile,BufRead *.rc,*.rch		setf rc
1229
1230" MuPAD source
1231au BufRead,BufNewFile *.mu			setf mupad
1232
1233" Mush
1234au BufNewFile,BufRead *.mush			setf mush
1235
1236" Mutt setup file (also for Muttng)
1237au BufNewFile,BufRead Mutt{ng,}rc		setf muttrc
1238
1239" Nano
1240au BufNewFile,BufRead */etc/nanorc,.nanorc	setf nanorc
1241
1242" Nastran input/DMAP
1243"au BufNewFile,BufRead *.dat			setf nastran
1244
1245" Natural
1246au BufNewFile,BufRead *.NS[ACGLMNPS]		setf natural
1247
1248" Netrc
1249au BufNewFile,BufRead .netrc			setf netrc
1250
1251" Ninja file
1252au BufNewFile,BufRead *.ninja			setf ninja
1253
1254" Novell netware batch files
1255au BufNewFile,BufRead *.ncf			setf ncf
1256
1257" Nroff/Troff (*.ms and *.t are checked below)
1258au BufNewFile,BufRead *.me
1259	\ if expand("<afile>") != "read.me" && expand("<afile>") != "click.me" |
1260	\   setf nroff |
1261	\ endif
1262au BufNewFile,BufRead *.tr,*.nr,*.roff,*.tmac,*.mom	setf nroff
1263au BufNewFile,BufRead *.[1-9]			call s:FTnroff()
1264
1265" This function checks if one of the first five lines start with a dot.  In
1266" that case it is probably an nroff file: 'filetype' is set and 1 is returned.
1267func! s:FTnroff()
1268  if getline(1)[0] . getline(2)[0] . getline(3)[0] . getline(4)[0] . getline(5)[0] =~ '\.'
1269    setf nroff
1270    return 1
1271  endif
1272  return 0
1273endfunc
1274
1275" Nroff or Objective C++
1276au BufNewFile,BufRead *.mm			call s:FTmm()
1277
1278func! s:FTmm()
1279  let n = 1
1280  while n < 10
1281    let line = getline(n)
1282    if line =~ '^\s*\(#\s*\(include\|import\)\>\|/\*\)'
1283      setf objcpp
1284      return
1285    endif
1286    let n = n + 1
1287  endwhile
1288  setf nroff
1289endfunc
1290
1291" Not Quite C
1292au BufNewFile,BufRead *.nqc			setf nqc
1293
1294" NSIS
1295au BufNewFile,BufRead *.nsi,*.nsh		setf nsis
1296
1297" OCAML
1298au BufNewFile,BufRead *.ml,*.mli,*.mll,*.mly,.ocamlinit	setf ocaml
1299
1300" Occam
1301au BufNewFile,BufRead *.occ			setf occam
1302
1303" Omnimark
1304au BufNewFile,BufRead *.xom,*.xin		setf omnimark
1305
1306" OpenROAD
1307au BufNewFile,BufRead *.or			setf openroad
1308
1309" OPL
1310au BufNewFile,BufRead *.[Oo][Pp][Ll]		setf opl
1311
1312" Oracle config file
1313au BufNewFile,BufRead *.ora			setf ora
1314
1315" Packet filter conf
1316au BufNewFile,BufRead pf.conf			setf pf
1317
1318" Pam conf
1319au BufNewFile,BufRead */etc/pam.conf		setf pamconf
1320
1321" PApp
1322au BufNewFile,BufRead *.papp,*.pxml,*.pxsl	setf papp
1323
1324" Password file
1325au BufNewFile,BufRead */etc/passwd,*/etc/passwd-,*/etc/passwd.edit,*/etc/shadow,*/etc/shadow-,*/etc/shadow.edit,*/var/backups/passwd.bak,*/var/backups/shadow.bak setf passwd
1326
1327" Pascal (also *.p)
1328au BufNewFile,BufRead *.pas			setf pascal
1329
1330" Delphi project file
1331au BufNewFile,BufRead *.dpr			setf pascal
1332
1333" PDF
1334au BufNewFile,BufRead *.pdf			setf pdf
1335
1336" Perl
1337if has("fname_case")
1338  au BufNewFile,BufRead *.pl,*.PL		call s:FTpl()
1339else
1340  au BufNewFile,BufRead *.pl			call s:FTpl()
1341endif
1342au BufNewFile,BufRead *.plx,*.al		setf perl
1343au BufNewFile,BufRead *.p6,*.pm6		setf perl6
1344
1345func! s:FTpl()
1346  if exists("g:filetype_pl")
1347    exe "setf " . g:filetype_pl
1348  else
1349    " recognize Prolog by specific text in the first non-empty line
1350    " require a blank after the '%' because Perl uses "%list" and "%translate"
1351    let l = getline(nextnonblank(1))
1352    if l =~ '\<prolog\>' || l =~ '^\s*\(%\+\(\s\|$\)\|/\*\)' || l =~ ':-'
1353      setf prolog
1354    else
1355      setf perl
1356    endif
1357  endif
1358endfunc
1359
1360" Perl, XPM or XPM2
1361au BufNewFile,BufRead *.pm
1362	\ if getline(1) =~ "XPM2" |
1363	\   setf xpm2 |
1364	\ elseif getline(1) =~ "XPM" |
1365	\   setf xpm |
1366	\ else |
1367	\   setf perl |
1368	\ endif
1369
1370" Perl POD
1371au BufNewFile,BufRead *.pod			setf pod
1372
1373" Php, php3, php4, etc.
1374" Also Phtml (was used for PHP 2 in the past)
1375" Also .ctp for Cake template file
1376au BufNewFile,BufRead *.php,*.php\d,*.phtml,*.ctp	setf php
1377
1378" Pike
1379au BufNewFile,BufRead *.pike,*.lpc,*.ulpc,*.pmod setf pike
1380
1381" Pinfo config
1382au BufNewFile,BufRead */etc/pinforc,*/.pinforc	setf pinfo
1383
1384" Palm Resource compiler
1385au BufNewFile,BufRead *.rcp			setf pilrc
1386
1387" Pine config
1388au BufNewFile,BufRead .pinerc,pinerc,.pinercex,pinercex		setf pine
1389
1390" PL/M (also: *.inp)
1391au BufNewFile,BufRead *.plm,*.p36,*.pac		setf plm
1392
1393" PL/SQL
1394au BufNewFile,BufRead *.pls,*.plsql		setf plsql
1395
1396" PLP
1397au BufNewFile,BufRead *.plp			setf plp
1398
1399" PO and PO template (GNU gettext)
1400au BufNewFile,BufRead *.po,*.pot		setf po
1401
1402" Postfix main config
1403au BufNewFile,BufRead main.cf			setf pfmain
1404
1405" PostScript (+ font files, encapsulated PostScript, Adobe Illustrator)
1406au BufNewFile,BufRead *.ps,*.pfa,*.afm,*.eps,*.epsf,*.epsi,*.ai	  setf postscr
1407
1408" PostScript Printer Description
1409au BufNewFile,BufRead *.ppd			setf ppd
1410
1411" Povray
1412au BufNewFile,BufRead *.pov			setf pov
1413
1414" Povray configuration
1415au BufNewFile,BufRead .povrayrc			setf povini
1416
1417" Povray, PHP or assembly
1418au BufNewFile,BufRead *.inc			call s:FTinc()
1419
1420func! s:FTinc()
1421  if exists("g:filetype_inc")
1422    exe "setf " . g:filetype_inc
1423  else
1424    let lines = getline(1).getline(2).getline(3)
1425    if lines =~? "perlscript"
1426      setf aspperl
1427    elseif lines =~ "<%"
1428      setf aspvbs
1429    elseif lines =~ "<?"
1430      setf php
1431    else
1432      call s:FTasmsyntax()
1433      if exists("b:asmsyntax")
1434	exe "setf " . fnameescape(b:asmsyntax)
1435      else
1436	setf pov
1437      endif
1438    endif
1439  endif
1440endfunc
1441
1442" Printcap and Termcap
1443au BufNewFile,BufRead *printcap
1444	\ let b:ptcap_type = "print" | setf ptcap
1445au BufNewFile,BufRead *termcap
1446	\ let b:ptcap_type = "term" | setf ptcap
1447
1448" PCCTS / ANTRL
1449"au BufNewFile,BufRead *.g			setf antrl
1450au BufNewFile,BufRead *.g			setf pccts
1451
1452" PPWizard
1453au BufNewFile,BufRead *.it,*.ih			setf ppwiz
1454
1455" Obj 3D file format
1456" TODO: is there a way to avoid MS-Windows Object files?
1457au BufNewFile,BufRead *.obj			setf obj
1458
1459" Oracle Pro*C/C++
1460au BufNewFile,BufRead *.pc			setf proc
1461
1462" Privoxy actions file
1463au BufNewFile,BufRead *.action			setf privoxy
1464
1465" Procmail
1466au BufNewFile,BufRead .procmail,.procmailrc	setf procmail
1467
1468" Progress or CWEB
1469au BufNewFile,BufRead *.w			call s:FTprogress_cweb()
1470
1471func! s:FTprogress_cweb()
1472  if exists("g:filetype_w")
1473    exe "setf " . g:filetype_w
1474    return
1475  endif
1476  if getline(1) =~ '&ANALYZE' || getline(3) =~ '&GLOBAL-DEFINE'
1477    setf progress
1478  else
1479    setf cweb
1480  endif
1481endfunc
1482
1483" Progress or assembly
1484au BufNewFile,BufRead *.i			call s:FTprogress_asm()
1485
1486func! s:FTprogress_asm()
1487  if exists("g:filetype_i")
1488    exe "setf " . g:filetype_i
1489    return
1490  endif
1491  " This function checks for an assembly comment the first ten lines.
1492  " If not found, assume Progress.
1493  let lnum = 1
1494  while lnum <= 10 && lnum < line('$')
1495    let line = getline(lnum)
1496    if line =~ '^\s*;' || line =~ '^\*'
1497      call s:FTasm()
1498      return
1499    elseif line !~ '^\s*$' || line =~ '^/\*'
1500      " Not an empty line: Doesn't look like valid assembly code.
1501      " Or it looks like a Progress /* comment
1502      break
1503    endif
1504    let lnum = lnum + 1
1505  endw
1506  setf progress
1507endfunc
1508
1509" Progress or Pascal
1510au BufNewFile,BufRead *.p			call s:FTprogress_pascal()
1511
1512func! s:FTprogress_pascal()
1513  if exists("g:filetype_p")
1514    exe "setf " . g:filetype_p
1515    return
1516  endif
1517  " This function checks for valid Pascal syntax in the first ten lines.
1518  " Look for either an opening comment or a program start.
1519  " If not found, assume Progress.
1520  let lnum = 1
1521  while lnum <= 10 && lnum < line('$')
1522    let line = getline(lnum)
1523    if line =~ '^\s*\(program\|unit\|procedure\|function\|const\|type\|var\)\>'
1524	\ || line =~ '^\s*{' || line =~ '^\s*(\*'
1525      setf pascal
1526      return
1527    elseif line !~ '^\s*$' || line =~ '^/\*'
1528      " Not an empty line: Doesn't look like valid Pascal code.
1529      " Or it looks like a Progress /* comment
1530      break
1531    endif
1532    let lnum = lnum + 1
1533  endw
1534  setf progress
1535endfunc
1536
1537
1538" Software Distributor Product Specification File (POSIX 1387.2-1995)
1539au BufNewFile,BufRead *.psf			setf psf
1540au BufNewFile,BufRead INDEX,INFO
1541	\ if getline(1) =~ '^\s*\(distribution\|installed_software\|root\|bundle\|product\)\s*$' |
1542	\   setf psf |
1543	\ endif
1544
1545" Prolog
1546au BufNewFile,BufRead *.pdb			setf prolog
1547
1548" Promela
1549au BufNewFile,BufRead *.pml			setf promela
1550
1551" Protocols
1552au BufNewFile,BufRead */etc/protocols		setf protocols
1553
1554" Pyrex
1555au BufNewFile,BufRead *.pyx,*.pxd		setf pyrex
1556
1557" Python
1558au BufNewFile,BufRead *.py,*.pyw		setf python
1559
1560" Quixote (Python-based web framework)
1561au BufNewFile,BufRead *.ptl			setf python
1562
1563" Radiance
1564au BufNewFile,BufRead *.rad,*.mat		setf radiance
1565
1566" Ratpoison config/command files
1567au BufNewFile,BufRead .ratpoisonrc,ratpoisonrc	setf ratpoison
1568
1569" RCS file
1570au BufNewFile,BufRead *\,v			setf rcs
1571
1572" Readline
1573au BufNewFile,BufRead .inputrc,inputrc		setf readline
1574
1575" Registry for MS-Windows
1576au BufNewFile,BufRead *.reg
1577	\ if getline(1) =~? '^REGEDIT[0-9]*\s*$\|^Windows Registry Editor Version \d*\.\d*\s*$' | setf registry | endif
1578
1579" Renderman Interface Bytestream
1580au BufNewFile,BufRead *.rib			setf rib
1581
1582" Rexx
1583au BufNewFile,BufRead *.rex,*.orx,*.rxo,*.rxj,*.jrexx,*.rexxj,*.rexx,*.testGroup,*.testUnit	setf rexx
1584
1585" R (Splus)
1586if has("fname_case")
1587  au BufNewFile,BufRead *.s,*.S			setf r
1588else
1589  au BufNewFile,BufRead *.s			setf r
1590endif
1591
1592" R Help file
1593if has("fname_case")
1594  au BufNewFile,BufRead *.rd,*.Rd		setf rhelp
1595else
1596  au BufNewFile,BufRead *.rd			setf rhelp
1597endif
1598
1599" R noweb file
1600if has("fname_case")
1601  au BufNewFile,BufRead *.Rnw,*.rnw,*.Snw,*.snw		setf rnoweb
1602else
1603  au BufNewFile,BufRead *.rnw,*.snw			setf rnoweb
1604endif
1605
1606" Rexx, Rebol or R
1607au BufNewFile,BufRead *.r,*.R			call s:FTr()
1608
1609func! s:FTr()
1610  let max = line("$") > 50 ? 50 : line("$")
1611
1612  for n in range(1, max)
1613    " Rebol is easy to recognize, check for that first
1614    if getline(n) =~? '\<REBOL\>'
1615      setf rebol
1616      return
1617    endif
1618  endfor
1619
1620  for n in range(1, max)
1621    " R has # comments
1622    if getline(n) =~ '^\s*#'
1623      setf r
1624      return
1625    endif
1626    " Rexx has /* comments */
1627    if getline(n) =~ '^\s*/\*'
1628      setf rexx
1629      return
1630    endif
1631  endfor
1632
1633  " Nothing recognized, use user default or assume Rexx
1634  if exists("g:filetype_r")
1635    exe "setf " . g:filetype_r
1636  else
1637    " Rexx used to be the default, but R appears to be much more popular.
1638    setf r
1639  endif
1640endfunc
1641
1642" Remind
1643au BufNewFile,BufRead .reminders,*.remind,*.rem		setf remind
1644
1645" Resolv.conf
1646au BufNewFile,BufRead resolv.conf		setf resolv
1647
1648" Relax NG Compact
1649au BufNewFile,BufRead *.rnc			setf rnc
1650
1651" Relax NG XML
1652au BufNewFile,BufRead *.rng			setf rng
1653
1654" RPL/2
1655au BufNewFile,BufRead *.rpl			setf rpl
1656
1657" Robots.txt
1658au BufNewFile,BufRead robots.txt		setf robots
1659
1660" Rpcgen
1661au BufNewFile,BufRead *.x			setf rpcgen
1662
1663" reStructuredText Documentation Format
1664au BufNewFile,BufRead *.rst			setf rst
1665
1666" RTF
1667au BufNewFile,BufRead *.rtf			setf rtf
1668
1669" Interactive Ruby shell
1670au BufNewFile,BufRead .irbrc,irbrc		setf ruby
1671
1672" Ruby
1673au BufNewFile,BufRead *.rb,*.rbw		setf ruby
1674
1675" RubyGems
1676au BufNewFile,BufRead *.gemspec			setf ruby
1677
1678" Rackup
1679au BufNewFile,BufRead *.ru			setf ruby
1680
1681" Bundler
1682au BufNewFile,BufRead Gemfile			setf ruby
1683
1684" Ruby on Rails
1685au BufNewFile,BufRead *.builder,*.rxml,*.rjs	setf ruby
1686
1687" Rantfile and Rakefile is like Ruby
1688au BufNewFile,BufRead [rR]antfile,*.rant,[rR]akefile,*.rake	setf ruby
1689
1690" S-lang (or shader language, or SmallLisp)
1691au BufNewFile,BufRead *.sl			setf slang
1692
1693" Samba config
1694au BufNewFile,BufRead smb.conf			setf samba
1695
1696" SAS script
1697au BufNewFile,BufRead *.sas			setf sas
1698
1699" Sass
1700au BufNewFile,BufRead *.sass			setf sass
1701
1702" Sather
1703au BufNewFile,BufRead *.sa			setf sather
1704
1705" Scilab
1706au BufNewFile,BufRead *.sci,*.sce		setf scilab
1707
1708" SCSS
1709au BufNewFile,BufRead *.scss			setf scss
1710
1711" SD: Streaming Descriptors
1712au BufNewFile,BufRead *.sd			setf sd
1713
1714" SDL
1715au BufNewFile,BufRead *.sdl,*.pr		setf sdl
1716
1717" sed
1718au BufNewFile,BufRead *.sed			setf sed
1719
1720" Sieve (RFC 3028)
1721au BufNewFile,BufRead *.siv			setf sieve
1722
1723" Sendmail
1724au BufNewFile,BufRead sendmail.cf		setf sm
1725
1726" Sendmail .mc files are actually m4.  Could also be MS Message text file.
1727au BufNewFile,BufRead *.mc			call s:McSetf()
1728
1729func! s:McSetf()
1730  " Rely on the file to start with a comment.
1731  " MS message text files use ';', Sendmail files use '#' or 'dnl'
1732  for lnum in range(1, min([line("$"), 20]))
1733    let line = getline(lnum)
1734    if line =~ '^\s*\(#\|dnl\)'
1735      setf m4  " Sendmail .mc file
1736      return
1737    elseif line =~ '^\s*;'
1738      setf msmessages  " MS Message text file
1739      return
1740    endif
1741  endfor
1742  setf m4  " Default: Sendmail .mc file
1743endfunc
1744
1745" Services
1746au BufNewFile,BufRead */etc/services		setf services
1747
1748" Service Location config
1749au BufNewFile,BufRead */etc/slp.conf		setf slpconf
1750
1751" Service Location registration
1752au BufNewFile,BufRead */etc/slp.reg		setf slpreg
1753
1754" Service Location SPI
1755au BufNewFile,BufRead */etc/slp.spi		setf slpspi
1756
1757" Setserial config
1758au BufNewFile,BufRead */etc/serial.conf		setf setserial
1759
1760" SGML
1761au BufNewFile,BufRead *.sgm,*.sgml
1762	\ if getline(1).getline(2).getline(3).getline(4).getline(5) =~? 'linuxdoc' |
1763	\   setf sgmllnx |
1764	\ elseif getline(1) =~ '<!DOCTYPE.*DocBook' || getline(2) =~ '<!DOCTYPE.*DocBook' |
1765	\   let b:docbk_type = "sgml" |
1766	\   let b:docbk_ver = 4 |
1767	\   setf docbk |
1768	\ else |
1769	\   setf sgml |
1770	\ endif
1771
1772" SGMLDECL
1773au BufNewFile,BufRead *.decl,*.dcl,*.dec
1774	\ if getline(1).getline(2).getline(3) =~? '^<!SGML' |
1775	\    setf sgmldecl |
1776	\ endif
1777
1778" SGML catalog file
1779au BufNewFile,BufRead catalog			setf catalog
1780au BufNewFile,BufRead sgml.catalog*		call s:StarSetf('catalog')
1781
1782" Shell scripts (sh, ksh, bash, bash2, csh); Allow .profile_foo etc.
1783" Gentoo ebuilds are actually bash scripts
1784au BufNewFile,BufRead .bashrc*,bashrc,bash.bashrc,.bash_profile*,.bash_logout*,*.bash,*.ebuild call SetFileTypeSH("bash")
1785au BufNewFile,BufRead .kshrc*,*.ksh call SetFileTypeSH("ksh")
1786au BufNewFile,BufRead */etc/profile,.profile*,*.sh,*.env call SetFileTypeSH(getline(1))
1787
1788" Also called from scripts.vim.
1789func! SetFileTypeSH(name)
1790  if expand("<amatch>") =~ g:ft_ignore_pat
1791    return
1792  endif
1793  if a:name =~ '\<csh\>'
1794    " Some .sh scripts contain #!/bin/csh.
1795    call SetFileTypeShell("csh")
1796    return
1797  elseif a:name =~ '\<tcsh\>'
1798    " Some .sh scripts contain #!/bin/tcsh.
1799    call SetFileTypeShell("tcsh")
1800    return
1801  elseif a:name =~ '\<zsh\>'
1802    " Some .sh scripts contain #!/bin/zsh.
1803    call SetFileTypeShell("zsh")
1804    return
1805  elseif a:name =~ '\<ksh\>'
1806    let b:is_kornshell = 1
1807    if exists("b:is_bash")
1808      unlet b:is_bash
1809    endif
1810    if exists("b:is_sh")
1811      unlet b:is_sh
1812    endif
1813  elseif exists("g:bash_is_sh") || a:name =~ '\<bash\>' || a:name =~ '\<bash2\>'
1814    let b:is_bash = 1
1815    if exists("b:is_kornshell")
1816      unlet b:is_kornshell
1817    endif
1818    if exists("b:is_sh")
1819      unlet b:is_sh
1820    endif
1821  elseif a:name =~ '\<sh\>'
1822    let b:is_sh = 1
1823    if exists("b:is_kornshell")
1824      unlet b:is_kornshell
1825    endif
1826    if exists("b:is_bash")
1827      unlet b:is_bash
1828    endif
1829  endif
1830  call SetFileTypeShell("sh")
1831endfunc
1832
1833" For shell-like file types, check for an "exec" command hidden in a comment,
1834" as used for Tcl.
1835" Also called from scripts.vim, thus can't be local to this script.
1836func! SetFileTypeShell(name)
1837  if expand("<amatch>") =~ g:ft_ignore_pat
1838    return
1839  endif
1840  let l = 2
1841  while l < 20 && l < line("$") && getline(l) =~ '^\s*\(#\|$\)'
1842    " Skip empty and comment lines.
1843    let l = l + 1
1844  endwhile
1845  if l < line("$") && getline(l) =~ '\s*exec\s' && getline(l - 1) =~ '^\s*#.*\\$'
1846    " Found an "exec" line after a comment with continuation
1847    let n = substitute(getline(l),'\s*exec\s\+\([^ ]*/\)\=', '', '')
1848    if n =~ '\<tclsh\|\<wish'
1849      setf tcl
1850      return
1851    endif
1852  endif
1853  exe "setf " . a:name
1854endfunc
1855
1856" tcsh scripts
1857au BufNewFile,BufRead .tcshrc*,*.tcsh,tcsh.tcshrc,tcsh.login	call SetFileTypeShell("tcsh")
1858
1859" csh scripts, but might also be tcsh scripts (on some systems csh is tcsh)
1860au BufNewFile,BufRead .login*,.cshrc*,csh.cshrc,csh.login,csh.logout,*.csh,.alias  call s:CSH()
1861
1862func! s:CSH()
1863  if exists("g:filetype_csh")
1864    call SetFileTypeShell(g:filetype_csh)
1865  elseif &shell =~ "tcsh"
1866    call SetFileTypeShell("tcsh")
1867  else
1868    call SetFileTypeShell("csh")
1869  endif
1870endfunc
1871
1872" Z-Shell script
1873au BufNewFile,BufRead .zprofile,*/etc/zprofile,.zfbfmarks  setf zsh
1874au BufNewFile,BufRead .zsh*,.zlog*,.zcompdump*  call s:StarSetf('zsh')
1875au BufNewFile,BufRead *.zsh			setf zsh
1876
1877" Scheme
1878au BufNewFile,BufRead *.scm,*.ss,*.rkt		setf scheme
1879
1880" Screen RC
1881au BufNewFile,BufRead .screenrc,screenrc	setf screen
1882
1883" Simula
1884au BufNewFile,BufRead *.sim			setf simula
1885
1886" SINDA
1887au BufNewFile,BufRead *.sin,*.s85		setf sinda
1888
1889" SiSU
1890au BufNewFile,BufRead *.sst,*.ssm,*.ssi,*.-sst,*._sst setf sisu
1891au BufNewFile,BufRead *.sst.meta,*.-sst.meta,*._sst.meta setf sisu
1892
1893" SKILL
1894au BufNewFile,BufRead *.il,*.ils,*.cdf		setf skill
1895
1896" SLRN
1897au BufNewFile,BufRead .slrnrc			setf slrnrc
1898au BufNewFile,BufRead *.score			setf slrnsc
1899
1900" Smalltalk (and TeX)
1901au BufNewFile,BufRead *.st			setf st
1902au BufNewFile,BufRead *.cls
1903	\ if getline(1) =~ '^%' |
1904	\  setf tex |
1905	\ elseif getline(1)[0] == '#' && getline(1) =~ 'rexx' |
1906	\  setf rexx |
1907	\ else |
1908	\  setf st |
1909	\ endif
1910
1911" Smarty templates
1912au BufNewFile,BufRead *.tpl			setf smarty
1913
1914" SMIL or XML
1915au BufNewFile,BufRead *.smil
1916	\ if getline(1) =~ '<?\s*xml.*?>' |
1917	\   setf xml |
1918	\ else |
1919	\   setf smil |
1920	\ endif
1921
1922" SMIL or SNMP MIB file
1923au BufNewFile,BufRead *.smi
1924	\ if getline(1) =~ '\<smil\>' |
1925	\   setf smil |
1926	\ else |
1927	\   setf mib |
1928	\ endif
1929
1930" SMITH
1931au BufNewFile,BufRead *.smt,*.smith		setf smith
1932
1933" Snobol4 and spitbol
1934au BufNewFile,BufRead *.sno,*.spt		setf snobol4
1935
1936" SNMP MIB files
1937au BufNewFile,BufRead *.mib,*.my		setf mib
1938
1939" Snort Configuration
1940au BufNewFile,BufRead *.hog,snort.conf,vision.conf	setf hog
1941au BufNewFile,BufRead *.rules			call s:FTRules()
1942
1943let s:ft_rules_udev_rules_pattern = '^\s*\cudev_rules\s*=\s*"\([^"]\{-1,}\)/*".*'
1944func! s:FTRules()
1945  let path = expand('<amatch>:p')
1946  if path =~ '^/\(etc/udev/\%(rules\.d/\)\=.*\.rules\|lib/udev/\%(rules\.d/\)\=.*\.rules\)$'
1947    setf udevrules
1948    return
1949  endif
1950  if path =~ '^/etc/ufw/'
1951    setf conf  " Better than hog
1952    return
1953  endif
1954  try
1955    let config_lines = readfile('/etc/udev/udev.conf')
1956  catch /^Vim\%((\a\+)\)\=:E484/
1957    setf hog
1958    return
1959  endtry
1960  let dir = expand('<amatch>:p:h')
1961  for line in config_lines
1962    if line =~ s:ft_rules_udev_rules_pattern
1963      let udev_rules = substitute(line, s:ft_rules_udev_rules_pattern, '\1', "")
1964      if dir == udev_rules
1965        setf udevrules
1966      endif
1967      break
1968    endif
1969  endfor
1970  setf hog
1971endfunc
1972
1973
1974" Spec (Linux RPM)
1975au BufNewFile,BufRead *.spec			setf spec
1976
1977" Speedup (AspenTech plant simulator)
1978au BufNewFile,BufRead *.speedup,*.spdata,*.spd	setf spup
1979
1980" Slice
1981au BufNewFile,BufRead *.ice			setf slice
1982
1983" Spice
1984au BufNewFile,BufRead *.sp,*.spice		setf spice
1985
1986" Spyce
1987au BufNewFile,BufRead *.spy,*.spi		setf spyce
1988
1989" Squid
1990au BufNewFile,BufRead squid.conf		setf squid
1991
1992" SQL for Oracle Designer
1993au BufNewFile,BufRead *.tyb,*.typ,*.tyc,*.pkb,*.pks	setf sql
1994
1995" SQL
1996au BufNewFile,BufRead *.sql			call s:SQL()
1997
1998func! s:SQL()
1999  if exists("g:filetype_sql")
2000    exe "setf " . g:filetype_sql
2001  else
2002    setf sql
2003  endif
2004endfunc
2005
2006" SQLJ
2007au BufNewFile,BufRead *.sqlj			setf sqlj
2008
2009" SQR
2010au BufNewFile,BufRead *.sqr,*.sqi		setf sqr
2011
2012" OpenSSH configuration
2013au BufNewFile,BufRead ssh_config,*/.ssh/config	setf sshconfig
2014
2015" OpenSSH server configuration
2016au BufNewFile,BufRead sshd_config		setf sshdconfig
2017
2018" Stata
2019au BufNewFile,BufRead *.ado,*.class,*.do,*.imata,*.mata   setf stata
2020
2021" SMCL
2022au BufNewFile,BufRead *.hlp,*.ihlp,*.smcl	setf smcl
2023
2024" Stored Procedures
2025au BufNewFile,BufRead *.stp			setf stp
2026
2027" Standard ML
2028au BufNewFile,BufRead *.sml			setf sml
2029
2030" Sratus VOS command macro
2031au BufNewFile,BufRead *.cm			setf voscm
2032
2033" Sysctl
2034au BufNewFile,BufRead */etc/sysctl.conf,*/etc/sysctl.d/*.conf	setf sysctl
2035
2036" Synopsys Design Constraints
2037au BufNewFile,BufRead *.sdc			setf sdc
2038
2039" Sudoers
2040au BufNewFile,BufRead */etc/sudoers,sudoers.tmp	setf sudoers
2041
2042" SVG (Scalable Vector Graphics)
2043au BufNewFile,BufRead *.svg			setf svg
2044
2045" If the file has an extension of 't' and is in a directory 't' then it is
2046" almost certainly a Perl test file.
2047" If the first line starts with '#' and contains 'perl' it's probably a Perl
2048" file.
2049" (Slow test) If a file contains a 'use' statement then it is almost certainly
2050" a Perl file.
2051func! s:FTperl()
2052  if expand("%:e") == 't' && expand("%:p:h:t") == 't'
2053    setf perl
2054    return 1
2055  endif
2056  if getline(1)[0] == '#' && getline(1) =~ 'perl'
2057    setf perl
2058    return 1
2059  endif
2060  if search('^use\s\s*\k', 'nc', 30)
2061    setf perl
2062    return 1
2063  endif
2064  return 0
2065endfunc
2066
2067" Tads (or Nroff or Perl test file)
2068au BufNewFile,BufRead *.t
2069	\ if !s:FTnroff() && !s:FTperl() | setf tads | endif
2070
2071" Tags
2072au BufNewFile,BufRead tags			setf tags
2073
2074" TAK
2075au BufNewFile,BufRead *.tak			setf tak
2076
2077" Task
2078au BufRead,BufNewFile {pending,completed,undo}.data  setf taskdata
2079au BufRead,BufNewFile *.task                    setf taskedit
2080
2081" Tcl (JACL too)
2082au BufNewFile,BufRead *.tcl,*.tk,*.itcl,*.itk,*.jacl	setf tcl
2083
2084" TealInfo
2085au BufNewFile,BufRead *.tli			setf tli
2086
2087" Telix Salt
2088au BufNewFile,BufRead *.slt			setf tsalt
2089
2090" Terminfo
2091au BufNewFile,BufRead *.ti			setf terminfo
2092
2093" TeX
2094au BufNewFile,BufRead *.latex,*.sty,*.dtx,*.ltx,*.bbl	setf tex
2095au BufNewFile,BufRead *.tex			call s:FTtex()
2096
2097" Choose context, plaintex, or tex (LaTeX) based on these rules:
2098" 1. Check the first line of the file for "%&<format>".
2099" 2. Check the first 1000 non-comment lines for LaTeX or ConTeXt keywords.
2100" 3. Default to "latex" or to g:tex_flavor, can be set in user's vimrc.
2101func! s:FTtex()
2102  let firstline = getline(1)
2103  if firstline =~ '^%&\s*\a\+'
2104    let format = tolower(matchstr(firstline, '\a\+'))
2105    let format = substitute(format, 'pdf', '', '')
2106    if format == 'tex'
2107      let format = 'plain'
2108    endif
2109  else
2110    " Default value, may be changed later:
2111    let format = exists("g:tex_flavor") ? g:tex_flavor : 'plain'
2112    " Save position, go to the top of the file, find first non-comment line.
2113    let save_cursor = getpos('.')
2114    call cursor(1,1)
2115    let firstNC = search('^\s*[^[:space:]%]', 'c', 1000)
2116    if firstNC " Check the next thousand lines for a LaTeX or ConTeXt keyword.
2117      let lpat = 'documentclass\>\|usepackage\>\|begin{\|newcommand\>\|renewcommand\>'
2118      let cpat = 'start\a\+\|setup\a\+\|usemodule\|enablemode\|enableregime\|setvariables\|useencoding\|usesymbols\|stelle\a\+\|verwende\a\+\|stel\a\+\|gebruik\a\+\|usa\a\+\|imposta\a\+\|regle\a\+\|utilisemodule\>'
2119      let kwline = search('^\s*\\\%(' . lpat . '\)\|^\s*\\\(' . cpat . '\)',
2120			      \ 'cnp', firstNC + 1000)
2121      if kwline == 1	" lpat matched
2122	let format = 'latex'
2123      elseif kwline == 2	" cpat matched
2124	let format = 'context'
2125      endif		" If neither matched, keep default set above.
2126      " let lline = search('^\s*\\\%(' . lpat . '\)', 'cn', firstNC + 1000)
2127      " let cline = search('^\s*\\\%(' . cpat . '\)', 'cn', firstNC + 1000)
2128      " if cline > 0
2129      "   let format = 'context'
2130      " endif
2131      " if lline > 0 && (cline == 0 || cline > lline)
2132      "   let format = 'tex'
2133      " endif
2134    endif " firstNC
2135    call setpos('.', save_cursor)
2136  endif " firstline =~ '^%&\s*\a\+'
2137
2138  " Translation from formats to file types.  TODO:  add AMSTeX, RevTex, others?
2139  if format == 'plain'
2140    setf plaintex
2141  elseif format == 'context'
2142    setf context
2143  else " probably LaTeX
2144    setf tex
2145  endif
2146  return
2147endfunc
2148
2149" ConTeXt
2150au BufNewFile,BufRead tex/context/*/*.tex,*.mkii,*.mkiv   setf context
2151
2152" Texinfo
2153au BufNewFile,BufRead *.texinfo,*.texi,*.txi	setf texinfo
2154
2155" TeX configuration
2156au BufNewFile,BufRead texmf.cnf			setf texmf
2157
2158" Tidy config
2159au BufNewFile,BufRead .tidyrc,tidyrc		setf tidy
2160
2161" TF mud client
2162au BufNewFile,BufRead *.tf,.tfrc,tfrc		setf tf
2163
2164" TPP - Text Presentation Program
2165au BufNewFile,BufReadPost *.tpp			setf tpp
2166
2167" Treetop
2168au BufRead,BufNewFile *.treetop			setf treetop
2169
2170" Trustees
2171au BufNewFile,BufRead trustees.conf		setf trustees
2172
2173" TSS - Geometry
2174au BufNewFile,BufReadPost *.tssgm		setf tssgm
2175
2176" TSS - Optics
2177au BufNewFile,BufReadPost *.tssop		setf tssop
2178
2179" TSS - Command Line (temporary)
2180au BufNewFile,BufReadPost *.tsscl		setf tsscl
2181
2182" TWIG files
2183au BufNewFile,BufReadPost *.twig		setf twig
2184
2185" Motif UIT/UIL files
2186au BufNewFile,BufRead *.uit,*.uil		setf uil
2187
2188" Udev conf
2189au BufNewFile,BufRead */etc/udev/udev.conf	setf udevconf
2190
2191" Udev permissions
2192au BufNewFile,BufRead */etc/udev/permissions.d/*.permissions setf udevperm
2193"
2194" Udev symlinks config
2195au BufNewFile,BufRead */etc/udev/cdsymlinks.conf	setf sh
2196
2197" UnrealScript
2198au BufNewFile,BufRead *.uc			setf uc
2199
2200" Updatedb
2201au BufNewFile,BufRead */etc/updatedb.conf	setf updatedb
2202
2203" Upstart (init(8)) config files
2204au BufNewFile,BufRead */usr/share/upstart/*.conf               setf upstart
2205au BufNewFile,BufRead */usr/share/upstart/*.override           setf upstart
2206au BufNewFile,BufRead */etc/init/*.conf,*/etc/init/*.override  setf upstart
2207au BufNewFile,BufRead */.init/*.conf,*/.init/*.override        setf upstart
2208au BufNewFile,BufRead */.config/upstart/*.conf                 setf upstart
2209au BufNewFile,BufRead */.config/upstart/*.override             setf upstart
2210
2211" Vera
2212au BufNewFile,BufRead *.vr,*.vri,*.vrh		setf vera
2213
2214" Verilog HDL
2215au BufNewFile,BufRead *.v			setf verilog
2216
2217" Verilog-AMS HDL
2218au BufNewFile,BufRead *.va,*.vams		setf verilogams
2219
2220" VHDL
2221au BufNewFile,BufRead *.hdl,*.vhd,*.vhdl,*.vbe,*.vst  setf vhdl
2222au BufNewFile,BufRead *.vhdl_[0-9]*		call s:StarSetf('vhdl')
2223
2224" Vim script
2225au BufNewFile,BufRead *.vim,*.vba,.exrc,_exrc	setf vim
2226
2227" Viminfo file
2228au BufNewFile,BufRead .viminfo,_viminfo		setf viminfo
2229
2230" Virata Config Script File or Drupal module
2231au BufRead,BufNewFile *.hw,*.module,*.pkg
2232	\ if getline(1) =~ '<?php' |
2233	\   setf php |
2234	\ else |
2235	\   setf virata |
2236	\ endif
2237
2238" Visual Basic (also uses *.bas) or FORM
2239au BufNewFile,BufRead *.frm			call s:FTVB("form")
2240
2241" SaxBasic is close to Visual Basic
2242au BufNewFile,BufRead *.sba			setf vb
2243
2244" Vgrindefs file
2245au BufNewFile,BufRead vgrindefs			setf vgrindefs
2246
2247" VRML V1.0c
2248au BufNewFile,BufRead *.wrl			setf vrml
2249
2250" Webmacro
2251au BufNewFile,BufRead *.wm			setf webmacro
2252
2253" Wget config
2254au BufNewFile,BufRead .wgetrc,wgetrc		setf wget
2255
2256" Website MetaLanguage
2257au BufNewFile,BufRead *.wml			setf wml
2258
2259" Winbatch
2260au BufNewFile,BufRead *.wbt			setf winbatch
2261
2262" WSML
2263au BufNewFile,BufRead *.wsml			setf wsml
2264
2265" WvDial
2266au BufNewFile,BufRead wvdial.conf,.wvdialrc	setf wvdial
2267
2268" CVS RC file
2269au BufNewFile,BufRead .cvsrc			setf cvsrc
2270
2271" CVS commit file
2272au BufNewFile,BufRead cvs\d\+			setf cvs
2273
2274" WEB (*.web is also used for Winbatch: Guess, based on expecting "%" comment
2275" lines in a WEB file).
2276au BufNewFile,BufRead *.web
2277	\ if getline(1)[0].getline(2)[0].getline(3)[0].getline(4)[0].getline(5)[0] =~ "%" |
2278	\   setf web |
2279	\ else |
2280	\   setf winbatch |
2281	\ endif
2282
2283" Windows Scripting Host and Windows Script Component
2284au BufNewFile,BufRead *.ws[fc]			setf wsh
2285
2286" XHTML
2287au BufNewFile,BufRead *.xhtml,*.xht		setf xhtml
2288
2289" X Pixmap (dynamically sets colors, use BufEnter to make it work better)
2290au BufEnter *.xpm
2291	\ if getline(1) =~ "XPM2" |
2292	\   setf xpm2 |
2293	\ else |
2294	\   setf xpm |
2295	\ endif
2296au BufEnter *.xpm2				setf xpm2
2297
2298" XFree86 config
2299au BufNewFile,BufRead XF86Config
2300	\ if getline(1) =~ '\<XConfigurator\>' |
2301	\   let b:xf86conf_xfree86_version = 3 |
2302	\ endif |
2303	\ setf xf86conf
2304au BufNewFile,BufRead */xorg.conf.d/*.conf
2305	\ let b:xf86conf_xfree86_version = 4 |
2306	\ setf xf86conf
2307
2308" Xorg config
2309au BufNewFile,BufRead xorg.conf,xorg.conf-4	let b:xf86conf_xfree86_version = 4 | setf xf86conf
2310
2311" Xinetd conf
2312au BufNewFile,BufRead */etc/xinetd.conf		setf xinetd
2313
2314" XS Perl extension interface language
2315au BufNewFile,BufRead *.xs			setf xs
2316
2317" X resources file
2318au BufNewFile,BufRead .Xdefaults,.Xpdefaults,.Xresources,xdm-config,*.ad setf xdefaults
2319
2320" Xmath
2321au BufNewFile,BufRead *.msc,*.msf		setf xmath
2322au BufNewFile,BufRead *.ms
2323	\ if !s:FTnroff() | setf xmath | endif
2324
2325" XML  specific variants: docbk and xbl
2326au BufNewFile,BufRead *.xml			call s:FTxml()
2327
2328func! s:FTxml()
2329  let n = 1
2330  while n < 100 && n < line("$")
2331    let line = getline(n)
2332    " DocBook 4 or DocBook 5.
2333    let is_docbook4 = line =~ '<!DOCTYPE.*DocBook'
2334    let is_docbook5 = line =~ ' xmlns="http://docbook.org/ns/docbook"'
2335    if is_docbook4 || is_docbook5
2336      let b:docbk_type = "xml"
2337      if is_docbook5
2338	let b:docbk_ver = 5
2339      else
2340	let b:docbk_ver = 4
2341      endif
2342      setf docbk
2343      return
2344    endif
2345    if line =~ 'xmlns:xbl="http://www.mozilla.org/xbl"'
2346      setf xbl
2347      return
2348    endif
2349    let n += 1
2350  endwhile
2351  setf xml
2352endfunc
2353
2354" XMI (holding UML models) is also XML
2355au BufNewFile,BufRead *.xmi			setf xml
2356
2357" CSPROJ files are Visual Studio.NET's XML-based project config files
2358au BufNewFile,BufRead *.csproj,*.csproj.user	setf xml
2359
2360" Qt Linguist translation source and Qt User Interface Files are XML
2361au BufNewFile,BufRead *.ts,*.ui			setf xml
2362
2363" TPM's are RDF-based descriptions of TeX packages (Nikolai Weibull)
2364au BufNewFile,BufRead *.tpm			setf xml
2365
2366" Xdg menus
2367au BufNewFile,BufRead */etc/xdg/menus/*.menu	setf xml
2368
2369" ATI graphics driver configuration
2370au BufNewFile,BufRead fglrxrc			setf xml
2371
2372" XLIFF (XML Localisation Interchange File Format) is also XML
2373au BufNewFile,BufRead *.xlf			setf xml
2374au BufNewFile,BufRead *.xliff			setf xml
2375
2376" XML User Interface Language
2377au BufNewFile,BufRead *.xul			setf xml
2378
2379" X11 xmodmap (also see below)
2380au BufNewFile,BufRead *Xmodmap			setf xmodmap
2381
2382" Xquery
2383au BufNewFile,BufRead *.xq,*.xql,*.xqm,*.xquery,*.xqy	setf xquery
2384
2385" XSD
2386au BufNewFile,BufRead *.xsd			setf xsd
2387
2388" Xslt
2389au BufNewFile,BufRead *.xsl,*.xslt		setf xslt
2390
2391" Yacc
2392au BufNewFile,BufRead *.yy			setf yacc
2393
2394" Yacc or racc
2395au BufNewFile,BufRead *.y			call s:FTy()
2396
2397func! s:FTy()
2398  let n = 1
2399  while n < 100 && n < line("$")
2400    let line = getline(n)
2401    if line =~ '^\s*%'
2402      setf yacc
2403      return
2404    endif
2405    if getline(n) =~ '^\s*\(#\|class\>\)' && getline(n) !~ '^\s*#\s*include'
2406      setf racc
2407      return
2408    endif
2409    let n = n + 1
2410  endwhile
2411  setf yacc
2412endfunc
2413
2414
2415" Yaml
2416au BufNewFile,BufRead *.yaml,*.yml		setf yaml
2417
2418" yum conf (close enough to dosini)
2419au BufNewFile,BufRead */etc/yum.conf		setf dosini
2420
2421" Zimbu
2422au BufNewFile,BufRead *.zu			setf zimbu
2423
2424" Zope
2425"   dtml (zope dynamic template markup language), pt (zope page template),
2426"   cpt (zope form controller page template)
2427au BufNewFile,BufRead *.dtml,*.pt,*.cpt		call s:FThtml()
2428"   zsql (zope sql method)
2429au BufNewFile,BufRead *.zsql			call s:SQL()
2430
2431" Z80 assembler asz80
2432au BufNewFile,BufRead *.z8a			setf z8a
2433
2434augroup END
2435
2436
2437" Source the user-specified filetype file, for backwards compatibility with
2438" Vim 5.x.
2439if exists("myfiletypefile") && filereadable(expand(myfiletypefile))
2440  execute "source " . myfiletypefile
2441endif
2442
2443
2444" Check for "*" after loading myfiletypefile, so that scripts.vim is only used
2445" when there are no matching file name extensions.
2446" Don't do this for compressed files.
2447augroup filetypedetect
2448au BufNewFile,BufRead *
2449	\ if !did_filetype() && expand("<amatch>") !~ g:ft_ignore_pat
2450	\ | runtime! scripts.vim | endif
2451au StdinReadPost * if !did_filetype() | runtime! scripts.vim | endif
2452
2453
2454" Extra checks for when no filetype has been detected now.  Mostly used for
2455" patterns that end in "*".  E.g., "zsh*" matches "zsh.vim", but that's a Vim
2456" script file.
2457" Most of these should call s:StarSetf() to avoid names ending in .gz and the
2458" like are used.
2459
2460" More Apache config files
2461au BufNewFile,BufRead access.conf*,apache.conf*,apache2.conf*,httpd.conf*,srm.conf*	call s:StarSetf('apache')
2462au BufNewFile,BufRead */etc/apache2/*.conf*,*/etc/apache2/conf.*/*,*/etc/apache2/mods-*/*,*/etc/apache2/sites-*/*,*/etc/httpd/conf.d/*.conf*		call s:StarSetf('apache')
2463
2464" Asterisk config file
2465au BufNewFile,BufRead *asterisk/*.conf*		call s:StarSetf('asterisk')
2466au BufNewFile,BufRead *asterisk*/*voicemail.conf* call s:StarSetf('asteriskvm')
2467
2468" Bazaar version control
2469au BufNewFile,BufRead bzr_log.*			setf bzr
2470
2471" BIND zone
2472au BufNewFile,BufRead */named/db.*,*/bind/db.*	call s:StarSetf('bindzone')
2473
2474" Calendar
2475au BufNewFile,BufRead */.calendar/*,
2476	\*/share/calendar/*/calendar.*,*/share/calendar/calendar.*
2477	\					call s:StarSetf('calendar')
2478
2479" Changelog
2480au BufNewFile,BufRead [cC]hange[lL]og*
2481	\ if getline(1) =~ '; urgency='
2482	\|  call s:StarSetf('debchangelog')
2483	\|else
2484	\|  call s:StarSetf('changelog')
2485	\|endif
2486
2487" Crontab
2488au BufNewFile,BufRead crontab,crontab.*,*/etc/cron.d/*		call s:StarSetf('crontab')
2489
2490" dnsmasq(8) configuration
2491au BufNewFile,BufRead */etc/dnsmasq.d/*		call s:StarSetf('dnsmasq')
2492
2493" Dracula
2494au BufNewFile,BufRead drac.*			call s:StarSetf('dracula')
2495
2496" Fvwm
2497au BufNewFile,BufRead */.fvwm/*			call s:StarSetf('fvwm')
2498au BufNewFile,BufRead *fvwmrc*,*fvwm95*.hook
2499	\ let b:fvwm_version = 1 | call s:StarSetf('fvwm')
2500au BufNewFile,BufRead *fvwm2rc*
2501	\ if expand("<afile>:e") == "m4"
2502	\|  call s:StarSetf('fvwm2m4')
2503	\|else
2504	\|  let b:fvwm_version = 2 | call s:StarSetf('fvwm')
2505	\|endif
2506
2507" Gedcom
2508au BufNewFile,BufRead */tmp/lltmp*		call s:StarSetf('gedcom')
2509
2510" GTK RC
2511au BufNewFile,BufRead .gtkrc*,gtkrc*		call s:StarSetf('gtkrc')
2512
2513" Jam
2514au BufNewFile,BufRead Prl*.*,JAM*.*		call s:StarSetf('jam')
2515
2516" Jargon
2517au! BufNewFile,BufRead *jarg*
2518	\ if getline(1).getline(2).getline(3).getline(4).getline(5) =~? 'THIS IS THE JARGON FILE'
2519	\|  call s:StarSetf('jargon')
2520	\|endif
2521
2522" Kconfig
2523au BufNewFile,BufRead Kconfig.*			call s:StarSetf('kconfig')
2524
2525" Lilo: Linux loader
2526au BufNewFile,BufRead lilo.conf*		call s:StarSetf('lilo')
2527
2528" Logcheck
2529au BufNewFile,BufRead */etc/logcheck/*.d*/*	call s:StarSetf('logcheck')
2530
2531" Makefile
2532au BufNewFile,BufRead [mM]akefile*		call s:StarSetf('make')
2533
2534" Ruby Makefile
2535au BufNewFile,BufRead [rR]akefile*		call s:StarSetf('ruby')
2536
2537" Mail (also matches muttrc.vim, so this is below the other checks)
2538au BufNewFile,BufRead mutt[[:alnum:]._-]\{6\}	setf mail
2539
2540" Modconf
2541au BufNewFile,BufRead */etc/modutils/*
2542	\ if executable(expand("<afile>")) != 1
2543	\|  call s:StarSetf('modconf')
2544	\|endif
2545au BufNewFile,BufRead */etc/modprobe.*		call s:StarSetf('modconf')
2546
2547" Mutt setup file
2548au BufNewFile,BufRead .mutt{ng,}rc*,*/.mutt{ng,}/mutt{ng,}rc*	call s:StarSetf('muttrc')
2549au BufNewFile,BufRead mutt{ng,}rc*,Mutt{ng,}rc*		call s:StarSetf('muttrc')
2550
2551" Nroff macros
2552au BufNewFile,BufRead tmac.*			call s:StarSetf('nroff')
2553
2554" Pam conf
2555au BufNewFile,BufRead */etc/pam.d/*		call s:StarSetf('pamconf')
2556
2557" Printcap and Termcap
2558au BufNewFile,BufRead *printcap*
2559	\ if !did_filetype()
2560	\|  let b:ptcap_type = "print" | call s:StarSetf('ptcap')
2561	\|endif
2562au BufNewFile,BufRead *termcap*
2563	\ if !did_filetype()
2564	\|  let b:ptcap_type = "term" | call s:StarSetf('ptcap')
2565	\|endif
2566
2567" ReDIF
2568" Only used when the .rdf file was not detected to be XML.
2569au BufRead,BufNewFile *.rdf			call s:Redif()
2570func! s:Redif()
2571  let lnum = 1
2572  while lnum <= 5 && lnum < line('$')
2573    if getline(lnum) =~ "^\ctemplate-type:"
2574      setf redif
2575      return
2576    endif
2577    let lnum = lnum + 1
2578  endwhile
2579endfunc
2580
2581" Remind
2582au BufNewFile,BufRead .reminders*		call s:StarSetf('remind')
2583
2584" Vim script
2585au BufNewFile,BufRead *vimrc*			call s:StarSetf('vim')
2586
2587" Subversion commit file
2588au BufNewFile,BufRead svn-commit*.tmp		setf svn
2589
2590" X resources file
2591au BufNewFile,BufRead Xresources*,*/app-defaults/*,*/Xresources/* call s:StarSetf('xdefaults')
2592
2593" XFree86 config
2594au BufNewFile,BufRead XF86Config-4*
2595	\ let b:xf86conf_xfree86_version = 4 | call s:StarSetf('xf86conf')
2596au BufNewFile,BufRead XF86Config*
2597	\ if getline(1) =~ '\<XConfigurator\>'
2598	\|  let b:xf86conf_xfree86_version = 3
2599	\|endif
2600	\|call s:StarSetf('xf86conf')
2601
2602" X11 xmodmap
2603au BufNewFile,BufRead *xmodmap*			call s:StarSetf('xmodmap')
2604
2605" Xinetd conf
2606au BufNewFile,BufRead */etc/xinetd.d/*		call s:StarSetf('xinetd')
2607
2608" yum conf (close enough to dosini)
2609au BufNewFile,BufRead */etc/yum.repos.d/*	call s:StarSetf('dosini')
2610
2611" Z-Shell script
2612au BufNewFile,BufRead zsh*,zlog*		call s:StarSetf('zsh')
2613
2614
2615" Plain text files, needs to be far down to not override others.  This avoids
2616" the "conf" type being used if there is a line starting with '#'.
2617au BufNewFile,BufRead *.txt,*.text		setf text
2618
2619
2620" Use the filetype detect plugins.  They may overrule any of the previously
2621" detected filetypes.
2622runtime! ftdetect/*.vim
2623
2624" NOTE: The above command could have ended the filetypedetect autocmd group
2625" and started another one. Let's make sure it has ended to get to a consistent
2626" state.
2627augroup END
2628
2629" Generic configuration file (check this last, it's just guessing!)
2630au filetypedetect BufNewFile,BufRead,StdinReadPost *
2631	\ if !did_filetype() && expand("<amatch>") !~ g:ft_ignore_pat
2632	\    && (getline(1) =~ '^#' || getline(2) =~ '^#' || getline(3) =~ '^#'
2633	\	|| getline(4) =~ '^#' || getline(5) =~ '^#') |
2634	\   setf conf |
2635	\ endif
2636
2637
2638" If the GUI is already running, may still need to install the Syntax menu.
2639" Don't do it when the 'M' flag is included in 'guioptions'.
2640if has("menu") && has("gui_running")
2641      \ && !exists("did_install_syntax_menu") && &guioptions !~# "M"
2642  source <sfile>:p:h/menu.vim
2643endif
2644
2645" Function called for testing all functions defined here.  These are
2646" script-local, thus need to be executed here.
2647" Returns a string with error messages (hopefully empty).
2648func! TestFiletypeFuncs(testlist)
2649  let output = ''
2650  for f in a:testlist
2651    try
2652      exe f
2653    catch
2654      let output = output . "\n" . f . ": " . v:exception
2655    endtry
2656  endfor
2657  return output
2658endfunc
2659
2660" Restore 'cpoptions'
2661let &cpo = s:cpo_save
2662unlet s:cpo_save
2663