xref: /vim-8.2.3635/runtime/filetype.vim (revision 9c754c45)
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" 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
1288
1289func! s:FTpl()
1290  if exists("g:filetype_pl")
1291    exe "setf " . g:filetype_pl
1292  else
1293    " recognize Prolog by specific text in the first non-empty line
1294    " require a blank after the '%' because Perl uses "%list" and "%translate"
1295    let l = getline(nextnonblank(1))
1296    if l =~ '\<prolog\>' || l =~ '^\s*\(%\+\(\s\|$\)\|/\*\)' || l =~ ':-'
1297      setf prolog
1298    else
1299      setf perl
1300    endif
1301  endif
1302endfunc
1303
1304" Perl, XPM or XPM2
1305au BufNewFile,BufRead *.pm
1306	\ if getline(1) =~ "XPM2" |
1307	\   setf xpm2 |
1308	\ elseif getline(1) =~ "XPM" |
1309	\   setf xpm |
1310	\ else |
1311	\   setf perl |
1312	\ endif
1313
1314" Perl POD
1315au BufNewFile,BufRead *.pod			setf pod
1316
1317" Php, php3, php4, etc.
1318" Also Phtml (was used for PHP 2 in the past)
1319" Also .ctp for Cake template file
1320au BufNewFile,BufRead *.php,*.php\d,*.phtml,*.ctp	setf php
1321
1322" Pike
1323au BufNewFile,BufRead *.pike,*.lpc,*.ulpc,*.pmod setf pike
1324
1325" Pinfo config
1326au BufNewFile,BufRead */etc/pinforc,*/.pinforc	setf pinfo
1327
1328" Palm Resource compiler
1329au BufNewFile,BufRead *.rcp			setf pilrc
1330
1331" Pine config
1332au BufNewFile,BufRead .pinerc,pinerc,.pinercex,pinercex		setf pine
1333
1334" PL/M (also: *.inp)
1335au BufNewFile,BufRead *.plm,*.p36,*.pac		setf plm
1336
1337" PL/SQL
1338au BufNewFile,BufRead *.pls,*.plsql		setf plsql
1339
1340" PLP
1341au BufNewFile,BufRead *.plp			setf plp
1342
1343" PO and PO template (GNU gettext)
1344au BufNewFile,BufRead *.po,*.pot		setf po
1345
1346" Postfix main config
1347au BufNewFile,BufRead main.cf			setf pfmain
1348
1349" PostScript (+ font files, encapsulated PostScript, Adobe Illustrator)
1350au BufNewFile,BufRead *.ps,*.pfa,*.afm,*.eps,*.epsf,*.epsi,*.ai	  setf postscr
1351
1352" PostScript Printer Description
1353au BufNewFile,BufRead *.ppd			setf ppd
1354
1355" Povray
1356au BufNewFile,BufRead *.pov			setf pov
1357
1358" Povray configuration
1359au BufNewFile,BufRead .povrayrc			setf povini
1360
1361" Povray, PHP or assembly
1362au BufNewFile,BufRead *.inc			call s:FTinc()
1363
1364func! s:FTinc()
1365  if exists("g:filetype_inc")
1366    exe "setf " . g:filetype_inc
1367  else
1368    let lines = getline(1).getline(2).getline(3)
1369    if lines =~? "perlscript"
1370      setf aspperl
1371    elseif lines =~ "<%"
1372      setf aspvbs
1373    elseif lines =~ "<?"
1374      setf php
1375    else
1376      call s:FTasmsyntax()
1377      if exists("b:asmsyntax")
1378	exe "setf " . fnameescape(b:asmsyntax)
1379      else
1380	setf pov
1381      endif
1382    endif
1383  endif
1384endfunc
1385
1386" Printcap and Termcap
1387au BufNewFile,BufRead *printcap
1388	\ let b:ptcap_type = "print" | setf ptcap
1389au BufNewFile,BufRead *termcap
1390	\ let b:ptcap_type = "term" | setf ptcap
1391
1392" PCCTS / ANTRL
1393"au BufNewFile,BufRead *.g			setf antrl
1394au BufNewFile,BufRead *.g			setf pccts
1395
1396" PPWizard
1397au BufNewFile,BufRead *.it,*.ih			setf ppwiz
1398
1399" Obj 3D file format
1400" TODO: is there a way to avoid MS-Windows Object files?
1401au BufNewFile,BufRead *.obj         		setf obj
1402
1403" Oracle Pro*C/C++
1404au BufNewFile,BufRead *.pc			setf proc
1405
1406" Privoxy actions file
1407au BufNewFile,BufRead *.action			setf privoxy
1408
1409" Procmail
1410au BufNewFile,BufRead .procmail,.procmailrc	setf procmail
1411
1412" Progress or CWEB
1413au BufNewFile,BufRead *.w			call s:FTprogress_cweb()
1414
1415func! s:FTprogress_cweb()
1416  if exists("g:filetype_w")
1417    exe "setf " . g:filetype_w
1418    return
1419  endif
1420  if getline(1) =~ '&ANALYZE' || getline(3) =~ '&GLOBAL-DEFINE'
1421    setf progress
1422  else
1423    setf cweb
1424  endif
1425endfunc
1426
1427" Progress or assembly
1428au BufNewFile,BufRead *.i			call s:FTprogress_asm()
1429
1430func! s:FTprogress_asm()
1431  if exists("g:filetype_i")
1432    exe "setf " . g:filetype_i
1433    return
1434  endif
1435  " This function checks for an assembly comment the first ten lines.
1436  " If not found, assume Progress.
1437  let lnum = 1
1438  while lnum <= 10 && lnum < line('$')
1439    let line = getline(lnum)
1440    if line =~ '^\s*;' || line =~ '^\*'
1441      call s:FTasm()
1442      return
1443    elseif line !~ '^\s*$' || line =~ '^/\*'
1444      " Not an empty line: Doesn't look like valid assembly code.
1445      " Or it looks like a Progress /* comment
1446      break
1447    endif
1448    let lnum = lnum + 1
1449  endw
1450  setf progress
1451endfunc
1452
1453" Progress or Pascal
1454au BufNewFile,BufRead *.p			call s:FTprogress_pascal()
1455
1456func! s:FTprogress_pascal()
1457  if exists("g:filetype_p")
1458    exe "setf " . g:filetype_p
1459    return
1460  endif
1461  " This function checks for valid Pascal syntax in the first ten lines.
1462  " Look for either an opening comment or a program start.
1463  " If not found, assume Progress.
1464  let lnum = 1
1465  while lnum <= 10 && lnum < line('$')
1466    let line = getline(lnum)
1467    if line =~ '^\s*\(program\|unit\|procedure\|function\|const\|type\|var\)\>'
1468	\ || line =~ '^\s*{' || line =~ '^\s*(\*'
1469      setf pascal
1470      return
1471    elseif line !~ '^\s*$' || line =~ '^/\*'
1472      " Not an empty line: Doesn't look like valid Pascal code.
1473      " Or it looks like a Progress /* comment
1474      break
1475    endif
1476    let lnum = lnum + 1
1477  endw
1478  setf progress
1479endfunc
1480
1481
1482" Software Distributor Product Specification File (POSIX 1387.2-1995)
1483au BufNewFile,BufRead *.psf			setf psf
1484au BufNewFile,BufRead INDEX,INFO
1485	\ if getline(1) =~ '^\s*\(distribution\|installed_software\|root\|bundle\|product\)\s*$' |
1486	\   setf psf |
1487	\ endif
1488
1489" Prolog
1490au BufNewFile,BufRead *.pdb			setf prolog
1491
1492" Promela
1493au BufNewFile,BufRead *.pml			setf promela
1494
1495" Protocols
1496au BufNewFile,BufRead /etc/protocols		setf protocols
1497
1498" Pyrex
1499au BufNewFile,BufRead *.pyx,*.pxd		setf pyrex
1500
1501" Python
1502au BufNewFile,BufRead *.py,*.pyw		setf python
1503
1504" Quixote (Python-based web framework)
1505au BufNewFile,BufRead *.ptl			setf python
1506
1507" Radiance
1508au BufNewFile,BufRead *.rad,*.mat		setf radiance
1509
1510" Ratpoison config/command files
1511au BufNewFile,BufRead .ratpoisonrc,ratpoisonrc	setf ratpoison
1512
1513" RCS file
1514au BufNewFile,BufRead *\,v			setf rcs
1515
1516" Readline
1517au BufNewFile,BufRead .inputrc,inputrc		setf readline
1518
1519" Registry for MS-Windows
1520au BufNewFile,BufRead *.reg
1521	\ if getline(1) =~? '^REGEDIT[0-9]*\s*$\|^Windows Registry Editor Version \d*\.\d*\s*$' | setf registry | endif
1522
1523" Renderman Interface Bytestream
1524au BufNewFile,BufRead *.rib			setf rib
1525
1526" Rexx
1527au BufNewFile,BufRead *.rexx,*.rex,*.jrexx,*.rxj,*.orx	setf rexx
1528
1529" R (Splus)
1530if has("fname_case")
1531  au BufNewFile,BufRead *.s,*.S			setf r
1532else
1533  au BufNewFile,BufRead *.s			setf r
1534endif
1535
1536" R Help file
1537if has("fname_case")
1538  au BufNewFile,BufRead *.rd,*.Rd		setf rhelp
1539else
1540  au BufNewFile,BufRead *.rd			setf rhelp
1541endif
1542
1543" R noweb file
1544if has("fname_case")
1545  au BufNewFile,BufRead *.Rnw,*.rnw,*.Snw,*.snw		setf rnoweb
1546else
1547  au BufNewFile,BufRead *.rnw,*.snw			setf rnoweb
1548endif
1549
1550" Rexx, Rebol or R
1551au BufNewFile,BufRead *.r,*.R			call s:FTr()
1552
1553func! s:FTr()
1554  let max = line("$") > 50 ? 50 : line("$")
1555
1556  for n in range(1, max)
1557    " Rebol is easy to recognize, check for that first
1558    if getline(n) =~? '\<REBOL\>'
1559      setf rebol
1560      return
1561    endif
1562  endfor
1563
1564  for n in range(1, max)
1565    " R has # comments
1566    if getline(n) =~ '^\s*#'
1567      setf r
1568      return
1569    endif
1570    " Rexx has /* comments */
1571    if getline(n) =~ '^\s*/\*'
1572      setf rexx
1573      return
1574    endif
1575  endfor
1576
1577  " Nothing recognized, assume Rexx
1578  setf rexx
1579endfunc
1580
1581" Remind
1582au BufNewFile,BufRead .reminders*		call s:StarSetf('remind')
1583au BufNewFile,BufRead *.remind,*.rem		setf remind
1584
1585" Resolv.conf
1586au BufNewFile,BufRead resolv.conf		setf resolv
1587
1588" Relax NG Compact
1589au BufNewFile,BufRead *.rnc			setf rnc
1590
1591" RPL/2
1592au BufNewFile,BufRead *.rpl			setf rpl
1593
1594" Robots.txt
1595au BufNewFile,BufRead robots.txt		setf robots
1596
1597" Rpcgen
1598au BufNewFile,BufRead *.x			setf rpcgen
1599
1600" reStructuredText Documentation Format
1601au BufNewFile,BufRead *.rst			setf rst
1602
1603" RTF
1604au BufNewFile,BufRead *.rtf			setf rtf
1605
1606" Interactive Ruby shell
1607au BufNewFile,BufRead .irbrc,irbrc		setf ruby
1608
1609" Ruby
1610au BufNewFile,BufRead *.rb,*.rbw,*.gem,*.gemspec	setf ruby
1611
1612" Ruby on Rails
1613au BufNewFile,BufRead *.builder,*.rxml,*.rjs	setf ruby
1614
1615" Rantfile and Rakefile is like Ruby
1616au BufNewFile,BufRead [rR]antfile,*.rant,[rR]akefile,*.rake	setf ruby
1617
1618" S-lang (or shader language, or SmallLisp)
1619au BufNewFile,BufRead *.sl			setf slang
1620
1621" Samba config
1622au BufNewFile,BufRead smb.conf			setf samba
1623
1624" SAS script
1625au BufNewFile,BufRead *.sas			setf sas
1626
1627" Sass
1628au BufNewFile,BufRead *.sass			setf sass
1629
1630" Sather
1631au BufNewFile,BufRead *.sa			setf sather
1632
1633" Scilab
1634au BufNewFile,BufRead *.sci,*.sce		setf scilab
1635
1636" SD: Streaming Descriptors
1637au BufNewFile,BufRead *.sd			setf sd
1638
1639" SDL
1640au BufNewFile,BufRead *.sdl,*.pr		setf sdl
1641
1642" sed
1643au BufNewFile,BufRead *.sed			setf sed
1644
1645" Sieve (RFC 3028)
1646au BufNewFile,BufRead *.siv			setf sieve
1647
1648" Sendmail
1649au BufNewFile,BufRead sendmail.cf		setf sm
1650
1651" Sendmail .mc files are actually m4.  Could also be MS Message text file.
1652au BufNewFile,BufRead *.mc			call s:McSetf()
1653
1654func! s:McSetf()
1655  " Rely on the file to start with a comment.
1656  " MS message text files use ';', Sendmail files use '#' or 'dnl'
1657  for lnum in range(1, min([line("$"), 20]))
1658    let line = getline(lnum)
1659    if line =~ '^\s*\(#\|dnl\)'
1660      setf m4  " Sendmail .mc file
1661      return
1662    elseif line =~ '^\s*;'
1663      setf msmessages  " MS Message text file
1664      return
1665    endif
1666  endfor
1667  setf m4  " Default: Sendmail .mc file
1668endfunc
1669
1670" Services
1671au BufNewFile,BufRead /etc/services		setf services
1672
1673" Service Location config
1674au BufNewFile,BufRead /etc/slp.conf		setf slpconf
1675
1676" Service Location registration
1677au BufNewFile,BufRead /etc/slp.reg		setf slpreg
1678
1679" Service Location SPI
1680au BufNewFile,BufRead /etc/slp.spi		setf slpspi
1681
1682" Setserial config
1683au BufNewFile,BufRead /etc/serial.conf		setf setserial
1684
1685" SGML
1686au BufNewFile,BufRead *.sgm,*.sgml
1687	\ if getline(1).getline(2).getline(3).getline(4).getline(5) =~? 'linuxdoc' |
1688	\   setf sgmllnx |
1689	\ elseif getline(1) =~ '<!DOCTYPE.*DocBook' || getline(2) =~ '<!DOCTYPE.*DocBook' |
1690	\   let b:docbk_type="sgml" |
1691	\   setf docbk |
1692	\ else |
1693	\   setf sgml |
1694	\ endif
1695
1696" SGMLDECL
1697au BufNewFile,BufRead *.decl,*.dcl,*.dec
1698	\ if getline(1).getline(2).getline(3) =~? '^<!SGML' |
1699	\    setf sgmldecl |
1700	\ endif
1701
1702" SGML catalog file
1703au BufNewFile,BufRead catalog			setf catalog
1704au BufNewFile,BufRead sgml.catalog*		call s:StarSetf('catalog')
1705
1706" Shell scripts (sh, ksh, bash, bash2, csh); Allow .profile_foo etc.
1707" Gentoo ebuilds are actually bash scripts
1708au BufNewFile,BufRead .bashrc*,bashrc,bash.bashrc,.bash_profile*,.bash_logout*,*.bash,*.ebuild call SetFileTypeSH("bash")
1709au BufNewFile,BufRead .kshrc*,*.ksh call SetFileTypeSH("ksh")
1710au BufNewFile,BufRead /etc/profile,.profile*,*.sh,*.env call SetFileTypeSH(getline(1))
1711
1712" Also called from scripts.vim.
1713func! SetFileTypeSH(name)
1714  if expand("<amatch>") =~ g:ft_ignore_pat
1715    return
1716  endif
1717  if a:name =~ '\<csh\>'
1718    " Some .sh scripts contain #!/bin/csh.
1719    call SetFileTypeShell("csh")
1720    return
1721  elseif a:name =~ '\<tcsh\>'
1722    " Some .sh scripts contain #!/bin/tcsh.
1723    call SetFileTypeShell("tcsh")
1724    return
1725  elseif a:name =~ '\<ksh\>'
1726    let b:is_kornshell = 1
1727    if exists("b:is_bash")
1728      unlet b:is_bash
1729    endif
1730    if exists("b:is_sh")
1731      unlet b:is_sh
1732    endif
1733  elseif exists("g:bash_is_sh") || a:name =~ '\<bash\>' || a:name =~ '\<bash2\>'
1734    let b:is_bash = 1
1735    if exists("b:is_kornshell")
1736      unlet b:is_kornshell
1737    endif
1738    if exists("b:is_sh")
1739      unlet b:is_sh
1740    endif
1741  elseif a:name =~ '\<sh\>'
1742    let b:is_sh = 1
1743    if exists("b:is_kornshell")
1744      unlet b:is_kornshell
1745    endif
1746    if exists("b:is_bash")
1747      unlet b:is_bash
1748    endif
1749  endif
1750  call SetFileTypeShell("sh")
1751endfunc
1752
1753" For shell-like file types, check for an "exec" command hidden in a comment,
1754" as used for Tcl.
1755" Also called from scripts.vim, thus can't be local to this script.
1756func! SetFileTypeShell(name)
1757  if expand("<amatch>") =~ g:ft_ignore_pat
1758    return
1759  endif
1760  let l = 2
1761  while l < 20 && l < line("$") && getline(l) =~ '^\s*\(#\|$\)'
1762    " Skip empty and comment lines.
1763    let l = l + 1
1764  endwhile
1765  if l < line("$") && getline(l) =~ '\s*exec\s' && getline(l - 1) =~ '^\s*#.*\\$'
1766    " Found an "exec" line after a comment with continuation
1767    let n = substitute(getline(l),'\s*exec\s\+\([^ ]*/\)\=', '', '')
1768    if n =~ '\<tclsh\|\<wish'
1769      setf tcl
1770      return
1771    endif
1772  endif
1773  exe "setf " . a:name
1774endfunc
1775
1776" tcsh scripts
1777au BufNewFile,BufRead .tcshrc*,*.tcsh,tcsh.tcshrc,tcsh.login	call SetFileTypeShell("tcsh")
1778
1779" csh scripts, but might also be tcsh scripts (on some systems csh is tcsh)
1780au BufNewFile,BufRead .login*,.cshrc*,csh.cshrc,csh.login,csh.logout,*.csh,.alias  call s:CSH()
1781
1782func! s:CSH()
1783  if exists("g:filetype_csh")
1784    call SetFileTypeShell(g:filetype_csh)
1785  elseif &shell =~ "tcsh"
1786    call SetFileTypeShell("tcsh")
1787  else
1788    call SetFileTypeShell("csh")
1789  endif
1790endfunc
1791
1792" Z-Shell script
1793au BufNewFile,BufRead .zprofile,/etc/zprofile,.zfbfmarks  setf zsh
1794au BufNewFile,BufRead .zsh*,.zlog*,.zcompdump*  call s:StarSetf('zsh')
1795au BufNewFile,BufRead *.zsh 			setf zsh
1796
1797" Scheme
1798au BufNewFile,BufRead *.scm,*.ss		setf scheme
1799
1800" Screen RC
1801au BufNewFile,BufRead .screenrc,screenrc	setf screen
1802
1803" Simula
1804au BufNewFile,BufRead *.sim			setf simula
1805
1806" SINDA
1807au BufNewFile,BufRead *.sin,*.s85		setf sinda
1808
1809" SiSU
1810au BufNewFile,BufRead *.sst,*.ssm,*.ssi,*.-sst,*._sst setf sisu
1811au BufNewFile,BufRead *.sst.meta,*.-sst.meta,*._sst.meta setf sisu
1812
1813" SKILL
1814au BufNewFile,BufRead *.il,*.ils,*.cdf		setf skill
1815
1816" SLRN
1817au BufNewFile,BufRead .slrnrc			setf slrnrc
1818au BufNewFile,BufRead *.score			setf slrnsc
1819
1820" Smalltalk (and TeX)
1821au BufNewFile,BufRead *.st			setf st
1822au BufNewFile,BufRead *.cls
1823	\ if getline(1) =~ '^%' |
1824	\  setf tex |
1825	\ else |
1826	\  setf st |
1827	\ endif
1828
1829" Smarty templates
1830au BufNewFile,BufRead *.tpl			setf smarty
1831
1832" SMIL or XML
1833au BufNewFile,BufRead *.smil
1834	\ if getline(1) =~ '<?\s*xml.*?>' |
1835	\   setf xml |
1836	\ else |
1837	\   setf smil |
1838	\ endif
1839
1840" SMIL or SNMP MIB file
1841au BufNewFile,BufRead *.smi
1842	\ if getline(1) =~ '\<smil\>' |
1843	\   setf smil |
1844	\ else |
1845	\   setf mib |
1846	\ endif
1847
1848" SMITH
1849au BufNewFile,BufRead *.smt,*.smith		setf smith
1850
1851" Snobol4 and spitbol
1852au BufNewFile,BufRead *.sno,*.spt		setf snobol4
1853
1854" SNMP MIB files
1855au BufNewFile,BufRead *.mib,*.my		setf mib
1856
1857" Snort Configuration
1858au BufNewFile,BufRead *.hog,snort.conf,vision.conf	setf hog
1859au BufNewFile,BufRead *.rules			call s:FTRules()
1860
1861let s:ft_rules_udev_rules_pattern = '^\s*\cudev_rules\s*=\s*"\([^"]\{-1,}\)/*".*'
1862func! s:FTRules()
1863  let path = expand('<amatch>:p')
1864  if path =~ '^/etc/udev/\%(rules\.d/\)\=.*\.rules$'
1865    setf udevrules
1866    return
1867  endif
1868  if path =~ '^/etc/ufw/'
1869    setf conf  " Better than hog
1870    return
1871  endif
1872  try
1873    let config_lines = readfile('/etc/udev/udev.conf')
1874  catch /^Vim\%((\a\+)\)\=:E484/
1875    setf hog
1876    return
1877  endtry
1878  let dir = expand('<amatch>:p:h')
1879  for line in config_lines
1880    if line =~ s:ft_rules_udev_rules_pattern
1881      let udev_rules = substitute(line, s:ft_rules_udev_rules_pattern, '\1', "")
1882      if dir == udev_rules
1883        setf udevrules
1884      endif
1885      break
1886    endif
1887  endfor
1888  setf hog
1889endfunc
1890
1891
1892" Spec (Linux RPM)
1893au BufNewFile,BufRead *.spec			setf spec
1894
1895" Speedup (AspenTech plant simulator)
1896au BufNewFile,BufRead *.speedup,*.spdata,*.spd	setf spup
1897
1898" Slice
1899au BufNewFile,BufRead *.ice			setf slice
1900
1901" Spice
1902au BufNewFile,BufRead *.sp,*.spice		setf spice
1903
1904" Spyce
1905au BufNewFile,BufRead *.spy,*.spi		setf spyce
1906
1907" Squid
1908au BufNewFile,BufRead squid.conf		setf squid
1909
1910" SQL for Oracle Designer
1911au BufNewFile,BufRead *.tyb,*.typ,*.tyc,*.pkb,*.pks	setf sql
1912
1913" SQL
1914au BufNewFile,BufRead *.sql			call s:SQL()
1915
1916func! s:SQL()
1917  if exists("g:filetype_sql")
1918    exe "setf " . g:filetype_sql
1919  else
1920    setf sql
1921  endif
1922endfunc
1923
1924" SQLJ
1925au BufNewFile,BufRead *.sqlj			setf sqlj
1926
1927" SQR
1928au BufNewFile,BufRead *.sqr,*.sqi		setf sqr
1929
1930" OpenSSH configuration
1931au BufNewFile,BufRead ssh_config,*/.ssh/config	setf sshconfig
1932
1933" OpenSSH server configuration
1934au BufNewFile,BufRead sshd_config		setf sshdconfig
1935
1936" Stata
1937au BufNewFile,BufRead *.ado,*.class,*.do,*.imata,*.mata   setf stata
1938
1939" SMCL
1940au BufNewFile,BufRead *.hlp,*.ihlp,*.smcl	setf smcl
1941
1942" Stored Procedures
1943au BufNewFile,BufRead *.stp			setf stp
1944
1945" Standard ML
1946au BufNewFile,BufRead *.sml			setf sml
1947
1948" Sratus VOS command macro
1949au BufNewFile,BufRead *.cm			setf voscm
1950
1951" Sysctl
1952au BufNewFile,BufRead /etc/sysctl.conf		setf sysctl
1953
1954" Synopsys Design Constraints
1955au BufNewFile,BufRead *.sdc			setf sdc
1956
1957" Sudoers
1958au BufNewFile,BufRead /etc/sudoers,sudoers.tmp	setf sudoers
1959
1960" SVG (Scalable Vector Graphics)
1961au BufNewFile,BufRead *.svg			setf svg
1962
1963" If the file has an extension of 't' and is in a directory 't' then it is
1964" almost certainly a Perl test file.
1965" If the first line starts with '#' and contains 'perl' it's probably a Perl
1966" file.
1967" (Slow test) If a file contains a 'use' statement then it is almost certainly
1968" a Perl file.
1969func! s:FTperl()
1970  if expand("%:e") == 't' && expand("%:p:h:t") == 't'
1971    setf perl
1972    return 1
1973  endif
1974  if getline(1)[0] == '#' && getline(1) =~ 'perl'
1975    setf perl
1976    return 1
1977  endif
1978  if search('^use\s\s*\k', 'nc', 30)
1979    setf perl
1980    return 1
1981  endif
1982  return 0
1983endfunc
1984
1985" Tads (or Nroff or Perl test file)
1986au BufNewFile,BufRead *.t
1987	\ if !s:FTnroff() && !s:FTperl() | setf tads | endif
1988
1989" Tags
1990au BufNewFile,BufRead tags			setf tags
1991
1992" TAK
1993au BufNewFile,BufRead *.tak			setf tak
1994
1995" Task
1996au BufRead,BufNewFile {pending,completed,undo}.data  setf taskdata
1997au BufRead,BufNewFile *.task                    setf taskedit
1998
1999" Tcl (JACL too)
2000au BufNewFile,BufRead *.tcl,*.tk,*.itcl,*.itk,*.jacl	setf tcl
2001
2002" TealInfo
2003au BufNewFile,BufRead *.tli			setf tli
2004
2005" Telix Salt
2006au BufNewFile,BufRead *.slt			setf tsalt
2007
2008" Terminfo
2009au BufNewFile,BufRead *.ti			setf terminfo
2010
2011" TeX
2012au BufNewFile,BufRead *.latex,*.sty,*.dtx,*.ltx,*.bbl	setf tex
2013au BufNewFile,BufRead *.tex			call s:FTtex()
2014
2015" Choose context, plaintex, or tex (LaTeX) based on these rules:
2016" 1. Check the first line of the file for "%&<format>".
2017" 2. Check the first 1000 non-comment lines for LaTeX or ConTeXt keywords.
2018" 3. Default to "latex" or to g:tex_flavor, can be set in user's vimrc.
2019func! s:FTtex()
2020  let firstline = getline(1)
2021  if firstline =~ '^%&\s*\a\+'
2022    let format = tolower(matchstr(firstline, '\a\+'))
2023    let format = substitute(format, 'pdf', '', '')
2024    if format == 'tex'
2025      let format = 'plain'
2026    endif
2027  else
2028    " Default value, may be changed later:
2029    let format = exists("g:tex_flavor") ? g:tex_flavor : 'plain'
2030    " Save position, go to the top of the file, find first non-comment line.
2031    let save_cursor = getpos('.')
2032    call cursor(1,1)
2033    let firstNC = search('^\s*[^[:space:]%]', 'c', 1000)
2034    if firstNC " Check the next thousand lines for a LaTeX or ConTeXt keyword.
2035      let lpat = 'documentclass\>\|usepackage\>\|begin{\|newcommand\>\|renewcommand\>'
2036      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\>'
2037      let kwline = search('^\s*\\\%(' . lpat . '\)\|^\s*\\\(' . cpat . '\)',
2038			      \ 'cnp', firstNC + 1000)
2039      if kwline == 1	" lpat matched
2040	let format = 'latex'
2041      elseif kwline == 2	" cpat matched
2042	let format = 'context'
2043      endif		" If neither matched, keep default set above.
2044      " let lline = search('^\s*\\\%(' . lpat . '\)', 'cn', firstNC + 1000)
2045      " let cline = search('^\s*\\\%(' . cpat . '\)', 'cn', firstNC + 1000)
2046      " if cline > 0
2047      "   let format = 'context'
2048      " endif
2049      " if lline > 0 && (cline == 0 || cline > lline)
2050      "   let format = 'tex'
2051      " endif
2052    endif " firstNC
2053    call setpos('.', save_cursor)
2054  endif " firstline =~ '^%&\s*\a\+'
2055
2056  " Translation from formats to file types.  TODO:  add AMSTeX, RevTex, others?
2057  if format == 'plain'
2058    setf plaintex
2059  elseif format == 'context'
2060    setf context
2061  else " probably LaTeX
2062    setf tex
2063  endif
2064  return
2065endfunc
2066
2067" ConTeXt
2068au BufNewFile,BufRead tex/context/*/*.tex,*.mkii,*.mkiv   setf context
2069
2070" Texinfo
2071au BufNewFile,BufRead *.texinfo,*.texi,*.txi	setf texinfo
2072
2073" TeX configuration
2074au BufNewFile,BufRead texmf.cnf			setf texmf
2075
2076" Tidy config
2077au BufNewFile,BufRead .tidyrc,tidyrc		setf tidy
2078
2079" TF mud client
2080au BufNewFile,BufRead *.tf,.tfrc,tfrc		setf tf
2081
2082" TPP - Text Presentation Program
2083au BufNewFile,BufReadPost *.tpp			setf tpp
2084
2085" Trustees
2086au BufNewFile,BufRead trustees.conf		setf trustees
2087
2088" TSS - Geometry
2089au BufNewFile,BufReadPost *.tssgm		setf tssgm
2090
2091" TSS - Optics
2092au BufNewFile,BufReadPost *.tssop		setf tssop
2093
2094" TSS - Command Line (temporary)
2095au BufNewFile,BufReadPost *.tsscl		setf tsscl
2096
2097" Motif UIT/UIL files
2098au BufNewFile,BufRead *.uit,*.uil		setf uil
2099
2100" Udev conf
2101au BufNewFile,BufRead /etc/udev/udev.conf	setf udevconf
2102
2103" Udev permissions
2104au BufNewFile,BufRead /etc/udev/permissions.d/*.permissions setf udevperm
2105"
2106" Udev symlinks config
2107au BufNewFile,BufRead /etc/udev/cdsymlinks.conf	setf sh
2108
2109" UnrealScript
2110au BufNewFile,BufRead *.uc			setf uc
2111
2112" Updatedb
2113au BufNewFile,BufRead /etc/updatedb.conf	setf updatedb
2114
2115" Vera
2116au BufNewFile,BufRead *.vr,*.vri,*.vrh		setf vera
2117
2118" Verilog HDL
2119au BufNewFile,BufRead *.v			setf verilog
2120
2121" Verilog-AMS HDL
2122au BufNewFile,BufRead *.va,*.vams		setf verilogams
2123
2124" VHDL
2125au BufNewFile,BufRead *.hdl,*.vhd,*.vhdl,*.vbe,*.vst  setf vhdl
2126au BufNewFile,BufRead *.vhdl_[0-9]*		call s:StarSetf('vhdl')
2127
2128" Vim script
2129au BufNewFile,BufRead *.vim,*.vba,.exrc,_exrc	setf vim
2130
2131" Viminfo file
2132au BufNewFile,BufRead .viminfo,_viminfo		setf viminfo
2133
2134" Virata Config Script File or Drupal module
2135au BufRead,BufNewFile *.hw,*.module,*.pkg
2136	\ if getline(1) =~ '<?php' |
2137	\   setf php |
2138	\ else |
2139	\   setf virata |
2140	\ endif
2141
2142" Visual Basic (also uses *.bas) or FORM
2143au BufNewFile,BufRead *.frm			call s:FTVB("form")
2144
2145" SaxBasic is close to Visual Basic
2146au BufNewFile,BufRead *.sba			setf vb
2147
2148" Vgrindefs file
2149au BufNewFile,BufRead vgrindefs			setf vgrindefs
2150
2151" VRML V1.0c
2152au BufNewFile,BufRead *.wrl			setf vrml
2153
2154" Webmacro
2155au BufNewFile,BufRead *.wm			setf webmacro
2156
2157" Wget config
2158au BufNewFile,BufRead .wgetrc,wgetrc		setf wget
2159
2160" Website MetaLanguage
2161au BufNewFile,BufRead *.wml			setf wml
2162
2163" Winbatch
2164au BufNewFile,BufRead *.wbt			setf winbatch
2165
2166" WSML
2167au BufNewFile,BufRead *.wsml			setf wsml
2168
2169" WvDial
2170au BufNewFile,BufRead wvdial.conf,.wvdialrc	setf wvdial
2171
2172" CVS RC file
2173au BufNewFile,BufRead .cvsrc			setf cvsrc
2174
2175" CVS commit file
2176au BufNewFile,BufRead cvs\d\+			setf cvs
2177
2178" WEB (*.web is also used for Winbatch: Guess, based on expecting "%" comment
2179" lines in a WEB file).
2180au BufNewFile,BufRead *.web
2181	\ if getline(1)[0].getline(2)[0].getline(3)[0].getline(4)[0].getline(5)[0] =~ "%" |
2182	\   setf web |
2183	\ else |
2184	\   setf winbatch |
2185	\ endif
2186
2187" Windows Scripting Host and Windows Script Component
2188au BufNewFile,BufRead *.ws[fc]			setf wsh
2189
2190" XHTML
2191au BufNewFile,BufRead *.xhtml,*.xht		setf xhtml
2192
2193" X Pixmap (dynamically sets colors, use BufEnter to make it work better)
2194au BufEnter *.xpm
2195	\ if getline(1) =~ "XPM2" |
2196	\   setf xpm2 |
2197	\ else |
2198	\   setf xpm |
2199	\ endif
2200au BufEnter *.xpm2				setf xpm2
2201
2202" XFree86 config
2203au BufNewFile,BufRead XF86Config
2204	\ if getline(1) =~ '\<XConfigurator\>' |
2205	\   let b:xf86c_xfree86_version = 3 |
2206	\ endif |
2207	\ setf xf86conf
2208
2209" Xorg config
2210au BufNewFile,BufRead xorg.conf,xorg.conf-4	let b:xf86c_xfree86_version = 4 | setf xf86conf
2211
2212" Xinetd conf
2213au BufNewFile,BufRead /etc/xinetd.conf		setf xinetd
2214
2215" XS Perl extension interface language
2216au BufNewFile,BufRead *.xs			setf xs
2217
2218" X resources file
2219au BufNewFile,BufRead .Xdefaults,.Xpdefaults,.Xresources,xdm-config,*.ad setf xdefaults
2220
2221" Xmath
2222au BufNewFile,BufRead *.msc,*.msf		setf xmath
2223au BufNewFile,BufRead *.ms
2224	\ if !s:FTnroff() | setf xmath | endif
2225
2226" XML  specific variants: docbk and xbl
2227au BufNewFile,BufRead *.xml			call s:FTxml()
2228
2229func! s:FTxml()
2230  let n = 1
2231  while n < 100 && n < line("$")
2232    let line = getline(n)
2233    if line =~ '<!DOCTYPE.*DocBook'
2234      let b:docbk_type = "xml"
2235      setf docbk
2236      return
2237    endif
2238    if line =~ 'xmlns:xbl="http://www.mozilla.org/xbl"'
2239      setf xbl
2240      return
2241    endif
2242    let n += 1
2243  endwhile
2244  setf xml
2245endfunc
2246
2247" XMI (holding UML models) is also XML
2248au BufNewFile,BufRead *.xmi			setf xml
2249
2250" CSPROJ files are Visual Studio.NET's XML-based project config files
2251au BufNewFile,BufRead *.csproj,*.csproj.user	setf xml
2252
2253" Qt Linguist translation source and Qt User Interface Files are XML
2254au BufNewFile,BufRead *.ts,*.ui			setf xml
2255
2256" TPM's are RDF-based descriptions of TeX packages (Nikolai Weibull)
2257au BufNewFile,BufRead *.tpm			setf xml
2258
2259" Xdg menus
2260au BufNewFile,BufRead /etc/xdg/menus/*.menu	setf xml
2261
2262" ATI graphics driver configuration
2263au BufNewFile,BufRead fglrxrc			setf xml
2264
2265" XLIFF (XML Localisation Interchange File Format) is also XML
2266au BufNewFile,BufRead *.xlf			setf xml
2267au BufNewFile,BufRead *.xliff			setf xml
2268
2269" X11 xmodmap (also see below)
2270au BufNewFile,BufRead *Xmodmap			setf xmodmap
2271
2272" Xquery
2273au BufNewFile,BufRead *.xq,*.xql,*.xqm,*.xquery,*.xqy	setf xquery
2274
2275" XSD
2276au BufNewFile,BufRead *.xsd			setf xsd
2277
2278" Xslt
2279au BufNewFile,BufRead *.xsl,*.xslt		setf xslt
2280
2281" Yacc
2282au BufNewFile,BufRead *.yy			setf yacc
2283
2284" Yacc or racc
2285au BufNewFile,BufRead *.y			call s:FTy()
2286
2287func! s:FTy()
2288  let n = 1
2289  while n < 100 && n < line("$")
2290    let line = getline(n)
2291    if line =~ '^\s*%'
2292      setf yacc
2293      return
2294    endif
2295    if getline(n) =~ '^\s*\(#\|class\>\)' && getline(n) !~ '^\s*#\s*include'
2296      setf racc
2297      return
2298    endif
2299    let n = n + 1
2300  endwhile
2301  setf yacc
2302endfunc
2303
2304
2305" Yaml
2306au BufNewFile,BufRead *.yaml,*.yml		setf yaml
2307
2308" Zope
2309"   dtml (zope dynamic template markup language), pt (zope page template),
2310"   cpt (zope form controller page template)
2311au BufNewFile,BufRead *.dtml,*.pt,*.cpt		call s:FThtml()
2312"   zsql (zope sql method)
2313au BufNewFile,BufRead *.zsql			call s:SQL()
2314
2315" Z80 assembler asz80
2316au BufNewFile,BufRead *.z8a			setf z8a
2317
2318augroup END
2319
2320
2321" Source the user-specified filetype file, for backwards compatibility with
2322" Vim 5.x.
2323if exists("myfiletypefile") && filereadable(expand(myfiletypefile))
2324  execute "source " . myfiletypefile
2325endif
2326
2327
2328" Check for "*" after loading myfiletypefile, so that scripts.vim is only used
2329" when there are no matching file name extensions.
2330" Don't do this for compressed files.
2331augroup filetypedetect
2332au BufNewFile,BufRead *
2333	\ if !did_filetype() && expand("<amatch>") !~ g:ft_ignore_pat
2334	\ | runtime! scripts.vim | endif
2335au StdinReadPost * if !did_filetype() | runtime! scripts.vim | endif
2336
2337
2338" Extra checks for when no filetype has been detected now.  Mostly used for
2339" patterns that end in "*".  E.g., "zsh*" matches "zsh.vim", but that's a Vim
2340" script file.
2341" Most of these should call s:StarSetf() to avoid names ending in .gz and the
2342" like are used.
2343
2344" More Apache files.
2345au BufNewFile,BufRead /etc/apache2/conf.*/*,/etc/apache2/sites-*/*,/etc/apache2/mods-*/*		call s:StarSetf('apache')
2346
2347" Asterisk config file
2348au BufNewFile,BufRead *asterisk/*.conf*		call s:StarSetf('asterisk')
2349au BufNewFile,BufRead *asterisk*/*voicemail.conf* call s:StarSetf('asteriskvm')
2350
2351" Bazaar version control
2352au BufNewFile,BufRead bzr_log.*			setf bzr
2353
2354" BIND zone
2355au BufNewFile,BufRead */named/db.*,*/bind/db.*	call s:StarSetf('bindzone')
2356
2357" Changelog
2358au BufNewFile,BufRead [cC]hange[lL]og*
2359	\ if getline(1) =~ '; urgency='
2360	\|  call s:StarSetf('debchangelog')
2361	\|else
2362	\|  call s:StarSetf('changelog')
2363	\|endif
2364
2365" Crontab
2366au BufNewFile,BufRead crontab,crontab.*,/etc/cron.d/*		call s:StarSetf('crontab')
2367
2368" Debian Sources.list
2369au BufNewFile,BufRead /etc/apt/sources.list.d/*	call s:StarSetf('debsources')
2370
2371" Dracula
2372au BufNewFile,BufRead drac.*			call s:StarSetf('dracula')
2373
2374" Fvwm
2375au BufNewFile,BufRead */.fvwm/*			call s:StarSetf('fvwm')
2376au BufNewFile,BufRead *fvwmrc*,*fvwm95*.hook
2377	\ let b:fvwm_version = 1 | call s:StarSetf('fvwm')
2378au BufNewFile,BufRead *fvwm2rc*
2379	\ if expand("<afile>:e") == "m4"
2380	\|  call s:StarSetf('fvwm2m4')
2381	\|else
2382	\|  let b:fvwm_version = 2 | call s:StarSetf('fvwm')
2383	\|endif
2384
2385" Gedcom
2386au BufNewFile,BufRead /tmp/lltmp*		call s:StarSetf('gedcom')
2387
2388" GTK RC
2389au BufNewFile,BufRead .gtkrc*,gtkrc*		call s:StarSetf('gtkrc')
2390
2391" Jam
2392au BufNewFile,BufRead Prl*.*,JAM*.*		call s:StarSetf('jam')
2393
2394" Jargon
2395au! BufNewFile,BufRead *jarg*
2396	\ if getline(1).getline(2).getline(3).getline(4).getline(5) =~? 'THIS IS THE JARGON FILE'
2397	\|  call s:StarSetf('jargon')
2398	\|endif
2399
2400" Kconfig
2401au BufNewFile,BufRead Kconfig.*			call s:StarSetf('kconfig')
2402
2403" Makefile
2404au BufNewFile,BufRead [mM]akefile*		call s:StarSetf('make')
2405
2406" Ruby Makefile
2407au BufNewFile,BufRead [rR]akefile*		call s:StarSetf('ruby')
2408
2409" Mail (also matches muttrc.vim, so this is below the other checks)
2410au BufNewFile,BufRead mutt[[:alnum:]._-]\{6\}	setf mail
2411
2412" Modconf
2413au BufNewFile,BufRead /etc/modprobe.*		call s:StarSetf('modconf')
2414
2415" Mutt setup file
2416au BufNewFile,BufRead .mutt{ng,}rc*,*/.mutt{ng,}/mutt{ng,}rc*	call s:StarSetf('muttrc')
2417au BufNewFile,BufRead mutt{ng,}rc*,Mutt{ng,}rc*		call s:StarSetf('muttrc')
2418
2419" Nroff macros
2420au BufNewFile,BufRead tmac.*			call s:StarSetf('nroff')
2421
2422" Pam conf
2423au BufNewFile,BufRead /etc/pam.d/*		call s:StarSetf('pamconf')
2424
2425" Printcap and Termcap
2426au BufNewFile,BufRead *printcap*
2427	\ if !did_filetype()
2428	\|  let b:ptcap_type = "print" | call s:StarSetf('ptcap')
2429	\|endif
2430au BufNewFile,BufRead *termcap*
2431	\ if !did_filetype()
2432	\|  let b:ptcap_type = "term" | call s:StarSetf('ptcap')
2433	\|endif
2434
2435" Vim script
2436au BufNewFile,BufRead *vimrc*			call s:StarSetf('vim')
2437
2438" Subversion commit file
2439au BufNewFile,BufRead svn-commit*.tmp		setf svn
2440
2441" X resources file
2442au BufNewFile,BufRead Xresources*,*/app-defaults/*,*/Xresources/* call s:StarSetf('xdefaults')
2443
2444" XFree86 config
2445au BufNewFile,BufRead XF86Config-4*
2446	\ let b:xf86c_xfree86_version = 4 | call s:StarSetf('xf86conf')
2447au BufNewFile,BufRead XF86Config*
2448	\ if getline(1) =~ '\<XConfigurator\>'
2449	\|  let b:xf86c_xfree86_version = 3
2450	\|endif
2451	\|call s:StarSetf('xf86conf')
2452
2453" X11 xmodmap
2454au BufNewFile,BufRead *xmodmap*			call s:StarSetf('xmodmap')
2455
2456" Xinetd conf
2457au BufNewFile,BufRead /etc/xinetd.d/*		call s:StarSetf('xinetd')
2458
2459" Z-Shell script
2460au BufNewFile,BufRead zsh*,zlog*		call s:StarSetf('zsh')
2461
2462
2463
2464" Use the filetype detect plugins.  They may overrule any of the previously
2465" detected filetypes.
2466runtime! ftdetect/*.vim
2467
2468
2469" Generic configuration file (check this last, it's just guessing!)
2470au BufNewFile,BufRead,StdinReadPost *
2471	\ if !did_filetype() && expand("<amatch>") !~ g:ft_ignore_pat
2472	\    && (getline(1) =~ '^#' || getline(2) =~ '^#' || getline(3) =~ '^#'
2473	\	|| getline(4) =~ '^#' || getline(5) =~ '^#') |
2474	\   setf conf |
2475	\ endif
2476
2477augroup END
2478
2479
2480" If the GUI is already running, may still need to install the Syntax menu.
2481" Don't do it when the 'M' flag is included in 'guioptions'.
2482if has("menu") && has("gui_running")
2483      \ && !exists("did_install_syntax_menu") && &guioptions !~# "M"
2484  source <sfile>:p:h/menu.vim
2485endif
2486
2487" Function called for testing all functions defined here.  These are
2488" script-local, thus need to be executed here.
2489" Returns a string with error messages (hopefully empty).
2490func! TestFiletypeFuncs(testlist)
2491  let output = ''
2492  for f in a:testlist
2493    try
2494      exe f
2495    catch
2496      let output = output . "\n" . f . ": " . v:exception
2497    endtry
2498  endfor
2499  return output
2500endfunc
2501
2502" Restore 'cpoptions'
2503let &cpo = s:cpo_save
2504unlet s:cpo_save
2505