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