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