blob: a690431014e496bbf8750edf89ae0eb6f9ab3ee2 [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 Moolenaar790c18b2019-07-04 17:22:06 +02004" Last change: 2019 Jun 25
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 Moolenaar4bc0bed2018-02-03 22:35:40 +0100136 elseif s:name =~# 'node\(js\)\=\>\|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 Moolenaar8fd2ffc2018-02-03 15:43:15 +0100179 " Clojure
180 elseif s:name =~# 'clojure'
181 set ft=clojure
182
Bram Moolenaar071d4272004-06-13 20:20:40 +0000183 endif
184 unlet s:name
185
186else
187 " File does not start with "#!".
188
189 let s:line2 = getline(2)
190 let s:line3 = getline(3)
191 let s:line4 = getline(4)
192 let s:line5 = getline(5)
193
194 " Bourne-like shell scripts: sh ksh bash bash2
Bram Moolenaar3a429ef2017-06-11 17:10:32 +0200195 if s:line1 =~# '^:$'
Bram Moolenaard09a2062017-11-11 15:37:45 +0100196 call dist#ft#SetFileTypeSH(s:line1) " defined in filetype.vim
Bram Moolenaar071d4272004-06-13 20:20:40 +0000197
Bram Moolenaar6a7af8e2019-06-25 21:34:26 +0200198 " Z shell scripts
Bram Moolenaar3a429ef2017-06-11 17:10:32 +0200199 elseif s:line1 =~# '^#compdef\>' || s:line1 =~# '^#autoload\>' ||
200 \ "\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 +0000201 set ft=zsh
202
203 " ELM Mail files
Bram Moolenaar3a429ef2017-06-11 17:10:32 +0200204 elseif s:line1 =~# '^From \([a-zA-Z][a-zA-Z_0-9\.=-]*\(@[^ ]*\)\=\|-\) .* \(19\|20\)\d\d$'
Bram Moolenaar071d4272004-06-13 20:20:40 +0000205 set ft=mail
206
Bram Moolenaar6a7af8e2019-06-25 21:34:26 +0200207 " Mason
Bram Moolenaar3a429ef2017-06-11 17:10:32 +0200208 elseif s:line1 =~# '^<[%&].*>'
Bram Moolenaar071d4272004-06-13 20:20:40 +0000209 set ft=mason
210
Bram Moolenaar6a7af8e2019-06-25 21:34:26 +0200211 " Vim scripts (must have '" vim' as the first line to trigger this)
Bram Moolenaar3a429ef2017-06-11 17:10:32 +0200212 elseif s:line1 =~# '^" *[vV]im$'
Bram Moolenaar071d4272004-06-13 20:20:40 +0000213 set ft=vim
214
Bram Moolenaar6a7af8e2019-06-25 21:34:26 +0200215 " libcxx and libstdc++ standard library headers like "iostream" do not have
216 " an extension, recognize the Emacs file mode.
217 elseif s:line1 =~? '-\*-.*C++.*-\*-'
218 set ft=cpp
219
220 " MOO
Bram Moolenaar3a429ef2017-06-11 17:10:32 +0200221 elseif s:line1 =~# '^\*\* LambdaMOO Database, Format Version \%([1-3]\>\)\@!\d\+ \*\*$'
Bram Moolenaar071d4272004-06-13 20:20:40 +0000222 set ft=moo
223
224 " Diff file:
225 " - "diff" in first line (context diff)
226 " - "Only in " in first line
227 " - "--- " in first line and "+++ " in second line (unified diff).
228 " - "*** " in first line and "--- " in second line (context diff).
229 " - "# It was generated by makepatch " in the second line (makepatch diff).
230 " - "Index: <filename>" in the first line (CVS file)
Bram Moolenaar899dddf2006-03-26 21:06:50 +0000231 " - "=== ", line of "=", "---", "+++ " (SVK diff)
Bram Moolenaard2cec5b2006-03-28 21:08:56 +0000232 " - "=== ", "--- ", "+++ " (bzr diff, common case)
233 " - "=== (removed|added|renamed|modified)" (bzr diff, alternative)
Bram Moolenaard09acef2012-09-21 14:54:30 +0200234 " - "# HG changeset patch" in first line (Mercurial export format)
Bram Moolenaar3a429ef2017-06-11 17:10:32 +0200235 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\)'
236 \ || (s:line1 =~# '^--- ' && s:line2 =~# '^+++ ')
237 \ || (s:line1 =~# '^\* looking for ' && s:line2 =~# '^\* comparing to ')
238 \ || (s:line1 =~# '^\*\*\* ' && s:line2 =~# '^--- ')
239 \ || (s:line1 =~# '^=== ' && ((s:line2 =~# '^=\{66\}' && s:line3 =~# '^--- ' && s:line4 =~# '^+++') || (s:line2 =~# '^--- ' && s:line3 =~# '^+++ ')))
240 \ || (s:line1 =~# '^=== \(removed\|added\|renamed\|modified\)')
Bram Moolenaar071d4272004-06-13 20:20:40 +0000241 set ft=diff
242
243 " PostScript Files (must have %!PS as the first line, like a2ps output)
Bram Moolenaar3a429ef2017-06-11 17:10:32 +0200244 elseif s:line1 =~# '^%![ \t]*PS'
Bram Moolenaar071d4272004-06-13 20:20:40 +0000245 set ft=postscr
246
247 " M4 scripts: Guess there is a line that starts with "dnl".
Bram Moolenaar3a429ef2017-06-11 17:10:32 +0200248 elseif s:line1 =~# '^\s*dnl\>'
249 \ || s:line2 =~# '^\s*dnl\>'
250 \ || s:line3 =~# '^\s*dnl\>'
251 \ || s:line4 =~# '^\s*dnl\>'
252 \ || s:line5 =~# '^\s*dnl\>'
Bram Moolenaar071d4272004-06-13 20:20:40 +0000253 set ft=m4
254
255 " AmigaDos scripts
256 elseif $TERM == "amiga"
Bram Moolenaar3a429ef2017-06-11 17:10:32 +0200257 \ && (s:line1 =~# "^;" || s:line1 =~? '^\.bra')
Bram Moolenaar071d4272004-06-13 20:20:40 +0000258 set ft=amiga
259
260 " SiCAD scripts (must have procn or procd as the first line to trigger this)
261 elseif s:line1 =~? '^ *proc[nd] *$'
262 set ft=sicad
263
264 " Purify log files start with "**** Purify"
Bram Moolenaar3a429ef2017-06-11 17:10:32 +0200265 elseif s:line1 =~# '^\*\*\*\* Purify'
Bram Moolenaar071d4272004-06-13 20:20:40 +0000266 set ft=purifylog
267
268 " XML
Bram Moolenaar3a429ef2017-06-11 17:10:32 +0200269 elseif s:line1 =~# '<?\s*xml.*?>'
Bram Moolenaar071d4272004-06-13 20:20:40 +0000270 set ft=xml
271
272 " XHTML (e.g.: PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN")
Bram Moolenaar3a429ef2017-06-11 17:10:32 +0200273 elseif s:line1 =~# '\<DTD\s\+XHTML\s'
Bram Moolenaar071d4272004-06-13 20:20:40 +0000274 set ft=xhtml
275
Bram Moolenaar12b87e52008-08-25 03:04:18 +0000276 " HTML (e.g.: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN")
Bram Moolenaar26852122016-05-24 20:02:38 +0200277 " Avoid "doctype html", used by slim.
278 elseif s:line1 =~? '<!DOCTYPE\s\+html\>'
Bram Moolenaar12b87e52008-08-25 03:04:18 +0000279 set ft=html
280
Bram Moolenaaraba88572008-06-25 20:13:35 +0000281 " PDF
Bram Moolenaar3a429ef2017-06-11 17:10:32 +0200282 elseif s:line1 =~# '^%PDF-'
Bram Moolenaaraba88572008-06-25 20:13:35 +0000283 set ft=pdf
284
Bram Moolenaar071d4272004-06-13 20:20:40 +0000285 " XXD output
Bram Moolenaar3a429ef2017-06-11 17:10:32 +0200286 elseif s:line1 =~# '^\x\{7}: \x\{2} \=\x\{2} \=\x\{2} \=\x\{2} '
Bram Moolenaar071d4272004-06-13 20:20:40 +0000287 set ft=xxd
288
289 " RCS/CVS log output
Bram Moolenaar3a429ef2017-06-11 17:10:32 +0200290 elseif s:line1 =~# '^RCS file:' || s:line2 =~# '^RCS file:'
Bram Moolenaar071d4272004-06-13 20:20:40 +0000291 set ft=rcslog
292
293 " CVS commit
Bram Moolenaar3a429ef2017-06-11 17:10:32 +0200294 elseif s:line2 =~# '^CVS:' || getline("$") =~# '^CVS: '
Bram Moolenaar071d4272004-06-13 20:20:40 +0000295 set ft=cvs
296
Bram Moolenaar19a09a12005-03-04 23:39:37 +0000297 " Prescribe
Bram Moolenaar3a429ef2017-06-11 17:10:32 +0200298 elseif s:line1 =~# '^!R!'
Bram Moolenaar19a09a12005-03-04 23:39:37 +0000299 set ft=prescribe
300
Bram Moolenaar071d4272004-06-13 20:20:40 +0000301 " Send-pr
Bram Moolenaar3a429ef2017-06-11 17:10:32 +0200302 elseif s:line1 =~# '^SEND-PR:'
Bram Moolenaar071d4272004-06-13 20:20:40 +0000303 set ft=sendpr
304
305 " SNNS files
Bram Moolenaar3a429ef2017-06-11 17:10:32 +0200306 elseif s:line1 =~# '^SNNS network definition file'
Bram Moolenaar071d4272004-06-13 20:20:40 +0000307 set ft=snnsnet
Bram Moolenaar3a429ef2017-06-11 17:10:32 +0200308 elseif s:line1 =~# '^SNNS pattern definition file'
Bram Moolenaar071d4272004-06-13 20:20:40 +0000309 set ft=snnspat
Bram Moolenaar3a429ef2017-06-11 17:10:32 +0200310 elseif s:line1 =~# '^SNNS result file'
Bram Moolenaar071d4272004-06-13 20:20:40 +0000311 set ft=snnsres
312
313 " Virata
Bram Moolenaar3a429ef2017-06-11 17:10:32 +0200314 elseif s:line1 =~# '^%.\{-}[Vv]irata'
315 \ || s:line2 =~# '^%.\{-}[Vv]irata'
316 \ || s:line3 =~# '^%.\{-}[Vv]irata'
317 \ || s:line4 =~# '^%.\{-}[Vv]irata'
318 \ || s:line5 =~# '^%.\{-}[Vv]irata'
Bram Moolenaar071d4272004-06-13 20:20:40 +0000319 set ft=virata
320
321 " Strace
Bram Moolenaarc572da52017-08-27 16:52:01 +0200322 elseif s:line1 =~# '[0-9:.]* *execve(' || s:line1 =~# '^__libc_start_main'
Bram Moolenaar071d4272004-06-13 20:20:40 +0000323 set ft=strace
324
325 " VSE JCL
Bram Moolenaar3a429ef2017-06-11 17:10:32 +0200326 elseif s:line1 =~# '^\* $$ JOB\>' || s:line1 =~# '^// *JOB\>'
Bram Moolenaar071d4272004-06-13 20:20:40 +0000327 set ft=vsejcl
328
329 " TAK and SINDA
Bram Moolenaar3a429ef2017-06-11 17:10:32 +0200330 elseif s:line4 =~# 'K & K Associates' || s:line2 =~# 'TAK 2000'
Bram Moolenaar071d4272004-06-13 20:20:40 +0000331 set ft=takout
Bram Moolenaar3a429ef2017-06-11 17:10:32 +0200332 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 +0000333 set ft=sindaout
Bram Moolenaar3a429ef2017-06-11 17:10:32 +0200334 elseif getline(6) =~# 'Run Date: '
Bram Moolenaar071d4272004-06-13 20:20:40 +0000335 set ft=takcmp
Bram Moolenaar3a429ef2017-06-11 17:10:32 +0200336 elseif getline(9) =~# 'Node File 1'
Bram Moolenaar071d4272004-06-13 20:20:40 +0000337 set ft=sindacmp
338
339 " DNS zone files
Bram Moolenaar01164a62017-11-02 22:58:42 +0100340 elseif s:line1.s:line2.s:line3.s:line4 =~# '^; <<>> DiG [0-9.]\+.* <<>>\|$ORIGIN\|$TTL\|IN\s\+SOA'
Bram Moolenaarbd404142006-03-25 22:05:04 +0000341 set ft=bindzone
Bram Moolenaar071d4272004-06-13 20:20:40 +0000342
343 " BAAN
Bram Moolenaar3a429ef2017-06-11 17:10:32 +0200344 elseif s:line1 =~# '|\*\{1,80}' && s:line2 =~# 'VRC '
345 \ || s:line2 =~# '|\*\{1,80}' && s:line3 =~# 'VRC '
Bram Moolenaar071d4272004-06-13 20:20:40 +0000346 set ft=baan
347
348 " Valgrind
Bram Moolenaar3a429ef2017-06-11 17:10:32 +0200349 elseif s:line1 =~# '^==\d\+== valgrind' || s:line3 =~# '^==\d\+== Using valgrind'
Bram Moolenaar071d4272004-06-13 20:20:40 +0000350 set ft=valgrind
351
Bram Moolenaar34401cc2014-08-29 15:12:19 +0200352 " Go docs
Bram Moolenaar3a429ef2017-06-11 17:10:32 +0200353 elseif s:line1 =~# '^PACKAGE DOCUMENTATION$'
Bram Moolenaar34401cc2014-08-29 15:12:19 +0200354 set ft=godoc
355
Bram Moolenaar071d4272004-06-13 20:20:40 +0000356 " Renderman Interface Bytestream
Bram Moolenaar3a429ef2017-06-11 17:10:32 +0200357 elseif s:line1 =~# '^##RenderMan'
Bram Moolenaar071d4272004-06-13 20:20:40 +0000358 set ft=rib
359
360 " Scheme scripts
Bram Moolenaar3a429ef2017-06-11 17:10:32 +0200361 elseif s:line1 =~# 'exec\s\+\S*scheme' || s:line2 =~# 'exec\s\+\S*scheme'
Bram Moolenaar071d4272004-06-13 20:20:40 +0000362 set ft=scheme
363
Bram Moolenaaraba88572008-06-25 20:13:35 +0000364 " Git output
Bram Moolenaar3a429ef2017-06-11 17:10:32 +0200365 elseif s:line1 =~# '^\(commit\|tree\|object\) \x\{40\}\>\|^tag \S\+$'
Bram Moolenaaraba88572008-06-25 20:13:35 +0000366 set ft=git
367
Bram Moolenaar543b7ef2013-06-01 14:50:56 +0200368 " Gprof (gnu profiler)
369 elseif s:line1 == 'Flat profile:'
370 \ && s:line2 == ''
Bram Moolenaar3a429ef2017-06-11 17:10:32 +0200371 \ && s:line3 =~# '^Each sample counts as .* seconds.$'
Bram Moolenaar543b7ef2013-06-01 14:50:56 +0200372 set ft=gprof
373
Bram Moolenaar203d04d2013-06-06 21:36:40 +0200374 " Erlang terms
375 " (See also: http://www.gnu.org/software/emacs/manual/html_node/emacs/Choosing-Modes.html#Choosing-Modes)
376 elseif s:line1 =~? '-\*-.*erlang.*-\*-'
377 set ft=erlang
378
Bram Moolenaar071d4272004-06-13 20:20:40 +0000379 " CVS diff
380 else
Bram Moolenaar5c736222010-01-06 20:54:52 +0100381 let s:lnum = 1
Bram Moolenaar3a429ef2017-06-11 17:10:32 +0200382 while getline(s:lnum) =~# "^? " && s:lnum < line("$")
Bram Moolenaar5c736222010-01-06 20:54:52 +0100383 let s:lnum += 1
Bram Moolenaar071d4272004-06-13 20:20:40 +0000384 endwhile
Bram Moolenaar3a429ef2017-06-11 17:10:32 +0200385 if getline(s:lnum) =~# '^Index:\s\+\f\+$'
Bram Moolenaar071d4272004-06-13 20:20:40 +0000386 set ft=diff
387
388 " locale input files: Formal Definitions of Cultural Conventions
389 " filename must be like en_US, fr_FR@euro or en_US.UTF-8
Bram Moolenaar3a429ef2017-06-11 17:10:32 +0200390 elseif expand("%") =~# '\a\a_\a\a\($\|[.@]\)\|i18n$\|POSIX$\|translit_'
Bram Moolenaar5c736222010-01-06 20:54:52 +0100391 let s:lnum = 1
392 while s:lnum < 100 && s:lnum < line("$")
Bram Moolenaar3a429ef2017-06-11 17:10:32 +0200393 if getline(s:lnum) =~# '^LC_\(IDENTIFICATION\|CTYPE\|COLLATE\|MONETARY\|NUMERIC\|TIME\|MESSAGES\|PAPER\|TELEPHONE\|MEASUREMENT\|NAME\|ADDRESS\)$'
Bram Moolenaar071d4272004-06-13 20:20:40 +0000394 setf fdcc
395 break
396 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +0100397 let s:lnum += 1
Bram Moolenaar071d4272004-06-13 20:20:40 +0000398 endwhile
399 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +0100400 unlet s:lnum
Bram Moolenaar071d4272004-06-13 20:20:40 +0000401
402 endif
403
404 unlet s:line2 s:line3 s:line4 s:line5
405
406endif
407
408" Restore 'cpoptions'
409let &cpo = s:cpo_save
410
411unlet s:cpo_save s:line1