xref: /vim-8.2.3635/runtime/scripts.vim (revision b1b163ef)
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
193314b773aSBram Moolenaar    " MikroTik RouterOS script
194314b773aSBram Moolenaar  elseif s:name =~# 'rsc\>'
195314b773aSBram Moolenaar    set ft=routeros
196314b773aSBram Moolenaar
197*b1b163efSBram Moolenaar    " Fish shell
198*b1b163efSBram Moolenaar  elseif s:name =~# 'fish\>'
199*b1b163efSBram Moolenaar    set ft=fish
200*b1b163efSBram Moolenaar
201071d4279SBram Moolenaar  endif
202071d4279SBram Moolenaar  unlet s:name
203071d4279SBram Moolenaar
204071d4279SBram Moolenaarelse
205071d4279SBram Moolenaar  " File does not start with "#!".
206071d4279SBram Moolenaar
207071d4279SBram Moolenaar  let s:line2 = getline(2)
208071d4279SBram Moolenaar  let s:line3 = getline(3)
209071d4279SBram Moolenaar  let s:line4 = getline(4)
210071d4279SBram Moolenaar  let s:line5 = getline(5)
211071d4279SBram Moolenaar
212071d4279SBram Moolenaar  " Bourne-like shell scripts: sh ksh bash bash2
2133a429efbSBram Moolenaar  if s:line1 =~# '^:$'
214d09a206eSBram Moolenaar    call dist#ft#SetFileTypeSH(s:line1)	" defined in filetype.vim
215071d4279SBram Moolenaar
216071d4279SBram Moolenaar  " Z shell scripts
2173a429efbSBram Moolenaar  elseif s:line1 =~# '^#compdef\>' || s:line1 =~# '^#autoload\>' ||
2183a429efbSBram Moolenaar        \ "\n".s:line1."\n".s:line2."\n".s:line3."\n".s:line4."\n".s:line5 =~# '\n\s*emulate\s\+\%(-[LR]\s\+\)\=[ckz]\=sh\>'
219071d4279SBram Moolenaar    set ft=zsh
220071d4279SBram Moolenaar
221071d4279SBram Moolenaar  " ELM Mail files
2223a429efbSBram Moolenaar  elseif s:line1 =~# '^From \([a-zA-Z][a-zA-Z_0-9\.=-]*\(@[^ ]*\)\=\|-\) .* \(19\|20\)\d\d$'
223071d4279SBram Moolenaar    set ft=mail
224071d4279SBram Moolenaar
225071d4279SBram Moolenaar  " Mason
2263a429efbSBram Moolenaar  elseif s:line1 =~# '^<[%&].*>'
227071d4279SBram Moolenaar    set ft=mason
228071d4279SBram Moolenaar
229071d4279SBram Moolenaar  " Vim scripts (must have '" vim' as the first line to trigger this)
2303a429efbSBram Moolenaar  elseif s:line1 =~# '^" *[vV]im$'
231071d4279SBram Moolenaar    set ft=vim
232071d4279SBram Moolenaar
2336a7af8e2SBram Moolenaar  " libcxx and libstdc++ standard library headers like "iostream" do not have
2346a7af8e2SBram Moolenaar  " an extension, recognize the Emacs file mode.
2356a7af8e2SBram Moolenaar  elseif s:line1 =~? '-\*-.*C++.*-\*-'
2366a7af8e2SBram Moolenaar    set ft=cpp
2376a7af8e2SBram Moolenaar
238071d4279SBram Moolenaar  " MOO
2393a429efbSBram Moolenaar  elseif s:line1 =~# '^\*\* LambdaMOO Database, Format Version \%([1-3]\>\)\@!\d\+ \*\*$'
240071d4279SBram Moolenaar    set ft=moo
241071d4279SBram Moolenaar
242071d4279SBram Moolenaar    " Diff file:
243071d4279SBram Moolenaar    " - "diff" in first line (context diff)
244071d4279SBram Moolenaar    " - "Only in " in first line
245071d4279SBram Moolenaar    " - "--- " in first line and "+++ " in second line (unified diff).
246071d4279SBram Moolenaar    " - "*** " in first line and "--- " in second line (context diff).
247071d4279SBram Moolenaar    " - "# It was generated by makepatch " in the second line (makepatch diff).
248071d4279SBram Moolenaar    " - "Index: <filename>" in the first line (CVS file)
249899dddf8SBram Moolenaar    " - "=== ", line of "=", "---", "+++ " (SVK diff)
250d2cec5b0SBram Moolenaar    " - "=== ", "--- ", "+++ " (bzr diff, common case)
251d2cec5b0SBram Moolenaar    " - "=== (removed|added|renamed|modified)" (bzr diff, alternative)
252d09acef4SBram Moolenaar    " - "# HG changeset patch" in first line (Mercurial export format)
2533a429efbSBram 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\)'
2543a429efbSBram Moolenaar	\ || (s:line1 =~# '^--- ' && s:line2 =~# '^+++ ')
2553a429efbSBram Moolenaar	\ || (s:line1 =~# '^\* looking for ' && s:line2 =~# '^\* comparing to ')
2563a429efbSBram Moolenaar	\ || (s:line1 =~# '^\*\*\* ' && s:line2 =~# '^--- ')
2573a429efbSBram Moolenaar	\ || (s:line1 =~# '^=== ' && ((s:line2 =~# '^=\{66\}' && s:line3 =~# '^--- ' && s:line4 =~# '^+++') || (s:line2 =~# '^--- ' && s:line3 =~# '^+++ ')))
2583a429efbSBram Moolenaar	\ || (s:line1 =~# '^=== \(removed\|added\|renamed\|modified\)')
259071d4279SBram Moolenaar    set ft=diff
260071d4279SBram Moolenaar
261071d4279SBram Moolenaar    " PostScript Files (must have %!PS as the first line, like a2ps output)
2623a429efbSBram Moolenaar  elseif s:line1 =~# '^%![ \t]*PS'
263071d4279SBram Moolenaar    set ft=postscr
264071d4279SBram Moolenaar
265071d4279SBram Moolenaar    " M4 scripts: Guess there is a line that starts with "dnl".
2663a429efbSBram Moolenaar  elseif s:line1 =~# '^\s*dnl\>'
2673a429efbSBram Moolenaar	\ || s:line2 =~# '^\s*dnl\>'
2683a429efbSBram Moolenaar	\ || s:line3 =~# '^\s*dnl\>'
2693a429efbSBram Moolenaar	\ || s:line4 =~# '^\s*dnl\>'
2703a429efbSBram Moolenaar	\ || s:line5 =~# '^\s*dnl\>'
271071d4279SBram Moolenaar    set ft=m4
272071d4279SBram Moolenaar
273071d4279SBram Moolenaar    " AmigaDos scripts
274071d4279SBram Moolenaar  elseif $TERM == "amiga"
2753a429efbSBram Moolenaar	\ && (s:line1 =~# "^;" || s:line1 =~? '^\.bra')
276071d4279SBram Moolenaar    set ft=amiga
277071d4279SBram Moolenaar
278071d4279SBram Moolenaar    " SiCAD scripts (must have procn or procd as the first line to trigger this)
279071d4279SBram Moolenaar  elseif s:line1 =~? '^ *proc[nd] *$'
280071d4279SBram Moolenaar    set ft=sicad
281071d4279SBram Moolenaar
282071d4279SBram Moolenaar    " Purify log files start with "****  Purify"
2833a429efbSBram Moolenaar  elseif s:line1 =~# '^\*\*\*\*  Purify'
284071d4279SBram Moolenaar    set ft=purifylog
285071d4279SBram Moolenaar
286071d4279SBram Moolenaar    " XML
2873a429efbSBram Moolenaar  elseif s:line1 =~# '<?\s*xml.*?>'
288071d4279SBram Moolenaar    set ft=xml
289071d4279SBram Moolenaar
290071d4279SBram Moolenaar    " XHTML (e.g.: PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN")
2913a429efbSBram Moolenaar  elseif s:line1 =~# '\<DTD\s\+XHTML\s'
292071d4279SBram Moolenaar    set ft=xhtml
293071d4279SBram Moolenaar
29412b87e55SBram Moolenaar    " HTML (e.g.: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN")
29526852128SBram Moolenaar    " Avoid "doctype html", used by slim.
29626852128SBram Moolenaar  elseif s:line1 =~? '<!DOCTYPE\s\+html\>'
29712b87e55SBram Moolenaar    set ft=html
29812b87e55SBram Moolenaar
299aba8857aSBram Moolenaar    " PDF
3003a429efbSBram Moolenaar  elseif s:line1 =~# '^%PDF-'
301aba8857aSBram Moolenaar    set ft=pdf
302aba8857aSBram Moolenaar
303071d4279SBram Moolenaar    " XXD output
3043a429efbSBram Moolenaar  elseif s:line1 =~# '^\x\{7}: \x\{2} \=\x\{2} \=\x\{2} \=\x\{2} '
305071d4279SBram Moolenaar    set ft=xxd
306071d4279SBram Moolenaar
307071d4279SBram Moolenaar    " RCS/CVS log output
3083a429efbSBram Moolenaar  elseif s:line1 =~# '^RCS file:' || s:line2 =~# '^RCS file:'
309071d4279SBram Moolenaar    set ft=rcslog
310071d4279SBram Moolenaar
311071d4279SBram Moolenaar    " CVS commit
3123a429efbSBram Moolenaar  elseif s:line2 =~# '^CVS:' || getline("$") =~# '^CVS: '
313071d4279SBram Moolenaar    set ft=cvs
314071d4279SBram Moolenaar
31519a09a18SBram Moolenaar    " Prescribe
3163a429efbSBram Moolenaar  elseif s:line1 =~# '^!R!'
31719a09a18SBram Moolenaar    set ft=prescribe
31819a09a18SBram Moolenaar
319071d4279SBram Moolenaar    " Send-pr
3203a429efbSBram Moolenaar  elseif s:line1 =~# '^SEND-PR:'
321071d4279SBram Moolenaar    set ft=sendpr
322071d4279SBram Moolenaar
323071d4279SBram Moolenaar    " SNNS files
3243a429efbSBram Moolenaar  elseif s:line1 =~# '^SNNS network definition file'
325071d4279SBram Moolenaar    set ft=snnsnet
3263a429efbSBram Moolenaar  elseif s:line1 =~# '^SNNS pattern definition file'
327071d4279SBram Moolenaar    set ft=snnspat
3283a429efbSBram Moolenaar  elseif s:line1 =~# '^SNNS result file'
329071d4279SBram Moolenaar    set ft=snnsres
330071d4279SBram Moolenaar
331071d4279SBram Moolenaar    " Virata
3323a429efbSBram Moolenaar  elseif s:line1 =~# '^%.\{-}[Vv]irata'
3333a429efbSBram Moolenaar	\ || s:line2 =~# '^%.\{-}[Vv]irata'
3343a429efbSBram Moolenaar	\ || s:line3 =~# '^%.\{-}[Vv]irata'
3353a429efbSBram Moolenaar	\ || s:line4 =~# '^%.\{-}[Vv]irata'
3363a429efbSBram Moolenaar	\ || s:line5 =~# '^%.\{-}[Vv]irata'
337071d4279SBram Moolenaar    set ft=virata
338071d4279SBram Moolenaar
339071d4279SBram Moolenaar    " Strace
340c572da5fSBram Moolenaar  elseif s:line1 =~# '[0-9:.]* *execve(' || s:line1 =~# '^__libc_start_main'
341071d4279SBram Moolenaar    set ft=strace
342071d4279SBram Moolenaar
343071d4279SBram Moolenaar    " VSE JCL
3443a429efbSBram Moolenaar  elseif s:line1 =~# '^\* $$ JOB\>' || s:line1 =~# '^// *JOB\>'
345071d4279SBram Moolenaar    set ft=vsejcl
346071d4279SBram Moolenaar
347071d4279SBram Moolenaar    " TAK and SINDA
3483a429efbSBram Moolenaar  elseif s:line4 =~# 'K & K  Associates' || s:line2 =~# 'TAK 2000'
349071d4279SBram Moolenaar    set ft=takout
3503a429efbSBram Moolenaar  elseif s:line3 =~# 'S Y S T E M S   I M P R O V E D '
351071d4279SBram Moolenaar    set ft=sindaout
3523a429efbSBram Moolenaar  elseif getline(6) =~# 'Run Date: '
353071d4279SBram Moolenaar    set ft=takcmp
3543a429efbSBram Moolenaar  elseif getline(9) =~# 'Node    File  1'
355071d4279SBram Moolenaar    set ft=sindacmp
356071d4279SBram Moolenaar
357071d4279SBram Moolenaar    " DNS zone files
35801164a65SBram Moolenaar  elseif s:line1.s:line2.s:line3.s:line4 =~# '^; <<>> DiG [0-9.]\+.* <<>>\|$ORIGIN\|$TTL\|IN\s\+SOA'
359bd404149SBram Moolenaar    set ft=bindzone
360071d4279SBram Moolenaar
361071d4279SBram Moolenaar    " BAAN
3623a429efbSBram Moolenaar  elseif s:line1 =~# '|\*\{1,80}' && s:line2 =~# 'VRC '
3633a429efbSBram Moolenaar	\ || s:line2 =~# '|\*\{1,80}' && s:line3 =~# 'VRC '
364071d4279SBram Moolenaar    set ft=baan
365071d4279SBram Moolenaar
366071d4279SBram Moolenaar  " Valgrind
3673a429efbSBram Moolenaar  elseif s:line1 =~# '^==\d\+== valgrind' || s:line3 =~# '^==\d\+== Using valgrind'
368071d4279SBram Moolenaar    set ft=valgrind
369071d4279SBram Moolenaar
37034401ccaSBram Moolenaar  " Go docs
3713a429efbSBram Moolenaar  elseif s:line1 =~# '^PACKAGE DOCUMENTATION$'
37234401ccaSBram Moolenaar    set ft=godoc
37334401ccaSBram Moolenaar
374071d4279SBram Moolenaar  " Renderman Interface Bytestream
3753a429efbSBram Moolenaar  elseif s:line1 =~# '^##RenderMan'
376071d4279SBram Moolenaar    set ft=rib
377071d4279SBram Moolenaar
378071d4279SBram Moolenaar  " Scheme scripts
3793a429efbSBram Moolenaar  elseif s:line1 =~# 'exec\s\+\S*scheme' || s:line2 =~# 'exec\s\+\S*scheme'
380071d4279SBram Moolenaar    set ft=scheme
381071d4279SBram Moolenaar
382aba8857aSBram Moolenaar  " Git output
3833a429efbSBram Moolenaar  elseif s:line1 =~# '^\(commit\|tree\|object\) \x\{40\}\>\|^tag \S\+$'
384aba8857aSBram Moolenaar    set ft=git
385aba8857aSBram Moolenaar
386543b7ef7SBram Moolenaar   " Gprof (gnu profiler)
387543b7ef7SBram Moolenaar   elseif s:line1 == 'Flat profile:'
388543b7ef7SBram Moolenaar     \ && s:line2 == ''
3893a429efbSBram Moolenaar     \ && s:line3 =~# '^Each sample counts as .* seconds.$'
390543b7ef7SBram Moolenaar     set ft=gprof
391543b7ef7SBram Moolenaar
392203d04d7SBram Moolenaar  " Erlang terms
393203d04d7SBram Moolenaar  " (See also: http://www.gnu.org/software/emacs/manual/html_node/emacs/Choosing-Modes.html#Choosing-Modes)
394203d04d7SBram Moolenaar  elseif s:line1 =~? '-\*-.*erlang.*-\*-'
395203d04d7SBram Moolenaar    set ft=erlang
396203d04d7SBram Moolenaar
3978eab7313SBram Moolenaar  " YAML
3988eab7313SBram Moolenaar  elseif s:line1 =~# '^%YAML'
3998eab7313SBram Moolenaar    set ft=yaml
4008eab7313SBram Moolenaar
401314b773aSBram Moolenaar  " MikroTik RouterOS script
402314b773aSBram Moolenaar  elseif s:line1 =~# '^#.*by RouterOS.*$'
403314b773aSBram Moolenaar    set ft=routeros
404314b773aSBram Moolenaar
405071d4279SBram Moolenaar  " CVS diff
406071d4279SBram Moolenaar  else
4075c73622aSBram Moolenaar    let s:lnum = 1
4083a429efbSBram Moolenaar    while getline(s:lnum) =~# "^? " && s:lnum < line("$")
4095c73622aSBram Moolenaar      let s:lnum += 1
410071d4279SBram Moolenaar    endwhile
4113a429efbSBram Moolenaar    if getline(s:lnum) =~# '^Index:\s\+\f\+$'
412071d4279SBram Moolenaar      set ft=diff
413071d4279SBram Moolenaar
414071d4279SBram Moolenaar      " locale input files: Formal Definitions of Cultural Conventions
415071d4279SBram Moolenaar      " filename must be like en_US, fr_FR@euro or en_US.UTF-8
4163a429efbSBram Moolenaar    elseif expand("%") =~# '\a\a_\a\a\($\|[.@]\)\|i18n$\|POSIX$\|translit_'
4175c73622aSBram Moolenaar      let s:lnum = 1
4185c73622aSBram Moolenaar      while s:lnum < 100 && s:lnum < line("$")
4193a429efbSBram Moolenaar	if getline(s:lnum) =~# '^LC_\(IDENTIFICATION\|CTYPE\|COLLATE\|MONETARY\|NUMERIC\|TIME\|MESSAGES\|PAPER\|TELEPHONE\|MEASUREMENT\|NAME\|ADDRESS\)$'
420071d4279SBram Moolenaar	  setf fdcc
421071d4279SBram Moolenaar	  break
422071d4279SBram Moolenaar	endif
4235c73622aSBram Moolenaar	let s:lnum += 1
424071d4279SBram Moolenaar      endwhile
425071d4279SBram Moolenaar    endif
4265c73622aSBram Moolenaar    unlet s:lnum
427071d4279SBram Moolenaar
428071d4279SBram Moolenaar  endif
429071d4279SBram Moolenaar
430071d4279SBram Moolenaar  unlet s:line2 s:line3 s:line4 s:line5
431071d4279SBram Moolenaar
432071d4279SBram Moolenaarendif
433071d4279SBram Moolenaar
434071d4279SBram Moolenaar" Restore 'cpoptions'
435071d4279SBram Moolenaarlet &cpo = s:cpo_save
436071d4279SBram Moolenaar
437071d4279SBram Moolenaarunlet s:cpo_save s:line1
438