1071d4279SBram Moolenaar" Vim support file to detect file types in scripts 2071d4279SBram Moolenaar" 3071d4279SBram Moolenaar" Maintainer: Bram Moolenaar <[email protected]> 4*3d1cde8aSBram 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 153*3d1cde8aSBram 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 185071d4279SBram Moolenaar endif 186071d4279SBram Moolenaar unlet s:name 187071d4279SBram Moolenaar 188071d4279SBram Moolenaarelse 189071d4279SBram Moolenaar " File does not start with "#!". 190071d4279SBram Moolenaar 191071d4279SBram Moolenaar let s:line2 = getline(2) 192071d4279SBram Moolenaar let s:line3 = getline(3) 193071d4279SBram Moolenaar let s:line4 = getline(4) 194071d4279SBram Moolenaar let s:line5 = getline(5) 195071d4279SBram Moolenaar 196071d4279SBram Moolenaar " Bourne-like shell scripts: sh ksh bash bash2 1973a429efbSBram Moolenaar if s:line1 =~# '^:$' 198d09a206eSBram Moolenaar call dist#ft#SetFileTypeSH(s:line1) " defined in filetype.vim 199071d4279SBram Moolenaar 200071d4279SBram Moolenaar " Z shell scripts 2013a429efbSBram Moolenaar elseif s:line1 =~# '^#compdef\>' || s:line1 =~# '^#autoload\>' || 2023a429efbSBram Moolenaar \ "\n".s:line1."\n".s:line2."\n".s:line3."\n".s:line4."\n".s:line5 =~# '\n\s*emulate\s\+\%(-[LR]\s\+\)\=[ckz]\=sh\>' 203071d4279SBram Moolenaar set ft=zsh 204071d4279SBram Moolenaar 205071d4279SBram Moolenaar " ELM Mail files 2063a429efbSBram Moolenaar elseif s:line1 =~# '^From \([a-zA-Z][a-zA-Z_0-9\.=-]*\(@[^ ]*\)\=\|-\) .* \(19\|20\)\d\d$' 207071d4279SBram Moolenaar set ft=mail 208071d4279SBram Moolenaar 209071d4279SBram Moolenaar " Mason 2103a429efbSBram Moolenaar elseif s:line1 =~# '^<[%&].*>' 211071d4279SBram Moolenaar set ft=mason 212071d4279SBram Moolenaar 213071d4279SBram Moolenaar " Vim scripts (must have '" vim' as the first line to trigger this) 2143a429efbSBram Moolenaar elseif s:line1 =~# '^" *[vV]im$' 215071d4279SBram Moolenaar set ft=vim 216071d4279SBram Moolenaar 2176a7af8e2SBram Moolenaar " libcxx and libstdc++ standard library headers like "iostream" do not have 2186a7af8e2SBram Moolenaar " an extension, recognize the Emacs file mode. 2196a7af8e2SBram Moolenaar elseif s:line1 =~? '-\*-.*C++.*-\*-' 2206a7af8e2SBram Moolenaar set ft=cpp 2216a7af8e2SBram Moolenaar 222071d4279SBram Moolenaar " MOO 2233a429efbSBram Moolenaar elseif s:line1 =~# '^\*\* LambdaMOO Database, Format Version \%([1-3]\>\)\@!\d\+ \*\*$' 224071d4279SBram Moolenaar set ft=moo 225071d4279SBram Moolenaar 226071d4279SBram Moolenaar " Diff file: 227071d4279SBram Moolenaar " - "diff" in first line (context diff) 228071d4279SBram Moolenaar " - "Only in " in first line 229071d4279SBram Moolenaar " - "--- " in first line and "+++ " in second line (unified diff). 230071d4279SBram Moolenaar " - "*** " in first line and "--- " in second line (context diff). 231071d4279SBram Moolenaar " - "# It was generated by makepatch " in the second line (makepatch diff). 232071d4279SBram Moolenaar " - "Index: <filename>" in the first line (CVS file) 233899dddf8SBram Moolenaar " - "=== ", line of "=", "---", "+++ " (SVK diff) 234d2cec5b0SBram Moolenaar " - "=== ", "--- ", "+++ " (bzr diff, common case) 235d2cec5b0SBram Moolenaar " - "=== (removed|added|renamed|modified)" (bzr diff, alternative) 236d09acef4SBram Moolenaar " - "# HG changeset patch" in first line (Mercurial export format) 2373a429efbSBram 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\)' 2383a429efbSBram Moolenaar \ || (s:line1 =~# '^--- ' && s:line2 =~# '^+++ ') 2393a429efbSBram Moolenaar \ || (s:line1 =~# '^\* looking for ' && s:line2 =~# '^\* comparing to ') 2403a429efbSBram Moolenaar \ || (s:line1 =~# '^\*\*\* ' && s:line2 =~# '^--- ') 2413a429efbSBram Moolenaar \ || (s:line1 =~# '^=== ' && ((s:line2 =~# '^=\{66\}' && s:line3 =~# '^--- ' && s:line4 =~# '^+++') || (s:line2 =~# '^--- ' && s:line3 =~# '^+++ '))) 2423a429efbSBram Moolenaar \ || (s:line1 =~# '^=== \(removed\|added\|renamed\|modified\)') 243071d4279SBram Moolenaar set ft=diff 244071d4279SBram Moolenaar 245071d4279SBram Moolenaar " PostScript Files (must have %!PS as the first line, like a2ps output) 2463a429efbSBram Moolenaar elseif s:line1 =~# '^%![ \t]*PS' 247071d4279SBram Moolenaar set ft=postscr 248071d4279SBram Moolenaar 249071d4279SBram Moolenaar " M4 scripts: Guess there is a line that starts with "dnl". 2503a429efbSBram Moolenaar elseif s:line1 =~# '^\s*dnl\>' 2513a429efbSBram Moolenaar \ || s:line2 =~# '^\s*dnl\>' 2523a429efbSBram Moolenaar \ || s:line3 =~# '^\s*dnl\>' 2533a429efbSBram Moolenaar \ || s:line4 =~# '^\s*dnl\>' 2543a429efbSBram Moolenaar \ || s:line5 =~# '^\s*dnl\>' 255071d4279SBram Moolenaar set ft=m4 256071d4279SBram Moolenaar 257071d4279SBram Moolenaar " AmigaDos scripts 258071d4279SBram Moolenaar elseif $TERM == "amiga" 2593a429efbSBram Moolenaar \ && (s:line1 =~# "^;" || s:line1 =~? '^\.bra') 260071d4279SBram Moolenaar set ft=amiga 261071d4279SBram Moolenaar 262071d4279SBram Moolenaar " SiCAD scripts (must have procn or procd as the first line to trigger this) 263071d4279SBram Moolenaar elseif s:line1 =~? '^ *proc[nd] *$' 264071d4279SBram Moolenaar set ft=sicad 265071d4279SBram Moolenaar 266071d4279SBram Moolenaar " Purify log files start with "**** Purify" 2673a429efbSBram Moolenaar elseif s:line1 =~# '^\*\*\*\* Purify' 268071d4279SBram Moolenaar set ft=purifylog 269071d4279SBram Moolenaar 270071d4279SBram Moolenaar " XML 2713a429efbSBram Moolenaar elseif s:line1 =~# '<?\s*xml.*?>' 272071d4279SBram Moolenaar set ft=xml 273071d4279SBram Moolenaar 274071d4279SBram Moolenaar " XHTML (e.g.: PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN") 2753a429efbSBram Moolenaar elseif s:line1 =~# '\<DTD\s\+XHTML\s' 276071d4279SBram Moolenaar set ft=xhtml 277071d4279SBram Moolenaar 27812b87e55SBram Moolenaar " HTML (e.g.: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN") 27926852128SBram Moolenaar " Avoid "doctype html", used by slim. 28026852128SBram Moolenaar elseif s:line1 =~? '<!DOCTYPE\s\+html\>' 28112b87e55SBram Moolenaar set ft=html 28212b87e55SBram Moolenaar 283aba8857aSBram Moolenaar " PDF 2843a429efbSBram Moolenaar elseif s:line1 =~# '^%PDF-' 285aba8857aSBram Moolenaar set ft=pdf 286aba8857aSBram Moolenaar 287071d4279SBram Moolenaar " XXD output 2883a429efbSBram Moolenaar elseif s:line1 =~# '^\x\{7}: \x\{2} \=\x\{2} \=\x\{2} \=\x\{2} ' 289071d4279SBram Moolenaar set ft=xxd 290071d4279SBram Moolenaar 291071d4279SBram Moolenaar " RCS/CVS log output 2923a429efbSBram Moolenaar elseif s:line1 =~# '^RCS file:' || s:line2 =~# '^RCS file:' 293071d4279SBram Moolenaar set ft=rcslog 294071d4279SBram Moolenaar 295071d4279SBram Moolenaar " CVS commit 2963a429efbSBram Moolenaar elseif s:line2 =~# '^CVS:' || getline("$") =~# '^CVS: ' 297071d4279SBram Moolenaar set ft=cvs 298071d4279SBram Moolenaar 29919a09a18SBram Moolenaar " Prescribe 3003a429efbSBram Moolenaar elseif s:line1 =~# '^!R!' 30119a09a18SBram Moolenaar set ft=prescribe 30219a09a18SBram Moolenaar 303071d4279SBram Moolenaar " Send-pr 3043a429efbSBram Moolenaar elseif s:line1 =~# '^SEND-PR:' 305071d4279SBram Moolenaar set ft=sendpr 306071d4279SBram Moolenaar 307071d4279SBram Moolenaar " SNNS files 3083a429efbSBram Moolenaar elseif s:line1 =~# '^SNNS network definition file' 309071d4279SBram Moolenaar set ft=snnsnet 3103a429efbSBram Moolenaar elseif s:line1 =~# '^SNNS pattern definition file' 311071d4279SBram Moolenaar set ft=snnspat 3123a429efbSBram Moolenaar elseif s:line1 =~# '^SNNS result file' 313071d4279SBram Moolenaar set ft=snnsres 314071d4279SBram Moolenaar 315071d4279SBram Moolenaar " Virata 3163a429efbSBram Moolenaar elseif s:line1 =~# '^%.\{-}[Vv]irata' 3173a429efbSBram Moolenaar \ || s:line2 =~# '^%.\{-}[Vv]irata' 3183a429efbSBram Moolenaar \ || s:line3 =~# '^%.\{-}[Vv]irata' 3193a429efbSBram Moolenaar \ || s:line4 =~# '^%.\{-}[Vv]irata' 3203a429efbSBram Moolenaar \ || s:line5 =~# '^%.\{-}[Vv]irata' 321071d4279SBram Moolenaar set ft=virata 322071d4279SBram Moolenaar 323071d4279SBram Moolenaar " Strace 324c572da5fSBram Moolenaar elseif s:line1 =~# '[0-9:.]* *execve(' || s:line1 =~# '^__libc_start_main' 325071d4279SBram Moolenaar set ft=strace 326071d4279SBram Moolenaar 327071d4279SBram Moolenaar " VSE JCL 3283a429efbSBram Moolenaar elseif s:line1 =~# '^\* $$ JOB\>' || s:line1 =~# '^// *JOB\>' 329071d4279SBram Moolenaar set ft=vsejcl 330071d4279SBram Moolenaar 331071d4279SBram Moolenaar " TAK and SINDA 3323a429efbSBram Moolenaar elseif s:line4 =~# 'K & K Associates' || s:line2 =~# 'TAK 2000' 333071d4279SBram Moolenaar set ft=takout 3343a429efbSBram Moolenaar elseif s:line3 =~# 'S Y S T E M S I M P R O V E D ' 335071d4279SBram Moolenaar set ft=sindaout 3363a429efbSBram Moolenaar elseif getline(6) =~# 'Run Date: ' 337071d4279SBram Moolenaar set ft=takcmp 3383a429efbSBram Moolenaar elseif getline(9) =~# 'Node File 1' 339071d4279SBram Moolenaar set ft=sindacmp 340071d4279SBram Moolenaar 341071d4279SBram Moolenaar " DNS zone files 34201164a65SBram Moolenaar elseif s:line1.s:line2.s:line3.s:line4 =~# '^; <<>> DiG [0-9.]\+.* <<>>\|$ORIGIN\|$TTL\|IN\s\+SOA' 343bd404149SBram Moolenaar set ft=bindzone 344071d4279SBram Moolenaar 345071d4279SBram Moolenaar " BAAN 3463a429efbSBram Moolenaar elseif s:line1 =~# '|\*\{1,80}' && s:line2 =~# 'VRC ' 3473a429efbSBram Moolenaar \ || s:line2 =~# '|\*\{1,80}' && s:line3 =~# 'VRC ' 348071d4279SBram Moolenaar set ft=baan 349071d4279SBram Moolenaar 350071d4279SBram Moolenaar " Valgrind 3513a429efbSBram Moolenaar elseif s:line1 =~# '^==\d\+== valgrind' || s:line3 =~# '^==\d\+== Using valgrind' 352071d4279SBram Moolenaar set ft=valgrind 353071d4279SBram Moolenaar 35434401ccaSBram Moolenaar " Go docs 3553a429efbSBram Moolenaar elseif s:line1 =~# '^PACKAGE DOCUMENTATION$' 35634401ccaSBram Moolenaar set ft=godoc 35734401ccaSBram Moolenaar 358071d4279SBram Moolenaar " Renderman Interface Bytestream 3593a429efbSBram Moolenaar elseif s:line1 =~# '^##RenderMan' 360071d4279SBram Moolenaar set ft=rib 361071d4279SBram Moolenaar 362071d4279SBram Moolenaar " Scheme scripts 3633a429efbSBram Moolenaar elseif s:line1 =~# 'exec\s\+\S*scheme' || s:line2 =~# 'exec\s\+\S*scheme' 364071d4279SBram Moolenaar set ft=scheme 365071d4279SBram Moolenaar 366aba8857aSBram Moolenaar " Git output 3673a429efbSBram Moolenaar elseif s:line1 =~# '^\(commit\|tree\|object\) \x\{40\}\>\|^tag \S\+$' 368aba8857aSBram Moolenaar set ft=git 369aba8857aSBram Moolenaar 370543b7ef7SBram Moolenaar " Gprof (gnu profiler) 371543b7ef7SBram Moolenaar elseif s:line1 == 'Flat profile:' 372543b7ef7SBram Moolenaar \ && s:line2 == '' 3733a429efbSBram Moolenaar \ && s:line3 =~# '^Each sample counts as .* seconds.$' 374543b7ef7SBram Moolenaar set ft=gprof 375543b7ef7SBram Moolenaar 376203d04d7SBram Moolenaar " Erlang terms 377203d04d7SBram Moolenaar " (See also: http://www.gnu.org/software/emacs/manual/html_node/emacs/Choosing-Modes.html#Choosing-Modes) 378203d04d7SBram Moolenaar elseif s:line1 =~? '-\*-.*erlang.*-\*-' 379203d04d7SBram Moolenaar set ft=erlang 380203d04d7SBram Moolenaar 3818eab7313SBram Moolenaar " YAML 3828eab7313SBram Moolenaar elseif s:line1 =~# '^%YAML' 3838eab7313SBram Moolenaar set ft=yaml 3848eab7313SBram Moolenaar 385071d4279SBram Moolenaar " CVS diff 386071d4279SBram Moolenaar else 3875c73622aSBram Moolenaar let s:lnum = 1 3883a429efbSBram Moolenaar while getline(s:lnum) =~# "^? " && s:lnum < line("$") 3895c73622aSBram Moolenaar let s:lnum += 1 390071d4279SBram Moolenaar endwhile 3913a429efbSBram Moolenaar if getline(s:lnum) =~# '^Index:\s\+\f\+$' 392071d4279SBram Moolenaar set ft=diff 393071d4279SBram Moolenaar 394071d4279SBram Moolenaar " locale input files: Formal Definitions of Cultural Conventions 395071d4279SBram Moolenaar " filename must be like en_US, fr_FR@euro or en_US.UTF-8 3963a429efbSBram Moolenaar elseif expand("%") =~# '\a\a_\a\a\($\|[.@]\)\|i18n$\|POSIX$\|translit_' 3975c73622aSBram Moolenaar let s:lnum = 1 3985c73622aSBram Moolenaar while s:lnum < 100 && s:lnum < line("$") 3993a429efbSBram Moolenaar if getline(s:lnum) =~# '^LC_\(IDENTIFICATION\|CTYPE\|COLLATE\|MONETARY\|NUMERIC\|TIME\|MESSAGES\|PAPER\|TELEPHONE\|MEASUREMENT\|NAME\|ADDRESS\)$' 400071d4279SBram Moolenaar setf fdcc 401071d4279SBram Moolenaar break 402071d4279SBram Moolenaar endif 4035c73622aSBram Moolenaar let s:lnum += 1 404071d4279SBram Moolenaar endwhile 405071d4279SBram Moolenaar endif 4065c73622aSBram Moolenaar unlet s:lnum 407071d4279SBram Moolenaar 408071d4279SBram Moolenaar endif 409071d4279SBram Moolenaar 410071d4279SBram Moolenaar unlet s:line2 s:line3 s:line4 s:line5 411071d4279SBram Moolenaar 412071d4279SBram Moolenaarendif 413071d4279SBram Moolenaar 414071d4279SBram Moolenaar" Restore 'cpoptions' 415071d4279SBram Moolenaarlet &cpo = s:cpo_save 416071d4279SBram Moolenaar 417071d4279SBram Moolenaarunlet s:cpo_save s:line1 418