blob: 71e3f48bdfcdaf0a3b434c968a66de873d0b3140 [file] [log] [blame]
Bram Moolenaar071d4272004-06-13 20:20:40 +00001" Vim support file to detect file types in scripts
2"
3" Maintainer: Bram Moolenaar <Bram@vim.org>
Bram Moolenaard09a2062017-11-11 15:37:45 +01004" Last change: 2017 Nov 11
Bram Moolenaar071d4272004-06-13 20:20:40 +00005
6" This file is called by an autocommand for every file that has just been
7" loaded into a buffer. It checks if the type of file can be recognized by
8" the file contents. The autocommand is in $VIMRUNTIME/filetype.vim.
Bram Moolenaar3a429ef2017-06-11 17:10:32 +02009"
10" Note that the pattern matches are done with =~# to avoid the value of the
11" 'ignorecase' option making a difference. Where case is to be ignored use
12" =~? instead. Do not use =~ anywhere.
Bram Moolenaar071d4272004-06-13 20:20:40 +000013
14
15" Only do the rest when the FileType autocommand has not been triggered yet.
16if did_filetype()
17 finish
18endif
19
20" Load the user defined scripts file first
21" Only do this when the FileType autocommand has not been triggered yet
Bram Moolenaarf4630b62005-05-20 21:31:17 +000022if exists("myscriptsfile") && filereadable(expand(myscriptsfile))
Bram Moolenaar071d4272004-06-13 20:20:40 +000023 execute "source " . myscriptsfile
24 if did_filetype()
25 finish
26 endif
27endif
28
29" Line continuation is used here, remove 'C' from 'cpoptions'
30let s:cpo_save = &cpo
31set cpo&vim
32
33let s:line1 = getline(1)
34
Bram Moolenaar3a429ef2017-06-11 17:10:32 +020035if s:line1 =~# "^#!"
Bram Moolenaar071d4272004-06-13 20:20:40 +000036 " A script that starts with "#!".
37
38 " Check for a line like "#!/usr/bin/env VAR=val bash". Turn it into
39 " "#!/usr/bin/bash" to make matching easier.
Bram Moolenaar3a429ef2017-06-11 17:10:32 +020040 if s:line1 =~# '^#!\s*\S*\<env\s'
Bram Moolenaar071d4272004-06-13 20:20:40 +000041 let s:line1 = substitute(s:line1, '\S\+=\S\+', '', 'g')
42 let s:line1 = substitute(s:line1, '\<env\s\+', '', '')
43 endif
44
45 " Get the program name.
46 " Only accept spaces in PC style paths: "#!c:/program files/perl [args]".
Bram Moolenaarf4630b62005-05-20 21:31:17 +000047 " If the word env is used, use the first word after the space:
48 " "#!/usr/bin/env perl [path/args]"
Bram Moolenaar071d4272004-06-13 20:20:40 +000049 " If there is no path use the first word: "#!perl [path/args]".
50 " Otherwise get the last word after a slash: "#!/usr/bin/perl [path/args]".
Bram Moolenaar3a429ef2017-06-11 17:10:32 +020051 if s:line1 =~# '^#!\s*\a:[/\\]'
Bram Moolenaar071d4272004-06-13 20:20:40 +000052 let s:name = substitute(s:line1, '^#!.*[/\\]\(\i\+\).*', '\1', '')
Bram Moolenaar3a429ef2017-06-11 17:10:32 +020053 elseif s:line1 =~# '^#!.*\<env\>'
Bram Moolenaarf4630b62005-05-20 21:31:17 +000054 let s:name = substitute(s:line1, '^#!.*\<env\>\s\+\(\i\+\).*', '\1', '')
Bram Moolenaar3a429ef2017-06-11 17:10:32 +020055 elseif s:line1 =~# '^#!\s*[^/\\ ]*\>\([^/\\]\|$\)'
Bram Moolenaar071d4272004-06-13 20:20:40 +000056 let s:name = substitute(s:line1, '^#!\s*\([^/\\ ]*\>\).*', '\1', '')
57 else
58 let s:name = substitute(s:line1, '^#!\s*\S*[/\\]\(\i\+\).*', '\1', '')
59 endif
60
Bram Moolenaara8c4d562006-08-08 18:54:11 +000061 " tcl scripts may have #!/bin/sh in the first line and "exec wish" in the
62 " third line. Suggested by Steven Atkinson.
Bram Moolenaar3a429ef2017-06-11 17:10:32 +020063 if getline(3) =~# '^exec wish'
Bram Moolenaara8c4d562006-08-08 18:54:11 +000064 let s:name = 'wish'
65 endif
66
Bram Moolenaard4755bb2004-09-02 19:12:26 +000067 " Bourne-like shell scripts: bash bash2 ksh ksh93 sh
Bram Moolenaar3a429ef2017-06-11 17:10:32 +020068 if s:name =~# '^\(bash\d*\|\|ksh\d*\|sh\)\>'
Bram Moolenaard09a2062017-11-11 15:37:45 +010069 call dist#ft#SetFileTypeSH(s:line1) " defined in filetype.vim
Bram Moolenaar071d4272004-06-13 20:20:40 +000070
71 " csh scripts
Bram Moolenaar3a429ef2017-06-11 17:10:32 +020072 elseif s:name =~# '^csh\>'
Bram Moolenaar071d4272004-06-13 20:20:40 +000073 if exists("g:filetype_csh")
Bram Moolenaard09a2062017-11-11 15:37:45 +010074 call dist#ft#SetFileTypeShell(g:filetype_csh)
Bram Moolenaar071d4272004-06-13 20:20:40 +000075 else
Bram Moolenaard09a2062017-11-11 15:37:45 +010076 call dist#ft#SetFileTypeShell("csh")
Bram Moolenaar071d4272004-06-13 20:20:40 +000077 endif
78
79 " tcsh scripts
Bram Moolenaar3a429ef2017-06-11 17:10:32 +020080 elseif s:name =~# '^tcsh\>'
Bram Moolenaard09a2062017-11-11 15:37:45 +010081 call dist#ft#SetFileTypeShell("tcsh")
Bram Moolenaar071d4272004-06-13 20:20:40 +000082
83 " Z shell scripts
Bram Moolenaar3a429ef2017-06-11 17:10:32 +020084 elseif s:name =~# '^zsh\>'
Bram Moolenaar071d4272004-06-13 20:20:40 +000085 set ft=zsh
86
87 " TCL scripts
Bram Moolenaar3a429ef2017-06-11 17:10:32 +020088 elseif s:name =~# '^\(tclsh\|wish\|expectk\|itclsh\|itkwish\)\>'
Bram Moolenaar071d4272004-06-13 20:20:40 +000089 set ft=tcl
90
91 " Expect scripts
Bram Moolenaar3a429ef2017-06-11 17:10:32 +020092 elseif s:name =~# '^expect\>'
Bram Moolenaar071d4272004-06-13 20:20:40 +000093 set ft=expect
94
95 " Gnuplot scripts
Bram Moolenaar3a429ef2017-06-11 17:10:32 +020096 elseif s:name =~# '^gnuplot\>'
Bram Moolenaar071d4272004-06-13 20:20:40 +000097 set ft=gnuplot
98
99 " Makefiles
Bram Moolenaar3a429ef2017-06-11 17:10:32 +0200100 elseif s:name =~# 'make\>'
Bram Moolenaar071d4272004-06-13 20:20:40 +0000101 set ft=make
102
Bram Moolenaar40962ec2018-01-28 22:47:25 +0100103 " Pike
104 elseif s:name =~# '^pike\%(\>\|[0-9]\)'
105 set ft=pike
106
Bram Moolenaarf4630b62005-05-20 21:31:17 +0000107 " Lua
Bram Moolenaar3a429ef2017-06-11 17:10:32 +0200108 elseif s:name =~# 'lua'
Bram Moolenaarf4630b62005-05-20 21:31:17 +0000109 set ft=lua
110
Bram Moolenaar3b72f1d2010-07-29 23:12:43 +0200111 " Perl 6
Bram Moolenaar3a429ef2017-06-11 17:10:32 +0200112 elseif s:name =~# 'perl6'
Bram Moolenaar3b72f1d2010-07-29 23:12:43 +0200113 set ft=perl6
114
Bram Moolenaar071d4272004-06-13 20:20:40 +0000115 " Perl
Bram Moolenaar3a429ef2017-06-11 17:10:32 +0200116 elseif s:name =~# 'perl'
Bram Moolenaar071d4272004-06-13 20:20:40 +0000117 set ft=perl
118
119 " PHP
Bram Moolenaar3a429ef2017-06-11 17:10:32 +0200120 elseif s:name =~# 'php'
Bram Moolenaar071d4272004-06-13 20:20:40 +0000121 set ft=php
122
123 " Python
Bram Moolenaar3a429ef2017-06-11 17:10:32 +0200124 elseif s:name =~# 'python'
Bram Moolenaar071d4272004-06-13 20:20:40 +0000125 set ft=python
126
127 " Groovy
Bram Moolenaar3a429ef2017-06-11 17:10:32 +0200128 elseif s:name =~# '^groovy\>'
Bram Moolenaar071d4272004-06-13 20:20:40 +0000129 set ft=groovy
130
131 " Ruby
Bram Moolenaar3a429ef2017-06-11 17:10:32 +0200132 elseif s:name =~# 'ruby'
Bram Moolenaar071d4272004-06-13 20:20:40 +0000133 set ft=ruby
134
Bram Moolenaar214641f2017-03-05 17:04:09 +0100135 " JavaScript
Bram Moolenaar3a429ef2017-06-11 17:10:32 +0200136 elseif s:name =~# 'node\(js\)\=\>' || s:name =~# 'rhino\>'
Bram Moolenaar214641f2017-03-05 17:04:09 +0100137 set ft=javascript
138
Bram Moolenaar071d4272004-06-13 20:20:40 +0000139 " BC calculator
Bram Moolenaar3a429ef2017-06-11 17:10:32 +0200140 elseif s:name =~# '^bc\>'
Bram Moolenaar071d4272004-06-13 20:20:40 +0000141 set ft=bc
142
143 " sed
Bram Moolenaar3a429ef2017-06-11 17:10:32 +0200144 elseif s:name =~# 'sed\>'
Bram Moolenaar071d4272004-06-13 20:20:40 +0000145 set ft=sed
146
147 " OCaml-scripts
Bram Moolenaar3a429ef2017-06-11 17:10:32 +0200148 elseif s:name =~# 'ocaml'
Bram Moolenaar071d4272004-06-13 20:20:40 +0000149 set ft=ocaml
150
151 " Awk scripts
Bram Moolenaar3a429ef2017-06-11 17:10:32 +0200152 elseif s:name =~# 'awk\>'
Bram Moolenaar071d4272004-06-13 20:20:40 +0000153 set ft=awk
154
155 " Website MetaLanguage
Bram Moolenaar3a429ef2017-06-11 17:10:32 +0200156 elseif s:name =~# 'wml'
Bram Moolenaar071d4272004-06-13 20:20:40 +0000157 set ft=wml
158
159 " Scheme scripts
Bram Moolenaar3a429ef2017-06-11 17:10:32 +0200160 elseif s:name =~# 'scheme'
Bram Moolenaar071d4272004-06-13 20:20:40 +0000161 set ft=scheme
162
Bram Moolenaaraf289d32005-10-12 21:01:44 +0000163 " CFEngine scripts
Bram Moolenaar3a429ef2017-06-11 17:10:32 +0200164 elseif s:name =~# 'cfengine'
Bram Moolenaaraf289d32005-10-12 21:01:44 +0000165 set ft=cfengine
166
Bram Moolenaar203d04d2013-06-06 21:36:40 +0200167 " Erlang scripts
Bram Moolenaar3a429ef2017-06-11 17:10:32 +0200168 elseif s:name =~# 'escript'
Bram Moolenaar203d04d2013-06-06 21:36:40 +0200169 set ft=erlang
170
Bram Moolenaar214641f2017-03-05 17:04:09 +0100171 " Haskell
Bram Moolenaar3a429ef2017-06-11 17:10:32 +0200172 elseif s:name =~# 'haskell'
Bram Moolenaar214641f2017-03-05 17:04:09 +0100173 set ft=haskell
174
175 " Scala
Bram Moolenaar3a429ef2017-06-11 17:10:32 +0200176 elseif s:name =~# 'scala\>'
Bram Moolenaar214641f2017-03-05 17:04:09 +0100177 set ft=scala
178
Bram Moolenaar071d4272004-06-13 20:20:40 +0000179 endif
180 unlet s:name
181
182else
183 " File does not start with "#!".
184
185 let s:line2 = getline(2)
186 let s:line3 = getline(3)
187 let s:line4 = getline(4)
188 let s:line5 = getline(5)
189
190 " Bourne-like shell scripts: sh ksh bash bash2
Bram Moolenaar3a429ef2017-06-11 17:10:32 +0200191 if s:line1 =~# '^:$'
Bram Moolenaard09a2062017-11-11 15:37:45 +0100192 call dist#ft#SetFileTypeSH(s:line1) " defined in filetype.vim
Bram Moolenaar071d4272004-06-13 20:20:40 +0000193
194 " Z shell scripts
Bram Moolenaar3a429ef2017-06-11 17:10:32 +0200195 elseif s:line1 =~# '^#compdef\>' || s:line1 =~# '^#autoload\>' ||
196 \ "\n".s:line1."\n".s:line2."\n".s:line3."\n".s:line4."\n".s:line5 =~# '\n\s*emulate\s\+\%(-[LR]\s\+\)\=[ckz]\=sh\>'
Bram Moolenaar071d4272004-06-13 20:20:40 +0000197 set ft=zsh
198
199 " ELM Mail files
Bram Moolenaar3a429ef2017-06-11 17:10:32 +0200200 elseif s:line1 =~# '^From \([a-zA-Z][a-zA-Z_0-9\.=-]*\(@[^ ]*\)\=\|-\) .* \(19\|20\)\d\d$'
Bram Moolenaar071d4272004-06-13 20:20:40 +0000201 set ft=mail
202
203 " Mason
Bram Moolenaar3a429ef2017-06-11 17:10:32 +0200204 elseif s:line1 =~# '^<[%&].*>'
Bram Moolenaar071d4272004-06-13 20:20:40 +0000205 set ft=mason
206
207 " Vim scripts (must have '" vim' as the first line to trigger this)
Bram Moolenaar3a429ef2017-06-11 17:10:32 +0200208 elseif s:line1 =~# '^" *[vV]im$'
Bram Moolenaar071d4272004-06-13 20:20:40 +0000209 set ft=vim
210
211 " MOO
Bram Moolenaar3a429ef2017-06-11 17:10:32 +0200212 elseif s:line1 =~# '^\*\* LambdaMOO Database, Format Version \%([1-3]\>\)\@!\d\+ \*\*$'
Bram Moolenaar071d4272004-06-13 20:20:40 +0000213 set ft=moo
214
215 " Diff file:
216 " - "diff" in first line (context diff)
217 " - "Only in " in first line
218 " - "--- " in first line and "+++ " in second line (unified diff).
219 " - "*** " in first line and "--- " in second line (context diff).
220 " - "# It was generated by makepatch " in the second line (makepatch diff).
221 " - "Index: <filename>" in the first line (CVS file)
Bram Moolenaar899dddf2006-03-26 21:06:50 +0000222 " - "=== ", line of "=", "---", "+++ " (SVK diff)
Bram Moolenaard2cec5b2006-03-28 21:08:56 +0000223 " - "=== ", "--- ", "+++ " (bzr diff, common case)
224 " - "=== (removed|added|renamed|modified)" (bzr diff, alternative)
Bram Moolenaard09acef2012-09-21 14:54:30 +0200225 " - "# HG changeset patch" in first line (Mercurial export format)
Bram Moolenaar3a429ef2017-06-11 17:10:32 +0200226 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\)'
227 \ || (s:line1 =~# '^--- ' && s:line2 =~# '^+++ ')
228 \ || (s:line1 =~# '^\* looking for ' && s:line2 =~# '^\* comparing to ')
229 \ || (s:line1 =~# '^\*\*\* ' && s:line2 =~# '^--- ')
230 \ || (s:line1 =~# '^=== ' && ((s:line2 =~# '^=\{66\}' && s:line3 =~# '^--- ' && s:line4 =~# '^+++') || (s:line2 =~# '^--- ' && s:line3 =~# '^+++ ')))
231 \ || (s:line1 =~# '^=== \(removed\|added\|renamed\|modified\)')
Bram Moolenaar071d4272004-06-13 20:20:40 +0000232 set ft=diff
233
234 " PostScript Files (must have %!PS as the first line, like a2ps output)
Bram Moolenaar3a429ef2017-06-11 17:10:32 +0200235 elseif s:line1 =~# '^%![ \t]*PS'
Bram Moolenaar071d4272004-06-13 20:20:40 +0000236 set ft=postscr
237
238 " M4 scripts: Guess there is a line that starts with "dnl".
Bram Moolenaar3a429ef2017-06-11 17:10:32 +0200239 elseif s:line1 =~# '^\s*dnl\>'
240 \ || s:line2 =~# '^\s*dnl\>'
241 \ || s:line3 =~# '^\s*dnl\>'
242 \ || s:line4 =~# '^\s*dnl\>'
243 \ || s:line5 =~# '^\s*dnl\>'
Bram Moolenaar071d4272004-06-13 20:20:40 +0000244 set ft=m4
245
246 " AmigaDos scripts
247 elseif $TERM == "amiga"
Bram Moolenaar3a429ef2017-06-11 17:10:32 +0200248 \ && (s:line1 =~# "^;" || s:line1 =~? '^\.bra')
Bram Moolenaar071d4272004-06-13 20:20:40 +0000249 set ft=amiga
250
251 " SiCAD scripts (must have procn or procd as the first line to trigger this)
252 elseif s:line1 =~? '^ *proc[nd] *$'
253 set ft=sicad
254
255 " Purify log files start with "**** Purify"
Bram Moolenaar3a429ef2017-06-11 17:10:32 +0200256 elseif s:line1 =~# '^\*\*\*\* Purify'
Bram Moolenaar071d4272004-06-13 20:20:40 +0000257 set ft=purifylog
258
259 " XML
Bram Moolenaar3a429ef2017-06-11 17:10:32 +0200260 elseif s:line1 =~# '<?\s*xml.*?>'
Bram Moolenaar071d4272004-06-13 20:20:40 +0000261 set ft=xml
262
263 " XHTML (e.g.: PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN")
Bram Moolenaar3a429ef2017-06-11 17:10:32 +0200264 elseif s:line1 =~# '\<DTD\s\+XHTML\s'
Bram Moolenaar071d4272004-06-13 20:20:40 +0000265 set ft=xhtml
266
Bram Moolenaar12b87e52008-08-25 03:04:18 +0000267 " HTML (e.g.: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN")
Bram Moolenaar26852122016-05-24 20:02:38 +0200268 " Avoid "doctype html", used by slim.
269 elseif s:line1 =~? '<!DOCTYPE\s\+html\>'
Bram Moolenaar12b87e52008-08-25 03:04:18 +0000270 set ft=html
271
Bram Moolenaaraba88572008-06-25 20:13:35 +0000272 " PDF
Bram Moolenaar3a429ef2017-06-11 17:10:32 +0200273 elseif s:line1 =~# '^%PDF-'
Bram Moolenaaraba88572008-06-25 20:13:35 +0000274 set ft=pdf
275
Bram Moolenaar071d4272004-06-13 20:20:40 +0000276 " XXD output
Bram Moolenaar3a429ef2017-06-11 17:10:32 +0200277 elseif s:line1 =~# '^\x\{7}: \x\{2} \=\x\{2} \=\x\{2} \=\x\{2} '
Bram Moolenaar071d4272004-06-13 20:20:40 +0000278 set ft=xxd
279
280 " RCS/CVS log output
Bram Moolenaar3a429ef2017-06-11 17:10:32 +0200281 elseif s:line1 =~# '^RCS file:' || s:line2 =~# '^RCS file:'
Bram Moolenaar071d4272004-06-13 20:20:40 +0000282 set ft=rcslog
283
284 " CVS commit
Bram Moolenaar3a429ef2017-06-11 17:10:32 +0200285 elseif s:line2 =~# '^CVS:' || getline("$") =~# '^CVS: '
Bram Moolenaar071d4272004-06-13 20:20:40 +0000286 set ft=cvs
287
Bram Moolenaar19a09a12005-03-04 23:39:37 +0000288 " Prescribe
Bram Moolenaar3a429ef2017-06-11 17:10:32 +0200289 elseif s:line1 =~# '^!R!'
Bram Moolenaar19a09a12005-03-04 23:39:37 +0000290 set ft=prescribe
291
Bram Moolenaar071d4272004-06-13 20:20:40 +0000292 " Send-pr
Bram Moolenaar3a429ef2017-06-11 17:10:32 +0200293 elseif s:line1 =~# '^SEND-PR:'
Bram Moolenaar071d4272004-06-13 20:20:40 +0000294 set ft=sendpr
295
296 " SNNS files
Bram Moolenaar3a429ef2017-06-11 17:10:32 +0200297 elseif s:line1 =~# '^SNNS network definition file'
Bram Moolenaar071d4272004-06-13 20:20:40 +0000298 set ft=snnsnet
Bram Moolenaar3a429ef2017-06-11 17:10:32 +0200299 elseif s:line1 =~# '^SNNS pattern definition file'
Bram Moolenaar071d4272004-06-13 20:20:40 +0000300 set ft=snnspat
Bram Moolenaar3a429ef2017-06-11 17:10:32 +0200301 elseif s:line1 =~# '^SNNS result file'
Bram Moolenaar071d4272004-06-13 20:20:40 +0000302 set ft=snnsres
303
304 " Virata
Bram Moolenaar3a429ef2017-06-11 17:10:32 +0200305 elseif s:line1 =~# '^%.\{-}[Vv]irata'
306 \ || s:line2 =~# '^%.\{-}[Vv]irata'
307 \ || s:line3 =~# '^%.\{-}[Vv]irata'
308 \ || s:line4 =~# '^%.\{-}[Vv]irata'
309 \ || s:line5 =~# '^%.\{-}[Vv]irata'
Bram Moolenaar071d4272004-06-13 20:20:40 +0000310 set ft=virata
311
312 " Strace
Bram Moolenaarc572da52017-08-27 16:52:01 +0200313 elseif s:line1 =~# '[0-9:.]* *execve(' || s:line1 =~# '^__libc_start_main'
Bram Moolenaar071d4272004-06-13 20:20:40 +0000314 set ft=strace
315
316 " VSE JCL
Bram Moolenaar3a429ef2017-06-11 17:10:32 +0200317 elseif s:line1 =~# '^\* $$ JOB\>' || s:line1 =~# '^// *JOB\>'
Bram Moolenaar071d4272004-06-13 20:20:40 +0000318 set ft=vsejcl
319
320 " TAK and SINDA
Bram Moolenaar3a429ef2017-06-11 17:10:32 +0200321 elseif s:line4 =~# 'K & K Associates' || s:line2 =~# 'TAK 2000'
Bram Moolenaar071d4272004-06-13 20:20:40 +0000322 set ft=takout
Bram Moolenaar3a429ef2017-06-11 17:10:32 +0200323 elseif s:line3 =~# 'S Y S T E M S I M P R O V E D '
Bram Moolenaar071d4272004-06-13 20:20:40 +0000324 set ft=sindaout
Bram Moolenaar3a429ef2017-06-11 17:10:32 +0200325 elseif getline(6) =~# 'Run Date: '
Bram Moolenaar071d4272004-06-13 20:20:40 +0000326 set ft=takcmp
Bram Moolenaar3a429ef2017-06-11 17:10:32 +0200327 elseif getline(9) =~# 'Node File 1'
Bram Moolenaar071d4272004-06-13 20:20:40 +0000328 set ft=sindacmp
329
330 " DNS zone files
Bram Moolenaar01164a62017-11-02 22:58:42 +0100331 elseif s:line1.s:line2.s:line3.s:line4 =~# '^; <<>> DiG [0-9.]\+.* <<>>\|$ORIGIN\|$TTL\|IN\s\+SOA'
Bram Moolenaarbd404142006-03-25 22:05:04 +0000332 set ft=bindzone
Bram Moolenaar071d4272004-06-13 20:20:40 +0000333
334 " BAAN
Bram Moolenaar3a429ef2017-06-11 17:10:32 +0200335 elseif s:line1 =~# '|\*\{1,80}' && s:line2 =~# 'VRC '
336 \ || s:line2 =~# '|\*\{1,80}' && s:line3 =~# 'VRC '
Bram Moolenaar071d4272004-06-13 20:20:40 +0000337 set ft=baan
338
339 " Valgrind
Bram Moolenaar3a429ef2017-06-11 17:10:32 +0200340 elseif s:line1 =~# '^==\d\+== valgrind' || s:line3 =~# '^==\d\+== Using valgrind'
Bram Moolenaar071d4272004-06-13 20:20:40 +0000341 set ft=valgrind
342
Bram Moolenaar34401cc2014-08-29 15:12:19 +0200343 " Go docs
Bram Moolenaar3a429ef2017-06-11 17:10:32 +0200344 elseif s:line1 =~# '^PACKAGE DOCUMENTATION$'
Bram Moolenaar34401cc2014-08-29 15:12:19 +0200345 set ft=godoc
346
Bram Moolenaar071d4272004-06-13 20:20:40 +0000347 " Renderman Interface Bytestream
Bram Moolenaar3a429ef2017-06-11 17:10:32 +0200348 elseif s:line1 =~# '^##RenderMan'
Bram Moolenaar071d4272004-06-13 20:20:40 +0000349 set ft=rib
350
351 " Scheme scripts
Bram Moolenaar3a429ef2017-06-11 17:10:32 +0200352 elseif s:line1 =~# 'exec\s\+\S*scheme' || s:line2 =~# 'exec\s\+\S*scheme'
Bram Moolenaar071d4272004-06-13 20:20:40 +0000353 set ft=scheme
354
Bram Moolenaaraba88572008-06-25 20:13:35 +0000355 " Git output
Bram Moolenaar3a429ef2017-06-11 17:10:32 +0200356 elseif s:line1 =~# '^\(commit\|tree\|object\) \x\{40\}\>\|^tag \S\+$'
Bram Moolenaaraba88572008-06-25 20:13:35 +0000357 set ft=git
358
Bram Moolenaar543b7ef2013-06-01 14:50:56 +0200359 " Gprof (gnu profiler)
360 elseif s:line1 == 'Flat profile:'
361 \ && s:line2 == ''
Bram Moolenaar3a429ef2017-06-11 17:10:32 +0200362 \ && s:line3 =~# '^Each sample counts as .* seconds.$'
Bram Moolenaar543b7ef2013-06-01 14:50:56 +0200363 set ft=gprof
364
Bram Moolenaar203d04d2013-06-06 21:36:40 +0200365 " Erlang terms
366 " (See also: http://www.gnu.org/software/emacs/manual/html_node/emacs/Choosing-Modes.html#Choosing-Modes)
367 elseif s:line1 =~? '-\*-.*erlang.*-\*-'
368 set ft=erlang
369
Bram Moolenaar071d4272004-06-13 20:20:40 +0000370 " CVS diff
371 else
Bram Moolenaar5c736222010-01-06 20:54:52 +0100372 let s:lnum = 1
Bram Moolenaar3a429ef2017-06-11 17:10:32 +0200373 while getline(s:lnum) =~# "^? " && s:lnum < line("$")
Bram Moolenaar5c736222010-01-06 20:54:52 +0100374 let s:lnum += 1
Bram Moolenaar071d4272004-06-13 20:20:40 +0000375 endwhile
Bram Moolenaar3a429ef2017-06-11 17:10:32 +0200376 if getline(s:lnum) =~# '^Index:\s\+\f\+$'
Bram Moolenaar071d4272004-06-13 20:20:40 +0000377 set ft=diff
378
379 " locale input files: Formal Definitions of Cultural Conventions
380 " filename must be like en_US, fr_FR@euro or en_US.UTF-8
Bram Moolenaar3a429ef2017-06-11 17:10:32 +0200381 elseif expand("%") =~# '\a\a_\a\a\($\|[.@]\)\|i18n$\|POSIX$\|translit_'
Bram Moolenaar5c736222010-01-06 20:54:52 +0100382 let s:lnum = 1
383 while s:lnum < 100 && s:lnum < line("$")
Bram Moolenaar3a429ef2017-06-11 17:10:32 +0200384 if getline(s:lnum) =~# '^LC_\(IDENTIFICATION\|CTYPE\|COLLATE\|MONETARY\|NUMERIC\|TIME\|MESSAGES\|PAPER\|TELEPHONE\|MEASUREMENT\|NAME\|ADDRESS\)$'
Bram Moolenaar071d4272004-06-13 20:20:40 +0000385 setf fdcc
386 break
387 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +0100388 let s:lnum += 1
Bram Moolenaar071d4272004-06-13 20:20:40 +0000389 endwhile
390 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +0100391 unlet s:lnum
Bram Moolenaar071d4272004-06-13 20:20:40 +0000392
393 endif
394
395 unlet s:line2 s:line3 s:line4 s:line5
396
397endif
398
399" Restore 'cpoptions'
400let &cpo = s:cpo_save
401
402unlet s:cpo_save s:line1