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