xref: /vim-8.2.3635/runtime/filetype.vim (revision dee2e315)
1" Vim support file to detect file types
2"
3" Maintainer:	Bram Moolenaar <[email protected]>
4" Last Change:	2013 Jun 12
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" Httest
874au BufNewFile,BufRead *.htt,*.htb		setf httest
875
876" Icon
877au BufNewFile,BufRead *.icn			setf icon
878
879" IDL (Interface Description Language)
880au BufNewFile,BufRead *.idl			call s:FTidl()
881
882" Distinguish between standard IDL and MS-IDL
883func! s:FTidl()
884  let n = 1
885  while n < 50 && n < line("$")
886    if getline(n) =~ '^\s*import\s\+"\(unknwn\|objidl\)\.idl"'
887      setf msidl
888      return
889    endif
890    let n = n + 1
891  endwhile
892  setf idl
893endfunc
894
895" Microsoft IDL (Interface Description Language)  Also *.idl
896" MOF = WMI (Windows Management Instrumentation) Managed Object Format
897au BufNewFile,BufRead *.odl,*.mof		setf msidl
898
899" Icewm menu
900au BufNewFile,BufRead */.icewm/menu		setf icemenu
901
902" Indent profile (must come before IDL *.pro!)
903au BufNewFile,BufRead .indent.pro		setf indent
904au BufNewFile,BufRead indent.pro		call s:ProtoCheck('indent')
905
906" IDL (Interactive Data Language)
907au BufNewFile,BufRead *.pro			call s:ProtoCheck('idlang')
908
909" Distinguish between "default" and Cproto prototype file. */
910func! s:ProtoCheck(default)
911  " Cproto files have a comment in the first line and a function prototype in
912  " the second line, it always ends in ";".  Indent files may also have
913  " comments, thus we can't match comments to see the difference.
914  " IDL files can have a single ';' in the second line, require at least one
915  " chacter before the ';'.
916  if getline(2) =~ '.;$'
917    setf cpp
918  else
919    exe 'setf ' . a:default
920  endif
921endfunc
922
923
924" Indent RC
925au BufNewFile,BufRead indentrc			setf indent
926
927" Inform
928au BufNewFile,BufRead *.inf,*.INF		setf inform
929
930" Initng
931au BufNewFile,BufRead */etc/initng/**/*.i,*.ii	setf initng
932
933" Ipfilter
934au BufNewFile,BufRead ipf.conf,ipf6.conf,ipf.rules	setf ipfilter
935
936" Informix 4GL (source - canonical, include file, I4GL+M4 preproc.)
937au BufNewFile,BufRead *.4gl,*.4gh,*.m4gl	setf fgl
938
939" .INI file for MSDOS
940au BufNewFile,BufRead *.ini			setf dosini
941
942" SysV Inittab
943au BufNewFile,BufRead inittab			setf inittab
944
945" Inno Setup
946au BufNewFile,BufRead *.iss			setf iss
947
948" JAL
949au BufNewFile,BufRead *.jal,*.JAL		setf jal
950
951" Jam
952au BufNewFile,BufRead *.jpl,*.jpr		setf jam
953
954" Java
955au BufNewFile,BufRead *.java,*.jav		setf java
956
957" JavaCC
958au BufNewFile,BufRead *.jj,*.jjt		setf javacc
959
960" JavaScript, ECMAScript
961au BufNewFile,BufRead *.js,*.javascript,*.es,*.jsx,*.json   setf javascript
962
963" Java Server Pages
964au BufNewFile,BufRead *.jsp			setf jsp
965
966" Java Properties resource file (note: doesn't catch font.properties.pl)
967au BufNewFile,BufRead *.properties,*.properties_??,*.properties_??_??	setf jproperties
968au BufNewFile,BufRead *.properties_??_??_*	call s:StarSetf('jproperties')
969
970" Jess
971au BufNewFile,BufRead *.clp			setf jess
972
973" Jgraph
974au BufNewFile,BufRead *.jgr			setf jgraph
975
976" Jovial
977au BufNewFile,BufRead *.jov,*.j73,*.jovial	setf jovial
978
979" Kixtart
980au BufNewFile,BufRead *.kix			setf kix
981
982" Kimwitu[++]
983au BufNewFile,BufRead *.k			setf kwt
984
985" KDE script
986au BufNewFile,BufRead *.ks			setf kscript
987
988" Kconfig
989au BufNewFile,BufRead Kconfig,Kconfig.debug	setf kconfig
990
991" Lace (ISE)
992au BufNewFile,BufRead *.ace,*.ACE		setf lace
993
994" Latte
995au BufNewFile,BufRead *.latte,*.lte		setf latte
996
997" Limits
998au BufNewFile,BufRead */etc/limits,*/etc/*limits.conf,*/etc/*limits.d/*.conf	setf limits
999
1000" LambdaProlog (*.mod too, see Modsim)
1001au BufNewFile,BufRead *.sig			setf lprolog
1002
1003" LDAP LDIF
1004au BufNewFile,BufRead *.ldif			setf ldif
1005
1006" Ld loader
1007au BufNewFile,BufRead *.ld			setf ld
1008
1009" Lex
1010au BufNewFile,BufRead *.lex,*.l			setf lex
1011
1012" Libao
1013au BufNewFile,BufRead */etc/libao.conf,*/.libao	setf libao
1014
1015" Libsensors
1016au BufNewFile,BufRead */etc/sensors.conf,*/etc/sensors3.conf	setf sensors
1017
1018" LFTP
1019au BufNewFile,BufRead lftp.conf,.lftprc,*lftp/rc	setf lftp
1020
1021" Lifelines (or Lex for C++!)
1022au BufNewFile,BufRead *.ll			setf lifelines
1023
1024" Lilo: Linux loader
1025au BufNewFile,BufRead lilo.conf			setf lilo
1026
1027" Lisp (*.el = ELisp, *.cl = Common Lisp, *.jl = librep Lisp)
1028if has("fname_case")
1029  au BufNewFile,BufRead *.lsp,*.lisp,*.el,*.cl,*.jl,*.L,.emacs,.sawfishrc setf lisp
1030else
1031  au BufNewFile,BufRead *.lsp,*.lisp,*.el,*.cl,*.jl,.emacs,.sawfishrc setf lisp
1032endif
1033
1034" SBCL implementation of Common Lisp
1035au BufNewFile,BufRead sbclrc,.sbclrc		setf lisp
1036
1037" Liquid
1038au BufNewFile,BufRead *.liquid			setf liquid
1039
1040" Lite
1041au BufNewFile,BufRead *.lite,*.lt		setf lite
1042
1043" LiteStep RC files
1044au BufNewFile,BufRead */LiteStep/*/*.rc		setf litestep
1045
1046" Login access
1047au BufNewFile,BufRead */etc/login.access	setf loginaccess
1048
1049" Login defs
1050au BufNewFile,BufRead */etc/login.defs		setf logindefs
1051
1052" Logtalk
1053au BufNewFile,BufRead *.lgt			setf logtalk
1054
1055" LOTOS
1056au BufNewFile,BufRead *.lot,*.lotos		setf lotos
1057
1058" Lout (also: *.lt)
1059au BufNewFile,BufRead *.lou,*.lout		setf lout
1060
1061" Lua
1062au BufNewFile,BufRead *.lua			setf lua
1063
1064" Linden Scripting Language (Second Life)
1065au BufNewFile,BufRead *.lsl			setf lsl
1066
1067" Lynx style file (or LotusScript!)
1068au BufNewFile,BufRead *.lss			setf lss
1069
1070" M4
1071au BufNewFile,BufRead *.m4
1072	\ if expand("<afile>") !~? 'html.m4$\|fvwm2rc' | setf m4 | endif
1073
1074" MaGic Point
1075au BufNewFile,BufRead *.mgp			setf mgp
1076
1077" Mail (for Elm, trn, mutt, muttng, rn, slrn)
1078au 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
1079
1080" Mail aliases
1081au BufNewFile,BufRead */etc/mail/aliases,*/etc/aliases	setf mailaliases
1082
1083" Mailcap configuration file
1084au BufNewFile,BufRead .mailcap,mailcap		setf mailcap
1085
1086" Makefile
1087au BufNewFile,BufRead *[mM]akefile,*.mk,*.mak,*.dsp setf make
1088
1089" MakeIndex
1090au BufNewFile,BufRead *.ist,*.mst		setf ist
1091
1092" Mallard
1093au BufNewFile,BufRead *.page			setf mallard
1094
1095" Manpage
1096au BufNewFile,BufRead *.man			setf man
1097
1098" Man config
1099au BufNewFile,BufRead */etc/man.conf,man.config	setf manconf
1100
1101" Maple V
1102au BufNewFile,BufRead *.mv,*.mpl,*.mws		setf maple
1103
1104" Map (UMN mapserver config file)
1105au BufNewFile,BufRead *.map			setf map
1106
1107" Markdown
1108au BufNewFile,BufRead *.markdown,*.mdown,*.mkd,*.mkdn,*.mdwn,README.md  setf markdown
1109
1110" Mason
1111au BufNewFile,BufRead *.mason,*.mhtml		setf mason
1112
1113" Matlab or Objective C
1114au BufNewFile,BufRead *.m			call s:FTm()
1115
1116func! s:FTm()
1117  let n = 1
1118  while n < 10
1119    let line = getline(n)
1120    if line =~ '^\s*\(#\s*\(include\|import\)\>\|/\*\|//\)'
1121      setf objc
1122      return
1123    endif
1124    if line =~ '^\s*%'
1125      setf matlab
1126      return
1127    endif
1128    if line =~ '^\s*(\*'
1129      setf mma
1130      return
1131    endif
1132    let n = n + 1
1133  endwhile
1134  if exists("g:filetype_m")
1135    exe "setf " . g:filetype_m
1136  else
1137    setf matlab
1138  endif
1139endfunc
1140
1141" Mathematica notebook
1142au BufNewFile,BufRead *.nb			setf mma
1143
1144" Maya Extension Language
1145au BufNewFile,BufRead *.mel			setf mel
1146
1147" Mercurial (hg) commit file
1148au BufNewFile,BufRead hg-editor-*.txt		setf hgcommit
1149
1150" Mercurial config (looks like generic config file)
1151au BufNewFile,BufRead *.hgrc,*hgrc		setf cfg
1152
1153" Messages (logs mostly)
1154au 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
1155
1156" Metafont
1157au BufNewFile,BufRead *.mf			setf mf
1158
1159" MetaPost
1160au BufNewFile,BufRead *.mp			setf mp
1161
1162" MGL
1163au BufNewFile,BufRead *.mgl			setf mgl
1164
1165" MMIX or VMS makefile
1166au BufNewFile,BufRead *.mms			call s:FTmms()
1167
1168" Symbian meta-makefile definition (MMP)
1169au BufNewFile,BufRead *.mmp			setf mmp
1170
1171func! s:FTmms()
1172  let n = 1
1173  while n < 10
1174    let line = getline(n)
1175    if line =~ '^\s*\(%\|//\)' || line =~ '^\*'
1176      setf mmix
1177      return
1178    endif
1179    if line =~ '^\s*#'
1180      setf make
1181      return
1182    endif
1183    let n = n + 1
1184  endwhile
1185  setf mmix
1186endfunc
1187
1188
1189" Modsim III (or LambdaProlog)
1190au BufNewFile,BufRead *.mod
1191	\ if getline(1) =~ '\<module\>' |
1192	\   setf lprolog |
1193	\ else |
1194	\   setf modsim3 |
1195	\ endif
1196
1197" Modula 2
1198au BufNewFile,BufRead *.m2,*.DEF,*.MOD,*.md,*.mi setf modula2
1199
1200" Modula 3 (.m3, .i3, .mg, .ig)
1201au BufNewFile,BufRead *.[mi][3g]		setf modula3
1202
1203" Monk
1204au BufNewFile,BufRead *.isc,*.monk,*.ssc,*.tsc	setf monk
1205
1206" MOO
1207au BufNewFile,BufRead *.moo			setf moo
1208
1209" Modconf
1210au BufNewFile,BufRead */etc/modules.conf,*/etc/modules,*/etc/conf.modules setf modconf
1211
1212" Mplayer config
1213au BufNewFile,BufRead mplayer.conf,*/.mplayer/config	setf mplayerconf
1214
1215" Moterola S record
1216au BufNewFile,BufRead *.s19,*.s28,*.s37		setf srec
1217
1218" Mrxvtrc
1219au BufNewFile,BufRead mrxvtrc,.mrxvtrc		setf mrxvtrc
1220
1221" Msql
1222au BufNewFile,BufRead *.msql			setf msql
1223
1224" Mysql
1225au BufNewFile,BufRead *.mysql			setf mysql
1226
1227" Mutt setup files (must be before catch *.rc)
1228au BufNewFile,BufRead */etc/Muttrc.d/*		call s:StarSetf('muttrc')
1229
1230" M$ Resource files
1231au BufNewFile,BufRead *.rc,*.rch		setf rc
1232
1233" MuPAD source
1234au BufRead,BufNewFile *.mu			setf mupad
1235
1236" Mush
1237au BufNewFile,BufRead *.mush			setf mush
1238
1239" Mutt setup file (also for Muttng)
1240au BufNewFile,BufRead Mutt{ng,}rc		setf muttrc
1241
1242" Nano
1243au BufNewFile,BufRead */etc/nanorc,.nanorc	setf nanorc
1244
1245" Nastran input/DMAP
1246"au BufNewFile,BufRead *.dat			setf nastran
1247
1248" Natural
1249au BufNewFile,BufRead *.NS[ACGLMNPS]		setf natural
1250
1251" Netrc
1252au BufNewFile,BufRead .netrc			setf netrc
1253
1254" Ninja file
1255au BufNewFile,BufRead *.ninja			setf ninja
1256
1257" Novell netware batch files
1258au BufNewFile,BufRead *.ncf			setf ncf
1259
1260" Nroff/Troff (*.ms and *.t are checked below)
1261au BufNewFile,BufRead *.me
1262	\ if expand("<afile>") != "read.me" && expand("<afile>") != "click.me" |
1263	\   setf nroff |
1264	\ endif
1265au BufNewFile,BufRead *.tr,*.nr,*.roff,*.tmac,*.mom	setf nroff
1266au BufNewFile,BufRead *.[1-9]			call s:FTnroff()
1267
1268" This function checks if one of the first five lines start with a dot.  In
1269" that case it is probably an nroff file: 'filetype' is set and 1 is returned.
1270func! s:FTnroff()
1271  if getline(1)[0] . getline(2)[0] . getline(3)[0] . getline(4)[0] . getline(5)[0] =~ '\.'
1272    setf nroff
1273    return 1
1274  endif
1275  return 0
1276endfunc
1277
1278" Nroff or Objective C++
1279au BufNewFile,BufRead *.mm			call s:FTmm()
1280
1281func! s:FTmm()
1282  let n = 1
1283  while n < 10
1284    let line = getline(n)
1285    if line =~ '^\s*\(#\s*\(include\|import\)\>\|/\*\)'
1286      setf objcpp
1287      return
1288    endif
1289    let n = n + 1
1290  endwhile
1291  setf nroff
1292endfunc
1293
1294" Not Quite C
1295au BufNewFile,BufRead *.nqc			setf nqc
1296
1297" NSIS
1298au BufNewFile,BufRead *.nsi,*.nsh		setf nsis
1299
1300" OCAML
1301au BufNewFile,BufRead *.ml,*.mli,*.mll,*.mly,.ocamlinit	setf ocaml
1302
1303" Occam
1304au BufNewFile,BufRead *.occ			setf occam
1305
1306" Omnimark
1307au BufNewFile,BufRead *.xom,*.xin		setf omnimark
1308
1309" OpenROAD
1310au BufNewFile,BufRead *.or			setf openroad
1311
1312" OPL
1313au BufNewFile,BufRead *.[Oo][Pp][Ll]		setf opl
1314
1315" Oracle config file
1316au BufNewFile,BufRead *.ora			setf ora
1317
1318" Packet filter conf
1319au BufNewFile,BufRead pf.conf			setf pf
1320
1321" Pam conf
1322au BufNewFile,BufRead */etc/pam.conf		setf pamconf
1323
1324" PApp
1325au BufNewFile,BufRead *.papp,*.pxml,*.pxsl	setf papp
1326
1327" Password file
1328au 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
1329
1330" Pascal (also *.p)
1331au BufNewFile,BufRead *.pas			setf pascal
1332
1333" Delphi project file
1334au BufNewFile,BufRead *.dpr			setf pascal
1335
1336" PDF
1337au BufNewFile,BufRead *.pdf			setf pdf
1338
1339" Perl
1340if has("fname_case")
1341  au BufNewFile,BufRead *.pl,*.PL		call s:FTpl()
1342else
1343  au BufNewFile,BufRead *.pl			call s:FTpl()
1344endif
1345au BufNewFile,BufRead *.plx,*.al		setf perl
1346au BufNewFile,BufRead *.p6,*.pm6		setf perl6
1347
1348func! s:FTpl()
1349  if exists("g:filetype_pl")
1350    exe "setf " . g:filetype_pl
1351  else
1352    " recognize Prolog by specific text in the first non-empty line
1353    " require a blank after the '%' because Perl uses "%list" and "%translate"
1354    let l = getline(nextnonblank(1))
1355    if l =~ '\<prolog\>' || l =~ '^\s*\(%\+\(\s\|$\)\|/\*\)' || l =~ ':-'
1356      setf prolog
1357    else
1358      setf perl
1359    endif
1360  endif
1361endfunc
1362
1363" Perl, XPM or XPM2
1364au BufNewFile,BufRead *.pm
1365	\ if getline(1) =~ "XPM2" |
1366	\   setf xpm2 |
1367	\ elseif getline(1) =~ "XPM" |
1368	\   setf xpm |
1369	\ else |
1370	\   setf perl |
1371	\ endif
1372
1373" Perl POD
1374au BufNewFile,BufRead *.pod			setf pod
1375
1376" Php, php3, php4, etc.
1377" Also Phtml (was used for PHP 2 in the past)
1378" Also .ctp for Cake template file
1379au BufNewFile,BufRead *.php,*.php\d,*.phtml,*.ctp	setf php
1380
1381" Pike
1382au BufNewFile,BufRead *.pike,*.lpc,*.ulpc,*.pmod setf pike
1383
1384" Pinfo config
1385au BufNewFile,BufRead */etc/pinforc,*/.pinforc	setf pinfo
1386
1387" Palm Resource compiler
1388au BufNewFile,BufRead *.rcp			setf pilrc
1389
1390" Pine config
1391au BufNewFile,BufRead .pinerc,pinerc,.pinercex,pinercex		setf pine
1392
1393" PL/M (also: *.inp)
1394au BufNewFile,BufRead *.plm,*.p36,*.pac		setf plm
1395
1396" PL/SQL
1397au BufNewFile,BufRead *.pls,*.plsql		setf plsql
1398
1399" PLP
1400au BufNewFile,BufRead *.plp			setf plp
1401
1402" PO and PO template (GNU gettext)
1403au BufNewFile,BufRead *.po,*.pot		setf po
1404
1405" Postfix main config
1406au BufNewFile,BufRead main.cf			setf pfmain
1407
1408" PostScript (+ font files, encapsulated PostScript, Adobe Illustrator)
1409au BufNewFile,BufRead *.ps,*.pfa,*.afm,*.eps,*.epsf,*.epsi,*.ai	  setf postscr
1410
1411" PostScript Printer Description
1412au BufNewFile,BufRead *.ppd			setf ppd
1413
1414" Povray
1415au BufNewFile,BufRead *.pov			setf pov
1416
1417" Povray configuration
1418au BufNewFile,BufRead .povrayrc			setf povini
1419
1420" Povray, PHP or assembly
1421au BufNewFile,BufRead *.inc			call s:FTinc()
1422
1423func! s:FTinc()
1424  if exists("g:filetype_inc")
1425    exe "setf " . g:filetype_inc
1426  else
1427    let lines = getline(1).getline(2).getline(3)
1428    if lines =~? "perlscript"
1429      setf aspperl
1430    elseif lines =~ "<%"
1431      setf aspvbs
1432    elseif lines =~ "<?"
1433      setf php
1434    else
1435      call s:FTasmsyntax()
1436      if exists("b:asmsyntax")
1437	exe "setf " . fnameescape(b:asmsyntax)
1438      else
1439	setf pov
1440      endif
1441    endif
1442  endif
1443endfunc
1444
1445" Printcap and Termcap
1446au BufNewFile,BufRead *printcap
1447	\ let b:ptcap_type = "print" | setf ptcap
1448au BufNewFile,BufRead *termcap
1449	\ let b:ptcap_type = "term" | setf ptcap
1450
1451" PCCTS / ANTRL
1452"au BufNewFile,BufRead *.g			setf antrl
1453au BufNewFile,BufRead *.g			setf pccts
1454
1455" PPWizard
1456au BufNewFile,BufRead *.it,*.ih			setf ppwiz
1457
1458" Obj 3D file format
1459" TODO: is there a way to avoid MS-Windows Object files?
1460au BufNewFile,BufRead *.obj			setf obj
1461
1462" Oracle Pro*C/C++
1463au BufNewFile,BufRead *.pc			setf proc
1464
1465" Privoxy actions file
1466au BufNewFile,BufRead *.action			setf privoxy
1467
1468" Procmail
1469au BufNewFile,BufRead .procmail,.procmailrc	setf procmail
1470
1471" Progress or CWEB
1472au BufNewFile,BufRead *.w			call s:FTprogress_cweb()
1473
1474func! s:FTprogress_cweb()
1475  if exists("g:filetype_w")
1476    exe "setf " . g:filetype_w
1477    return
1478  endif
1479  if getline(1) =~ '&ANALYZE' || getline(3) =~ '&GLOBAL-DEFINE'
1480    setf progress
1481  else
1482    setf cweb
1483  endif
1484endfunc
1485
1486" Progress or assembly
1487au BufNewFile,BufRead *.i			call s:FTprogress_asm()
1488
1489func! s:FTprogress_asm()
1490  if exists("g:filetype_i")
1491    exe "setf " . g:filetype_i
1492    return
1493  endif
1494  " This function checks for an assembly comment the first ten lines.
1495  " If not found, assume Progress.
1496  let lnum = 1
1497  while lnum <= 10 && lnum < line('$')
1498    let line = getline(lnum)
1499    if line =~ '^\s*;' || line =~ '^\*'
1500      call s:FTasm()
1501      return
1502    elseif line !~ '^\s*$' || line =~ '^/\*'
1503      " Not an empty line: Doesn't look like valid assembly code.
1504      " Or it looks like a Progress /* comment
1505      break
1506    endif
1507    let lnum = lnum + 1
1508  endw
1509  setf progress
1510endfunc
1511
1512" Progress or Pascal
1513au BufNewFile,BufRead *.p			call s:FTprogress_pascal()
1514
1515func! s:FTprogress_pascal()
1516  if exists("g:filetype_p")
1517    exe "setf " . g:filetype_p
1518    return
1519  endif
1520  " This function checks for valid Pascal syntax in the first ten lines.
1521  " Look for either an opening comment or a program start.
1522  " If not found, assume Progress.
1523  let lnum = 1
1524  while lnum <= 10 && lnum < line('$')
1525    let line = getline(lnum)
1526    if line =~ '^\s*\(program\|unit\|procedure\|function\|const\|type\|var\)\>'
1527	\ || line =~ '^\s*{' || line =~ '^\s*(\*'
1528      setf pascal
1529      return
1530    elseif line !~ '^\s*$' || line =~ '^/\*'
1531      " Not an empty line: Doesn't look like valid Pascal code.
1532      " Or it looks like a Progress /* comment
1533      break
1534    endif
1535    let lnum = lnum + 1
1536  endw
1537  setf progress
1538endfunc
1539
1540
1541" Software Distributor Product Specification File (POSIX 1387.2-1995)
1542au BufNewFile,BufRead *.psf			setf psf
1543au BufNewFile,BufRead INDEX,INFO
1544	\ if getline(1) =~ '^\s*\(distribution\|installed_software\|root\|bundle\|product\)\s*$' |
1545	\   setf psf |
1546	\ endif
1547
1548" Prolog
1549au BufNewFile,BufRead *.pdb			setf prolog
1550
1551" Promela
1552au BufNewFile,BufRead *.pml			setf promela
1553
1554" Google protocol buffers
1555au BufNewFile,BufRead *.proto			setf proto
1556
1557" Protocols
1558au BufNewFile,BufRead */etc/protocols		setf protocols
1559
1560" Pyrex
1561au BufNewFile,BufRead *.pyx,*.pxd		setf pyrex
1562
1563" Python
1564au BufNewFile,BufRead *.py,*.pyw		setf python
1565
1566" Quixote (Python-based web framework)
1567au BufNewFile,BufRead *.ptl			setf python
1568
1569" Radiance
1570au BufNewFile,BufRead *.rad,*.mat		setf radiance
1571
1572" Ratpoison config/command files
1573au BufNewFile,BufRead .ratpoisonrc,ratpoisonrc	setf ratpoison
1574
1575" RCS file
1576au BufNewFile,BufRead *\,v			setf rcs
1577
1578" Readline
1579au BufNewFile,BufRead .inputrc,inputrc		setf readline
1580
1581" Registry for MS-Windows
1582au BufNewFile,BufRead *.reg
1583	\ if getline(1) =~? '^REGEDIT[0-9]*\s*$\|^Windows Registry Editor Version \d*\.\d*\s*$' | setf registry | endif
1584
1585" Renderman Interface Bytestream
1586au BufNewFile,BufRead *.rib			setf rib
1587
1588" Rexx
1589au BufNewFile,BufRead *.rex,*.orx,*.rxo,*.rxj,*.jrexx,*.rexxj,*.rexx,*.testGroup,*.testUnit	setf rexx
1590
1591" R (Splus)
1592if has("fname_case")
1593  au BufNewFile,BufRead *.s,*.S			setf r
1594else
1595  au BufNewFile,BufRead *.s			setf r
1596endif
1597
1598" R Help file
1599if has("fname_case")
1600  au BufNewFile,BufRead *.rd,*.Rd		setf rhelp
1601else
1602  au BufNewFile,BufRead *.rd			setf rhelp
1603endif
1604
1605" R noweb file
1606if has("fname_case")
1607  au BufNewFile,BufRead *.Rnw,*.rnw,*.Snw,*.snw		setf rnoweb
1608else
1609  au BufNewFile,BufRead *.rnw,*.snw			setf rnoweb
1610endif
1611
1612" Rexx, Rebol or R
1613au BufNewFile,BufRead *.r,*.R			call s:FTr()
1614
1615func! s:FTr()
1616  let max = line("$") > 50 ? 50 : line("$")
1617
1618  for n in range(1, max)
1619    " Rebol is easy to recognize, check for that first
1620    if getline(n) =~? '\<REBOL\>'
1621      setf rebol
1622      return
1623    endif
1624  endfor
1625
1626  for n in range(1, max)
1627    " R has # comments
1628    if getline(n) =~ '^\s*#'
1629      setf r
1630      return
1631    endif
1632    " Rexx has /* comments */
1633    if getline(n) =~ '^\s*/\*'
1634      setf rexx
1635      return
1636    endif
1637  endfor
1638
1639  " Nothing recognized, use user default or assume Rexx
1640  if exists("g:filetype_r")
1641    exe "setf " . g:filetype_r
1642  else
1643    " Rexx used to be the default, but R appears to be much more popular.
1644    setf r
1645  endif
1646endfunc
1647
1648" Remind
1649au BufNewFile,BufRead .reminders,*.remind,*.rem		setf remind
1650
1651" Resolv.conf
1652au BufNewFile,BufRead resolv.conf		setf resolv
1653
1654" Relax NG Compact
1655au BufNewFile,BufRead *.rnc			setf rnc
1656
1657" Relax NG XML
1658au BufNewFile,BufRead *.rng			setf rng
1659
1660" RPL/2
1661au BufNewFile,BufRead *.rpl			setf rpl
1662
1663" Robots.txt
1664au BufNewFile,BufRead robots.txt		setf robots
1665
1666" Rpcgen
1667au BufNewFile,BufRead *.x			setf rpcgen
1668
1669" reStructuredText Documentation Format
1670au BufNewFile,BufRead *.rst			setf rst
1671
1672" RTF
1673au BufNewFile,BufRead *.rtf			setf rtf
1674
1675" Interactive Ruby shell
1676au BufNewFile,BufRead .irbrc,irbrc		setf ruby
1677
1678" Ruby
1679au BufNewFile,BufRead *.rb,*.rbw		setf ruby
1680
1681" RubyGems
1682au BufNewFile,BufRead *.gemspec			setf ruby
1683
1684" Rackup
1685au BufNewFile,BufRead *.ru			setf ruby
1686
1687" Bundler
1688au BufNewFile,BufRead Gemfile			setf ruby
1689
1690" Ruby on Rails
1691au BufNewFile,BufRead *.builder,*.rxml,*.rjs	setf ruby
1692
1693" Rantfile and Rakefile is like Ruby
1694au BufNewFile,BufRead [rR]antfile,*.rant,[rR]akefile,*.rake	setf ruby
1695
1696" S-lang (or shader language, or SmallLisp)
1697au BufNewFile,BufRead *.sl			setf slang
1698
1699" Samba config
1700au BufNewFile,BufRead smb.conf			setf samba
1701
1702" SAS script
1703au BufNewFile,BufRead *.sas			setf sas
1704
1705" Sass
1706au BufNewFile,BufRead *.sass			setf sass
1707
1708" Sather
1709au BufNewFile,BufRead *.sa			setf sather
1710
1711" Scilab
1712au BufNewFile,BufRead *.sci,*.sce		setf scilab
1713
1714" SCSS
1715au BufNewFile,BufRead *.scss			setf scss
1716
1717" SD: Streaming Descriptors
1718au BufNewFile,BufRead *.sd			setf sd
1719
1720" SDL
1721au BufNewFile,BufRead *.sdl,*.pr		setf sdl
1722
1723" sed
1724au BufNewFile,BufRead *.sed			setf sed
1725
1726" Sieve (RFC 3028)
1727au BufNewFile,BufRead *.siv			setf sieve
1728
1729" Sendmail
1730au BufNewFile,BufRead sendmail.cf		setf sm
1731
1732" Sendmail .mc files are actually m4.  Could also be MS Message text file.
1733au BufNewFile,BufRead *.mc			call s:McSetf()
1734
1735func! s:McSetf()
1736  " Rely on the file to start with a comment.
1737  " MS message text files use ';', Sendmail files use '#' or 'dnl'
1738  for lnum in range(1, min([line("$"), 20]))
1739    let line = getline(lnum)
1740    if line =~ '^\s*\(#\|dnl\)'
1741      setf m4  " Sendmail .mc file
1742      return
1743    elseif line =~ '^\s*;'
1744      setf msmessages  " MS Message text file
1745      return
1746    endif
1747  endfor
1748  setf m4  " Default: Sendmail .mc file
1749endfunc
1750
1751" Services
1752au BufNewFile,BufRead */etc/services		setf services
1753
1754" Service Location config
1755au BufNewFile,BufRead */etc/slp.conf		setf slpconf
1756
1757" Service Location registration
1758au BufNewFile,BufRead */etc/slp.reg		setf slpreg
1759
1760" Service Location SPI
1761au BufNewFile,BufRead */etc/slp.spi		setf slpspi
1762
1763" Setserial config
1764au BufNewFile,BufRead */etc/serial.conf		setf setserial
1765
1766" SGML
1767au BufNewFile,BufRead *.sgm,*.sgml
1768	\ if getline(1).getline(2).getline(3).getline(4).getline(5) =~? 'linuxdoc' |
1769	\   setf sgmllnx |
1770	\ elseif getline(1) =~ '<!DOCTYPE.*DocBook' || getline(2) =~ '<!DOCTYPE.*DocBook' |
1771	\   let b:docbk_type = "sgml" |
1772	\   let b:docbk_ver = 4 |
1773	\   setf docbk |
1774	\ else |
1775	\   setf sgml |
1776	\ endif
1777
1778" SGMLDECL
1779au BufNewFile,BufRead *.decl,*.dcl,*.dec
1780	\ if getline(1).getline(2).getline(3) =~? '^<!SGML' |
1781	\    setf sgmldecl |
1782	\ endif
1783
1784" SGML catalog file
1785au BufNewFile,BufRead catalog			setf catalog
1786au BufNewFile,BufRead sgml.catalog*		call s:StarSetf('catalog')
1787
1788" Shell scripts (sh, ksh, bash, bash2, csh); Allow .profile_foo etc.
1789" Gentoo ebuilds are actually bash scripts
1790au BufNewFile,BufRead .bashrc*,bashrc,bash.bashrc,.bash_profile*,.bash_logout*,*.bash,*.ebuild call SetFileTypeSH("bash")
1791au BufNewFile,BufRead .kshrc*,*.ksh call SetFileTypeSH("ksh")
1792au BufNewFile,BufRead */etc/profile,.profile*,*.sh,*.env call SetFileTypeSH(getline(1))
1793
1794" Also called from scripts.vim.
1795func! SetFileTypeSH(name)
1796  if expand("<amatch>") =~ g:ft_ignore_pat
1797    return
1798  endif
1799  if a:name =~ '\<csh\>'
1800    " Some .sh scripts contain #!/bin/csh.
1801    call SetFileTypeShell("csh")
1802    return
1803  elseif a:name =~ '\<tcsh\>'
1804    " Some .sh scripts contain #!/bin/tcsh.
1805    call SetFileTypeShell("tcsh")
1806    return
1807  elseif a:name =~ '\<zsh\>'
1808    " Some .sh scripts contain #!/bin/zsh.
1809    call SetFileTypeShell("zsh")
1810    return
1811  elseif a:name =~ '\<ksh\>'
1812    let b:is_kornshell = 1
1813    if exists("b:is_bash")
1814      unlet b:is_bash
1815    endif
1816    if exists("b:is_sh")
1817      unlet b:is_sh
1818    endif
1819  elseif exists("g:bash_is_sh") || a:name =~ '\<bash\>' || a:name =~ '\<bash2\>'
1820    let b:is_bash = 1
1821    if exists("b:is_kornshell")
1822      unlet b:is_kornshell
1823    endif
1824    if exists("b:is_sh")
1825      unlet b:is_sh
1826    endif
1827  elseif a:name =~ '\<sh\>'
1828    let b:is_sh = 1
1829    if exists("b:is_kornshell")
1830      unlet b:is_kornshell
1831    endif
1832    if exists("b:is_bash")
1833      unlet b:is_bash
1834    endif
1835  endif
1836  call SetFileTypeShell("sh")
1837endfunc
1838
1839" For shell-like file types, check for an "exec" command hidden in a comment,
1840" as used for Tcl.
1841" Also called from scripts.vim, thus can't be local to this script.
1842func! SetFileTypeShell(name)
1843  if expand("<amatch>") =~ g:ft_ignore_pat
1844    return
1845  endif
1846  let l = 2
1847  while l < 20 && l < line("$") && getline(l) =~ '^\s*\(#\|$\)'
1848    " Skip empty and comment lines.
1849    let l = l + 1
1850  endwhile
1851  if l < line("$") && getline(l) =~ '\s*exec\s' && getline(l - 1) =~ '^\s*#.*\\$'
1852    " Found an "exec" line after a comment with continuation
1853    let n = substitute(getline(l),'\s*exec\s\+\([^ ]*/\)\=', '', '')
1854    if n =~ '\<tclsh\|\<wish'
1855      setf tcl
1856      return
1857    endif
1858  endif
1859  exe "setf " . a:name
1860endfunc
1861
1862" tcsh scripts
1863au BufNewFile,BufRead .tcshrc*,*.tcsh,tcsh.tcshrc,tcsh.login	call SetFileTypeShell("tcsh")
1864
1865" csh scripts, but might also be tcsh scripts (on some systems csh is tcsh)
1866au BufNewFile,BufRead .login*,.cshrc*,csh.cshrc,csh.login,csh.logout,*.csh,.alias  call s:CSH()
1867
1868func! s:CSH()
1869  if exists("g:filetype_csh")
1870    call SetFileTypeShell(g:filetype_csh)
1871  elseif &shell =~ "tcsh"
1872    call SetFileTypeShell("tcsh")
1873  else
1874    call SetFileTypeShell("csh")
1875  endif
1876endfunc
1877
1878" Z-Shell script
1879au BufNewFile,BufRead .zprofile,*/etc/zprofile,.zfbfmarks  setf zsh
1880au BufNewFile,BufRead .zsh*,.zlog*,.zcompdump*  call s:StarSetf('zsh')
1881au BufNewFile,BufRead *.zsh			setf zsh
1882
1883" Scheme
1884au BufNewFile,BufRead *.scm,*.ss,*.rkt		setf scheme
1885
1886" Screen RC
1887au BufNewFile,BufRead .screenrc,screenrc	setf screen
1888
1889" Simula
1890au BufNewFile,BufRead *.sim			setf simula
1891
1892" SINDA
1893au BufNewFile,BufRead *.sin,*.s85		setf sinda
1894
1895" SiSU
1896au BufNewFile,BufRead *.sst,*.ssm,*.ssi,*.-sst,*._sst setf sisu
1897au BufNewFile,BufRead *.sst.meta,*.-sst.meta,*._sst.meta setf sisu
1898
1899" SKILL
1900au BufNewFile,BufRead *.il,*.ils,*.cdf		setf skill
1901
1902" SLRN
1903au BufNewFile,BufRead .slrnrc			setf slrnrc
1904au BufNewFile,BufRead *.score			setf slrnsc
1905
1906" Smalltalk (and TeX)
1907au BufNewFile,BufRead *.st			setf st
1908au BufNewFile,BufRead *.cls
1909	\ if getline(1) =~ '^%' |
1910	\  setf tex |
1911	\ elseif getline(1)[0] == '#' && getline(1) =~ 'rexx' |
1912	\  setf rexx |
1913	\ else |
1914	\  setf st |
1915	\ endif
1916
1917" Smarty templates
1918au BufNewFile,BufRead *.tpl			setf smarty
1919
1920" SMIL or XML
1921au BufNewFile,BufRead *.smil
1922	\ if getline(1) =~ '<?\s*xml.*?>' |
1923	\   setf xml |
1924	\ else |
1925	\   setf smil |
1926	\ endif
1927
1928" SMIL or SNMP MIB file
1929au BufNewFile,BufRead *.smi
1930	\ if getline(1) =~ '\<smil\>' |
1931	\   setf smil |
1932	\ else |
1933	\   setf mib |
1934	\ endif
1935
1936" SMITH
1937au BufNewFile,BufRead *.smt,*.smith		setf smith
1938
1939" Snobol4 and spitbol
1940au BufNewFile,BufRead *.sno,*.spt		setf snobol4
1941
1942" SNMP MIB files
1943au BufNewFile,BufRead *.mib,*.my		setf mib
1944
1945" Snort Configuration
1946au BufNewFile,BufRead *.hog,snort.conf,vision.conf	setf hog
1947au BufNewFile,BufRead *.rules			call s:FTRules()
1948
1949let s:ft_rules_udev_rules_pattern = '^\s*\cudev_rules\s*=\s*"\([^"]\{-1,}\)/*".*'
1950func! s:FTRules()
1951  let path = expand('<amatch>:p')
1952  if path =~ '^/\(etc/udev/\%(rules\.d/\)\=.*\.rules\|lib/udev/\%(rules\.d/\)\=.*\.rules\)$'
1953    setf udevrules
1954    return
1955  endif
1956  if path =~ '^/etc/ufw/'
1957    setf conf  " Better than hog
1958    return
1959  endif
1960  try
1961    let config_lines = readfile('/etc/udev/udev.conf')
1962  catch /^Vim\%((\a\+)\)\=:E484/
1963    setf hog
1964    return
1965  endtry
1966  let dir = expand('<amatch>:p:h')
1967  for line in config_lines
1968    if line =~ s:ft_rules_udev_rules_pattern
1969      let udev_rules = substitute(line, s:ft_rules_udev_rules_pattern, '\1', "")
1970      if dir == udev_rules
1971        setf udevrules
1972      endif
1973      break
1974    endif
1975  endfor
1976  setf hog
1977endfunc
1978
1979
1980" Spec (Linux RPM)
1981au BufNewFile,BufRead *.spec			setf spec
1982
1983" Speedup (AspenTech plant simulator)
1984au BufNewFile,BufRead *.speedup,*.spdata,*.spd	setf spup
1985
1986" Slice
1987au BufNewFile,BufRead *.ice			setf slice
1988
1989" Spice
1990au BufNewFile,BufRead *.sp,*.spice		setf spice
1991
1992" Spyce
1993au BufNewFile,BufRead *.spy,*.spi		setf spyce
1994
1995" Squid
1996au BufNewFile,BufRead squid.conf		setf squid
1997
1998" SQL for Oracle Designer
1999au BufNewFile,BufRead *.tyb,*.typ,*.tyc,*.pkb,*.pks	setf sql
2000
2001" SQL
2002au BufNewFile,BufRead *.sql			call s:SQL()
2003
2004func! s:SQL()
2005  if exists("g:filetype_sql")
2006    exe "setf " . g:filetype_sql
2007  else
2008    setf sql
2009  endif
2010endfunc
2011
2012" SQLJ
2013au BufNewFile,BufRead *.sqlj			setf sqlj
2014
2015" SQR
2016au BufNewFile,BufRead *.sqr,*.sqi		setf sqr
2017
2018" OpenSSH configuration
2019au BufNewFile,BufRead ssh_config,*/.ssh/config	setf sshconfig
2020
2021" OpenSSH server configuration
2022au BufNewFile,BufRead sshd_config		setf sshdconfig
2023
2024" Stata
2025au BufNewFile,BufRead *.ado,*.class,*.do,*.imata,*.mata   setf stata
2026
2027" SMCL
2028au BufNewFile,BufRead *.hlp,*.ihlp,*.smcl	setf smcl
2029
2030" Stored Procedures
2031au BufNewFile,BufRead *.stp			setf stp
2032
2033" Standard ML
2034au BufNewFile,BufRead *.sml			setf sml
2035
2036" Sratus VOS command macro
2037au BufNewFile,BufRead *.cm			setf voscm
2038
2039" Sysctl
2040au BufNewFile,BufRead */etc/sysctl.conf,*/etc/sysctl.d/*.conf	setf sysctl
2041
2042" Synopsys Design Constraints
2043au BufNewFile,BufRead *.sdc			setf sdc
2044
2045" Sudoers
2046au BufNewFile,BufRead */etc/sudoers,sudoers.tmp	setf sudoers
2047
2048" SVG (Scalable Vector Graphics)
2049au BufNewFile,BufRead *.svg			setf svg
2050
2051" If the file has an extension of 't' and is in a directory 't' then it is
2052" almost certainly a Perl test file.
2053" If the first line starts with '#' and contains 'perl' it's probably a Perl
2054" file.
2055" (Slow test) If a file contains a 'use' statement then it is almost certainly
2056" a Perl file.
2057func! s:FTperl()
2058  if expand("%:e") == 't' && expand("%:p:h:t") == 't'
2059    setf perl
2060    return 1
2061  endif
2062  if getline(1)[0] == '#' && getline(1) =~ 'perl'
2063    setf perl
2064    return 1
2065  endif
2066  if search('^use\s\s*\k', 'nc', 30)
2067    setf perl
2068    return 1
2069  endif
2070  return 0
2071endfunc
2072
2073" Tads (or Nroff or Perl test file)
2074au BufNewFile,BufRead *.t
2075	\ if !s:FTnroff() && !s:FTperl() | setf tads | endif
2076
2077" Tags
2078au BufNewFile,BufRead tags			setf tags
2079
2080" TAK
2081au BufNewFile,BufRead *.tak			setf tak
2082
2083" Task
2084au BufRead,BufNewFile {pending,completed,undo}.data  setf taskdata
2085au BufRead,BufNewFile *.task                    setf taskedit
2086
2087" Tcl (JACL too)
2088au BufNewFile,BufRead *.tcl,*.tk,*.itcl,*.itk,*.jacl	setf tcl
2089
2090" TealInfo
2091au BufNewFile,BufRead *.tli			setf tli
2092
2093" Telix Salt
2094au BufNewFile,BufRead *.slt			setf tsalt
2095
2096" Terminfo
2097au BufNewFile,BufRead *.ti			setf terminfo
2098
2099" TeX
2100au BufNewFile,BufRead *.latex,*.sty,*.dtx,*.ltx,*.bbl	setf tex
2101au BufNewFile,BufRead *.tex			call s:FTtex()
2102
2103" Choose context, plaintex, or tex (LaTeX) based on these rules:
2104" 1. Check the first line of the file for "%&<format>".
2105" 2. Check the first 1000 non-comment lines for LaTeX or ConTeXt keywords.
2106" 3. Default to "latex" or to g:tex_flavor, can be set in user's vimrc.
2107func! s:FTtex()
2108  let firstline = getline(1)
2109  if firstline =~ '^%&\s*\a\+'
2110    let format = tolower(matchstr(firstline, '\a\+'))
2111    let format = substitute(format, 'pdf', '', '')
2112    if format == 'tex'
2113      let format = 'plain'
2114    endif
2115  else
2116    " Default value, may be changed later:
2117    let format = exists("g:tex_flavor") ? g:tex_flavor : 'plain'
2118    " Save position, go to the top of the file, find first non-comment line.
2119    let save_cursor = getpos('.')
2120    call cursor(1,1)
2121    let firstNC = search('^\s*[^[:space:]%]', 'c', 1000)
2122    if firstNC " Check the next thousand lines for a LaTeX or ConTeXt keyword.
2123      let lpat = 'documentclass\>\|usepackage\>\|begin{\|newcommand\>\|renewcommand\>'
2124      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\>'
2125      let kwline = search('^\s*\\\%(' . lpat . '\)\|^\s*\\\(' . cpat . '\)',
2126			      \ 'cnp', firstNC + 1000)
2127      if kwline == 1	" lpat matched
2128	let format = 'latex'
2129      elseif kwline == 2	" cpat matched
2130	let format = 'context'
2131      endif		" If neither matched, keep default set above.
2132      " let lline = search('^\s*\\\%(' . lpat . '\)', 'cn', firstNC + 1000)
2133      " let cline = search('^\s*\\\%(' . cpat . '\)', 'cn', firstNC + 1000)
2134      " if cline > 0
2135      "   let format = 'context'
2136      " endif
2137      " if lline > 0 && (cline == 0 || cline > lline)
2138      "   let format = 'tex'
2139      " endif
2140    endif " firstNC
2141    call setpos('.', save_cursor)
2142  endif " firstline =~ '^%&\s*\a\+'
2143
2144  " Translation from formats to file types.  TODO:  add AMSTeX, RevTex, others?
2145  if format == 'plain'
2146    setf plaintex
2147  elseif format == 'context'
2148    setf context
2149  else " probably LaTeX
2150    setf tex
2151  endif
2152  return
2153endfunc
2154
2155" ConTeXt
2156au BufNewFile,BufRead tex/context/*/*.tex,*.mkii,*.mkiv   setf context
2157
2158" Texinfo
2159au BufNewFile,BufRead *.texinfo,*.texi,*.txi	setf texinfo
2160
2161" TeX configuration
2162au BufNewFile,BufRead texmf.cnf			setf texmf
2163
2164" Tidy config
2165au BufNewFile,BufRead .tidyrc,tidyrc		setf tidy
2166
2167" TF mud client
2168au BufNewFile,BufRead *.tf,.tfrc,tfrc		setf tf
2169
2170" TPP - Text Presentation Program
2171au BufNewFile,BufReadPost *.tpp			setf tpp
2172
2173" Treetop
2174au BufRead,BufNewFile *.treetop			setf treetop
2175
2176" Trustees
2177au BufNewFile,BufRead trustees.conf		setf trustees
2178
2179" TSS - Geometry
2180au BufNewFile,BufReadPost *.tssgm		setf tssgm
2181
2182" TSS - Optics
2183au BufNewFile,BufReadPost *.tssop		setf tssop
2184
2185" TSS - Command Line (temporary)
2186au BufNewFile,BufReadPost *.tsscl		setf tsscl
2187
2188" TWIG files
2189au BufNewFile,BufReadPost *.twig		setf twig
2190
2191" Motif UIT/UIL files
2192au BufNewFile,BufRead *.uit,*.uil		setf uil
2193
2194" Udev conf
2195au BufNewFile,BufRead */etc/udev/udev.conf	setf udevconf
2196
2197" Udev permissions
2198au BufNewFile,BufRead */etc/udev/permissions.d/*.permissions setf udevperm
2199"
2200" Udev symlinks config
2201au BufNewFile,BufRead */etc/udev/cdsymlinks.conf	setf sh
2202
2203" UnrealScript
2204au BufNewFile,BufRead *.uc			setf uc
2205
2206" Updatedb
2207au BufNewFile,BufRead */etc/updatedb.conf	setf updatedb
2208
2209" Upstart (init(8)) config files
2210au BufNewFile,BufRead */usr/share/upstart/*.conf               setf upstart
2211au BufNewFile,BufRead */usr/share/upstart/*.override           setf upstart
2212au BufNewFile,BufRead */etc/init/*.conf,*/etc/init/*.override  setf upstart
2213au BufNewFile,BufRead */.init/*.conf,*/.init/*.override        setf upstart
2214au BufNewFile,BufRead */.config/upstart/*.conf                 setf upstart
2215au BufNewFile,BufRead */.config/upstart/*.override             setf upstart
2216
2217" Vera
2218au BufNewFile,BufRead *.vr,*.vri,*.vrh		setf vera
2219
2220" Verilog HDL
2221au BufNewFile,BufRead *.v			setf verilog
2222
2223" Verilog-AMS HDL
2224au BufNewFile,BufRead *.va,*.vams		setf verilogams
2225
2226" VHDL
2227au BufNewFile,BufRead *.hdl,*.vhd,*.vhdl,*.vbe,*.vst  setf vhdl
2228au BufNewFile,BufRead *.vhdl_[0-9]*		call s:StarSetf('vhdl')
2229
2230" Vim script
2231au BufNewFile,BufRead *.vim,*.vba,.exrc,_exrc	setf vim
2232
2233" Viminfo file
2234au BufNewFile,BufRead .viminfo,_viminfo		setf viminfo
2235
2236" Virata Config Script File or Drupal module
2237au BufRead,BufNewFile *.hw,*.module,*.pkg
2238	\ if getline(1) =~ '<?php' |
2239	\   setf php |
2240	\ else |
2241	\   setf virata |
2242	\ endif
2243
2244" Visual Basic (also uses *.bas) or FORM
2245au BufNewFile,BufRead *.frm			call s:FTVB("form")
2246
2247" SaxBasic is close to Visual Basic
2248au BufNewFile,BufRead *.sba			setf vb
2249
2250" Vgrindefs file
2251au BufNewFile,BufRead vgrindefs			setf vgrindefs
2252
2253" VRML V1.0c
2254au BufNewFile,BufRead *.wrl			setf vrml
2255
2256" Webmacro
2257au BufNewFile,BufRead *.wm			setf webmacro
2258
2259" Wget config
2260au BufNewFile,BufRead .wgetrc,wgetrc		setf wget
2261
2262" Website MetaLanguage
2263au BufNewFile,BufRead *.wml			setf wml
2264
2265" Winbatch
2266au BufNewFile,BufRead *.wbt			setf winbatch
2267
2268" WSML
2269au BufNewFile,BufRead *.wsml			setf wsml
2270
2271" WvDial
2272au BufNewFile,BufRead wvdial.conf,.wvdialrc	setf wvdial
2273
2274" CVS RC file
2275au BufNewFile,BufRead .cvsrc			setf cvsrc
2276
2277" CVS commit file
2278au BufNewFile,BufRead cvs\d\+			setf cvs
2279
2280" WEB (*.web is also used for Winbatch: Guess, based on expecting "%" comment
2281" lines in a WEB file).
2282au BufNewFile,BufRead *.web
2283	\ if getline(1)[0].getline(2)[0].getline(3)[0].getline(4)[0].getline(5)[0] =~ "%" |
2284	\   setf web |
2285	\ else |
2286	\   setf winbatch |
2287	\ endif
2288
2289" Windows Scripting Host and Windows Script Component
2290au BufNewFile,BufRead *.ws[fc]			setf wsh
2291
2292" XHTML
2293au BufNewFile,BufRead *.xhtml,*.xht		setf xhtml
2294
2295" X Pixmap (dynamically sets colors, use BufEnter to make it work better)
2296au BufEnter *.xpm
2297	\ if getline(1) =~ "XPM2" |
2298	\   setf xpm2 |
2299	\ else |
2300	\   setf xpm |
2301	\ endif
2302au BufEnter *.xpm2				setf xpm2
2303
2304" XFree86 config
2305au BufNewFile,BufRead XF86Config
2306	\ if getline(1) =~ '\<XConfigurator\>' |
2307	\   let b:xf86conf_xfree86_version = 3 |
2308	\ endif |
2309	\ setf xf86conf
2310au BufNewFile,BufRead */xorg.conf.d/*.conf
2311	\ let b:xf86conf_xfree86_version = 4 |
2312	\ setf xf86conf
2313
2314" Xorg config
2315au BufNewFile,BufRead xorg.conf,xorg.conf-4	let b:xf86conf_xfree86_version = 4 | setf xf86conf
2316
2317" Xinetd conf
2318au BufNewFile,BufRead */etc/xinetd.conf		setf xinetd
2319
2320" XS Perl extension interface language
2321au BufNewFile,BufRead *.xs			setf xs
2322
2323" X resources file
2324au BufNewFile,BufRead .Xdefaults,.Xpdefaults,.Xresources,xdm-config,*.ad setf xdefaults
2325
2326" Xmath
2327au BufNewFile,BufRead *.msc,*.msf		setf xmath
2328au BufNewFile,BufRead *.ms
2329	\ if !s:FTnroff() | setf xmath | endif
2330
2331" XML  specific variants: docbk and xbl
2332au BufNewFile,BufRead *.xml			call s:FTxml()
2333
2334func! s:FTxml()
2335  let n = 1
2336  while n < 100 && n < line("$")
2337    let line = getline(n)
2338    " DocBook 4 or DocBook 5.
2339    let is_docbook4 = line =~ '<!DOCTYPE.*DocBook'
2340    let is_docbook5 = line =~ ' xmlns="http://docbook.org/ns/docbook"'
2341    if is_docbook4 || is_docbook5
2342      let b:docbk_type = "xml"
2343      if is_docbook5
2344	let b:docbk_ver = 5
2345      else
2346	let b:docbk_ver = 4
2347      endif
2348      setf docbk
2349      return
2350    endif
2351    if line =~ 'xmlns:xbl="http://www.mozilla.org/xbl"'
2352      setf xbl
2353      return
2354    endif
2355    let n += 1
2356  endwhile
2357  setf xml
2358endfunc
2359
2360" XMI (holding UML models) is also XML
2361au BufNewFile,BufRead *.xmi			setf xml
2362
2363" CSPROJ files are Visual Studio.NET's XML-based project config files
2364au BufNewFile,BufRead *.csproj,*.csproj.user	setf xml
2365
2366" Qt Linguist translation source and Qt User Interface Files are XML
2367au BufNewFile,BufRead *.ts,*.ui			setf xml
2368
2369" TPM's are RDF-based descriptions of TeX packages (Nikolai Weibull)
2370au BufNewFile,BufRead *.tpm			setf xml
2371
2372" Xdg menus
2373au BufNewFile,BufRead */etc/xdg/menus/*.menu	setf xml
2374
2375" ATI graphics driver configuration
2376au BufNewFile,BufRead fglrxrc			setf xml
2377
2378" XLIFF (XML Localisation Interchange File Format) is also XML
2379au BufNewFile,BufRead *.xlf			setf xml
2380au BufNewFile,BufRead *.xliff			setf xml
2381
2382" XML User Interface Language
2383au BufNewFile,BufRead *.xul			setf xml
2384
2385" X11 xmodmap (also see below)
2386au BufNewFile,BufRead *Xmodmap			setf xmodmap
2387
2388" Xquery
2389au BufNewFile,BufRead *.xq,*.xql,*.xqm,*.xquery,*.xqy	setf xquery
2390
2391" XSD
2392au BufNewFile,BufRead *.xsd			setf xsd
2393
2394" Xslt
2395au BufNewFile,BufRead *.xsl,*.xslt		setf xslt
2396
2397" Yacc
2398au BufNewFile,BufRead *.yy			setf yacc
2399
2400" Yacc or racc
2401au BufNewFile,BufRead *.y			call s:FTy()
2402
2403func! s:FTy()
2404  let n = 1
2405  while n < 100 && n < line("$")
2406    let line = getline(n)
2407    if line =~ '^\s*%'
2408      setf yacc
2409      return
2410    endif
2411    if getline(n) =~ '^\s*\(#\|class\>\)' && getline(n) !~ '^\s*#\s*include'
2412      setf racc
2413      return
2414    endif
2415    let n = n + 1
2416  endwhile
2417  setf yacc
2418endfunc
2419
2420
2421" Yaml
2422au BufNewFile,BufRead *.yaml,*.yml		setf yaml
2423
2424" yum conf (close enough to dosini)
2425au BufNewFile,BufRead */etc/yum.conf		setf dosini
2426
2427" Zimbu
2428au BufNewFile,BufRead *.zu			setf zimbu
2429
2430" Zope
2431"   dtml (zope dynamic template markup language), pt (zope page template),
2432"   cpt (zope form controller page template)
2433au BufNewFile,BufRead *.dtml,*.pt,*.cpt		call s:FThtml()
2434"   zsql (zope sql method)
2435au BufNewFile,BufRead *.zsql			call s:SQL()
2436
2437" Z80 assembler asz80
2438au BufNewFile,BufRead *.z8a			setf z8a
2439
2440augroup END
2441
2442
2443" Source the user-specified filetype file, for backwards compatibility with
2444" Vim 5.x.
2445if exists("myfiletypefile") && filereadable(expand(myfiletypefile))
2446  execute "source " . myfiletypefile
2447endif
2448
2449
2450" Check for "*" after loading myfiletypefile, so that scripts.vim is only used
2451" when there are no matching file name extensions.
2452" Don't do this for compressed files.
2453augroup filetypedetect
2454au BufNewFile,BufRead *
2455	\ if !did_filetype() && expand("<amatch>") !~ g:ft_ignore_pat
2456	\ | runtime! scripts.vim | endif
2457au StdinReadPost * if !did_filetype() | runtime! scripts.vim | endif
2458
2459
2460" Extra checks for when no filetype has been detected now.  Mostly used for
2461" patterns that end in "*".  E.g., "zsh*" matches "zsh.vim", but that's a Vim
2462" script file.
2463" Most of these should call s:StarSetf() to avoid names ending in .gz and the
2464" like are used.
2465
2466" More Apache config files
2467au BufNewFile,BufRead access.conf*,apache.conf*,apache2.conf*,httpd.conf*,srm.conf*	call s:StarSetf('apache')
2468au BufNewFile,BufRead */etc/apache2/*.conf*,*/etc/apache2/conf.*/*,*/etc/apache2/mods-*/*,*/etc/apache2/sites-*/*,*/etc/httpd/conf.d/*.conf*		call s:StarSetf('apache')
2469
2470" Asterisk config file
2471au BufNewFile,BufRead *asterisk/*.conf*		call s:StarSetf('asterisk')
2472au BufNewFile,BufRead *asterisk*/*voicemail.conf* call s:StarSetf('asteriskvm')
2473
2474" Bazaar version control
2475au BufNewFile,BufRead bzr_log.*			setf bzr
2476
2477" BIND zone
2478au BufNewFile,BufRead */named/db.*,*/bind/db.*	call s:StarSetf('bindzone')
2479
2480" Calendar
2481au BufNewFile,BufRead */.calendar/*,
2482	\*/share/calendar/*/calendar.*,*/share/calendar/calendar.*
2483	\					call s:StarSetf('calendar')
2484
2485" Changelog
2486au BufNewFile,BufRead [cC]hange[lL]og*
2487	\ if getline(1) =~ '; urgency='
2488	\|  call s:StarSetf('debchangelog')
2489	\|else
2490	\|  call s:StarSetf('changelog')
2491	\|endif
2492
2493" Crontab
2494au BufNewFile,BufRead crontab,crontab.*,*/etc/cron.d/*		call s:StarSetf('crontab')
2495
2496" dnsmasq(8) configuration
2497au BufNewFile,BufRead */etc/dnsmasq.d/*		call s:StarSetf('dnsmasq')
2498
2499" Dracula
2500au BufNewFile,BufRead drac.*			call s:StarSetf('dracula')
2501
2502" Fvwm
2503au BufNewFile,BufRead */.fvwm/*			call s:StarSetf('fvwm')
2504au BufNewFile,BufRead *fvwmrc*,*fvwm95*.hook
2505	\ let b:fvwm_version = 1 | call s:StarSetf('fvwm')
2506au BufNewFile,BufRead *fvwm2rc*
2507	\ if expand("<afile>:e") == "m4"
2508	\|  call s:StarSetf('fvwm2m4')
2509	\|else
2510	\|  let b:fvwm_version = 2 | call s:StarSetf('fvwm')
2511	\|endif
2512
2513" Gedcom
2514au BufNewFile,BufRead */tmp/lltmp*		call s:StarSetf('gedcom')
2515
2516" GTK RC
2517au BufNewFile,BufRead .gtkrc*,gtkrc*		call s:StarSetf('gtkrc')
2518
2519" Jam
2520au BufNewFile,BufRead Prl*.*,JAM*.*		call s:StarSetf('jam')
2521
2522" Jargon
2523au! BufNewFile,BufRead *jarg*
2524	\ if getline(1).getline(2).getline(3).getline(4).getline(5) =~? 'THIS IS THE JARGON FILE'
2525	\|  call s:StarSetf('jargon')
2526	\|endif
2527
2528" Kconfig
2529au BufNewFile,BufRead Kconfig.*			call s:StarSetf('kconfig')
2530
2531" Lilo: Linux loader
2532au BufNewFile,BufRead lilo.conf*		call s:StarSetf('lilo')
2533
2534" Logcheck
2535au BufNewFile,BufRead */etc/logcheck/*.d*/*	call s:StarSetf('logcheck')
2536
2537" Makefile
2538au BufNewFile,BufRead [mM]akefile*		call s:StarSetf('make')
2539
2540" Ruby Makefile
2541au BufNewFile,BufRead [rR]akefile*		call s:StarSetf('ruby')
2542
2543" Mail (also matches muttrc.vim, so this is below the other checks)
2544au BufNewFile,BufRead mutt[[:alnum:]._-]\{6\}	setf mail
2545
2546" Modconf
2547au BufNewFile,BufRead */etc/modutils/*
2548	\ if executable(expand("<afile>")) != 1
2549	\|  call s:StarSetf('modconf')
2550	\|endif
2551au BufNewFile,BufRead */etc/modprobe.*		call s:StarSetf('modconf')
2552
2553" Mutt setup file
2554au BufNewFile,BufRead .mutt{ng,}rc*,*/.mutt{ng,}/mutt{ng,}rc*	call s:StarSetf('muttrc')
2555au BufNewFile,BufRead mutt{ng,}rc*,Mutt{ng,}rc*		call s:StarSetf('muttrc')
2556
2557" Nroff macros
2558au BufNewFile,BufRead tmac.*			call s:StarSetf('nroff')
2559
2560" Pam conf
2561au BufNewFile,BufRead */etc/pam.d/*		call s:StarSetf('pamconf')
2562
2563" Printcap and Termcap
2564au BufNewFile,BufRead *printcap*
2565	\ if !did_filetype()
2566	\|  let b:ptcap_type = "print" | call s:StarSetf('ptcap')
2567	\|endif
2568au BufNewFile,BufRead *termcap*
2569	\ if !did_filetype()
2570	\|  let b:ptcap_type = "term" | call s:StarSetf('ptcap')
2571	\|endif
2572
2573" ReDIF
2574" Only used when the .rdf file was not detected to be XML.
2575au BufRead,BufNewFile *.rdf			call s:Redif()
2576func! s:Redif()
2577  let lnum = 1
2578  while lnum <= 5 && lnum < line('$')
2579    if getline(lnum) =~ "^\ctemplate-type:"
2580      setf redif
2581      return
2582    endif
2583    let lnum = lnum + 1
2584  endwhile
2585endfunc
2586
2587" Remind
2588au BufNewFile,BufRead .reminders*		call s:StarSetf('remind')
2589
2590" Vim script
2591au BufNewFile,BufRead *vimrc*			call s:StarSetf('vim')
2592
2593" Subversion commit file
2594au BufNewFile,BufRead svn-commit*.tmp		setf svn
2595
2596" X resources file
2597au BufNewFile,BufRead Xresources*,*/app-defaults/*,*/Xresources/* call s:StarSetf('xdefaults')
2598
2599" XFree86 config
2600au BufNewFile,BufRead XF86Config-4*
2601	\ let b:xf86conf_xfree86_version = 4 | call s:StarSetf('xf86conf')
2602au BufNewFile,BufRead XF86Config*
2603	\ if getline(1) =~ '\<XConfigurator\>'
2604	\|  let b:xf86conf_xfree86_version = 3
2605	\|endif
2606	\|call s:StarSetf('xf86conf')
2607
2608" X11 xmodmap
2609au BufNewFile,BufRead *xmodmap*			call s:StarSetf('xmodmap')
2610
2611" Xinetd conf
2612au BufNewFile,BufRead */etc/xinetd.d/*		call s:StarSetf('xinetd')
2613
2614" yum conf (close enough to dosini)
2615au BufNewFile,BufRead */etc/yum.repos.d/*	call s:StarSetf('dosini')
2616
2617" Z-Shell script
2618au BufNewFile,BufRead zsh*,zlog*		call s:StarSetf('zsh')
2619
2620
2621" Plain text files, needs to be far down to not override others.  This avoids
2622" the "conf" type being used if there is a line starting with '#'.
2623au BufNewFile,BufRead *.txt,*.text		setf text
2624
2625
2626" Use the filetype detect plugins.  They may overrule any of the previously
2627" detected filetypes.
2628runtime! ftdetect/*.vim
2629
2630" NOTE: The above command could have ended the filetypedetect autocmd group
2631" and started another one. Let's make sure it has ended to get to a consistent
2632" state.
2633augroup END
2634
2635" Generic configuration file (check this last, it's just guessing!)
2636au filetypedetect BufNewFile,BufRead,StdinReadPost *
2637	\ if !did_filetype() && expand("<amatch>") !~ g:ft_ignore_pat
2638	\    && (getline(1) =~ '^#' || getline(2) =~ '^#' || getline(3) =~ '^#'
2639	\	|| getline(4) =~ '^#' || getline(5) =~ '^#') |
2640	\   setf conf |
2641	\ endif
2642
2643
2644" If the GUI is already running, may still need to install the Syntax menu.
2645" Don't do it when the 'M' flag is included in 'guioptions'.
2646if has("menu") && has("gui_running")
2647      \ && !exists("did_install_syntax_menu") && &guioptions !~# "M"
2648  source <sfile>:p:h/menu.vim
2649endif
2650
2651" Function called for testing all functions defined here.  These are
2652" script-local, thus need to be executed here.
2653" Returns a string with error messages (hopefully empty).
2654func! TestFiletypeFuncs(testlist)
2655  let output = ''
2656  for f in a:testlist
2657    try
2658      exe f
2659    catch
2660      let output = output . "\n" . f . ": " . v:exception
2661    endtry
2662  endfor
2663  return output
2664endfunc
2665
2666" Restore 'cpoptions'
2667let &cpo = s:cpo_save
2668unlet s:cpo_save
2669