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