xref: /vim-8.2.3635/runtime/scripts.vim (revision 3a429efb)
1071d4279SBram Moolenaar" Vim support file to detect file types in scripts
2071d4279SBram Moolenaar"
3071d4279SBram Moolenaar" Maintainer:	Bram Moolenaar <[email protected]>
4*3a429efbSBram Moolenaar" Last change:	2017 Jun 11
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.
9*3a429efbSBram Moolenaar"
10*3a429efbSBram Moolenaar" Note that the pattern matches are done with =~# to avoid the value of the
11*3a429efbSBram Moolenaar" 'ignorecase' option making a difference.  Where case is to be ignored use
12*3a429efbSBram 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
35*3a429efbSBram 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.
40*3a429efbSBram 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]".
51*3a429efbSBram Moolenaar  if s:line1 =~# '^#!\s*\a:[/\\]'
52071d4279SBram Moolenaar    let s:name = substitute(s:line1, '^#!.*[/\\]\(\i\+\).*', '\1', '')
53*3a429efbSBram Moolenaar  elseif s:line1 =~# '^#!.*\<env\>'
54f4630b60SBram Moolenaar    let s:name = substitute(s:line1, '^#!.*\<env\>\s\+\(\i\+\).*', '\1', '')
55*3a429efbSBram 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.
63*3a429efbSBram 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
68*3a429efbSBram Moolenaar  if s:name =~# '^\(bash\d*\|\|ksh\d*\|sh\)\>'
69071d4279SBram Moolenaar    call SetFileTypeSH(s:line1)	" defined in filetype.vim
70071d4279SBram Moolenaar
71071d4279SBram Moolenaar    " csh scripts
72*3a429efbSBram Moolenaar  elseif s:name =~# '^csh\>'
73071d4279SBram Moolenaar    if exists("g:filetype_csh")
743fdfa4a9SBram Moolenaar      call SetFileTypeShell(g:filetype_csh)
75071d4279SBram Moolenaar    else
763fdfa4a9SBram Moolenaar      call SetFileTypeShell("csh")
77071d4279SBram Moolenaar    endif
78071d4279SBram Moolenaar
79071d4279SBram Moolenaar    " tcsh scripts
80*3a429efbSBram Moolenaar  elseif s:name =~# '^tcsh\>'
813fdfa4a9SBram Moolenaar    call SetFileTypeShell("tcsh")
82071d4279SBram Moolenaar
83071d4279SBram Moolenaar    " Z shell scripts
84*3a429efbSBram Moolenaar  elseif s:name =~# '^zsh\>'
85071d4279SBram Moolenaar    set ft=zsh
86071d4279SBram Moolenaar
87071d4279SBram Moolenaar    " TCL scripts
88*3a429efbSBram Moolenaar  elseif s:name =~# '^\(tclsh\|wish\|expectk\|itclsh\|itkwish\)\>'
89071d4279SBram Moolenaar    set ft=tcl
90071d4279SBram Moolenaar
91071d4279SBram Moolenaar    " Expect scripts
92*3a429efbSBram Moolenaar  elseif s:name =~# '^expect\>'
93071d4279SBram Moolenaar    set ft=expect
94071d4279SBram Moolenaar
95071d4279SBram Moolenaar    " Gnuplot scripts
96*3a429efbSBram Moolenaar  elseif s:name =~# '^gnuplot\>'
97071d4279SBram Moolenaar    set ft=gnuplot
98071d4279SBram Moolenaar
99071d4279SBram Moolenaar    " Makefiles
100*3a429efbSBram Moolenaar  elseif s:name =~# 'make\>'
101071d4279SBram Moolenaar    set ft=make
102071d4279SBram Moolenaar
103f4630b60SBram Moolenaar    " Lua
104*3a429efbSBram Moolenaar  elseif s:name =~# 'lua'
105f4630b60SBram Moolenaar    set ft=lua
106f4630b60SBram Moolenaar
1073b72f1d2SBram Moolenaar    " Perl 6
108*3a429efbSBram Moolenaar  elseif s:name =~# 'perl6'
1093b72f1d2SBram Moolenaar    set ft=perl6
1103b72f1d2SBram Moolenaar
111071d4279SBram Moolenaar    " Perl
112*3a429efbSBram Moolenaar  elseif s:name =~# 'perl'
113071d4279SBram Moolenaar    set ft=perl
114071d4279SBram Moolenaar
115071d4279SBram Moolenaar    " PHP
116*3a429efbSBram Moolenaar  elseif s:name =~# 'php'
117071d4279SBram Moolenaar    set ft=php
118071d4279SBram Moolenaar
119071d4279SBram Moolenaar    " Python
120*3a429efbSBram Moolenaar  elseif s:name =~# 'python'
121071d4279SBram Moolenaar    set ft=python
122071d4279SBram Moolenaar
123071d4279SBram Moolenaar    " Groovy
124*3a429efbSBram Moolenaar  elseif s:name =~# '^groovy\>'
125071d4279SBram Moolenaar    set ft=groovy
126071d4279SBram Moolenaar
127071d4279SBram Moolenaar    " Ruby
128*3a429efbSBram Moolenaar  elseif s:name =~# 'ruby'
129071d4279SBram Moolenaar    set ft=ruby
130071d4279SBram Moolenaar
131214641f7SBram Moolenaar    " JavaScript
132*3a429efbSBram Moolenaar  elseif s:name =~# 'node\(js\)\=\>' || s:name =~# 'rhino\>'
133214641f7SBram Moolenaar    set ft=javascript
134214641f7SBram Moolenaar
135071d4279SBram Moolenaar    " BC calculator
136*3a429efbSBram Moolenaar  elseif s:name =~# '^bc\>'
137071d4279SBram Moolenaar    set ft=bc
138071d4279SBram Moolenaar
139071d4279SBram Moolenaar    " sed
140*3a429efbSBram Moolenaar  elseif s:name =~# 'sed\>'
141071d4279SBram Moolenaar    set ft=sed
142071d4279SBram Moolenaar
143071d4279SBram Moolenaar    " OCaml-scripts
144*3a429efbSBram Moolenaar  elseif s:name =~# 'ocaml'
145071d4279SBram Moolenaar    set ft=ocaml
146071d4279SBram Moolenaar
147071d4279SBram Moolenaar    " Awk scripts
148*3a429efbSBram Moolenaar  elseif s:name =~# 'awk\>'
149071d4279SBram Moolenaar    set ft=awk
150071d4279SBram Moolenaar
151071d4279SBram Moolenaar    " Website MetaLanguage
152*3a429efbSBram Moolenaar  elseif s:name =~# 'wml'
153071d4279SBram Moolenaar    set ft=wml
154071d4279SBram Moolenaar
155071d4279SBram Moolenaar    " Scheme scripts
156*3a429efbSBram Moolenaar  elseif s:name =~# 'scheme'
157071d4279SBram Moolenaar    set ft=scheme
158071d4279SBram Moolenaar
159af289d33SBram Moolenaar    " CFEngine scripts
160*3a429efbSBram Moolenaar  elseif s:name =~# 'cfengine'
161af289d33SBram Moolenaar    set ft=cfengine
162af289d33SBram Moolenaar
163203d04d7SBram Moolenaar    " Erlang scripts
164*3a429efbSBram Moolenaar  elseif s:name =~# 'escript'
165203d04d7SBram Moolenaar    set ft=erlang
166203d04d7SBram Moolenaar
167214641f7SBram Moolenaar    " Haskell
168*3a429efbSBram Moolenaar  elseif s:name =~# 'haskell'
169214641f7SBram Moolenaar    set ft=haskell
170214641f7SBram Moolenaar
171214641f7SBram Moolenaar    " Scala
172*3a429efbSBram Moolenaar  elseif s:name =~# 'scala\>'
173214641f7SBram Moolenaar    set ft=scala
174214641f7SBram Moolenaar
175071d4279SBram Moolenaar  endif
176071d4279SBram Moolenaar  unlet s:name
177071d4279SBram Moolenaar
178071d4279SBram Moolenaarelse
179071d4279SBram Moolenaar  " File does not start with "#!".
180071d4279SBram Moolenaar
181071d4279SBram Moolenaar  let s:line2 = getline(2)
182071d4279SBram Moolenaar  let s:line3 = getline(3)
183071d4279SBram Moolenaar  let s:line4 = getline(4)
184071d4279SBram Moolenaar  let s:line5 = getline(5)
185071d4279SBram Moolenaar
186071d4279SBram Moolenaar  " Bourne-like shell scripts: sh ksh bash bash2
187*3a429efbSBram Moolenaar  if s:line1 =~# '^:$'
188071d4279SBram Moolenaar    call SetFileTypeSH(s:line1)	" defined in filetype.vim
189071d4279SBram Moolenaar
190071d4279SBram Moolenaar    " Z shell scripts
191*3a429efbSBram Moolenaar  elseif s:line1 =~# '^#compdef\>' || s:line1 =~# '^#autoload\>' ||
192*3a429efbSBram Moolenaar        \ "\n".s:line1."\n".s:line2."\n".s:line3."\n".s:line4."\n".s:line5 =~# '\n\s*emulate\s\+\%(-[LR]\s\+\)\=[ckz]\=sh\>'
193071d4279SBram Moolenaar    set ft=zsh
194071d4279SBram Moolenaar
195071d4279SBram Moolenaar  " ELM Mail files
196*3a429efbSBram Moolenaar  elseif s:line1 =~# '^From \([a-zA-Z][a-zA-Z_0-9\.=-]*\(@[^ ]*\)\=\|-\) .* \(19\|20\)\d\d$'
197071d4279SBram Moolenaar    set ft=mail
198071d4279SBram Moolenaar
199071d4279SBram Moolenaar    " Mason
200*3a429efbSBram Moolenaar  elseif s:line1 =~# '^<[%&].*>'
201071d4279SBram Moolenaar    set ft=mason
202071d4279SBram Moolenaar
203071d4279SBram Moolenaar    " Vim scripts (must have '" vim' as the first line to trigger this)
204*3a429efbSBram Moolenaar  elseif s:line1 =~# '^" *[vV]im$'
205071d4279SBram Moolenaar    set ft=vim
206071d4279SBram Moolenaar
207071d4279SBram Moolenaar    " MOO
208*3a429efbSBram Moolenaar  elseif s:line1 =~# '^\*\* LambdaMOO Database, Format Version \%([1-3]\>\)\@!\d\+ \*\*$'
209071d4279SBram Moolenaar    set ft=moo
210071d4279SBram Moolenaar
211071d4279SBram Moolenaar    " Diff file:
212071d4279SBram Moolenaar    " - "diff" in first line (context diff)
213071d4279SBram Moolenaar    " - "Only in " in first line
214071d4279SBram Moolenaar    " - "--- " in first line and "+++ " in second line (unified diff).
215071d4279SBram Moolenaar    " - "*** " in first line and "--- " in second line (context diff).
216071d4279SBram Moolenaar    " - "# It was generated by makepatch " in the second line (makepatch diff).
217071d4279SBram Moolenaar    " - "Index: <filename>" in the first line (CVS file)
218899dddf8SBram Moolenaar    " - "=== ", line of "=", "---", "+++ " (SVK diff)
219d2cec5b0SBram Moolenaar    " - "=== ", "--- ", "+++ " (bzr diff, common case)
220d2cec5b0SBram Moolenaar    " - "=== (removed|added|renamed|modified)" (bzr diff, alternative)
221d09acef4SBram Moolenaar    " - "# HG changeset patch" in first line (Mercurial export format)
222*3a429efbSBram 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\)'
223*3a429efbSBram Moolenaar	\ || (s:line1 =~# '^--- ' && s:line2 =~# '^+++ ')
224*3a429efbSBram Moolenaar	\ || (s:line1 =~# '^\* looking for ' && s:line2 =~# '^\* comparing to ')
225*3a429efbSBram Moolenaar	\ || (s:line1 =~# '^\*\*\* ' && s:line2 =~# '^--- ')
226*3a429efbSBram Moolenaar	\ || (s:line1 =~# '^=== ' && ((s:line2 =~# '^=\{66\}' && s:line3 =~# '^--- ' && s:line4 =~# '^+++') || (s:line2 =~# '^--- ' && s:line3 =~# '^+++ ')))
227*3a429efbSBram Moolenaar	\ || (s:line1 =~# '^=== \(removed\|added\|renamed\|modified\)')
228071d4279SBram Moolenaar    set ft=diff
229071d4279SBram Moolenaar
230071d4279SBram Moolenaar    " PostScript Files (must have %!PS as the first line, like a2ps output)
231*3a429efbSBram Moolenaar  elseif s:line1 =~# '^%![ \t]*PS'
232071d4279SBram Moolenaar    set ft=postscr
233071d4279SBram Moolenaar
234071d4279SBram Moolenaar    " M4 scripts: Guess there is a line that starts with "dnl".
235*3a429efbSBram Moolenaar  elseif s:line1 =~# '^\s*dnl\>'
236*3a429efbSBram Moolenaar	\ || s:line2 =~# '^\s*dnl\>'
237*3a429efbSBram Moolenaar	\ || s:line3 =~# '^\s*dnl\>'
238*3a429efbSBram Moolenaar	\ || s:line4 =~# '^\s*dnl\>'
239*3a429efbSBram Moolenaar	\ || s:line5 =~# '^\s*dnl\>'
240071d4279SBram Moolenaar    set ft=m4
241071d4279SBram Moolenaar
242071d4279SBram Moolenaar    " AmigaDos scripts
243071d4279SBram Moolenaar  elseif $TERM == "amiga"
244*3a429efbSBram Moolenaar	\ && (s:line1 =~# "^;" || s:line1 =~? '^\.bra')
245071d4279SBram Moolenaar    set ft=amiga
246071d4279SBram Moolenaar
247071d4279SBram Moolenaar    " SiCAD scripts (must have procn or procd as the first line to trigger this)
248071d4279SBram Moolenaar  elseif s:line1 =~? '^ *proc[nd] *$'
249071d4279SBram Moolenaar    set ft=sicad
250071d4279SBram Moolenaar
251071d4279SBram Moolenaar    " Purify log files start with "****  Purify"
252*3a429efbSBram Moolenaar  elseif s:line1 =~# '^\*\*\*\*  Purify'
253071d4279SBram Moolenaar    set ft=purifylog
254071d4279SBram Moolenaar
255071d4279SBram Moolenaar    " XML
256*3a429efbSBram Moolenaar  elseif s:line1 =~# '<?\s*xml.*?>'
257071d4279SBram Moolenaar    set ft=xml
258071d4279SBram Moolenaar
259071d4279SBram Moolenaar    " XHTML (e.g.: PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN")
260*3a429efbSBram Moolenaar  elseif s:line1 =~# '\<DTD\s\+XHTML\s'
261071d4279SBram Moolenaar    set ft=xhtml
262071d4279SBram Moolenaar
26312b87e55SBram Moolenaar    " HTML (e.g.: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN")
26426852128SBram Moolenaar    " Avoid "doctype html", used by slim.
26526852128SBram Moolenaar  elseif s:line1 =~? '<!DOCTYPE\s\+html\>'
26612b87e55SBram Moolenaar    set ft=html
26712b87e55SBram Moolenaar
268aba8857aSBram Moolenaar    " PDF
269*3a429efbSBram Moolenaar  elseif s:line1 =~# '^%PDF-'
270aba8857aSBram Moolenaar    set ft=pdf
271aba8857aSBram Moolenaar
272071d4279SBram Moolenaar    " XXD output
273*3a429efbSBram Moolenaar  elseif s:line1 =~# '^\x\{7}: \x\{2} \=\x\{2} \=\x\{2} \=\x\{2} '
274071d4279SBram Moolenaar    set ft=xxd
275071d4279SBram Moolenaar
276071d4279SBram Moolenaar    " RCS/CVS log output
277*3a429efbSBram Moolenaar  elseif s:line1 =~# '^RCS file:' || s:line2 =~# '^RCS file:'
278071d4279SBram Moolenaar    set ft=rcslog
279071d4279SBram Moolenaar
280071d4279SBram Moolenaar    " CVS commit
281*3a429efbSBram Moolenaar  elseif s:line2 =~# '^CVS:' || getline("$") =~# '^CVS: '
282071d4279SBram Moolenaar    set ft=cvs
283071d4279SBram Moolenaar
28419a09a18SBram Moolenaar    " Prescribe
285*3a429efbSBram Moolenaar  elseif s:line1 =~# '^!R!'
28619a09a18SBram Moolenaar    set ft=prescribe
28719a09a18SBram Moolenaar
288071d4279SBram Moolenaar    " Send-pr
289*3a429efbSBram Moolenaar  elseif s:line1 =~# '^SEND-PR:'
290071d4279SBram Moolenaar    set ft=sendpr
291071d4279SBram Moolenaar
292071d4279SBram Moolenaar    " SNNS files
293*3a429efbSBram Moolenaar  elseif s:line1 =~# '^SNNS network definition file'
294071d4279SBram Moolenaar    set ft=snnsnet
295*3a429efbSBram Moolenaar  elseif s:line1 =~# '^SNNS pattern definition file'
296071d4279SBram Moolenaar    set ft=snnspat
297*3a429efbSBram Moolenaar  elseif s:line1 =~# '^SNNS result file'
298071d4279SBram Moolenaar    set ft=snnsres
299071d4279SBram Moolenaar
300071d4279SBram Moolenaar    " Virata
301*3a429efbSBram Moolenaar  elseif s:line1 =~# '^%.\{-}[Vv]irata'
302*3a429efbSBram Moolenaar	\ || s:line2 =~# '^%.\{-}[Vv]irata'
303*3a429efbSBram Moolenaar	\ || s:line3 =~# '^%.\{-}[Vv]irata'
304*3a429efbSBram Moolenaar	\ || s:line4 =~# '^%.\{-}[Vv]irata'
305*3a429efbSBram Moolenaar	\ || s:line5 =~# '^%.\{-}[Vv]irata'
306071d4279SBram Moolenaar    set ft=virata
307071d4279SBram Moolenaar
308071d4279SBram Moolenaar    " Strace
309*3a429efbSBram Moolenaar  elseif s:line1 =~# '^\(\[pid \d\+\] \)\=[0-9:.]* *execve(' || s:line1 =~# '^__libc_start_main'
310071d4279SBram Moolenaar    set ft=strace
311071d4279SBram Moolenaar
312071d4279SBram Moolenaar    " VSE JCL
313*3a429efbSBram Moolenaar  elseif s:line1 =~# '^\* $$ JOB\>' || s:line1 =~# '^// *JOB\>'
314071d4279SBram Moolenaar    set ft=vsejcl
315071d4279SBram Moolenaar
316071d4279SBram Moolenaar    " TAK and SINDA
317*3a429efbSBram Moolenaar  elseif s:line4 =~# 'K & K  Associates' || s:line2 =~# 'TAK 2000'
318071d4279SBram Moolenaar    set ft=takout
319*3a429efbSBram Moolenaar  elseif s:line3 =~# 'S Y S T E M S   I M P R O V E D '
320071d4279SBram Moolenaar    set ft=sindaout
321*3a429efbSBram Moolenaar  elseif getline(6) =~# 'Run Date: '
322071d4279SBram Moolenaar    set ft=takcmp
323*3a429efbSBram Moolenaar  elseif getline(9) =~# 'Node    File  1'
324071d4279SBram Moolenaar    set ft=sindacmp
325071d4279SBram Moolenaar
326071d4279SBram Moolenaar    " DNS zone files
327*3a429efbSBram Moolenaar  elseif s:line1.s:line2.s:line3.s:line4 =~# '^; <<>> DiG [0-9.]\+ <<>>\|BIND.*named\|$ORIGIN\|$TTL\|IN\s\+SOA'
328bd404149SBram Moolenaar    set ft=bindzone
329071d4279SBram Moolenaar
330071d4279SBram Moolenaar    " BAAN
331*3a429efbSBram Moolenaar  elseif s:line1 =~# '|\*\{1,80}' && s:line2 =~# 'VRC '
332*3a429efbSBram Moolenaar	\ || s:line2 =~# '|\*\{1,80}' && s:line3 =~# 'VRC '
333071d4279SBram Moolenaar    set ft=baan
334071d4279SBram Moolenaar
335071d4279SBram Moolenaar  " Valgrind
336*3a429efbSBram Moolenaar  elseif s:line1 =~# '^==\d\+== valgrind' || s:line3 =~# '^==\d\+== Using valgrind'
337071d4279SBram Moolenaar    set ft=valgrind
338071d4279SBram Moolenaar
33934401ccaSBram Moolenaar  " Go docs
340*3a429efbSBram Moolenaar  elseif s:line1 =~# '^PACKAGE DOCUMENTATION$'
34134401ccaSBram Moolenaar    set ft=godoc
34234401ccaSBram Moolenaar
343071d4279SBram Moolenaar  " Renderman Interface Bytestream
344*3a429efbSBram Moolenaar  elseif s:line1 =~# '^##RenderMan'
345071d4279SBram Moolenaar    set ft=rib
346071d4279SBram Moolenaar
347071d4279SBram Moolenaar  " Scheme scripts
348*3a429efbSBram Moolenaar  elseif s:line1 =~# 'exec\s\+\S*scheme' || s:line2 =~# 'exec\s\+\S*scheme'
349071d4279SBram Moolenaar    set ft=scheme
350071d4279SBram Moolenaar
351aba8857aSBram Moolenaar  " Git output
352*3a429efbSBram Moolenaar  elseif s:line1 =~# '^\(commit\|tree\|object\) \x\{40\}\>\|^tag \S\+$'
353aba8857aSBram Moolenaar    set ft=git
354aba8857aSBram Moolenaar
355543b7ef7SBram Moolenaar   " Gprof (gnu profiler)
356543b7ef7SBram Moolenaar   elseif s:line1 == 'Flat profile:'
357543b7ef7SBram Moolenaar     \ && s:line2 == ''
358*3a429efbSBram Moolenaar     \ && s:line3 =~# '^Each sample counts as .* seconds.$'
359543b7ef7SBram Moolenaar     set ft=gprof
360543b7ef7SBram Moolenaar
361203d04d7SBram Moolenaar  " Erlang terms
362203d04d7SBram Moolenaar  " (See also: http://www.gnu.org/software/emacs/manual/html_node/emacs/Choosing-Modes.html#Choosing-Modes)
363203d04d7SBram Moolenaar  elseif s:line1 =~? '-\*-.*erlang.*-\*-'
364203d04d7SBram Moolenaar    set ft=erlang
365203d04d7SBram Moolenaar
366071d4279SBram Moolenaar  " CVS diff
367071d4279SBram Moolenaar  else
3685c73622aSBram Moolenaar    let s:lnum = 1
369*3a429efbSBram Moolenaar    while getline(s:lnum) =~# "^? " && s:lnum < line("$")
3705c73622aSBram Moolenaar      let s:lnum += 1
371071d4279SBram Moolenaar    endwhile
372*3a429efbSBram Moolenaar    if getline(s:lnum) =~# '^Index:\s\+\f\+$'
373071d4279SBram Moolenaar      set ft=diff
374071d4279SBram Moolenaar
375071d4279SBram Moolenaar      " locale input files: Formal Definitions of Cultural Conventions
376071d4279SBram Moolenaar      " filename must be like en_US, fr_FR@euro or en_US.UTF-8
377*3a429efbSBram Moolenaar    elseif expand("%") =~# '\a\a_\a\a\($\|[.@]\)\|i18n$\|POSIX$\|translit_'
3785c73622aSBram Moolenaar      let s:lnum = 1
3795c73622aSBram Moolenaar      while s:lnum < 100 && s:lnum < line("$")
380*3a429efbSBram Moolenaar	if getline(s:lnum) =~# '^LC_\(IDENTIFICATION\|CTYPE\|COLLATE\|MONETARY\|NUMERIC\|TIME\|MESSAGES\|PAPER\|TELEPHONE\|MEASUREMENT\|NAME\|ADDRESS\)$'
381071d4279SBram Moolenaar	  setf fdcc
382071d4279SBram Moolenaar	  break
383071d4279SBram Moolenaar	endif
3845c73622aSBram Moolenaar	let s:lnum += 1
385071d4279SBram Moolenaar      endwhile
386071d4279SBram Moolenaar    endif
3875c73622aSBram Moolenaar    unlet s:lnum
388071d4279SBram Moolenaar
389071d4279SBram Moolenaar  endif
390071d4279SBram Moolenaar
391071d4279SBram Moolenaar  unlet s:line2 s:line3 s:line4 s:line5
392071d4279SBram Moolenaar
393071d4279SBram Moolenaarendif
394071d4279SBram Moolenaar
395071d4279SBram Moolenaar" Restore 'cpoptions'
396071d4279SBram Moolenaarlet &cpo = s:cpo_save
397071d4279SBram Moolenaar
398071d4279SBram Moolenaarunlet s:cpo_save s:line1
399