xref: /vim-8.2.3635/runtime/scripts.vim (revision 3d1cde8a)
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