1071d4279SBram Moolenaar" Vim support file to detect file types in scripts 2071d4279SBram Moolenaar" 3071d4279SBram Moolenaar" Maintainer: Bram Moolenaar <[email protected]> 43d1cde8aSBram Moolenaar" Last change: 2020 Aug 15 5071d4279SBram Moolenaar 6071d4279SBram Moolenaar" This file is called by an autocommand for every file that has just been 7071d4279SBram Moolenaar" loaded into a buffer. It checks if the type of file can be recognized by 8071d4279SBram Moolenaar" the file contents. The autocommand is in $VIMRUNTIME/filetype.vim. 93a429efbSBram Moolenaar" 103a429efbSBram Moolenaar" Note that the pattern matches are done with =~# to avoid the value of the 113a429efbSBram Moolenaar" 'ignorecase' option making a difference. Where case is to be ignored use 123a429efbSBram Moolenaar" =~? instead. Do not use =~ anywhere. 13071d4279SBram Moolenaar 14071d4279SBram Moolenaar 15071d4279SBram Moolenaar" Only do the rest when the FileType autocommand has not been triggered yet. 16071d4279SBram Moolenaarif did_filetype() 17071d4279SBram Moolenaar finish 18071d4279SBram Moolenaarendif 19071d4279SBram Moolenaar 20071d4279SBram Moolenaar" Load the user defined scripts file first 21071d4279SBram Moolenaar" Only do this when the FileType autocommand has not been triggered yet 22f4630b60SBram Moolenaarif exists("myscriptsfile") && filereadable(expand(myscriptsfile)) 23071d4279SBram Moolenaar execute "source " . myscriptsfile 24071d4279SBram Moolenaar if did_filetype() 25071d4279SBram Moolenaar finish 26071d4279SBram Moolenaar endif 27071d4279SBram Moolenaarendif 28071d4279SBram Moolenaar 29071d4279SBram Moolenaar" Line continuation is used here, remove 'C' from 'cpoptions' 30071d4279SBram Moolenaarlet s:cpo_save = &cpo 31071d4279SBram Moolenaarset cpo&vim 32071d4279SBram Moolenaar 33071d4279SBram Moolenaarlet s:line1 = getline(1) 34071d4279SBram Moolenaar 353a429efbSBram Moolenaarif s:line1 =~# "^#!" 36071d4279SBram Moolenaar " A script that starts with "#!". 37071d4279SBram Moolenaar 38b5e18f29SBram Moolenaar " Check for a line like "#!/usr/bin/env {options} bash". Turn it into 39071d4279SBram Moolenaar " "#!/usr/bin/bash" to make matching easier. 40b5e18f29SBram Moolenaar " Recognize only a few {options} that are commonly used. 413a429efbSBram Moolenaar if s:line1 =~# '^#!\s*\S*\<env\s' 42071d4279SBram Moolenaar let s:line1 = substitute(s:line1, '\S\+=\S\+', '', 'g') 43b5e18f29SBram Moolenaar let s:line1 = substitute(s:line1, '\(-[iS]\|--ignore-environment\|--split-string\)', '', '') 44071d4279SBram Moolenaar let s:line1 = substitute(s:line1, '\<env\s\+', '', '') 45071d4279SBram Moolenaar endif 46071d4279SBram Moolenaar 47071d4279SBram Moolenaar " Get the program name. 48071d4279SBram Moolenaar " Only accept spaces in PC style paths: "#!c:/program files/perl [args]". 49f4630b60SBram Moolenaar " If the word env is used, use the first word after the space: 50f4630b60SBram Moolenaar " "#!/usr/bin/env perl [path/args]" 51071d4279SBram Moolenaar " If there is no path use the first word: "#!perl [path/args]". 52071d4279SBram Moolenaar " Otherwise get the last word after a slash: "#!/usr/bin/perl [path/args]". 533a429efbSBram Moolenaar if s:line1 =~# '^#!\s*\a:[/\\]' 54071d4279SBram Moolenaar let s:name = substitute(s:line1, '^#!.*[/\\]\(\i\+\).*', '\1', '') 553a429efbSBram Moolenaar elseif s:line1 =~# '^#!.*\<env\>' 56f4630b60SBram Moolenaar let s:name = substitute(s:line1, '^#!.*\<env\>\s\+\(\i\+\).*', '\1', '') 573a429efbSBram Moolenaar elseif s:line1 =~# '^#!\s*[^/\\ ]*\>\([^/\\]\|$\)' 58071d4279SBram Moolenaar let s:name = substitute(s:line1, '^#!\s*\([^/\\ ]*\>\).*', '\1', '') 59071d4279SBram Moolenaar else 60071d4279SBram Moolenaar let s:name = substitute(s:line1, '^#!\s*\S*[/\\]\(\i\+\).*', '\1', '') 61071d4279SBram Moolenaar endif 62071d4279SBram Moolenaar 63a8c4d563SBram Moolenaar " tcl scripts may have #!/bin/sh in the first line and "exec wish" in the 64a8c4d563SBram Moolenaar " third line. Suggested by Steven Atkinson. 653a429efbSBram Moolenaar if getline(3) =~# '^exec wish' 66a8c4d563SBram Moolenaar let s:name = 'wish' 67a8c4d563SBram Moolenaar endif 68a8c4d563SBram Moolenaar 69d4755bb0SBram Moolenaar " Bourne-like shell scripts: bash bash2 ksh ksh93 sh 703a429efbSBram Moolenaar if s:name =~# '^\(bash\d*\|\|ksh\d*\|sh\)\>' 71d09a206eSBram Moolenaar call dist#ft#SetFileTypeSH(s:line1) " defined in filetype.vim 72071d4279SBram Moolenaar 73071d4279SBram Moolenaar " csh scripts 743a429efbSBram Moolenaar elseif s:name =~# '^csh\>' 75071d4279SBram Moolenaar if exists("g:filetype_csh") 76d09a206eSBram Moolenaar call dist#ft#SetFileTypeShell(g:filetype_csh) 77071d4279SBram Moolenaar else 78d09a206eSBram Moolenaar call dist#ft#SetFileTypeShell("csh") 79071d4279SBram Moolenaar endif 80071d4279SBram Moolenaar 81071d4279SBram Moolenaar " tcsh scripts 823a429efbSBram Moolenaar elseif s:name =~# '^tcsh\>' 83d09a206eSBram Moolenaar call dist#ft#SetFileTypeShell("tcsh") 84071d4279SBram Moolenaar 85071d4279SBram Moolenaar " Z shell scripts 863a429efbSBram Moolenaar elseif s:name =~# '^zsh\>' 87071d4279SBram Moolenaar set ft=zsh 88071d4279SBram Moolenaar 89071d4279SBram Moolenaar " TCL scripts 903a429efbSBram Moolenaar elseif s:name =~# '^\(tclsh\|wish\|expectk\|itclsh\|itkwish\)\>' 91071d4279SBram Moolenaar set ft=tcl 92071d4279SBram Moolenaar 93071d4279SBram Moolenaar " Expect scripts 943a429efbSBram Moolenaar elseif s:name =~# '^expect\>' 95071d4279SBram Moolenaar set ft=expect 96071d4279SBram Moolenaar 97071d4279SBram Moolenaar " Gnuplot scripts 983a429efbSBram Moolenaar elseif s:name =~# '^gnuplot\>' 99071d4279SBram Moolenaar set ft=gnuplot 100071d4279SBram Moolenaar 101071d4279SBram Moolenaar " Makefiles 1023a429efbSBram Moolenaar elseif s:name =~# 'make\>' 103071d4279SBram Moolenaar set ft=make 104071d4279SBram Moolenaar 10540962ec9SBram Moolenaar " Pike 10640962ec9SBram Moolenaar elseif s:name =~# '^pike\%(\>\|[0-9]\)' 10740962ec9SBram Moolenaar set ft=pike 10840962ec9SBram Moolenaar 109f4630b60SBram Moolenaar " Lua 1103a429efbSBram Moolenaar elseif s:name =~# 'lua' 111f4630b60SBram Moolenaar set ft=lua 112f4630b60SBram Moolenaar 1133b72f1d2SBram Moolenaar " Perl 6 1143a429efbSBram Moolenaar elseif s:name =~# 'perl6' 1153b72f1d2SBram Moolenaar set ft=perl6 1163b72f1d2SBram Moolenaar 117071d4279SBram Moolenaar " Perl 1183a429efbSBram Moolenaar elseif s:name =~# 'perl' 119071d4279SBram Moolenaar set ft=perl 120071d4279SBram Moolenaar 121071d4279SBram Moolenaar " PHP 1223a429efbSBram Moolenaar elseif s:name =~# 'php' 123071d4279SBram Moolenaar set ft=php 124071d4279SBram Moolenaar 125071d4279SBram Moolenaar " Python 1263a429efbSBram Moolenaar elseif s:name =~# 'python' 127071d4279SBram Moolenaar set ft=python 128071d4279SBram Moolenaar 129071d4279SBram Moolenaar " Groovy 1303a429efbSBram Moolenaar elseif s:name =~# '^groovy\>' 131071d4279SBram Moolenaar set ft=groovy 132071d4279SBram Moolenaar 133071d4279SBram Moolenaar " Ruby 1343a429efbSBram Moolenaar elseif s:name =~# 'ruby' 135071d4279SBram Moolenaar set ft=ruby 136071d4279SBram Moolenaar 137214641f7SBram Moolenaar " JavaScript 1384bc0bed5SBram Moolenaar elseif s:name =~# 'node\(js\)\=\>\|js\>' || s:name =~# 'rhino\>' 139214641f7SBram Moolenaar set ft=javascript 140214641f7SBram Moolenaar 141071d4279SBram Moolenaar " BC calculator 1423a429efbSBram Moolenaar elseif s:name =~# '^bc\>' 143071d4279SBram Moolenaar set ft=bc 144071d4279SBram Moolenaar 145071d4279SBram Moolenaar " sed 1463a429efbSBram Moolenaar elseif s:name =~# 'sed\>' 147071d4279SBram Moolenaar set ft=sed 148071d4279SBram Moolenaar 149071d4279SBram Moolenaar " OCaml-scripts 1503a429efbSBram Moolenaar elseif s:name =~# 'ocaml' 151071d4279SBram Moolenaar set ft=ocaml 152071d4279SBram Moolenaar 1533d1cde8aSBram Moolenaar " Awk scripts; also finds "gawk" 1543a429efbSBram Moolenaar elseif s:name =~# 'awk\>' 155071d4279SBram Moolenaar set ft=awk 156071d4279SBram Moolenaar 157071d4279SBram Moolenaar " Website MetaLanguage 1583a429efbSBram Moolenaar elseif s:name =~# 'wml' 159071d4279SBram Moolenaar set ft=wml 160071d4279SBram Moolenaar 161071d4279SBram Moolenaar " Scheme scripts 1623a429efbSBram Moolenaar elseif s:name =~# 'scheme' 163071d4279SBram Moolenaar set ft=scheme 164071d4279SBram Moolenaar 165af289d33SBram Moolenaar " CFEngine scripts 1663a429efbSBram Moolenaar elseif s:name =~# 'cfengine' 167af289d33SBram Moolenaar set ft=cfengine 168af289d33SBram Moolenaar 169203d04d7SBram Moolenaar " Erlang scripts 1703a429efbSBram Moolenaar elseif s:name =~# 'escript' 171203d04d7SBram Moolenaar set ft=erlang 172203d04d7SBram Moolenaar 173214641f7SBram Moolenaar " Haskell 1743a429efbSBram Moolenaar elseif s:name =~# 'haskell' 175214641f7SBram Moolenaar set ft=haskell 176214641f7SBram Moolenaar 177214641f7SBram Moolenaar " Scala 1783a429efbSBram Moolenaar elseif s:name =~# 'scala\>' 179214641f7SBram Moolenaar set ft=scala 180214641f7SBram Moolenaar 1818fd2ffc5SBram Moolenaar " Clojure 1828fd2ffc5SBram Moolenaar elseif s:name =~# 'clojure' 1838fd2ffc5SBram Moolenaar set ft=clojure 1848fd2ffc5SBram Moolenaar 185*a0122dcdSBram Moolenaar " Free Pascal 186*a0122dcdSBram Moolenaar elseif s:name =~# 'instantfpc\>' 187*a0122dcdSBram Moolenaar set ft=pascal 188*a0122dcdSBram Moolenaar 189071d4279SBram Moolenaar endif 190071d4279SBram Moolenaar unlet s:name 191071d4279SBram Moolenaar 192071d4279SBram Moolenaarelse 193071d4279SBram Moolenaar " File does not start with "#!". 194071d4279SBram Moolenaar 195071d4279SBram Moolenaar let s:line2 = getline(2) 196071d4279SBram Moolenaar let s:line3 = getline(3) 197071d4279SBram Moolenaar let s:line4 = getline(4) 198071d4279SBram Moolenaar let s:line5 = getline(5) 199071d4279SBram Moolenaar 200071d4279SBram Moolenaar " Bourne-like shell scripts: sh ksh bash bash2 2013a429efbSBram Moolenaar if s:line1 =~# '^:$' 202d09a206eSBram Moolenaar call dist#ft#SetFileTypeSH(s:line1) " defined in filetype.vim 203071d4279SBram Moolenaar 204071d4279SBram Moolenaar " Z shell scripts 2053a429efbSBram Moolenaar elseif s:line1 =~# '^#compdef\>' || s:line1 =~# '^#autoload\>' || 2063a429efbSBram Moolenaar \ "\n".s:line1."\n".s:line2."\n".s:line3."\n".s:line4."\n".s:line5 =~# '\n\s*emulate\s\+\%(-[LR]\s\+\)\=[ckz]\=sh\>' 207071d4279SBram Moolenaar set ft=zsh 208071d4279SBram Moolenaar 209071d4279SBram Moolenaar " ELM Mail files 2103a429efbSBram Moolenaar elseif s:line1 =~# '^From \([a-zA-Z][a-zA-Z_0-9\.=-]*\(@[^ ]*\)\=\|-\) .* \(19\|20\)\d\d$' 211071d4279SBram Moolenaar set ft=mail 212071d4279SBram Moolenaar 213071d4279SBram Moolenaar " Mason 2143a429efbSBram Moolenaar elseif s:line1 =~# '^<[%&].*>' 215071d4279SBram Moolenaar set ft=mason 216071d4279SBram Moolenaar 217071d4279SBram Moolenaar " Vim scripts (must have '" vim' as the first line to trigger this) 2183a429efbSBram Moolenaar elseif s:line1 =~# '^" *[vV]im$' 219071d4279SBram Moolenaar set ft=vim 220071d4279SBram Moolenaar 2216a7af8e2SBram Moolenaar " libcxx and libstdc++ standard library headers like "iostream" do not have 2226a7af8e2SBram Moolenaar " an extension, recognize the Emacs file mode. 2236a7af8e2SBram Moolenaar elseif s:line1 =~? '-\*-.*C++.*-\*-' 2246a7af8e2SBram Moolenaar set ft=cpp 2256a7af8e2SBram Moolenaar 226071d4279SBram Moolenaar " MOO 2273a429efbSBram Moolenaar elseif s:line1 =~# '^\*\* LambdaMOO Database, Format Version \%([1-3]\>\)\@!\d\+ \*\*$' 228071d4279SBram Moolenaar set ft=moo 229071d4279SBram Moolenaar 230071d4279SBram Moolenaar " Diff file: 231071d4279SBram Moolenaar " - "diff" in first line (context diff) 232071d4279SBram Moolenaar " - "Only in " in first line 233071d4279SBram Moolenaar " - "--- " in first line and "+++ " in second line (unified diff). 234071d4279SBram Moolenaar " - "*** " in first line and "--- " in second line (context diff). 235071d4279SBram Moolenaar " - "# It was generated by makepatch " in the second line (makepatch diff). 236071d4279SBram Moolenaar " - "Index: <filename>" in the first line (CVS file) 237899dddf8SBram Moolenaar " - "=== ", line of "=", "---", "+++ " (SVK diff) 238d2cec5b0SBram Moolenaar " - "=== ", "--- ", "+++ " (bzr diff, common case) 239d2cec5b0SBram Moolenaar " - "=== (removed|added|renamed|modified)" (bzr diff, alternative) 240d09acef4SBram Moolenaar " - "# HG changeset patch" in first line (Mercurial export format) 2413a429efbSBram Moolenaar elseif s:line1 =~# '^\(diff\>\|Only in \|\d\+\(,\d\+\)\=[cda]\d\+\>\|# It was generated by makepatch \|Index:\s\+\f\+\r\=$\|===== \f\+ \d\+\.\d\+ vs edited\|==== //\f\+#\d\+\|# HG changeset patch\)' 2423a429efbSBram Moolenaar \ || (s:line1 =~# '^--- ' && s:line2 =~# '^+++ ') 2433a429efbSBram Moolenaar \ || (s:line1 =~# '^\* looking for ' && s:line2 =~# '^\* comparing to ') 2443a429efbSBram Moolenaar \ || (s:line1 =~# '^\*\*\* ' && s:line2 =~# '^--- ') 2453a429efbSBram Moolenaar \ || (s:line1 =~# '^=== ' && ((s:line2 =~# '^=\{66\}' && s:line3 =~# '^--- ' && s:line4 =~# '^+++') || (s:line2 =~# '^--- ' && s:line3 =~# '^+++ '))) 2463a429efbSBram Moolenaar \ || (s:line1 =~# '^=== \(removed\|added\|renamed\|modified\)') 247071d4279SBram Moolenaar set ft=diff 248071d4279SBram Moolenaar 249071d4279SBram Moolenaar " PostScript Files (must have %!PS as the first line, like a2ps output) 2503a429efbSBram Moolenaar elseif s:line1 =~# '^%![ \t]*PS' 251071d4279SBram Moolenaar set ft=postscr 252071d4279SBram Moolenaar 253071d4279SBram Moolenaar " M4 scripts: Guess there is a line that starts with "dnl". 2543a429efbSBram Moolenaar elseif s:line1 =~# '^\s*dnl\>' 2553a429efbSBram Moolenaar \ || s:line2 =~# '^\s*dnl\>' 2563a429efbSBram Moolenaar \ || s:line3 =~# '^\s*dnl\>' 2573a429efbSBram Moolenaar \ || s:line4 =~# '^\s*dnl\>' 2583a429efbSBram Moolenaar \ || s:line5 =~# '^\s*dnl\>' 259071d4279SBram Moolenaar set ft=m4 260071d4279SBram Moolenaar 261071d4279SBram Moolenaar " AmigaDos scripts 262071d4279SBram Moolenaar elseif $TERM == "amiga" 2633a429efbSBram Moolenaar \ && (s:line1 =~# "^;" || s:line1 =~? '^\.bra') 264071d4279SBram Moolenaar set ft=amiga 265071d4279SBram Moolenaar 266071d4279SBram Moolenaar " SiCAD scripts (must have procn or procd as the first line to trigger this) 267071d4279SBram Moolenaar elseif s:line1 =~? '^ *proc[nd] *$' 268071d4279SBram Moolenaar set ft=sicad 269071d4279SBram Moolenaar 270071d4279SBram Moolenaar " Purify log files start with "**** Purify" 2713a429efbSBram Moolenaar elseif s:line1 =~# '^\*\*\*\* Purify' 272071d4279SBram Moolenaar set ft=purifylog 273071d4279SBram Moolenaar 274071d4279SBram Moolenaar " XML 2753a429efbSBram Moolenaar elseif s:line1 =~# '<?\s*xml.*?>' 276071d4279SBram Moolenaar set ft=xml 277071d4279SBram Moolenaar 278071d4279SBram Moolenaar " XHTML (e.g.: PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN") 2793a429efbSBram Moolenaar elseif s:line1 =~# '\<DTD\s\+XHTML\s' 280071d4279SBram Moolenaar set ft=xhtml 281071d4279SBram Moolenaar 28212b87e55SBram Moolenaar " HTML (e.g.: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN") 28326852128SBram Moolenaar " Avoid "doctype html", used by slim. 28426852128SBram Moolenaar elseif s:line1 =~? '<!DOCTYPE\s\+html\>' 28512b87e55SBram Moolenaar set ft=html 28612b87e55SBram Moolenaar 287aba8857aSBram Moolenaar " PDF 2883a429efbSBram Moolenaar elseif s:line1 =~# '^%PDF-' 289aba8857aSBram Moolenaar set ft=pdf 290aba8857aSBram Moolenaar 291071d4279SBram Moolenaar " XXD output 2923a429efbSBram Moolenaar elseif s:line1 =~# '^\x\{7}: \x\{2} \=\x\{2} \=\x\{2} \=\x\{2} ' 293071d4279SBram Moolenaar set ft=xxd 294071d4279SBram Moolenaar 295071d4279SBram Moolenaar " RCS/CVS log output 2963a429efbSBram Moolenaar elseif s:line1 =~# '^RCS file:' || s:line2 =~# '^RCS file:' 297071d4279SBram Moolenaar set ft=rcslog 298071d4279SBram Moolenaar 299071d4279SBram Moolenaar " CVS commit 3003a429efbSBram Moolenaar elseif s:line2 =~# '^CVS:' || getline("$") =~# '^CVS: ' 301071d4279SBram Moolenaar set ft=cvs 302071d4279SBram Moolenaar 30319a09a18SBram Moolenaar " Prescribe 3043a429efbSBram Moolenaar elseif s:line1 =~# '^!R!' 30519a09a18SBram Moolenaar set ft=prescribe 30619a09a18SBram Moolenaar 307071d4279SBram Moolenaar " Send-pr 3083a429efbSBram Moolenaar elseif s:line1 =~# '^SEND-PR:' 309071d4279SBram Moolenaar set ft=sendpr 310071d4279SBram Moolenaar 311071d4279SBram Moolenaar " SNNS files 3123a429efbSBram Moolenaar elseif s:line1 =~# '^SNNS network definition file' 313071d4279SBram Moolenaar set ft=snnsnet 3143a429efbSBram Moolenaar elseif s:line1 =~# '^SNNS pattern definition file' 315071d4279SBram Moolenaar set ft=snnspat 3163a429efbSBram Moolenaar elseif s:line1 =~# '^SNNS result file' 317071d4279SBram Moolenaar set ft=snnsres 318071d4279SBram Moolenaar 319071d4279SBram Moolenaar " Virata 3203a429efbSBram Moolenaar elseif s:line1 =~# '^%.\{-}[Vv]irata' 3213a429efbSBram Moolenaar \ || s:line2 =~# '^%.\{-}[Vv]irata' 3223a429efbSBram Moolenaar \ || s:line3 =~# '^%.\{-}[Vv]irata' 3233a429efbSBram Moolenaar \ || s:line4 =~# '^%.\{-}[Vv]irata' 3243a429efbSBram Moolenaar \ || s:line5 =~# '^%.\{-}[Vv]irata' 325071d4279SBram Moolenaar set ft=virata 326071d4279SBram Moolenaar 327071d4279SBram Moolenaar " Strace 328c572da5fSBram Moolenaar elseif s:line1 =~# '[0-9:.]* *execve(' || s:line1 =~# '^__libc_start_main' 329071d4279SBram Moolenaar set ft=strace 330071d4279SBram Moolenaar 331071d4279SBram Moolenaar " VSE JCL 3323a429efbSBram Moolenaar elseif s:line1 =~# '^\* $$ JOB\>' || s:line1 =~# '^// *JOB\>' 333071d4279SBram Moolenaar set ft=vsejcl 334071d4279SBram Moolenaar 335071d4279SBram Moolenaar " TAK and SINDA 3363a429efbSBram Moolenaar elseif s:line4 =~# 'K & K Associates' || s:line2 =~# 'TAK 2000' 337071d4279SBram Moolenaar set ft=takout 3383a429efbSBram Moolenaar elseif s:line3 =~# 'S Y S T E M S I M P R O V E D ' 339071d4279SBram Moolenaar set ft=sindaout 3403a429efbSBram Moolenaar elseif getline(6) =~# 'Run Date: ' 341071d4279SBram Moolenaar set ft=takcmp 3423a429efbSBram Moolenaar elseif getline(9) =~# 'Node File 1' 343071d4279SBram Moolenaar set ft=sindacmp 344071d4279SBram Moolenaar 345071d4279SBram Moolenaar " DNS zone files 34601164a65SBram Moolenaar elseif s:line1.s:line2.s:line3.s:line4 =~# '^; <<>> DiG [0-9.]\+.* <<>>\|$ORIGIN\|$TTL\|IN\s\+SOA' 347bd404149SBram Moolenaar set ft=bindzone 348071d4279SBram Moolenaar 349071d4279SBram Moolenaar " BAAN 3503a429efbSBram Moolenaar elseif s:line1 =~# '|\*\{1,80}' && s:line2 =~# 'VRC ' 3513a429efbSBram Moolenaar \ || s:line2 =~# '|\*\{1,80}' && s:line3 =~# 'VRC ' 352071d4279SBram Moolenaar set ft=baan 353071d4279SBram Moolenaar 354071d4279SBram Moolenaar " Valgrind 3553a429efbSBram Moolenaar elseif s:line1 =~# '^==\d\+== valgrind' || s:line3 =~# '^==\d\+== Using valgrind' 356071d4279SBram Moolenaar set ft=valgrind 357071d4279SBram Moolenaar 35834401ccaSBram Moolenaar " Go docs 3593a429efbSBram Moolenaar elseif s:line1 =~# '^PACKAGE DOCUMENTATION$' 36034401ccaSBram Moolenaar set ft=godoc 36134401ccaSBram Moolenaar 362071d4279SBram Moolenaar " Renderman Interface Bytestream 3633a429efbSBram Moolenaar elseif s:line1 =~# '^##RenderMan' 364071d4279SBram Moolenaar set ft=rib 365071d4279SBram Moolenaar 366071d4279SBram Moolenaar " Scheme scripts 3673a429efbSBram Moolenaar elseif s:line1 =~# 'exec\s\+\S*scheme' || s:line2 =~# 'exec\s\+\S*scheme' 368071d4279SBram Moolenaar set ft=scheme 369071d4279SBram Moolenaar 370aba8857aSBram Moolenaar " Git output 3713a429efbSBram Moolenaar elseif s:line1 =~# '^\(commit\|tree\|object\) \x\{40\}\>\|^tag \S\+$' 372aba8857aSBram Moolenaar set ft=git 373aba8857aSBram Moolenaar 374543b7ef7SBram Moolenaar " Gprof (gnu profiler) 375543b7ef7SBram Moolenaar elseif s:line1 == 'Flat profile:' 376543b7ef7SBram Moolenaar \ && s:line2 == '' 3773a429efbSBram Moolenaar \ && s:line3 =~# '^Each sample counts as .* seconds.$' 378543b7ef7SBram Moolenaar set ft=gprof 379543b7ef7SBram Moolenaar 380203d04d7SBram Moolenaar " Erlang terms 381203d04d7SBram Moolenaar " (See also: http://www.gnu.org/software/emacs/manual/html_node/emacs/Choosing-Modes.html#Choosing-Modes) 382203d04d7SBram Moolenaar elseif s:line1 =~? '-\*-.*erlang.*-\*-' 383203d04d7SBram Moolenaar set ft=erlang 384203d04d7SBram Moolenaar 3858eab7313SBram Moolenaar " YAML 3868eab7313SBram Moolenaar elseif s:line1 =~# '^%YAML' 3878eab7313SBram Moolenaar set ft=yaml 3888eab7313SBram Moolenaar 389071d4279SBram Moolenaar " CVS diff 390071d4279SBram Moolenaar else 3915c73622aSBram Moolenaar let s:lnum = 1 3923a429efbSBram Moolenaar while getline(s:lnum) =~# "^? " && s:lnum < line("$") 3935c73622aSBram Moolenaar let s:lnum += 1 394071d4279SBram Moolenaar endwhile 3953a429efbSBram Moolenaar if getline(s:lnum) =~# '^Index:\s\+\f\+$' 396071d4279SBram Moolenaar set ft=diff 397071d4279SBram Moolenaar 398071d4279SBram Moolenaar " locale input files: Formal Definitions of Cultural Conventions 399071d4279SBram Moolenaar " filename must be like en_US, fr_FR@euro or en_US.UTF-8 4003a429efbSBram Moolenaar elseif expand("%") =~# '\a\a_\a\a\($\|[.@]\)\|i18n$\|POSIX$\|translit_' 4015c73622aSBram Moolenaar let s:lnum = 1 4025c73622aSBram Moolenaar while s:lnum < 100 && s:lnum < line("$") 4033a429efbSBram Moolenaar if getline(s:lnum) =~# '^LC_\(IDENTIFICATION\|CTYPE\|COLLATE\|MONETARY\|NUMERIC\|TIME\|MESSAGES\|PAPER\|TELEPHONE\|MEASUREMENT\|NAME\|ADDRESS\)$' 404071d4279SBram Moolenaar setf fdcc 405071d4279SBram Moolenaar break 406071d4279SBram Moolenaar endif 4075c73622aSBram Moolenaar let s:lnum += 1 408071d4279SBram Moolenaar endwhile 409071d4279SBram Moolenaar endif 4105c73622aSBram Moolenaar unlet s:lnum 411071d4279SBram Moolenaar 412071d4279SBram Moolenaar endif 413071d4279SBram Moolenaar 414071d4279SBram Moolenaar unlet s:line2 s:line3 s:line4 s:line5 415071d4279SBram Moolenaar 416071d4279SBram Moolenaarendif 417071d4279SBram Moolenaar 418071d4279SBram Moolenaar" Restore 'cpoptions' 419071d4279SBram Moolenaarlet &cpo = s:cpo_save 420071d4279SBram Moolenaar 421071d4279SBram Moolenaarunlet s:cpo_save s:line1 422