xref: /vim-8.2.3635/runtime/scripts.vim (revision a0122dcd)
1071d4279SBram Moolenaar" Vim support file to detect file types in scripts
2071d4279SBram Moolenaar"
3071d4279SBram Moolenaar" Maintainer:	Bram Moolenaar <[email protected]>
43d1cde8aSBram 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
1533d1cde8aSBram 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
185*a0122dcdSBram Moolenaar    " Free Pascal
186*a0122dcdSBram Moolenaar  elseif s:name =~# 'instantfpc\>'
187*a0122dcdSBram Moolenaar    set ft=pascal
188*a0122dcdSBram Moolenaar
189071d4279SBram Moolenaar  endif
190071d4279SBram Moolenaar  unlet s:name
191071d4279SBram Moolenaar
192071d4279SBram Moolenaarelse
193071d4279SBram Moolenaar  " File does not start with "#!".
194071d4279SBram Moolenaar
195071d4279SBram Moolenaar  let s:line2 = getline(2)
196071d4279SBram Moolenaar  let s:line3 = getline(3)
197071d4279SBram Moolenaar  let s:line4 = getline(4)
198071d4279SBram Moolenaar  let s:line5 = getline(5)
199071d4279SBram Moolenaar
200071d4279SBram Moolenaar  " Bourne-like shell scripts: sh ksh bash bash2
2013a429efbSBram Moolenaar  if s:line1 =~# '^:$'
202d09a206eSBram Moolenaar    call dist#ft#SetFileTypeSH(s:line1)	" defined in filetype.vim
203071d4279SBram Moolenaar
204071d4279SBram Moolenaar  " Z shell scripts
2053a429efbSBram Moolenaar  elseif s:line1 =~# '^#compdef\>' || s:line1 =~# '^#autoload\>' ||
2063a429efbSBram Moolenaar        \ "\n".s:line1."\n".s:line2."\n".s:line3."\n".s:line4."\n".s:line5 =~# '\n\s*emulate\s\+\%(-[LR]\s\+\)\=[ckz]\=sh\>'
207071d4279SBram Moolenaar    set ft=zsh
208071d4279SBram Moolenaar
209071d4279SBram Moolenaar  " ELM Mail files
2103a429efbSBram Moolenaar  elseif s:line1 =~# '^From \([a-zA-Z][a-zA-Z_0-9\.=-]*\(@[^ ]*\)\=\|-\) .* \(19\|20\)\d\d$'
211071d4279SBram Moolenaar    set ft=mail
212071d4279SBram Moolenaar
213071d4279SBram Moolenaar  " Mason
2143a429efbSBram Moolenaar  elseif s:line1 =~# '^<[%&].*>'
215071d4279SBram Moolenaar    set ft=mason
216071d4279SBram Moolenaar
217071d4279SBram Moolenaar  " Vim scripts (must have '" vim' as the first line to trigger this)
2183a429efbSBram Moolenaar  elseif s:line1 =~# '^" *[vV]im$'
219071d4279SBram Moolenaar    set ft=vim
220071d4279SBram Moolenaar
2216a7af8e2SBram Moolenaar  " libcxx and libstdc++ standard library headers like "iostream" do not have
2226a7af8e2SBram Moolenaar  " an extension, recognize the Emacs file mode.
2236a7af8e2SBram Moolenaar  elseif s:line1 =~? '-\*-.*C++.*-\*-'
2246a7af8e2SBram Moolenaar    set ft=cpp
2256a7af8e2SBram Moolenaar
226071d4279SBram Moolenaar  " MOO
2273a429efbSBram Moolenaar  elseif s:line1 =~# '^\*\* LambdaMOO Database, Format Version \%([1-3]\>\)\@!\d\+ \*\*$'
228071d4279SBram Moolenaar    set ft=moo
229071d4279SBram Moolenaar
230071d4279SBram Moolenaar    " Diff file:
231071d4279SBram Moolenaar    " - "diff" in first line (context diff)
232071d4279SBram Moolenaar    " - "Only in " in first line
233071d4279SBram Moolenaar    " - "--- " in first line and "+++ " in second line (unified diff).
234071d4279SBram Moolenaar    " - "*** " in first line and "--- " in second line (context diff).
235071d4279SBram Moolenaar    " - "# It was generated by makepatch " in the second line (makepatch diff).
236071d4279SBram Moolenaar    " - "Index: <filename>" in the first line (CVS file)
237899dddf8SBram Moolenaar    " - "=== ", line of "=", "---", "+++ " (SVK diff)
238d2cec5b0SBram Moolenaar    " - "=== ", "--- ", "+++ " (bzr diff, common case)
239d2cec5b0SBram Moolenaar    " - "=== (removed|added|renamed|modified)" (bzr diff, alternative)
240d09acef4SBram Moolenaar    " - "# HG changeset patch" in first line (Mercurial export format)
2413a429efbSBram 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\)'
2423a429efbSBram Moolenaar	\ || (s:line1 =~# '^--- ' && s:line2 =~# '^+++ ')
2433a429efbSBram Moolenaar	\ || (s:line1 =~# '^\* looking for ' && s:line2 =~# '^\* comparing to ')
2443a429efbSBram Moolenaar	\ || (s:line1 =~# '^\*\*\* ' && s:line2 =~# '^--- ')
2453a429efbSBram Moolenaar	\ || (s:line1 =~# '^=== ' && ((s:line2 =~# '^=\{66\}' && s:line3 =~# '^--- ' && s:line4 =~# '^+++') || (s:line2 =~# '^--- ' && s:line3 =~# '^+++ ')))
2463a429efbSBram Moolenaar	\ || (s:line1 =~# '^=== \(removed\|added\|renamed\|modified\)')
247071d4279SBram Moolenaar    set ft=diff
248071d4279SBram Moolenaar
249071d4279SBram Moolenaar    " PostScript Files (must have %!PS as the first line, like a2ps output)
2503a429efbSBram Moolenaar  elseif s:line1 =~# '^%![ \t]*PS'
251071d4279SBram Moolenaar    set ft=postscr
252071d4279SBram Moolenaar
253071d4279SBram Moolenaar    " M4 scripts: Guess there is a line that starts with "dnl".
2543a429efbSBram Moolenaar  elseif s:line1 =~# '^\s*dnl\>'
2553a429efbSBram Moolenaar	\ || s:line2 =~# '^\s*dnl\>'
2563a429efbSBram Moolenaar	\ || s:line3 =~# '^\s*dnl\>'
2573a429efbSBram Moolenaar	\ || s:line4 =~# '^\s*dnl\>'
2583a429efbSBram Moolenaar	\ || s:line5 =~# '^\s*dnl\>'
259071d4279SBram Moolenaar    set ft=m4
260071d4279SBram Moolenaar
261071d4279SBram Moolenaar    " AmigaDos scripts
262071d4279SBram Moolenaar  elseif $TERM == "amiga"
2633a429efbSBram Moolenaar	\ && (s:line1 =~# "^;" || s:line1 =~? '^\.bra')
264071d4279SBram Moolenaar    set ft=amiga
265071d4279SBram Moolenaar
266071d4279SBram Moolenaar    " SiCAD scripts (must have procn or procd as the first line to trigger this)
267071d4279SBram Moolenaar  elseif s:line1 =~? '^ *proc[nd] *$'
268071d4279SBram Moolenaar    set ft=sicad
269071d4279SBram Moolenaar
270071d4279SBram Moolenaar    " Purify log files start with "****  Purify"
2713a429efbSBram Moolenaar  elseif s:line1 =~# '^\*\*\*\*  Purify'
272071d4279SBram Moolenaar    set ft=purifylog
273071d4279SBram Moolenaar
274071d4279SBram Moolenaar    " XML
2753a429efbSBram Moolenaar  elseif s:line1 =~# '<?\s*xml.*?>'
276071d4279SBram Moolenaar    set ft=xml
277071d4279SBram Moolenaar
278071d4279SBram Moolenaar    " XHTML (e.g.: PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN")
2793a429efbSBram Moolenaar  elseif s:line1 =~# '\<DTD\s\+XHTML\s'
280071d4279SBram Moolenaar    set ft=xhtml
281071d4279SBram Moolenaar
28212b87e55SBram Moolenaar    " HTML (e.g.: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN")
28326852128SBram Moolenaar    " Avoid "doctype html", used by slim.
28426852128SBram Moolenaar  elseif s:line1 =~? '<!DOCTYPE\s\+html\>'
28512b87e55SBram Moolenaar    set ft=html
28612b87e55SBram Moolenaar
287aba8857aSBram Moolenaar    " PDF
2883a429efbSBram Moolenaar  elseif s:line1 =~# '^%PDF-'
289aba8857aSBram Moolenaar    set ft=pdf
290aba8857aSBram Moolenaar
291071d4279SBram Moolenaar    " XXD output
2923a429efbSBram Moolenaar  elseif s:line1 =~# '^\x\{7}: \x\{2} \=\x\{2} \=\x\{2} \=\x\{2} '
293071d4279SBram Moolenaar    set ft=xxd
294071d4279SBram Moolenaar
295071d4279SBram Moolenaar    " RCS/CVS log output
2963a429efbSBram Moolenaar  elseif s:line1 =~# '^RCS file:' || s:line2 =~# '^RCS file:'
297071d4279SBram Moolenaar    set ft=rcslog
298071d4279SBram Moolenaar
299071d4279SBram Moolenaar    " CVS commit
3003a429efbSBram Moolenaar  elseif s:line2 =~# '^CVS:' || getline("$") =~# '^CVS: '
301071d4279SBram Moolenaar    set ft=cvs
302071d4279SBram Moolenaar
30319a09a18SBram Moolenaar    " Prescribe
3043a429efbSBram Moolenaar  elseif s:line1 =~# '^!R!'
30519a09a18SBram Moolenaar    set ft=prescribe
30619a09a18SBram Moolenaar
307071d4279SBram Moolenaar    " Send-pr
3083a429efbSBram Moolenaar  elseif s:line1 =~# '^SEND-PR:'
309071d4279SBram Moolenaar    set ft=sendpr
310071d4279SBram Moolenaar
311071d4279SBram Moolenaar    " SNNS files
3123a429efbSBram Moolenaar  elseif s:line1 =~# '^SNNS network definition file'
313071d4279SBram Moolenaar    set ft=snnsnet
3143a429efbSBram Moolenaar  elseif s:line1 =~# '^SNNS pattern definition file'
315071d4279SBram Moolenaar    set ft=snnspat
3163a429efbSBram Moolenaar  elseif s:line1 =~# '^SNNS result file'
317071d4279SBram Moolenaar    set ft=snnsres
318071d4279SBram Moolenaar
319071d4279SBram Moolenaar    " Virata
3203a429efbSBram Moolenaar  elseif s:line1 =~# '^%.\{-}[Vv]irata'
3213a429efbSBram Moolenaar	\ || s:line2 =~# '^%.\{-}[Vv]irata'
3223a429efbSBram Moolenaar	\ || s:line3 =~# '^%.\{-}[Vv]irata'
3233a429efbSBram Moolenaar	\ || s:line4 =~# '^%.\{-}[Vv]irata'
3243a429efbSBram Moolenaar	\ || s:line5 =~# '^%.\{-}[Vv]irata'
325071d4279SBram Moolenaar    set ft=virata
326071d4279SBram Moolenaar
327071d4279SBram Moolenaar    " Strace
328c572da5fSBram Moolenaar  elseif s:line1 =~# '[0-9:.]* *execve(' || s:line1 =~# '^__libc_start_main'
329071d4279SBram Moolenaar    set ft=strace
330071d4279SBram Moolenaar
331071d4279SBram Moolenaar    " VSE JCL
3323a429efbSBram Moolenaar  elseif s:line1 =~# '^\* $$ JOB\>' || s:line1 =~# '^// *JOB\>'
333071d4279SBram Moolenaar    set ft=vsejcl
334071d4279SBram Moolenaar
335071d4279SBram Moolenaar    " TAK and SINDA
3363a429efbSBram Moolenaar  elseif s:line4 =~# 'K & K  Associates' || s:line2 =~# 'TAK 2000'
337071d4279SBram Moolenaar    set ft=takout
3383a429efbSBram Moolenaar  elseif s:line3 =~# 'S Y S T E M S   I M P R O V E D '
339071d4279SBram Moolenaar    set ft=sindaout
3403a429efbSBram Moolenaar  elseif getline(6) =~# 'Run Date: '
341071d4279SBram Moolenaar    set ft=takcmp
3423a429efbSBram Moolenaar  elseif getline(9) =~# 'Node    File  1'
343071d4279SBram Moolenaar    set ft=sindacmp
344071d4279SBram Moolenaar
345071d4279SBram Moolenaar    " DNS zone files
34601164a65SBram Moolenaar  elseif s:line1.s:line2.s:line3.s:line4 =~# '^; <<>> DiG [0-9.]\+.* <<>>\|$ORIGIN\|$TTL\|IN\s\+SOA'
347bd404149SBram Moolenaar    set ft=bindzone
348071d4279SBram Moolenaar
349071d4279SBram Moolenaar    " BAAN
3503a429efbSBram Moolenaar  elseif s:line1 =~# '|\*\{1,80}' && s:line2 =~# 'VRC '
3513a429efbSBram Moolenaar	\ || s:line2 =~# '|\*\{1,80}' && s:line3 =~# 'VRC '
352071d4279SBram Moolenaar    set ft=baan
353071d4279SBram Moolenaar
354071d4279SBram Moolenaar  " Valgrind
3553a429efbSBram Moolenaar  elseif s:line1 =~# '^==\d\+== valgrind' || s:line3 =~# '^==\d\+== Using valgrind'
356071d4279SBram Moolenaar    set ft=valgrind
357071d4279SBram Moolenaar
35834401ccaSBram Moolenaar  " Go docs
3593a429efbSBram Moolenaar  elseif s:line1 =~# '^PACKAGE DOCUMENTATION$'
36034401ccaSBram Moolenaar    set ft=godoc
36134401ccaSBram Moolenaar
362071d4279SBram Moolenaar  " Renderman Interface Bytestream
3633a429efbSBram Moolenaar  elseif s:line1 =~# '^##RenderMan'
364071d4279SBram Moolenaar    set ft=rib
365071d4279SBram Moolenaar
366071d4279SBram Moolenaar  " Scheme scripts
3673a429efbSBram Moolenaar  elseif s:line1 =~# 'exec\s\+\S*scheme' || s:line2 =~# 'exec\s\+\S*scheme'
368071d4279SBram Moolenaar    set ft=scheme
369071d4279SBram Moolenaar
370aba8857aSBram Moolenaar  " Git output
3713a429efbSBram Moolenaar  elseif s:line1 =~# '^\(commit\|tree\|object\) \x\{40\}\>\|^tag \S\+$'
372aba8857aSBram Moolenaar    set ft=git
373aba8857aSBram Moolenaar
374543b7ef7SBram Moolenaar   " Gprof (gnu profiler)
375543b7ef7SBram Moolenaar   elseif s:line1 == 'Flat profile:'
376543b7ef7SBram Moolenaar     \ && s:line2 == ''
3773a429efbSBram Moolenaar     \ && s:line3 =~# '^Each sample counts as .* seconds.$'
378543b7ef7SBram Moolenaar     set ft=gprof
379543b7ef7SBram Moolenaar
380203d04d7SBram Moolenaar  " Erlang terms
381203d04d7SBram Moolenaar  " (See also: http://www.gnu.org/software/emacs/manual/html_node/emacs/Choosing-Modes.html#Choosing-Modes)
382203d04d7SBram Moolenaar  elseif s:line1 =~? '-\*-.*erlang.*-\*-'
383203d04d7SBram Moolenaar    set ft=erlang
384203d04d7SBram Moolenaar
3858eab7313SBram Moolenaar  " YAML
3868eab7313SBram Moolenaar  elseif s:line1 =~# '^%YAML'
3878eab7313SBram Moolenaar    set ft=yaml
3888eab7313SBram Moolenaar
389071d4279SBram Moolenaar  " CVS diff
390071d4279SBram Moolenaar  else
3915c73622aSBram Moolenaar    let s:lnum = 1
3923a429efbSBram Moolenaar    while getline(s:lnum) =~# "^? " && s:lnum < line("$")
3935c73622aSBram Moolenaar      let s:lnum += 1
394071d4279SBram Moolenaar    endwhile
3953a429efbSBram Moolenaar    if getline(s:lnum) =~# '^Index:\s\+\f\+$'
396071d4279SBram Moolenaar      set ft=diff
397071d4279SBram Moolenaar
398071d4279SBram Moolenaar      " locale input files: Formal Definitions of Cultural Conventions
399071d4279SBram Moolenaar      " filename must be like en_US, fr_FR@euro or en_US.UTF-8
4003a429efbSBram Moolenaar    elseif expand("%") =~# '\a\a_\a\a\($\|[.@]\)\|i18n$\|POSIX$\|translit_'
4015c73622aSBram Moolenaar      let s:lnum = 1
4025c73622aSBram Moolenaar      while s:lnum < 100 && s:lnum < line("$")
4033a429efbSBram Moolenaar	if getline(s:lnum) =~# '^LC_\(IDENTIFICATION\|CTYPE\|COLLATE\|MONETARY\|NUMERIC\|TIME\|MESSAGES\|PAPER\|TELEPHONE\|MEASUREMENT\|NAME\|ADDRESS\)$'
404071d4279SBram Moolenaar	  setf fdcc
405071d4279SBram Moolenaar	  break
406071d4279SBram Moolenaar	endif
4075c73622aSBram Moolenaar	let s:lnum += 1
408071d4279SBram Moolenaar      endwhile
409071d4279SBram Moolenaar    endif
4105c73622aSBram Moolenaar    unlet s:lnum
411071d4279SBram Moolenaar
412071d4279SBram Moolenaar  endif
413071d4279SBram Moolenaar
414071d4279SBram Moolenaar  unlet s:line2 s:line3 s:line4 s:line5
415071d4279SBram Moolenaar
416071d4279SBram Moolenaarendif
417071d4279SBram Moolenaar
418071d4279SBram Moolenaar" Restore 'cpoptions'
419071d4279SBram Moolenaarlet &cpo = s:cpo_save
420071d4279SBram Moolenaar
421071d4279SBram Moolenaarunlet s:cpo_save s:line1
422