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