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