xref: /vim-8.2.3635/runtime/scripts.vim (revision 214641f7)
1071d4279SBram Moolenaar" Vim support file to detect file types in scripts
2071d4279SBram Moolenaar"
3071d4279SBram Moolenaar" Maintainer:	Bram Moolenaar <[email protected]>
4*214641f7SBram Moolenaar" Last change:	2017 Mar 04
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.
9071d4279SBram Moolenaar
10071d4279SBram Moolenaar
11071d4279SBram Moolenaar" Only do the rest when the FileType autocommand has not been triggered yet.
12071d4279SBram Moolenaarif did_filetype()
13071d4279SBram Moolenaar  finish
14071d4279SBram Moolenaarendif
15071d4279SBram Moolenaar
16071d4279SBram Moolenaar" Load the user defined scripts file first
17071d4279SBram Moolenaar" Only do this when the FileType autocommand has not been triggered yet
18f4630b60SBram Moolenaarif exists("myscriptsfile") && filereadable(expand(myscriptsfile))
19071d4279SBram Moolenaar  execute "source " . myscriptsfile
20071d4279SBram Moolenaar  if did_filetype()
21071d4279SBram Moolenaar    finish
22071d4279SBram Moolenaar  endif
23071d4279SBram Moolenaarendif
24071d4279SBram Moolenaar
25071d4279SBram Moolenaar" Line continuation is used here, remove 'C' from 'cpoptions'
26071d4279SBram Moolenaarlet s:cpo_save = &cpo
27071d4279SBram Moolenaarset cpo&vim
28071d4279SBram Moolenaar
29071d4279SBram Moolenaarlet s:line1 = getline(1)
30071d4279SBram Moolenaar
31071d4279SBram Moolenaarif s:line1 =~ "^#!"
32071d4279SBram Moolenaar  " A script that starts with "#!".
33071d4279SBram Moolenaar
34071d4279SBram Moolenaar  " Check for a line like "#!/usr/bin/env VAR=val bash".  Turn it into
35071d4279SBram Moolenaar  " "#!/usr/bin/bash" to make matching easier.
36071d4279SBram Moolenaar  if s:line1 =~ '^#!\s*\S*\<env\s'
37071d4279SBram Moolenaar    let s:line1 = substitute(s:line1, '\S\+=\S\+', '', 'g')
38071d4279SBram Moolenaar    let s:line1 = substitute(s:line1, '\<env\s\+', '', '')
39071d4279SBram Moolenaar  endif
40071d4279SBram Moolenaar
41071d4279SBram Moolenaar  " Get the program name.
42071d4279SBram Moolenaar  " Only accept spaces in PC style paths: "#!c:/program files/perl [args]".
43f4630b60SBram Moolenaar  " If the word env is used, use the first word after the space:
44f4630b60SBram Moolenaar  " "#!/usr/bin/env perl [path/args]"
45071d4279SBram Moolenaar  " If there is no path use the first word: "#!perl [path/args]".
46071d4279SBram Moolenaar  " Otherwise get the last word after a slash: "#!/usr/bin/perl [path/args]".
47071d4279SBram Moolenaar  if s:line1 =~ '^#!\s*\a:[/\\]'
48071d4279SBram Moolenaar    let s:name = substitute(s:line1, '^#!.*[/\\]\(\i\+\).*', '\1', '')
49f4630b60SBram Moolenaar  elseif s:line1 =~ '^#!.*\<env\>'
50f4630b60SBram Moolenaar    let s:name = substitute(s:line1, '^#!.*\<env\>\s\+\(\i\+\).*', '\1', '')
51071d4279SBram Moolenaar  elseif s:line1 =~ '^#!\s*[^/\\ ]*\>\([^/\\]\|$\)'
52071d4279SBram Moolenaar    let s:name = substitute(s:line1, '^#!\s*\([^/\\ ]*\>\).*', '\1', '')
53071d4279SBram Moolenaar  else
54071d4279SBram Moolenaar    let s:name = substitute(s:line1, '^#!\s*\S*[/\\]\(\i\+\).*', '\1', '')
55071d4279SBram Moolenaar  endif
56071d4279SBram Moolenaar
57a8c4d563SBram Moolenaar  " tcl scripts may have #!/bin/sh in the first line and "exec wish" in the
58a8c4d563SBram Moolenaar  " third line.  Suggested by Steven Atkinson.
59a8c4d563SBram Moolenaar  if getline(3) =~ '^exec wish'
60a8c4d563SBram Moolenaar    let s:name = 'wish'
61a8c4d563SBram Moolenaar  endif
62a8c4d563SBram Moolenaar
63d4755bb0SBram Moolenaar  " Bourne-like shell scripts: bash bash2 ksh ksh93 sh
64d4755bb0SBram Moolenaar  if s:name =~ '^\(bash\d*\|\|ksh\d*\|sh\)\>'
65071d4279SBram Moolenaar    call SetFileTypeSH(s:line1)	" defined in filetype.vim
66071d4279SBram Moolenaar
67071d4279SBram Moolenaar    " csh scripts
68071d4279SBram Moolenaar  elseif s:name =~ '^csh\>'
69071d4279SBram Moolenaar    if exists("g:filetype_csh")
703fdfa4a9SBram Moolenaar      call SetFileTypeShell(g:filetype_csh)
71071d4279SBram Moolenaar    else
723fdfa4a9SBram Moolenaar      call SetFileTypeShell("csh")
73071d4279SBram Moolenaar    endif
74071d4279SBram Moolenaar
75071d4279SBram Moolenaar    " tcsh scripts
76071d4279SBram Moolenaar  elseif s:name =~ '^tcsh\>'
773fdfa4a9SBram Moolenaar    call SetFileTypeShell("tcsh")
78071d4279SBram Moolenaar
79071d4279SBram Moolenaar    " Z shell scripts
80071d4279SBram Moolenaar  elseif s:name =~ '^zsh\>'
81071d4279SBram Moolenaar    set ft=zsh
82071d4279SBram Moolenaar
83071d4279SBram Moolenaar    " TCL scripts
84071d4279SBram Moolenaar  elseif s:name =~ '^\(tclsh\|wish\|expectk\|itclsh\|itkwish\)\>'
85071d4279SBram Moolenaar    set ft=tcl
86071d4279SBram Moolenaar
87071d4279SBram Moolenaar    " Expect scripts
88071d4279SBram Moolenaar  elseif s:name =~ '^expect\>'
89071d4279SBram Moolenaar    set ft=expect
90071d4279SBram Moolenaar
91071d4279SBram Moolenaar    " Gnuplot scripts
92071d4279SBram Moolenaar  elseif s:name =~ '^gnuplot\>'
93071d4279SBram Moolenaar    set ft=gnuplot
94071d4279SBram Moolenaar
95071d4279SBram Moolenaar    " Makefiles
96071d4279SBram Moolenaar  elseif s:name =~ 'make\>'
97071d4279SBram Moolenaar    set ft=make
98071d4279SBram Moolenaar
99f4630b60SBram Moolenaar    " Lua
100f4630b60SBram Moolenaar  elseif s:name =~ 'lua'
101f4630b60SBram Moolenaar    set ft=lua
102f4630b60SBram Moolenaar
1033b72f1d2SBram Moolenaar    " Perl 6
1043b72f1d2SBram Moolenaar  elseif s:name =~ 'perl6'
1053b72f1d2SBram Moolenaar    set ft=perl6
1063b72f1d2SBram Moolenaar
107071d4279SBram Moolenaar    " Perl
108071d4279SBram Moolenaar  elseif s:name =~ 'perl'
109071d4279SBram Moolenaar    set ft=perl
110071d4279SBram Moolenaar
111071d4279SBram Moolenaar    " PHP
112071d4279SBram Moolenaar  elseif s:name =~ 'php'
113071d4279SBram Moolenaar    set ft=php
114071d4279SBram Moolenaar
115071d4279SBram Moolenaar    " Python
116071d4279SBram Moolenaar  elseif s:name =~ 'python'
117071d4279SBram Moolenaar    set ft=python
118071d4279SBram Moolenaar
119071d4279SBram Moolenaar    " Groovy
120071d4279SBram Moolenaar  elseif s:name =~ '^groovy\>'
121071d4279SBram Moolenaar    set ft=groovy
122071d4279SBram Moolenaar
123071d4279SBram Moolenaar    " Ruby
124071d4279SBram Moolenaar  elseif s:name =~ 'ruby'
125071d4279SBram Moolenaar    set ft=ruby
126071d4279SBram Moolenaar
127*214641f7SBram Moolenaar    " JavaScript
128*214641f7SBram Moolenaar  elseif s:name =~ 'node\(js\)\=\>' || s:name =~ 'rhino\>'
129*214641f7SBram Moolenaar    set ft=javascript
130*214641f7SBram Moolenaar
131071d4279SBram Moolenaar    " BC calculator
132071d4279SBram Moolenaar  elseif s:name =~ '^bc\>'
133071d4279SBram Moolenaar    set ft=bc
134071d4279SBram Moolenaar
135071d4279SBram Moolenaar    " sed
136071d4279SBram Moolenaar  elseif s:name =~ 'sed\>'
137071d4279SBram Moolenaar    set ft=sed
138071d4279SBram Moolenaar
139071d4279SBram Moolenaar    " OCaml-scripts
140071d4279SBram Moolenaar  elseif s:name =~ 'ocaml'
141071d4279SBram Moolenaar    set ft=ocaml
142071d4279SBram Moolenaar
143071d4279SBram Moolenaar    " Awk scripts
144071d4279SBram Moolenaar  elseif s:name =~ 'awk\>'
145071d4279SBram Moolenaar    set ft=awk
146071d4279SBram Moolenaar
147071d4279SBram Moolenaar    " Website MetaLanguage
148071d4279SBram Moolenaar  elseif s:name =~ 'wml'
149071d4279SBram Moolenaar    set ft=wml
150071d4279SBram Moolenaar
151071d4279SBram Moolenaar    " Scheme scripts
152071d4279SBram Moolenaar  elseif s:name =~ 'scheme'
153071d4279SBram Moolenaar    set ft=scheme
154071d4279SBram Moolenaar
155af289d33SBram Moolenaar    " CFEngine scripts
156af289d33SBram Moolenaar  elseif s:name =~ 'cfengine'
157af289d33SBram Moolenaar    set ft=cfengine
158af289d33SBram Moolenaar
159203d04d7SBram Moolenaar    " Erlang scripts
160203d04d7SBram Moolenaar  elseif s:name =~ 'escript'
161203d04d7SBram Moolenaar    set ft=erlang
162203d04d7SBram Moolenaar
163*214641f7SBram Moolenaar    " Haskell
164*214641f7SBram Moolenaar  elseif s:name =~ 'haskell'
165*214641f7SBram Moolenaar    set ft=haskell
166*214641f7SBram Moolenaar
167*214641f7SBram Moolenaar    " Scala
168*214641f7SBram Moolenaar  elseif s:name =~ 'scala\>'
169*214641f7SBram Moolenaar    set ft=scala
170*214641f7SBram Moolenaar
171071d4279SBram Moolenaar  endif
172071d4279SBram Moolenaar  unlet s:name
173071d4279SBram Moolenaar
174071d4279SBram Moolenaarelse
175071d4279SBram Moolenaar  " File does not start with "#!".
176071d4279SBram Moolenaar
177071d4279SBram Moolenaar  let s:line2 = getline(2)
178071d4279SBram Moolenaar  let s:line3 = getline(3)
179071d4279SBram Moolenaar  let s:line4 = getline(4)
180071d4279SBram Moolenaar  let s:line5 = getline(5)
181071d4279SBram Moolenaar
182071d4279SBram Moolenaar  " Bourne-like shell scripts: sh ksh bash bash2
183071d4279SBram Moolenaar  if s:line1 =~ '^:$'
184071d4279SBram Moolenaar    call SetFileTypeSH(s:line1)	" defined in filetype.vim
185071d4279SBram Moolenaar
186071d4279SBram Moolenaar    " Z shell scripts
1874a74803eSBram Moolenaar  elseif s:line1 =~ '^#compdef\>' || s:line1 =~ '^#autoload\>' ||
1884a74803eSBram Moolenaar        \ "\n".s:line1."\n".s:line2."\n".s:line3."\n".s:line4."\n".s:line5 =~ '\n\s*emulate\s\+\%(-[LR]\s\+\)\=[ckz]\=sh\>'
189071d4279SBram Moolenaar    set ft=zsh
190071d4279SBram Moolenaar
191071d4279SBram Moolenaar  " ELM Mail files
192c236c16dSBram Moolenaar  elseif s:line1 =~ '^From \([a-zA-Z][a-zA-Z_0-9\.=-]*\(@[^ ]*\)\=\|-\) .* \(19\|20\)\d\d$'
193071d4279SBram Moolenaar    set ft=mail
194071d4279SBram Moolenaar
195071d4279SBram Moolenaar    " Mason
196071d4279SBram Moolenaar  elseif s:line1 =~ '^<[%&].*>'
197071d4279SBram Moolenaar    set ft=mason
198071d4279SBram Moolenaar
199071d4279SBram Moolenaar    " Vim scripts (must have '" vim' as the first line to trigger this)
200071d4279SBram Moolenaar  elseif s:line1 =~ '^" *[vV]im$'
201071d4279SBram Moolenaar    set ft=vim
202071d4279SBram Moolenaar
203071d4279SBram Moolenaar    " MOO
204071d4279SBram Moolenaar  elseif s:line1 =~ '^\*\* LambdaMOO Database, Format Version \%([1-3]\>\)\@!\d\+ \*\*$'
205071d4279SBram Moolenaar    set ft=moo
206071d4279SBram Moolenaar
207071d4279SBram Moolenaar    " Diff file:
208071d4279SBram Moolenaar    " - "diff" in first line (context diff)
209071d4279SBram Moolenaar    " - "Only in " in first line
210071d4279SBram Moolenaar    " - "--- " in first line and "+++ " in second line (unified diff).
211071d4279SBram Moolenaar    " - "*** " in first line and "--- " in second line (context diff).
212071d4279SBram Moolenaar    " - "# It was generated by makepatch " in the second line (makepatch diff).
213071d4279SBram Moolenaar    " - "Index: <filename>" in the first line (CVS file)
214899dddf8SBram Moolenaar    " - "=== ", line of "=", "---", "+++ " (SVK diff)
215d2cec5b0SBram Moolenaar    " - "=== ", "--- ", "+++ " (bzr diff, common case)
216d2cec5b0SBram Moolenaar    " - "=== (removed|added|renamed|modified)" (bzr diff, alternative)
217d09acef4SBram Moolenaar    " - "# HG changeset patch" in first line (Mercurial export format)
218d09acef4SBram 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\)'
219071d4279SBram Moolenaar	\ || (s:line1 =~ '^--- ' && s:line2 =~ '^+++ ')
220bfd8fc05SBram Moolenaar	\ || (s:line1 =~ '^\* looking for ' && s:line2 =~ '^\* comparing to ')
221071d4279SBram Moolenaar	\ || (s:line1 =~ '^\*\*\* ' && s:line2 =~ '^--- ')
222d2cec5b0SBram Moolenaar	\ || (s:line1 =~ '^=== ' && ((s:line2 =~ '^=\{66\}' && s:line3 =~ '^--- ' && s:line4 =~ '^+++') || (s:line2 =~ '^--- ' && s:line3 =~ '^+++ ')))
223d2cec5b0SBram Moolenaar	\ || (s:line1 =~ '^=== \(removed\|added\|renamed\|modified\)')
224071d4279SBram Moolenaar    set ft=diff
225071d4279SBram Moolenaar
226071d4279SBram Moolenaar    " PostScript Files (must have %!PS as the first line, like a2ps output)
227071d4279SBram Moolenaar  elseif s:line1 =~ '^%![ \t]*PS'
228071d4279SBram Moolenaar    set ft=postscr
229071d4279SBram Moolenaar
230071d4279SBram Moolenaar    " M4 scripts: Guess there is a line that starts with "dnl".
231071d4279SBram Moolenaar  elseif s:line1 =~ '^\s*dnl\>'
232071d4279SBram Moolenaar	\ || s:line2 =~ '^\s*dnl\>'
233071d4279SBram Moolenaar	\ || s:line3 =~ '^\s*dnl\>'
234071d4279SBram Moolenaar	\ || s:line4 =~ '^\s*dnl\>'
235071d4279SBram Moolenaar	\ || s:line5 =~ '^\s*dnl\>'
236071d4279SBram Moolenaar    set ft=m4
237071d4279SBram Moolenaar
238071d4279SBram Moolenaar    " AmigaDos scripts
239071d4279SBram Moolenaar  elseif $TERM == "amiga"
240071d4279SBram Moolenaar	\ && (s:line1 =~ "^;" || s:line1 =~ '^\.[bB][rR][aA]')
241071d4279SBram Moolenaar    set ft=amiga
242071d4279SBram Moolenaar
243071d4279SBram Moolenaar    " SiCAD scripts (must have procn or procd as the first line to trigger this)
244071d4279SBram Moolenaar  elseif s:line1 =~? '^ *proc[nd] *$'
245071d4279SBram Moolenaar    set ft=sicad
246071d4279SBram Moolenaar
247071d4279SBram Moolenaar    " Purify log files start with "****  Purify"
248071d4279SBram Moolenaar  elseif s:line1 =~ '^\*\*\*\*  Purify'
249071d4279SBram Moolenaar    set ft=purifylog
250071d4279SBram Moolenaar
251071d4279SBram Moolenaar    " XML
252071d4279SBram Moolenaar  elseif s:line1 =~ '<?\s*xml.*?>'
253071d4279SBram Moolenaar    set ft=xml
254071d4279SBram Moolenaar
255071d4279SBram Moolenaar    " XHTML (e.g.: PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN")
256071d4279SBram Moolenaar  elseif s:line1 =~ '\<DTD\s\+XHTML\s'
257071d4279SBram Moolenaar    set ft=xhtml
258071d4279SBram Moolenaar
25912b87e55SBram Moolenaar    " HTML (e.g.: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN")
26026852128SBram Moolenaar    " Avoid "doctype html", used by slim.
26126852128SBram Moolenaar  elseif s:line1 =~? '<!DOCTYPE\s\+html\>'
26212b87e55SBram Moolenaar    set ft=html
26312b87e55SBram Moolenaar
264aba8857aSBram Moolenaar    " PDF
265aba8857aSBram Moolenaar  elseif s:line1 =~ '^%PDF-'
266aba8857aSBram Moolenaar    set ft=pdf
267aba8857aSBram Moolenaar
268071d4279SBram Moolenaar    " XXD output
269071d4279SBram Moolenaar  elseif s:line1 =~ '^\x\{7}: \x\{2} \=\x\{2} \=\x\{2} \=\x\{2} '
270071d4279SBram Moolenaar    set ft=xxd
271071d4279SBram Moolenaar
272071d4279SBram Moolenaar    " RCS/CVS log output
273071d4279SBram Moolenaar  elseif s:line1 =~ '^RCS file:' || s:line2 =~ '^RCS file:'
274071d4279SBram Moolenaar    set ft=rcslog
275071d4279SBram Moolenaar
276071d4279SBram Moolenaar    " CVS commit
277d4755bb0SBram Moolenaar  elseif s:line2 =~ '^CVS:' || getline("$") =~ '^CVS: '
278071d4279SBram Moolenaar    set ft=cvs
279071d4279SBram Moolenaar
28019a09a18SBram Moolenaar    " Prescribe
28119a09a18SBram Moolenaar  elseif s:line1 =~ '^!R!'
28219a09a18SBram Moolenaar    set ft=prescribe
28319a09a18SBram Moolenaar
284071d4279SBram Moolenaar    " Send-pr
285071d4279SBram Moolenaar  elseif s:line1 =~ '^SEND-PR:'
286071d4279SBram Moolenaar    set ft=sendpr
287071d4279SBram Moolenaar
288071d4279SBram Moolenaar    " SNNS files
289071d4279SBram Moolenaar  elseif s:line1 =~ '^SNNS network definition file'
290071d4279SBram Moolenaar    set ft=snnsnet
291071d4279SBram Moolenaar  elseif s:line1 =~ '^SNNS pattern definition file'
292071d4279SBram Moolenaar    set ft=snnspat
293071d4279SBram Moolenaar  elseif s:line1 =~ '^SNNS result file'
294071d4279SBram Moolenaar    set ft=snnsres
295071d4279SBram Moolenaar
296071d4279SBram Moolenaar    " Virata
297071d4279SBram Moolenaar  elseif s:line1 =~ '^%.\{-}[Vv]irata'
298071d4279SBram Moolenaar	\ || s:line2 =~ '^%.\{-}[Vv]irata'
299071d4279SBram Moolenaar	\ || s:line3 =~ '^%.\{-}[Vv]irata'
300071d4279SBram Moolenaar	\ || s:line4 =~ '^%.\{-}[Vv]irata'
301071d4279SBram Moolenaar	\ || s:line5 =~ '^%.\{-}[Vv]irata'
302071d4279SBram Moolenaar    set ft=virata
303071d4279SBram Moolenaar
304071d4279SBram Moolenaar    " Strace
305e37d50a5SBram Moolenaar  elseif s:line1 =~ '^\(\[pid \d\+\] \)\=[0-9:.]* *execve(' || s:line1 =~ '^__libc_start_main'
306071d4279SBram Moolenaar    set ft=strace
307071d4279SBram Moolenaar
308071d4279SBram Moolenaar    " VSE JCL
309071d4279SBram Moolenaar  elseif s:line1 =~ '^\* $$ JOB\>' || s:line1 =~ '^// *JOB\>'
310071d4279SBram Moolenaar    set ft=vsejcl
311071d4279SBram Moolenaar
312071d4279SBram Moolenaar    " TAK and SINDA
313071d4279SBram Moolenaar  elseif s:line4 =~ 'K & K  Associates' || s:line2 =~ 'TAK 2000'
314071d4279SBram Moolenaar    set ft=takout
315071d4279SBram Moolenaar  elseif s:line3 =~ 'S Y S T E M S   I M P R O V E D '
316071d4279SBram Moolenaar    set ft=sindaout
317071d4279SBram Moolenaar  elseif getline(6) =~ 'Run Date: '
318071d4279SBram Moolenaar    set ft=takcmp
319071d4279SBram Moolenaar  elseif getline(9) =~ 'Node    File  1'
320071d4279SBram Moolenaar    set ft=sindacmp
321071d4279SBram Moolenaar
322071d4279SBram Moolenaar    " DNS zone files
323bd404149SBram Moolenaar  elseif s:line1.s:line2.s:line3.s:line4 =~ '^; <<>> DiG [0-9.]\+ <<>>\|BIND.*named\|$ORIGIN\|$TTL\|IN\s\+SOA'
324bd404149SBram Moolenaar    set ft=bindzone
325071d4279SBram Moolenaar
326071d4279SBram Moolenaar    " BAAN
327071d4279SBram Moolenaar  elseif s:line1 =~ '|\*\{1,80}' && s:line2 =~ 'VRC '
328071d4279SBram Moolenaar	\ || s:line2 =~ '|\*\{1,80}' && s:line3 =~ 'VRC '
329071d4279SBram Moolenaar    set ft=baan
330071d4279SBram Moolenaar
331071d4279SBram Moolenaar  " Valgrind
332a9af0e6aSBram Moolenaar  elseif s:line1 =~ '^==\d\+== valgrind' || s:line3 =~ '^==\d\+== Using valgrind'
333071d4279SBram Moolenaar    set ft=valgrind
334071d4279SBram Moolenaar
33534401ccaSBram Moolenaar  " Go docs
33634401ccaSBram Moolenaar  elseif s:line1 =~ '^PACKAGE DOCUMENTATION$'
33734401ccaSBram Moolenaar    set ft=godoc
33834401ccaSBram Moolenaar
339071d4279SBram Moolenaar  " Renderman Interface Bytestream
340071d4279SBram Moolenaar  elseif s:line1 =~ '^##RenderMan'
341071d4279SBram Moolenaar    set ft=rib
342071d4279SBram Moolenaar
343071d4279SBram Moolenaar  " Scheme scripts
344071d4279SBram Moolenaar  elseif s:line1 =~ 'exec\s\+\S*scheme' || s:line2 =~ 'exec\s\+\S*scheme'
345071d4279SBram Moolenaar    set ft=scheme
346071d4279SBram Moolenaar
347aba8857aSBram Moolenaar  " Git output
3485c73622aSBram Moolenaar  elseif s:line1 =~ '^\(commit\|tree\|object\) \x\{40\}\>\|^tag \S\+$'
349aba8857aSBram Moolenaar    set ft=git
350aba8857aSBram Moolenaar
351543b7ef7SBram Moolenaar   " Gprof (gnu profiler)
352543b7ef7SBram Moolenaar   elseif s:line1 == 'Flat profile:'
353543b7ef7SBram Moolenaar     \ && s:line2 == ''
354543b7ef7SBram Moolenaar     \ && s:line3 =~ '^Each sample counts as .* seconds.$'
355543b7ef7SBram Moolenaar     set ft=gprof
356543b7ef7SBram Moolenaar
357203d04d7SBram Moolenaar  " Erlang terms
358203d04d7SBram Moolenaar  " (See also: http://www.gnu.org/software/emacs/manual/html_node/emacs/Choosing-Modes.html#Choosing-Modes)
359203d04d7SBram Moolenaar  elseif s:line1 =~? '-\*-.*erlang.*-\*-'
360203d04d7SBram Moolenaar    set ft=erlang
361203d04d7SBram Moolenaar
362071d4279SBram Moolenaar  " CVS diff
363071d4279SBram Moolenaar  else
3645c73622aSBram Moolenaar    let s:lnum = 1
3655c73622aSBram Moolenaar    while getline(s:lnum) =~ "^? " && s:lnum < line("$")
3665c73622aSBram Moolenaar      let s:lnum += 1
367071d4279SBram Moolenaar    endwhile
3685c73622aSBram Moolenaar    if getline(s:lnum) =~ '^Index:\s\+\f\+$'
369071d4279SBram Moolenaar      set ft=diff
370071d4279SBram Moolenaar
371071d4279SBram Moolenaar      " locale input files: Formal Definitions of Cultural Conventions
372071d4279SBram Moolenaar      " filename must be like en_US, fr_FR@euro or en_US.UTF-8
373071d4279SBram Moolenaar    elseif expand("%") =~ '\a\a_\a\a\($\|[.@]\)\|i18n$\|POSIX$\|translit_'
3745c73622aSBram Moolenaar      let s:lnum = 1
3755c73622aSBram Moolenaar      while s:lnum < 100 && s:lnum < line("$")
3765c73622aSBram Moolenaar	if getline(s:lnum) =~ '^LC_\(IDENTIFICATION\|CTYPE\|COLLATE\|MONETARY\|NUMERIC\|TIME\|MESSAGES\|PAPER\|TELEPHONE\|MEASUREMENT\|NAME\|ADDRESS\)$'
377071d4279SBram Moolenaar	  setf fdcc
378071d4279SBram Moolenaar	  break
379071d4279SBram Moolenaar	endif
3805c73622aSBram Moolenaar	let s:lnum += 1
381071d4279SBram Moolenaar      endwhile
382071d4279SBram Moolenaar    endif
3835c73622aSBram Moolenaar    unlet s:lnum
384071d4279SBram Moolenaar
385071d4279SBram Moolenaar  endif
386071d4279SBram Moolenaar
387071d4279SBram Moolenaar  unlet s:line2 s:line3 s:line4 s:line5
388071d4279SBram Moolenaar
389071d4279SBram Moolenaarendif
390071d4279SBram Moolenaar
391071d4279SBram Moolenaar" Restore 'cpoptions'
392071d4279SBram Moolenaarlet &cpo = s:cpo_save
393071d4279SBram Moolenaar
394071d4279SBram Moolenaarunlet s:cpo_save s:line1
395