home *** CD-ROM | disk | FTP | other *** search
/ vim.ftp.fu-berlin.de / 2015-02-03.vim.ftp.fu-berlin.de.tar / vim.ftp.fu-berlin.de / runtime / filetype.vim < prev    next >
Encoding:
Text File  |  2012-05-31  |  64.2 KB  |  2,602 lines

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