xref: /vim-8.2.3635/runtime/scripts.vim (revision 8fd2ffc5)
1071d4279SBram Moolenaar" Vim support file to detect file types in scripts
2071d4279SBram Moolenaar"
3071d4279SBram Moolenaar" Maintainer:	Bram Moolenaar <[email protected]>
4*8fd2ffc5SBram Moolenaar" Last change:	2018 Feb 03
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
38071d4279SBram Moolenaar  " Check for a line like "#!/usr/bin/env VAR=val bash".  Turn it into
39071d4279SBram Moolenaar  " "#!/usr/bin/bash" to make matching easier.
403a429efbSBram Moolenaar  if s:line1 =~# '^#!\s*\S*\<env\s'
41071d4279SBram Moolenaar    let s:line1 = substitute(s:line1, '\S\+=\S\+', '', 'g')
42071d4279SBram Moolenaar    let s:line1 = substitute(s:line1, '\<env\s\+', '', '')
43071d4279SBram Moolenaar  endif
44071d4279SBram Moolenaar
45071d4279SBram Moolenaar  " Get the program name.
46071d4279SBram Moolenaar  " Only accept spaces in PC style paths: "#!c:/program files/perl [args]".
47f4630b60SBram Moolenaar  " If the word env is used, use the first word after the space:
48f4630b60SBram Moolenaar  " "#!/usr/bin/env perl [path/args]"
49071d4279SBram Moolenaar  " If there is no path use the first word: "#!perl [path/args]".
50071d4279SBram Moolenaar  " Otherwise get the last word after a slash: "#!/usr/bin/perl [path/args]".
513a429efbSBram Moolenaar  if s:line1 =~# '^#!\s*\a:[/\\]'
52071d4279SBram Moolenaar    let s:name = substitute(s:line1, '^#!.*[/\\]\(\i\+\).*', '\1', '')
533a429efbSBram Moolenaar  elseif s:line1 =~# '^#!.*\<env\>'
54f4630b60SBram Moolenaar    let s:name = substitute(s:line1, '^#!.*\<env\>\s\+\(\i\+\).*', '\1', '')
553a429efbSBram Moolenaar  elseif s:line1 =~# '^#!\s*[^/\\ ]*\>\([^/\\]\|$\)'
56071d4279SBram Moolenaar    let s:name = substitute(s:line1, '^#!\s*\([^/\\ ]*\>\).*', '\1', '')
57071d4279SBram Moolenaar  else
58071d4279SBram Moolenaar    let s:name = substitute(s:line1, '^#!\s*\S*[/\\]\(\i\+\).*', '\1', '')
59071d4279SBram Moolenaar  endif
60071d4279SBram Moolenaar
61a8c4d563SBram Moolenaar  " tcl scripts may have #!/bin/sh in the first line and "exec wish" in the
62a8c4d563SBram Moolenaar  " third line.  Suggested by Steven Atkinson.
633a429efbSBram Moolenaar  if getline(3) =~# '^exec wish'
64a8c4d563SBram Moolenaar    let s:name = 'wish'
65a8c4d563SBram Moolenaar  endif
66a8c4d563SBram Moolenaar
67d4755bb0SBram Moolenaar  " Bourne-like shell scripts: bash bash2 ksh ksh93 sh
683a429efbSBram Moolenaar  if s:name =~# '^\(bash\d*\|\|ksh\d*\|sh\)\>'
69d09a206eSBram Moolenaar    call dist#ft#SetFileTypeSH(s:line1)	" defined in filetype.vim
70071d4279SBram Moolenaar
71071d4279SBram Moolenaar    " csh scripts
723a429efbSBram Moolenaar  elseif s:name =~# '^csh\>'
73071d4279SBram Moolenaar    if exists("g:filetype_csh")
74d09a206eSBram Moolenaar      call dist#ft#SetFileTypeShell(g:filetype_csh)
75071d4279SBram Moolenaar    else
76d09a206eSBram Moolenaar      call dist#ft#SetFileTypeShell("csh")
77071d4279SBram Moolenaar    endif
78071d4279SBram Moolenaar
79071d4279SBram Moolenaar    " tcsh scripts
803a429efbSBram Moolenaar  elseif s:name =~# '^tcsh\>'
81d09a206eSBram Moolenaar    call dist#ft#SetFileTypeShell("tcsh")
82071d4279SBram Moolenaar
83071d4279SBram Moolenaar    " Z shell scripts
843a429efbSBram Moolenaar  elseif s:name =~# '^zsh\>'
85071d4279SBram Moolenaar    set ft=zsh
86071d4279SBram Moolenaar
87071d4279SBram Moolenaar    " TCL scripts
883a429efbSBram Moolenaar  elseif s:name =~# '^\(tclsh\|wish\|expectk\|itclsh\|itkwish\)\>'
89071d4279SBram Moolenaar    set ft=tcl
90071d4279SBram Moolenaar
91071d4279SBram Moolenaar    " Expect scripts
923a429efbSBram Moolenaar  elseif s:name =~# '^expect\>'
93071d4279SBram Moolenaar    set ft=expect
94071d4279SBram Moolenaar
95071d4279SBram Moolenaar    " Gnuplot scripts
963a429efbSBram Moolenaar  elseif s:name =~# '^gnuplot\>'
97071d4279SBram Moolenaar    set ft=gnuplot
98071d4279SBram Moolenaar
99071d4279SBram Moolenaar    " Makefiles
1003a429efbSBram Moolenaar  elseif s:name =~# 'make\>'
101071d4279SBram Moolenaar    set ft=make
102071d4279SBram Moolenaar
10340962ec9SBram Moolenaar    " Pike
10440962ec9SBram Moolenaar  elseif s:name =~# '^pike\%(\>\|[0-9]\)'
10540962ec9SBram Moolenaar    set ft=pike
10640962ec9SBram Moolenaar
107*8fd2ffc5SBram Moolenaar    " Pike
108*8fd2ffc5SBram Moolenaar  elseif s:name =~# '^pike\%(\>\|[0-9]\)'
109*8fd2ffc5SBram Moolenaar    set ft=pike
110*8fd2ffc5SBram Moolenaar
111f4630b60SBram Moolenaar    " Lua
1123a429efbSBram Moolenaar  elseif s:name =~# 'lua'
113f4630b60SBram Moolenaar    set ft=lua
114f4630b60SBram Moolenaar
1153b72f1d2SBram Moolenaar    " Perl 6
1163a429efbSBram Moolenaar  elseif s:name =~# 'perl6'
1173b72f1d2SBram Moolenaar    set ft=perl6
1183b72f1d2SBram Moolenaar
119071d4279SBram Moolenaar    " Perl
1203a429efbSBram Moolenaar  elseif s:name =~# 'perl'
121071d4279SBram Moolenaar    set ft=perl
122071d4279SBram Moolenaar
123071d4279SBram Moolenaar    " PHP
1243a429efbSBram Moolenaar  elseif s:name =~# 'php'
125071d4279SBram Moolenaar    set ft=php
126071d4279SBram Moolenaar
127071d4279SBram Moolenaar    " Python
1283a429efbSBram Moolenaar  elseif s:name =~# 'python'
129071d4279SBram Moolenaar    set ft=python
130071d4279SBram Moolenaar
131071d4279SBram Moolenaar    " Groovy
1323a429efbSBram Moolenaar  elseif s:name =~# '^groovy\>'
133071d4279SBram Moolenaar    set ft=groovy
134071d4279SBram Moolenaar
135071d4279SBram Moolenaar    " Ruby
1363a429efbSBram Moolenaar  elseif s:name =~# 'ruby'
137071d4279SBram Moolenaar    set ft=ruby
138071d4279SBram Moolenaar
139214641f7SBram Moolenaar    " JavaScript
1403a429efbSBram Moolenaar  elseif s:name =~# 'node\(js\)\=\>' || s:name =~# 'rhino\>'
141214641f7SBram Moolenaar    set ft=javascript
142214641f7SBram Moolenaar
143071d4279SBram Moolenaar    " BC calculator
1443a429efbSBram Moolenaar  elseif s:name =~# '^bc\>'
145071d4279SBram Moolenaar    set ft=bc
146071d4279SBram Moolenaar
147071d4279SBram Moolenaar    " sed
1483a429efbSBram Moolenaar  elseif s:name =~# 'sed\>'
149071d4279SBram Moolenaar    set ft=sed
150071d4279SBram Moolenaar
151071d4279SBram Moolenaar    " OCaml-scripts
1523a429efbSBram Moolenaar  elseif s:name =~# 'ocaml'
153071d4279SBram Moolenaar    set ft=ocaml
154071d4279SBram Moolenaar
155071d4279SBram Moolenaar    " Awk scripts
1563a429efbSBram Moolenaar  elseif s:name =~# 'awk\>'
157071d4279SBram Moolenaar    set ft=awk
158071d4279SBram Moolenaar
159071d4279SBram Moolenaar    " Website MetaLanguage
1603a429efbSBram Moolenaar  elseif s:name =~# 'wml'
161071d4279SBram Moolenaar    set ft=wml
162071d4279SBram Moolenaar
163071d4279SBram Moolenaar    " Scheme scripts
1643a429efbSBram Moolenaar  elseif s:name =~# 'scheme'
165071d4279SBram Moolenaar    set ft=scheme
166071d4279SBram Moolenaar
167af289d33SBram Moolenaar    " CFEngine scripts
1683a429efbSBram Moolenaar  elseif s:name =~# 'cfengine'
169af289d33SBram Moolenaar    set ft=cfengine
170af289d33SBram Moolenaar
171203d04d7SBram Moolenaar    " Erlang scripts
1723a429efbSBram Moolenaar  elseif s:name =~# 'escript'
173203d04d7SBram Moolenaar    set ft=erlang
174203d04d7SBram Moolenaar
175214641f7SBram Moolenaar    " Haskell
1763a429efbSBram Moolenaar  elseif s:name =~# 'haskell'
177214641f7SBram Moolenaar    set ft=haskell
178214641f7SBram Moolenaar
179214641f7SBram Moolenaar    " Scala
1803a429efbSBram Moolenaar  elseif s:name =~# 'scala\>'
181214641f7SBram Moolenaar    set ft=scala
182214641f7SBram Moolenaar
183*8fd2ffc5SBram Moolenaar    " Clojure
184*8fd2ffc5SBram Moolenaar  elseif s:name =~# 'clojure'
185*8fd2ffc5SBram Moolenaar    set ft=clojure
186*8fd2ffc5SBram Moolenaar
187071d4279SBram Moolenaar  endif
188071d4279SBram Moolenaar  unlet s:name
189071d4279SBram Moolenaar
190071d4279SBram Moolenaarelse
191071d4279SBram Moolenaar  " File does not start with "#!".
192071d4279SBram Moolenaar
193071d4279SBram Moolenaar  let s:line2 = getline(2)
194071d4279SBram Moolenaar  let s:line3 = getline(3)
195071d4279SBram Moolenaar  let s:line4 = getline(4)
196071d4279SBram Moolenaar  let s:line5 = getline(5)
197071d4279SBram Moolenaar
198071d4279SBram Moolenaar  " Bourne-like shell scripts: sh ksh bash bash2
1993a429efbSBram Moolenaar  if s:line1 =~# '^:$'
200d09a206eSBram Moolenaar    call dist#ft#SetFileTypeSH(s:line1)	" defined in filetype.vim
201071d4279SBram Moolenaar
202071d4279SBram Moolenaar    " Z shell scripts
2033a429efbSBram Moolenaar  elseif s:line1 =~# '^#compdef\>' || s:line1 =~# '^#autoload\>' ||
2043a429efbSBram Moolenaar        \ "\n".s:line1."\n".s:line2."\n".s:line3."\n".s:line4."\n".s:line5 =~# '\n\s*emulate\s\+\%(-[LR]\s\+\)\=[ckz]\=sh\>'
205071d4279SBram Moolenaar    set ft=zsh
206071d4279SBram Moolenaar
207071d4279SBram Moolenaar  " ELM Mail files
2083a429efbSBram Moolenaar  elseif s:line1 =~# '^From \([a-zA-Z][a-zA-Z_0-9\.=-]*\(@[^ ]*\)\=\|-\) .* \(19\|20\)\d\d$'
209071d4279SBram Moolenaar    set ft=mail
210071d4279SBram Moolenaar
211071d4279SBram Moolenaar    " Mason
2123a429efbSBram Moolenaar  elseif s:line1 =~# '^<[%&].*>'
213071d4279SBram Moolenaar    set ft=mason
214071d4279SBram Moolenaar
215071d4279SBram Moolenaar    " Vim scripts (must have '" vim' as the first line to trigger this)
2163a429efbSBram Moolenaar  elseif s:line1 =~# '^" *[vV]im$'
217071d4279SBram Moolenaar    set ft=vim
218071d4279SBram Moolenaar
219071d4279SBram Moolenaar    " MOO
2203a429efbSBram Moolenaar  elseif s:line1 =~# '^\*\* LambdaMOO Database, Format Version \%([1-3]\>\)\@!\d\+ \*\*$'
221071d4279SBram Moolenaar    set ft=moo
222071d4279SBram Moolenaar
223071d4279SBram Moolenaar    " Diff file:
224071d4279SBram Moolenaar    " - "diff" in first line (context diff)
225071d4279SBram Moolenaar    " - "Only in " in first line
226071d4279SBram Moolenaar    " - "--- " in first line and "+++ " in second line (unified diff).
227071d4279SBram Moolenaar    " - "*** " in first line and "--- " in second line (context diff).
228071d4279SBram Moolenaar    " - "# It was generated by makepatch " in the second line (makepatch diff).
229071d4279SBram Moolenaar    " - "Index: <filename>" in the first line (CVS file)
230899dddf8SBram Moolenaar    " - "=== ", line of "=", "---", "+++ " (SVK diff)
231d2cec5b0SBram Moolenaar    " - "=== ", "--- ", "+++ " (bzr diff, common case)
232d2cec5b0SBram Moolenaar    " - "=== (removed|added|renamed|modified)" (bzr diff, alternative)
233d09acef4SBram Moolenaar    " - "# HG changeset patch" in first line (Mercurial export format)
2343a429efbSBram 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\)'
2353a429efbSBram Moolenaar	\ || (s:line1 =~# '^--- ' && s:line2 =~# '^+++ ')
2363a429efbSBram Moolenaar	\ || (s:line1 =~# '^\* looking for ' && s:line2 =~# '^\* comparing to ')
2373a429efbSBram Moolenaar	\ || (s:line1 =~# '^\*\*\* ' && s:line2 =~# '^--- ')
2383a429efbSBram Moolenaar	\ || (s:line1 =~# '^=== ' && ((s:line2 =~# '^=\{66\}' && s:line3 =~# '^--- ' && s:line4 =~# '^+++') || (s:line2 =~# '^--- ' && s:line3 =~# '^+++ ')))
2393a429efbSBram Moolenaar	\ || (s:line1 =~# '^=== \(removed\|added\|renamed\|modified\)')
240071d4279SBram Moolenaar    set ft=diff
241071d4279SBram Moolenaar
242071d4279SBram Moolenaar    " PostScript Files (must have %!PS as the first line, like a2ps output)
2433a429efbSBram Moolenaar  elseif s:line1 =~# '^%![ \t]*PS'
244071d4279SBram Moolenaar    set ft=postscr
245071d4279SBram Moolenaar
246071d4279SBram Moolenaar    " M4 scripts: Guess there is a line that starts with "dnl".
2473a429efbSBram Moolenaar  elseif s:line1 =~# '^\s*dnl\>'
2483a429efbSBram Moolenaar	\ || s:line2 =~# '^\s*dnl\>'
2493a429efbSBram Moolenaar	\ || s:line3 =~# '^\s*dnl\>'
2503a429efbSBram Moolenaar	\ || s:line4 =~# '^\s*dnl\>'
2513a429efbSBram Moolenaar	\ || s:line5 =~# '^\s*dnl\>'
252071d4279SBram Moolenaar    set ft=m4
253071d4279SBram Moolenaar
254071d4279SBram Moolenaar    " AmigaDos scripts
255071d4279SBram Moolenaar  elseif $TERM == "amiga"
2563a429efbSBram Moolenaar	\ && (s:line1 =~# "^;" || s:line1 =~? '^\.bra')
257071d4279SBram Moolenaar    set ft=amiga
258071d4279SBram Moolenaar
259071d4279SBram Moolenaar    " SiCAD scripts (must have procn or procd as the first line to trigger this)
260071d4279SBram Moolenaar  elseif s:line1 =~? '^ *proc[nd] *$'
261071d4279SBram Moolenaar    set ft=sicad
262071d4279SBram Moolenaar
263071d4279SBram Moolenaar    " Purify log files start with "****  Purify"
2643a429efbSBram Moolenaar  elseif s:line1 =~# '^\*\*\*\*  Purify'
265071d4279SBram Moolenaar    set ft=purifylog
266071d4279SBram Moolenaar
267071d4279SBram Moolenaar    " XML
2683a429efbSBram Moolenaar  elseif s:line1 =~# '<?\s*xml.*?>'
269071d4279SBram Moolenaar    set ft=xml
270071d4279SBram Moolenaar
271071d4279SBram Moolenaar    " XHTML (e.g.: PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN")
2723a429efbSBram Moolenaar  elseif s:line1 =~# '\<DTD\s\+XHTML\s'
273071d4279SBram Moolenaar    set ft=xhtml
274071d4279SBram Moolenaar
27512b87e55SBram Moolenaar    " HTML (e.g.: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN")
27626852128SBram Moolenaar    " Avoid "doctype html", used by slim.
27726852128SBram Moolenaar  elseif s:line1 =~? '<!DOCTYPE\s\+html\>'
27812b87e55SBram Moolenaar    set ft=html
27912b87e55SBram Moolenaar
280aba8857aSBram Moolenaar    " PDF
2813a429efbSBram Moolenaar  elseif s:line1 =~# '^%PDF-'
282aba8857aSBram Moolenaar    set ft=pdf
283aba8857aSBram Moolenaar
284071d4279SBram Moolenaar    " XXD output
2853a429efbSBram Moolenaar  elseif s:line1 =~# '^\x\{7}: \x\{2} \=\x\{2} \=\x\{2} \=\x\{2} '
286071d4279SBram Moolenaar    set ft=xxd
287071d4279SBram Moolenaar
288071d4279SBram Moolenaar    " RCS/CVS log output
2893a429efbSBram Moolenaar  elseif s:line1 =~# '^RCS file:' || s:line2 =~# '^RCS file:'
290071d4279SBram Moolenaar    set ft=rcslog
291071d4279SBram Moolenaar
292071d4279SBram Moolenaar    " CVS commit
2933a429efbSBram Moolenaar  elseif s:line2 =~# '^CVS:' || getline("$") =~# '^CVS: '
294071d4279SBram Moolenaar    set ft=cvs
295071d4279SBram Moolenaar
29619a09a18SBram Moolenaar    " Prescribe
2973a429efbSBram Moolenaar  elseif s:line1 =~# '^!R!'
29819a09a18SBram Moolenaar    set ft=prescribe
29919a09a18SBram Moolenaar
300071d4279SBram Moolenaar    " Send-pr
3013a429efbSBram Moolenaar  elseif s:line1 =~# '^SEND-PR:'
302071d4279SBram Moolenaar    set ft=sendpr
303071d4279SBram Moolenaar
304071d4279SBram Moolenaar    " SNNS files
3053a429efbSBram Moolenaar  elseif s:line1 =~# '^SNNS network definition file'
306071d4279SBram Moolenaar    set ft=snnsnet
3073a429efbSBram Moolenaar  elseif s:line1 =~# '^SNNS pattern definition file'
308071d4279SBram Moolenaar    set ft=snnspat
3093a429efbSBram Moolenaar  elseif s:line1 =~# '^SNNS result file'
310071d4279SBram Moolenaar    set ft=snnsres
311071d4279SBram Moolenaar
312071d4279SBram Moolenaar    " Virata
3133a429efbSBram Moolenaar  elseif s:line1 =~# '^%.\{-}[Vv]irata'
3143a429efbSBram Moolenaar	\ || s:line2 =~# '^%.\{-}[Vv]irata'
3153a429efbSBram Moolenaar	\ || s:line3 =~# '^%.\{-}[Vv]irata'
3163a429efbSBram Moolenaar	\ || s:line4 =~# '^%.\{-}[Vv]irata'
3173a429efbSBram Moolenaar	\ || s:line5 =~# '^%.\{-}[Vv]irata'
318071d4279SBram Moolenaar    set ft=virata
319071d4279SBram Moolenaar
320071d4279SBram Moolenaar    " Strace
321c572da5fSBram Moolenaar  elseif s:line1 =~# '[0-9:.]* *execve(' || s:line1 =~# '^__libc_start_main'
322071d4279SBram Moolenaar    set ft=strace
323071d4279SBram Moolenaar
324071d4279SBram Moolenaar    " VSE JCL
3253a429efbSBram Moolenaar  elseif s:line1 =~# '^\* $$ JOB\>' || s:line1 =~# '^// *JOB\>'
326071d4279SBram Moolenaar    set ft=vsejcl
327071d4279SBram Moolenaar
328071d4279SBram Moolenaar    " TAK and SINDA
3293a429efbSBram Moolenaar  elseif s:line4 =~# 'K & K  Associates' || s:line2 =~# 'TAK 2000'
330071d4279SBram Moolenaar    set ft=takout
3313a429efbSBram Moolenaar  elseif s:line3 =~# 'S Y S T E M S   I M P R O V E D '
332071d4279SBram Moolenaar    set ft=sindaout
3333a429efbSBram Moolenaar  elseif getline(6) =~# 'Run Date: '
334071d4279SBram Moolenaar    set ft=takcmp
3353a429efbSBram Moolenaar  elseif getline(9) =~# 'Node    File  1'
336071d4279SBram Moolenaar    set ft=sindacmp
337071d4279SBram Moolenaar
338071d4279SBram Moolenaar    " DNS zone files
33901164a65SBram Moolenaar  elseif s:line1.s:line2.s:line3.s:line4 =~# '^; <<>> DiG [0-9.]\+.* <<>>\|$ORIGIN\|$TTL\|IN\s\+SOA'
340bd404149SBram Moolenaar    set ft=bindzone
341071d4279SBram Moolenaar
342071d4279SBram Moolenaar    " BAAN
3433a429efbSBram Moolenaar  elseif s:line1 =~# '|\*\{1,80}' && s:line2 =~# 'VRC '
3443a429efbSBram Moolenaar	\ || s:line2 =~# '|\*\{1,80}' && s:line3 =~# 'VRC '
345071d4279SBram Moolenaar    set ft=baan
346071d4279SBram Moolenaar
347071d4279SBram Moolenaar  " Valgrind
3483a429efbSBram Moolenaar  elseif s:line1 =~# '^==\d\+== valgrind' || s:line3 =~# '^==\d\+== Using valgrind'
349071d4279SBram Moolenaar    set ft=valgrind
350071d4279SBram Moolenaar
35134401ccaSBram Moolenaar  " Go docs
3523a429efbSBram Moolenaar  elseif s:line1 =~# '^PACKAGE DOCUMENTATION$'
35334401ccaSBram Moolenaar    set ft=godoc
35434401ccaSBram Moolenaar
355071d4279SBram Moolenaar  " Renderman Interface Bytestream
3563a429efbSBram Moolenaar  elseif s:line1 =~# '^##RenderMan'
357071d4279SBram Moolenaar    set ft=rib
358071d4279SBram Moolenaar
359071d4279SBram Moolenaar  " Scheme scripts
3603a429efbSBram Moolenaar  elseif s:line1 =~# 'exec\s\+\S*scheme' || s:line2 =~# 'exec\s\+\S*scheme'
361071d4279SBram Moolenaar    set ft=scheme
362071d4279SBram Moolenaar
363aba8857aSBram Moolenaar  " Git output
3643a429efbSBram Moolenaar  elseif s:line1 =~# '^\(commit\|tree\|object\) \x\{40\}\>\|^tag \S\+$'
365aba8857aSBram Moolenaar    set ft=git
366aba8857aSBram Moolenaar
367543b7ef7SBram Moolenaar   " Gprof (gnu profiler)
368543b7ef7SBram Moolenaar   elseif s:line1 == 'Flat profile:'
369543b7ef7SBram Moolenaar     \ && s:line2 == ''
3703a429efbSBram Moolenaar     \ && s:line3 =~# '^Each sample counts as .* seconds.$'
371543b7ef7SBram Moolenaar     set ft=gprof
372543b7ef7SBram Moolenaar
373203d04d7SBram Moolenaar  " Erlang terms
374203d04d7SBram Moolenaar  " (See also: http://www.gnu.org/software/emacs/manual/html_node/emacs/Choosing-Modes.html#Choosing-Modes)
375203d04d7SBram Moolenaar  elseif s:line1 =~? '-\*-.*erlang.*-\*-'
376203d04d7SBram Moolenaar    set ft=erlang
377203d04d7SBram Moolenaar
378071d4279SBram Moolenaar  " CVS diff
379071d4279SBram Moolenaar  else
3805c73622aSBram Moolenaar    let s:lnum = 1
3813a429efbSBram Moolenaar    while getline(s:lnum) =~# "^? " && s:lnum < line("$")
3825c73622aSBram Moolenaar      let s:lnum += 1
383071d4279SBram Moolenaar    endwhile
3843a429efbSBram Moolenaar    if getline(s:lnum) =~# '^Index:\s\+\f\+$'
385071d4279SBram Moolenaar      set ft=diff
386071d4279SBram Moolenaar
387071d4279SBram Moolenaar      " locale input files: Formal Definitions of Cultural Conventions
388071d4279SBram Moolenaar      " filename must be like en_US, fr_FR@euro or en_US.UTF-8
3893a429efbSBram Moolenaar    elseif expand("%") =~# '\a\a_\a\a\($\|[.@]\)\|i18n$\|POSIX$\|translit_'
3905c73622aSBram Moolenaar      let s:lnum = 1
3915c73622aSBram Moolenaar      while s:lnum < 100 && s:lnum < line("$")
3923a429efbSBram Moolenaar	if getline(s:lnum) =~# '^LC_\(IDENTIFICATION\|CTYPE\|COLLATE\|MONETARY\|NUMERIC\|TIME\|MESSAGES\|PAPER\|TELEPHONE\|MEASUREMENT\|NAME\|ADDRESS\)$'
393071d4279SBram Moolenaar	  setf fdcc
394071d4279SBram Moolenaar	  break
395071d4279SBram Moolenaar	endif
3965c73622aSBram Moolenaar	let s:lnum += 1
397071d4279SBram Moolenaar      endwhile
398071d4279SBram Moolenaar    endif
3995c73622aSBram Moolenaar    unlet s:lnum
400071d4279SBram Moolenaar
401071d4279SBram Moolenaar  endif
402071d4279SBram Moolenaar
403071d4279SBram Moolenaar  unlet s:line2 s:line3 s:line4 s:line5
404071d4279SBram Moolenaar
405071d4279SBram Moolenaarendif
406071d4279SBram Moolenaar
407071d4279SBram Moolenaar" Restore 'cpoptions'
408071d4279SBram Moolenaarlet &cpo = s:cpo_save
409071d4279SBram Moolenaar
410071d4279SBram Moolenaarunlet s:cpo_save s:line1
411