xref: /vim-8.2.3635/runtime/scripts.vim (revision 314b773a)
1071d4279SBram Moolenaar" Vim support file to detect file types in scripts
2071d4279SBram Moolenaar"
3071d4279SBram Moolenaar" Maintainer:	Bram Moolenaar <[email protected]>
4942db23cSBram Moolenaar" Last change:	2021 Jan 22
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
113071d4279SBram Moolenaar    " Perl
1143a429efbSBram Moolenaar  elseif s:name =~# 'perl'
115071d4279SBram Moolenaar    set ft=perl
116071d4279SBram Moolenaar
117071d4279SBram Moolenaar    " PHP
1183a429efbSBram Moolenaar  elseif s:name =~# 'php'
119071d4279SBram Moolenaar    set ft=php
120071d4279SBram Moolenaar
121071d4279SBram Moolenaar    " Python
1223a429efbSBram Moolenaar  elseif s:name =~# 'python'
123071d4279SBram Moolenaar    set ft=python
124071d4279SBram Moolenaar
125071d4279SBram Moolenaar    " Groovy
1263a429efbSBram Moolenaar  elseif s:name =~# '^groovy\>'
127071d4279SBram Moolenaar    set ft=groovy
128071d4279SBram Moolenaar
12963276685SBram Moolenaar    " Raku
13063276685SBram Moolenaar  elseif s:name =~# 'raku'
13163276685SBram Moolenaar    set ft=raku
13263276685SBram 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
185a0122dcdSBram Moolenaar    " Free Pascal
186a0122dcdSBram Moolenaar  elseif s:name =~# 'instantfpc\>'
187a0122dcdSBram Moolenaar    set ft=pascal
188a0122dcdSBram Moolenaar
189402115f1SBram Moolenaar    " Fennel
190402115f1SBram Moolenaar  elseif s:name =~# 'fennel\>'
191402115f1SBram Moolenaar    set ft=fennel
192402115f1SBram Moolenaar
193*314b773aSBram Moolenaar    " MikroTik RouterOS script
194*314b773aSBram Moolenaar  elseif s:name =~# 'rsc\>'
195*314b773aSBram Moolenaar    set ft=routeros
196*314b773aSBram Moolenaar
197071d4279SBram Moolenaar  endif
198071d4279SBram Moolenaar  unlet s:name
199071d4279SBram Moolenaar
200071d4279SBram Moolenaarelse
201071d4279SBram Moolenaar  " File does not start with "#!".
202071d4279SBram Moolenaar
203071d4279SBram Moolenaar  let s:line2 = getline(2)
204071d4279SBram Moolenaar  let s:line3 = getline(3)
205071d4279SBram Moolenaar  let s:line4 = getline(4)
206071d4279SBram Moolenaar  let s:line5 = getline(5)
207071d4279SBram Moolenaar
208071d4279SBram Moolenaar  " Bourne-like shell scripts: sh ksh bash bash2
2093a429efbSBram Moolenaar  if s:line1 =~# '^:$'
210d09a206eSBram Moolenaar    call dist#ft#SetFileTypeSH(s:line1)	" defined in filetype.vim
211071d4279SBram Moolenaar
212071d4279SBram Moolenaar  " Z shell scripts
2133a429efbSBram Moolenaar  elseif s:line1 =~# '^#compdef\>' || s:line1 =~# '^#autoload\>' ||
2143a429efbSBram Moolenaar        \ "\n".s:line1."\n".s:line2."\n".s:line3."\n".s:line4."\n".s:line5 =~# '\n\s*emulate\s\+\%(-[LR]\s\+\)\=[ckz]\=sh\>'
215071d4279SBram Moolenaar    set ft=zsh
216071d4279SBram Moolenaar
217071d4279SBram Moolenaar  " ELM Mail files
2183a429efbSBram Moolenaar  elseif s:line1 =~# '^From \([a-zA-Z][a-zA-Z_0-9\.=-]*\(@[^ ]*\)\=\|-\) .* \(19\|20\)\d\d$'
219071d4279SBram Moolenaar    set ft=mail
220071d4279SBram Moolenaar
221071d4279SBram Moolenaar  " Mason
2223a429efbSBram Moolenaar  elseif s:line1 =~# '^<[%&].*>'
223071d4279SBram Moolenaar    set ft=mason
224071d4279SBram Moolenaar
225071d4279SBram Moolenaar  " Vim scripts (must have '" vim' as the first line to trigger this)
2263a429efbSBram Moolenaar  elseif s:line1 =~# '^" *[vV]im$'
227071d4279SBram Moolenaar    set ft=vim
228071d4279SBram Moolenaar
2296a7af8e2SBram Moolenaar  " libcxx and libstdc++ standard library headers like "iostream" do not have
2306a7af8e2SBram Moolenaar  " an extension, recognize the Emacs file mode.
2316a7af8e2SBram Moolenaar  elseif s:line1 =~? '-\*-.*C++.*-\*-'
2326a7af8e2SBram Moolenaar    set ft=cpp
2336a7af8e2SBram Moolenaar
234071d4279SBram Moolenaar  " MOO
2353a429efbSBram Moolenaar  elseif s:line1 =~# '^\*\* LambdaMOO Database, Format Version \%([1-3]\>\)\@!\d\+ \*\*$'
236071d4279SBram Moolenaar    set ft=moo
237071d4279SBram Moolenaar
238071d4279SBram Moolenaar    " Diff file:
239071d4279SBram Moolenaar    " - "diff" in first line (context diff)
240071d4279SBram Moolenaar    " - "Only in " in first line
241071d4279SBram Moolenaar    " - "--- " in first line and "+++ " in second line (unified diff).
242071d4279SBram Moolenaar    " - "*** " in first line and "--- " in second line (context diff).
243071d4279SBram Moolenaar    " - "# It was generated by makepatch " in the second line (makepatch diff).
244071d4279SBram Moolenaar    " - "Index: <filename>" in the first line (CVS file)
245899dddf8SBram Moolenaar    " - "=== ", line of "=", "---", "+++ " (SVK diff)
246d2cec5b0SBram Moolenaar    " - "=== ", "--- ", "+++ " (bzr diff, common case)
247d2cec5b0SBram Moolenaar    " - "=== (removed|added|renamed|modified)" (bzr diff, alternative)
248d09acef4SBram Moolenaar    " - "# HG changeset patch" in first line (Mercurial export format)
2493a429efbSBram 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\)'
2503a429efbSBram Moolenaar	\ || (s:line1 =~# '^--- ' && s:line2 =~# '^+++ ')
2513a429efbSBram Moolenaar	\ || (s:line1 =~# '^\* looking for ' && s:line2 =~# '^\* comparing to ')
2523a429efbSBram Moolenaar	\ || (s:line1 =~# '^\*\*\* ' && s:line2 =~# '^--- ')
2533a429efbSBram Moolenaar	\ || (s:line1 =~# '^=== ' && ((s:line2 =~# '^=\{66\}' && s:line3 =~# '^--- ' && s:line4 =~# '^+++') || (s:line2 =~# '^--- ' && s:line3 =~# '^+++ ')))
2543a429efbSBram Moolenaar	\ || (s:line1 =~# '^=== \(removed\|added\|renamed\|modified\)')
255071d4279SBram Moolenaar    set ft=diff
256071d4279SBram Moolenaar
257071d4279SBram Moolenaar    " PostScript Files (must have %!PS as the first line, like a2ps output)
2583a429efbSBram Moolenaar  elseif s:line1 =~# '^%![ \t]*PS'
259071d4279SBram Moolenaar    set ft=postscr
260071d4279SBram Moolenaar
261071d4279SBram Moolenaar    " M4 scripts: Guess there is a line that starts with "dnl".
2623a429efbSBram Moolenaar  elseif s:line1 =~# '^\s*dnl\>'
2633a429efbSBram Moolenaar	\ || s:line2 =~# '^\s*dnl\>'
2643a429efbSBram Moolenaar	\ || s:line3 =~# '^\s*dnl\>'
2653a429efbSBram Moolenaar	\ || s:line4 =~# '^\s*dnl\>'
2663a429efbSBram Moolenaar	\ || s:line5 =~# '^\s*dnl\>'
267071d4279SBram Moolenaar    set ft=m4
268071d4279SBram Moolenaar
269071d4279SBram Moolenaar    " AmigaDos scripts
270071d4279SBram Moolenaar  elseif $TERM == "amiga"
2713a429efbSBram Moolenaar	\ && (s:line1 =~# "^;" || s:line1 =~? '^\.bra')
272071d4279SBram Moolenaar    set ft=amiga
273071d4279SBram Moolenaar
274071d4279SBram Moolenaar    " SiCAD scripts (must have procn or procd as the first line to trigger this)
275071d4279SBram Moolenaar  elseif s:line1 =~? '^ *proc[nd] *$'
276071d4279SBram Moolenaar    set ft=sicad
277071d4279SBram Moolenaar
278071d4279SBram Moolenaar    " Purify log files start with "****  Purify"
2793a429efbSBram Moolenaar  elseif s:line1 =~# '^\*\*\*\*  Purify'
280071d4279SBram Moolenaar    set ft=purifylog
281071d4279SBram Moolenaar
282071d4279SBram Moolenaar    " XML
2833a429efbSBram Moolenaar  elseif s:line1 =~# '<?\s*xml.*?>'
284071d4279SBram Moolenaar    set ft=xml
285071d4279SBram Moolenaar
286071d4279SBram Moolenaar    " XHTML (e.g.: PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN")
2873a429efbSBram Moolenaar  elseif s:line1 =~# '\<DTD\s\+XHTML\s'
288071d4279SBram Moolenaar    set ft=xhtml
289071d4279SBram Moolenaar
29012b87e55SBram Moolenaar    " HTML (e.g.: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN")
29126852128SBram Moolenaar    " Avoid "doctype html", used by slim.
29226852128SBram Moolenaar  elseif s:line1 =~? '<!DOCTYPE\s\+html\>'
29312b87e55SBram Moolenaar    set ft=html
29412b87e55SBram Moolenaar
295aba8857aSBram Moolenaar    " PDF
2963a429efbSBram Moolenaar  elseif s:line1 =~# '^%PDF-'
297aba8857aSBram Moolenaar    set ft=pdf
298aba8857aSBram Moolenaar
299071d4279SBram Moolenaar    " XXD output
3003a429efbSBram Moolenaar  elseif s:line1 =~# '^\x\{7}: \x\{2} \=\x\{2} \=\x\{2} \=\x\{2} '
301071d4279SBram Moolenaar    set ft=xxd
302071d4279SBram Moolenaar
303071d4279SBram Moolenaar    " RCS/CVS log output
3043a429efbSBram Moolenaar  elseif s:line1 =~# '^RCS file:' || s:line2 =~# '^RCS file:'
305071d4279SBram Moolenaar    set ft=rcslog
306071d4279SBram Moolenaar
307071d4279SBram Moolenaar    " CVS commit
3083a429efbSBram Moolenaar  elseif s:line2 =~# '^CVS:' || getline("$") =~# '^CVS: '
309071d4279SBram Moolenaar    set ft=cvs
310071d4279SBram Moolenaar
31119a09a18SBram Moolenaar    " Prescribe
3123a429efbSBram Moolenaar  elseif s:line1 =~# '^!R!'
31319a09a18SBram Moolenaar    set ft=prescribe
31419a09a18SBram Moolenaar
315071d4279SBram Moolenaar    " Send-pr
3163a429efbSBram Moolenaar  elseif s:line1 =~# '^SEND-PR:'
317071d4279SBram Moolenaar    set ft=sendpr
318071d4279SBram Moolenaar
319071d4279SBram Moolenaar    " SNNS files
3203a429efbSBram Moolenaar  elseif s:line1 =~# '^SNNS network definition file'
321071d4279SBram Moolenaar    set ft=snnsnet
3223a429efbSBram Moolenaar  elseif s:line1 =~# '^SNNS pattern definition file'
323071d4279SBram Moolenaar    set ft=snnspat
3243a429efbSBram Moolenaar  elseif s:line1 =~# '^SNNS result file'
325071d4279SBram Moolenaar    set ft=snnsres
326071d4279SBram Moolenaar
327071d4279SBram Moolenaar    " Virata
3283a429efbSBram Moolenaar  elseif s:line1 =~# '^%.\{-}[Vv]irata'
3293a429efbSBram Moolenaar	\ || s:line2 =~# '^%.\{-}[Vv]irata'
3303a429efbSBram Moolenaar	\ || s:line3 =~# '^%.\{-}[Vv]irata'
3313a429efbSBram Moolenaar	\ || s:line4 =~# '^%.\{-}[Vv]irata'
3323a429efbSBram Moolenaar	\ || s:line5 =~# '^%.\{-}[Vv]irata'
333071d4279SBram Moolenaar    set ft=virata
334071d4279SBram Moolenaar
335071d4279SBram Moolenaar    " Strace
336c572da5fSBram Moolenaar  elseif s:line1 =~# '[0-9:.]* *execve(' || s:line1 =~# '^__libc_start_main'
337071d4279SBram Moolenaar    set ft=strace
338071d4279SBram Moolenaar
339071d4279SBram Moolenaar    " VSE JCL
3403a429efbSBram Moolenaar  elseif s:line1 =~# '^\* $$ JOB\>' || s:line1 =~# '^// *JOB\>'
341071d4279SBram Moolenaar    set ft=vsejcl
342071d4279SBram Moolenaar
343071d4279SBram Moolenaar    " TAK and SINDA
3443a429efbSBram Moolenaar  elseif s:line4 =~# 'K & K  Associates' || s:line2 =~# 'TAK 2000'
345071d4279SBram Moolenaar    set ft=takout
3463a429efbSBram Moolenaar  elseif s:line3 =~# 'S Y S T E M S   I M P R O V E D '
347071d4279SBram Moolenaar    set ft=sindaout
3483a429efbSBram Moolenaar  elseif getline(6) =~# 'Run Date: '
349071d4279SBram Moolenaar    set ft=takcmp
3503a429efbSBram Moolenaar  elseif getline(9) =~# 'Node    File  1'
351071d4279SBram Moolenaar    set ft=sindacmp
352071d4279SBram Moolenaar
353071d4279SBram Moolenaar    " DNS zone files
35401164a65SBram Moolenaar  elseif s:line1.s:line2.s:line3.s:line4 =~# '^; <<>> DiG [0-9.]\+.* <<>>\|$ORIGIN\|$TTL\|IN\s\+SOA'
355bd404149SBram Moolenaar    set ft=bindzone
356071d4279SBram Moolenaar
357071d4279SBram Moolenaar    " BAAN
3583a429efbSBram Moolenaar  elseif s:line1 =~# '|\*\{1,80}' && s:line2 =~# 'VRC '
3593a429efbSBram Moolenaar	\ || s:line2 =~# '|\*\{1,80}' && s:line3 =~# 'VRC '
360071d4279SBram Moolenaar    set ft=baan
361071d4279SBram Moolenaar
362071d4279SBram Moolenaar  " Valgrind
3633a429efbSBram Moolenaar  elseif s:line1 =~# '^==\d\+== valgrind' || s:line3 =~# '^==\d\+== Using valgrind'
364071d4279SBram Moolenaar    set ft=valgrind
365071d4279SBram Moolenaar
36634401ccaSBram Moolenaar  " Go docs
3673a429efbSBram Moolenaar  elseif s:line1 =~# '^PACKAGE DOCUMENTATION$'
36834401ccaSBram Moolenaar    set ft=godoc
36934401ccaSBram Moolenaar
370071d4279SBram Moolenaar  " Renderman Interface Bytestream
3713a429efbSBram Moolenaar  elseif s:line1 =~# '^##RenderMan'
372071d4279SBram Moolenaar    set ft=rib
373071d4279SBram Moolenaar
374071d4279SBram Moolenaar  " Scheme scripts
3753a429efbSBram Moolenaar  elseif s:line1 =~# 'exec\s\+\S*scheme' || s:line2 =~# 'exec\s\+\S*scheme'
376071d4279SBram Moolenaar    set ft=scheme
377071d4279SBram Moolenaar
378aba8857aSBram Moolenaar  " Git output
3793a429efbSBram Moolenaar  elseif s:line1 =~# '^\(commit\|tree\|object\) \x\{40\}\>\|^tag \S\+$'
380aba8857aSBram Moolenaar    set ft=git
381aba8857aSBram Moolenaar
382543b7ef7SBram Moolenaar   " Gprof (gnu profiler)
383543b7ef7SBram Moolenaar   elseif s:line1 == 'Flat profile:'
384543b7ef7SBram Moolenaar     \ && s:line2 == ''
3853a429efbSBram Moolenaar     \ && s:line3 =~# '^Each sample counts as .* seconds.$'
386543b7ef7SBram Moolenaar     set ft=gprof
387543b7ef7SBram Moolenaar
388203d04d7SBram Moolenaar  " Erlang terms
389203d04d7SBram Moolenaar  " (See also: http://www.gnu.org/software/emacs/manual/html_node/emacs/Choosing-Modes.html#Choosing-Modes)
390203d04d7SBram Moolenaar  elseif s:line1 =~? '-\*-.*erlang.*-\*-'
391203d04d7SBram Moolenaar    set ft=erlang
392203d04d7SBram Moolenaar
3938eab7313SBram Moolenaar  " YAML
3948eab7313SBram Moolenaar  elseif s:line1 =~# '^%YAML'
3958eab7313SBram Moolenaar    set ft=yaml
3968eab7313SBram Moolenaar
397*314b773aSBram Moolenaar  " MikroTik RouterOS script
398*314b773aSBram Moolenaar  elseif s:line1 =~# '^#.*by RouterOS.*$'
399*314b773aSBram Moolenaar    set ft=routeros
400*314b773aSBram Moolenaar
401071d4279SBram Moolenaar  " CVS diff
402071d4279SBram Moolenaar  else
4035c73622aSBram Moolenaar    let s:lnum = 1
4043a429efbSBram Moolenaar    while getline(s:lnum) =~# "^? " && s:lnum < line("$")
4055c73622aSBram Moolenaar      let s:lnum += 1
406071d4279SBram Moolenaar    endwhile
4073a429efbSBram Moolenaar    if getline(s:lnum) =~# '^Index:\s\+\f\+$'
408071d4279SBram Moolenaar      set ft=diff
409071d4279SBram Moolenaar
410071d4279SBram Moolenaar      " locale input files: Formal Definitions of Cultural Conventions
411071d4279SBram Moolenaar      " filename must be like en_US, fr_FR@euro or en_US.UTF-8
4123a429efbSBram Moolenaar    elseif expand("%") =~# '\a\a_\a\a\($\|[.@]\)\|i18n$\|POSIX$\|translit_'
4135c73622aSBram Moolenaar      let s:lnum = 1
4145c73622aSBram Moolenaar      while s:lnum < 100 && s:lnum < line("$")
4153a429efbSBram Moolenaar	if getline(s:lnum) =~# '^LC_\(IDENTIFICATION\|CTYPE\|COLLATE\|MONETARY\|NUMERIC\|TIME\|MESSAGES\|PAPER\|TELEPHONE\|MEASUREMENT\|NAME\|ADDRESS\)$'
416071d4279SBram Moolenaar	  setf fdcc
417071d4279SBram Moolenaar	  break
418071d4279SBram Moolenaar	endif
4195c73622aSBram Moolenaar	let s:lnum += 1
420071d4279SBram Moolenaar      endwhile
421071d4279SBram Moolenaar    endif
4225c73622aSBram Moolenaar    unlet s:lnum
423071d4279SBram Moolenaar
424071d4279SBram Moolenaar  endif
425071d4279SBram Moolenaar
426071d4279SBram Moolenaar  unlet s:line2 s:line3 s:line4 s:line5
427071d4279SBram Moolenaar
428071d4279SBram Moolenaarendif
429071d4279SBram Moolenaar
430071d4279SBram Moolenaar" Restore 'cpoptions'
431071d4279SBram Moolenaarlet &cpo = s:cpo_save
432071d4279SBram Moolenaar
433071d4279SBram Moolenaarunlet s:cpo_save s:line1
434