blob: 0079f4b4e26faf3ba1d32b4a3fad834399740f4b [file] [log] [blame]
Bram Moolenaar299d8e52022-02-13 20:32:02 +00001vim9script
2
3# Vim function for detecting a filetype from the file contents.
4# Invoked from "scripts.vim" in 'runtimepath'
5#
6# Maintainer: Bram Moolenaar <Bram@vim.org>
Bram Moolenaar19548c62023-06-08 21:27:13 +01007# Last Change: 2023 Jun 08
Bram Moolenaar299d8e52022-02-13 20:32:02 +00008
9export def DetectFiletype()
10 var line1 = getline(1)
11 if line1[0] == '#' && line1[1] == '!'
12 # File that starts with "#!".
13 DetectFromHashBang(line1)
14 else
15 # File does not start with "#!".
16 DetectFromText(line1)
17 endif
18enddef
19
20# Called for a script that has "#!" in the first line.
21def DetectFromHashBang(firstline: string)
22 var line1 = firstline
23
24 # Check for a line like "#!/usr/bin/env {options} bash". Turn it into
25 # "#!/usr/bin/bash" to make matching easier.
26 # Recognize only a few {options} that are commonly used.
27 if line1 =~ '^#!\s*\S*\<env\s'
28 line1 = substitute(line1, '\S\+=\S\+', '', 'g')
29 line1 = substitute(line1, '\(-[iS]\|--ignore-environment\|--split-string\)', '', '')
30 line1 = substitute(line1, '\<env\s\+', '', '')
31 endif
32
33 # Get the program name.
34 # Only accept spaces in PC style paths: "#!c:/program files/perl [args]".
35 # If the word env is used, use the first word after the space:
36 # "#!/usr/bin/env perl [path/args]"
37 # If there is no path use the first word: "#!perl [path/args]".
38 # Otherwise get the last word after a slash: "#!/usr/bin/perl [path/args]".
39 var name: string
40 if line1 =~ '^#!\s*\a:[/\\]'
41 name = substitute(line1, '^#!.*[/\\]\(\i\+\).*', '\1', '')
42 elseif line1 =~ '^#!.*\<env\>'
43 name = substitute(line1, '^#!.*\<env\>\s\+\(\i\+\).*', '\1', '')
44 elseif line1 =~ '^#!\s*[^/\\ ]*\>\([^/\\]\|$\)'
45 name = substitute(line1, '^#!\s*\([^/\\ ]*\>\).*', '\1', '')
46 else
Bram Moolenaar19548c62023-06-08 21:27:13 +010047 name = substitute(line1, '^#!\s*\S*[/\\]\(\f\+\).*', '\1', '')
Bram Moolenaar299d8e52022-02-13 20:32:02 +000048 endif
49
50 # tcl scripts may have #!/bin/sh in the first line and "exec wish" in the
51 # third line. Suggested by Steven Atkinson.
52 if getline(3) =~ '^exec wish'
53 name = 'wish'
54 endif
55
Eisuke Kawashima24482fb2022-11-24 10:58:10 +000056 # Bourne-like shell scripts: bash bash2 dash ksh ksh93 sh
57 if name =~ '^\(bash\d*\|dash\|ksh\d*\|sh\)\>'
Bram Moolenaar299d8e52022-02-13 20:32:02 +000058 call dist#ft#SetFileTypeSH(line1)
59
60 # csh scripts
61 elseif name =~ '^csh\>'
62 if exists("g:filetype_csh")
63 call dist#ft#SetFileTypeShell(g:filetype_csh)
64 else
65 call dist#ft#SetFileTypeShell("csh")
66 endif
67
68 # tcsh scripts
69 elseif name =~ '^tcsh\>'
70 call dist#ft#SetFileTypeShell("tcsh")
71
72 # Z shell scripts
73 elseif name =~ '^zsh\>'
Bram Moolenaar0b70aeb2023-05-06 21:21:52 +010074 setl ft=zsh
Bram Moolenaar299d8e52022-02-13 20:32:02 +000075
76 # TCL scripts
77 elseif name =~ '^\(tclsh\|wish\|expectk\|itclsh\|itkwish\)\>'
Bram Moolenaar0b70aeb2023-05-06 21:21:52 +010078 setl ft=tcl
Bram Moolenaar299d8e52022-02-13 20:32:02 +000079
80 # Expect scripts
81 elseif name =~ '^expect\>'
Bram Moolenaar0b70aeb2023-05-06 21:21:52 +010082 setl ft=expect
Bram Moolenaar299d8e52022-02-13 20:32:02 +000083
84 # Gnuplot scripts
85 elseif name =~ '^gnuplot\>'
Bram Moolenaar0b70aeb2023-05-06 21:21:52 +010086 setl ft=gnuplot
Bram Moolenaar299d8e52022-02-13 20:32:02 +000087
88 # Makefiles
89 elseif name =~ 'make\>'
Bram Moolenaar0b70aeb2023-05-06 21:21:52 +010090 setl ft=make
Bram Moolenaar299d8e52022-02-13 20:32:02 +000091
92 # Pike
93 elseif name =~ '^pike\%(\>\|[0-9]\)'
Bram Moolenaar0b70aeb2023-05-06 21:21:52 +010094 setl ft=pike
Bram Moolenaar299d8e52022-02-13 20:32:02 +000095
96 # Lua
97 elseif name =~ 'lua'
Bram Moolenaar0b70aeb2023-05-06 21:21:52 +010098 setl ft=lua
Bram Moolenaar299d8e52022-02-13 20:32:02 +000099
100 # Perl
101 elseif name =~ 'perl'
Bram Moolenaar0b70aeb2023-05-06 21:21:52 +0100102 setl ft=perl
Bram Moolenaar299d8e52022-02-13 20:32:02 +0000103
104 # PHP
105 elseif name =~ 'php'
Bram Moolenaar0b70aeb2023-05-06 21:21:52 +0100106 setl ft=php
Bram Moolenaar299d8e52022-02-13 20:32:02 +0000107
108 # Python
109 elseif name =~ 'python'
Bram Moolenaar0b70aeb2023-05-06 21:21:52 +0100110 setl ft=python
Bram Moolenaar299d8e52022-02-13 20:32:02 +0000111
112 # Groovy
113 elseif name =~ '^groovy\>'
Bram Moolenaar0b70aeb2023-05-06 21:21:52 +0100114 setl ft=groovy
Bram Moolenaar299d8e52022-02-13 20:32:02 +0000115
116 # Raku
117 elseif name =~ 'raku'
Bram Moolenaar0b70aeb2023-05-06 21:21:52 +0100118 setl ft=raku
Bram Moolenaar299d8e52022-02-13 20:32:02 +0000119
120 # Ruby
121 elseif name =~ 'ruby'
Bram Moolenaar0b70aeb2023-05-06 21:21:52 +0100122 setl ft=ruby
Bram Moolenaar299d8e52022-02-13 20:32:02 +0000123
124 # JavaScript
125 elseif name =~ 'node\(js\)\=\>\|js\>' || name =~ 'rhino\>'
Bram Moolenaar0b70aeb2023-05-06 21:21:52 +0100126 setl ft=javascript
Bram Moolenaar299d8e52022-02-13 20:32:02 +0000127
128 # BC calculator
129 elseif name =~ '^bc\>'
Bram Moolenaar0b70aeb2023-05-06 21:21:52 +0100130 setl ft=bc
Bram Moolenaar299d8e52022-02-13 20:32:02 +0000131
132 # sed
133 elseif name =~ 'sed\>'
Bram Moolenaar0b70aeb2023-05-06 21:21:52 +0100134 setl ft=sed
Bram Moolenaar299d8e52022-02-13 20:32:02 +0000135
136 # OCaml-scripts
137 elseif name =~ 'ocaml'
Bram Moolenaar0b70aeb2023-05-06 21:21:52 +0100138 setl ft=ocaml
Bram Moolenaar299d8e52022-02-13 20:32:02 +0000139
140 # Awk scripts; also finds "gawk"
141 elseif name =~ 'awk\>'
Bram Moolenaar0b70aeb2023-05-06 21:21:52 +0100142 setl ft=awk
Bram Moolenaar299d8e52022-02-13 20:32:02 +0000143
144 # Website MetaLanguage
145 elseif name =~ 'wml'
Bram Moolenaar0b70aeb2023-05-06 21:21:52 +0100146 setl ft=wml
Bram Moolenaar299d8e52022-02-13 20:32:02 +0000147
148 # Scheme scripts
149 elseif name =~ 'scheme'
Bram Moolenaar0b70aeb2023-05-06 21:21:52 +0100150 setl ft=scheme
Bram Moolenaar299d8e52022-02-13 20:32:02 +0000151
152 # CFEngine scripts
153 elseif name =~ 'cfengine'
Bram Moolenaar0b70aeb2023-05-06 21:21:52 +0100154 setl ft=cfengine
Bram Moolenaar299d8e52022-02-13 20:32:02 +0000155
156 # Erlang scripts
157 elseif name =~ 'escript'
Bram Moolenaar0b70aeb2023-05-06 21:21:52 +0100158 setl ft=erlang
Bram Moolenaar299d8e52022-02-13 20:32:02 +0000159
160 # Haskell
161 elseif name =~ 'haskell'
Bram Moolenaar0b70aeb2023-05-06 21:21:52 +0100162 setl ft=haskell
Bram Moolenaar299d8e52022-02-13 20:32:02 +0000163
164 # Scala
165 elseif name =~ 'scala\>'
Bram Moolenaar0b70aeb2023-05-06 21:21:52 +0100166 setl ft=scala
Bram Moolenaar299d8e52022-02-13 20:32:02 +0000167
168 # Clojure
169 elseif name =~ 'clojure'
Bram Moolenaar0b70aeb2023-05-06 21:21:52 +0100170 setl ft=clojure
Bram Moolenaar299d8e52022-02-13 20:32:02 +0000171
172 # Free Pascal
173 elseif name =~ 'instantfpc\>'
Bram Moolenaar0b70aeb2023-05-06 21:21:52 +0100174 setl ft=pascal
Bram Moolenaar299d8e52022-02-13 20:32:02 +0000175
176 # Fennel
177 elseif name =~ 'fennel\>'
Bram Moolenaar0b70aeb2023-05-06 21:21:52 +0100178 setl ft=fennel
Bram Moolenaar299d8e52022-02-13 20:32:02 +0000179
180 # MikroTik RouterOS script
181 elseif name =~ 'rsc\>'
Bram Moolenaar0b70aeb2023-05-06 21:21:52 +0100182 setl ft=routeros
Bram Moolenaar299d8e52022-02-13 20:32:02 +0000183
184 # Fish shell
185 elseif name =~ 'fish\>'
Bram Moolenaar0b70aeb2023-05-06 21:21:52 +0100186 setl ft=fish
Bram Moolenaar299d8e52022-02-13 20:32:02 +0000187
188 # Gforth
189 elseif name =~ 'gforth\>'
Bram Moolenaar0b70aeb2023-05-06 21:21:52 +0100190 setl ft=forth
Bram Moolenaar299d8e52022-02-13 20:32:02 +0000191
Bram Moolenaarbf661462022-06-16 13:27:18 +0100192 # Icon
193 elseif name =~ 'icon\>'
Bram Moolenaar0b70aeb2023-05-06 21:21:52 +0100194 setl ft=icon
Bram Moolenaarbf661462022-06-16 13:27:18 +0100195
Bram Moolenaar32447802022-07-05 21:56:39 +0100196 # Guile
197 elseif name =~ 'guile'
Bram Moolenaar0b70aeb2023-05-06 21:21:52 +0100198 setl ft=scheme
Bram Moolenaar32447802022-07-05 21:56:39 +0100199
Bram Moolenaar19548c62023-06-08 21:27:13 +0100200 # Nix
201 elseif name =~ 'nix-shell'
202 setl ft=nix
203
Bram Moolenaar299d8e52022-02-13 20:32:02 +0000204 endif
205enddef
206
207
208# Called for a script that does not have "#!" in the first line.
209def DetectFromText(line1: string)
210 var line2 = getline(2)
211 var line3 = getline(3)
212 var line4 = getline(4)
213 var line5 = getline(5)
214
215 # Bourne-like shell scripts: sh ksh bash bash2
216 if line1 =~ '^:$'
217 call dist#ft#SetFileTypeSH(line1)
218
219 # Z shell scripts
220 elseif line1 =~ '^#compdef\>'
221 || line1 =~ '^#autoload\>'
222 || "\n" .. line1 .. "\n" .. line2 .. "\n" .. line3 ..
223 "\n" .. line4 .. "\n" .. line5
224 =~ '\n\s*emulate\s\+\%(-[LR]\s\+\)\=[ckz]\=sh\>'
Bram Moolenaar0b70aeb2023-05-06 21:21:52 +0100225 setl ft=zsh
Bram Moolenaar299d8e52022-02-13 20:32:02 +0000226
227 # ELM Mail files
228 elseif line1 =~ '^From \([a-zA-Z][a-zA-Z_0-9\.=-]*\(@[^ ]*\)\=\|-\) .* \(19\|20\)\d\d$'
Bram Moolenaar0b70aeb2023-05-06 21:21:52 +0100229 setl ft=mail
Bram Moolenaar299d8e52022-02-13 20:32:02 +0000230
231 # Mason
232 elseif line1 =~ '^<[%&].*>'
Bram Moolenaar0b70aeb2023-05-06 21:21:52 +0100233 setl ft=mason
Bram Moolenaar299d8e52022-02-13 20:32:02 +0000234
235 # Vim scripts (must have '" vim' as the first line to trigger this)
236 elseif line1 =~ '^" *[vV]im$'
Bram Moolenaar0b70aeb2023-05-06 21:21:52 +0100237 setl ft=vim
Bram Moolenaar299d8e52022-02-13 20:32:02 +0000238
239 # libcxx and libstdc++ standard library headers like "iostream" do not have
240 # an extension, recognize the Emacs file mode.
241 elseif line1 =~? '-\*-.*C++.*-\*-'
Bram Moolenaar0b70aeb2023-05-06 21:21:52 +0100242 setl ft=cpp
Bram Moolenaar299d8e52022-02-13 20:32:02 +0000243
244 # MOO
245 elseif line1 =~ '^\*\* LambdaMOO Database, Format Version \%([1-3]\>\)\@!\d\+ \*\*$'
Bram Moolenaar0b70aeb2023-05-06 21:21:52 +0100246 setl ft=moo
Bram Moolenaar299d8e52022-02-13 20:32:02 +0000247
248 # Diff file:
249 # - "diff" in first line (context diff)
250 # - "Only in " in first line
251 # - "--- " in first line and "+++ " in second line (unified diff).
252 # - "*** " in first line and "--- " in second line (context diff).
253 # - "# It was generated by makepatch " in the second line (makepatch diff).
254 # - "Index: <filename>" in the first line (CVS file)
255 # - "=== ", line of "=", "---", "+++ " (SVK diff)
256 # - "=== ", "--- ", "+++ " (bzr diff, common case)
257 # - "=== (removed|added|renamed|modified)" (bzr diff, alternative)
258 # - "# HG changeset patch" in first line (Mercurial export format)
259 elseif 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\)'
260 || (line1 =~ '^--- ' && line2 =~ '^+++ ')
261 || (line1 =~ '^\* looking for ' && line2 =~ '^\* comparing to ')
262 || (line1 =~ '^\*\*\* ' && line2 =~ '^--- ')
263 || (line1 =~ '^=== ' && ((line2 =~ '^=\{66\}' && line3 =~ '^--- ' && line4 =~ '^+++') || (line2 =~ '^--- ' && line3 =~ '^+++ ')))
264 || (line1 =~ '^=== \(removed\|added\|renamed\|modified\)')
Bram Moolenaar0b70aeb2023-05-06 21:21:52 +0100265 setl ft=diff
Bram Moolenaar299d8e52022-02-13 20:32:02 +0000266
267 # PostScript Files (must have %!PS as the first line, like a2ps output)
268 elseif line1 =~ '^%![ \t]*PS'
Bram Moolenaar0b70aeb2023-05-06 21:21:52 +0100269 setl ft=postscr
Bram Moolenaar299d8e52022-02-13 20:32:02 +0000270
271 # M4 scripts: Guess there is a line that starts with "dnl".
272 elseif line1 =~ '^\s*dnl\>'
273 || line2 =~ '^\s*dnl\>'
274 || line3 =~ '^\s*dnl\>'
275 || line4 =~ '^\s*dnl\>'
276 || line5 =~ '^\s*dnl\>'
Bram Moolenaar0b70aeb2023-05-06 21:21:52 +0100277 setl ft=m4
Bram Moolenaar299d8e52022-02-13 20:32:02 +0000278
279 # AmigaDos scripts
280 elseif $TERM == "amiga" && (line1 =~ "^;" || line1 =~? '^\.bra')
Bram Moolenaar0b70aeb2023-05-06 21:21:52 +0100281 setl ft=amiga
Bram Moolenaar299d8e52022-02-13 20:32:02 +0000282
283 # SiCAD scripts (must have procn or procd as the first line to trigger this)
284 elseif line1 =~? '^ *proc[nd] *$'
Bram Moolenaar0b70aeb2023-05-06 21:21:52 +0100285 setl ft=sicad
Bram Moolenaar299d8e52022-02-13 20:32:02 +0000286
287 # Purify log files start with "**** Purify"
288 elseif line1 =~ '^\*\*\*\* Purify'
Bram Moolenaar0b70aeb2023-05-06 21:21:52 +0100289 setl ft=purifylog
Bram Moolenaar299d8e52022-02-13 20:32:02 +0000290
291 # XML
292 elseif line1 =~ '<?\s*xml.*?>'
Bram Moolenaar0b70aeb2023-05-06 21:21:52 +0100293 setl ft=xml
Bram Moolenaar299d8e52022-02-13 20:32:02 +0000294
295 # XHTML (e.g.: PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN")
296 elseif line1 =~ '\<DTD\s\+XHTML\s'
Bram Moolenaar0b70aeb2023-05-06 21:21:52 +0100297 setl ft=xhtml
Bram Moolenaar299d8e52022-02-13 20:32:02 +0000298
299 # HTML (e.g.: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN")
300 # Avoid "doctype html", used by slim.
301 elseif line1 =~? '<!DOCTYPE\s\+html\>'
Bram Moolenaar0b70aeb2023-05-06 21:21:52 +0100302 setl ft=html
Bram Moolenaar299d8e52022-02-13 20:32:02 +0000303
304 # PDF
305 elseif line1 =~ '^%PDF-'
Bram Moolenaar0b70aeb2023-05-06 21:21:52 +0100306 setl ft=pdf
Bram Moolenaar299d8e52022-02-13 20:32:02 +0000307
308 # XXD output
309 elseif line1 =~ '^\x\{7}: \x\{2} \=\x\{2} \=\x\{2} \=\x\{2} '
Bram Moolenaar0b70aeb2023-05-06 21:21:52 +0100310 setl ft=xxd
Bram Moolenaar299d8e52022-02-13 20:32:02 +0000311
312 # RCS/CVS log output
313 elseif line1 =~ '^RCS file:' || line2 =~ '^RCS file:'
Bram Moolenaar0b70aeb2023-05-06 21:21:52 +0100314 setl ft=rcslog
Bram Moolenaar299d8e52022-02-13 20:32:02 +0000315
316 # CVS commit
317 elseif line2 =~ '^CVS:' || getline("$") =~ '^CVS: '
Bram Moolenaar0b70aeb2023-05-06 21:21:52 +0100318 setl ft=cvs
Bram Moolenaar299d8e52022-02-13 20:32:02 +0000319
320 # Prescribe
321 elseif line1 =~ '^!R!'
Bram Moolenaar0b70aeb2023-05-06 21:21:52 +0100322 setl ft=prescribe
Bram Moolenaar299d8e52022-02-13 20:32:02 +0000323
324 # Send-pr
325 elseif line1 =~ '^SEND-PR:'
Bram Moolenaar0b70aeb2023-05-06 21:21:52 +0100326 setl ft=sendpr
Bram Moolenaar299d8e52022-02-13 20:32:02 +0000327
328 # SNNS files
329 elseif line1 =~ '^SNNS network definition file'
Bram Moolenaar0b70aeb2023-05-06 21:21:52 +0100330 setl ft=snnsnet
Bram Moolenaar299d8e52022-02-13 20:32:02 +0000331 elseif line1 =~ '^SNNS pattern definition file'
Bram Moolenaar0b70aeb2023-05-06 21:21:52 +0100332 setl ft=snnspat
Bram Moolenaar299d8e52022-02-13 20:32:02 +0000333 elseif line1 =~ '^SNNS result file'
Bram Moolenaar0b70aeb2023-05-06 21:21:52 +0100334 setl ft=snnsres
Bram Moolenaar299d8e52022-02-13 20:32:02 +0000335
336 # Virata
337 elseif line1 =~ '^%.\{-}[Vv]irata'
338 || line2 =~ '^%.\{-}[Vv]irata'
339 || line3 =~ '^%.\{-}[Vv]irata'
340 || line4 =~ '^%.\{-}[Vv]irata'
341 || line5 =~ '^%.\{-}[Vv]irata'
Bram Moolenaar0b70aeb2023-05-06 21:21:52 +0100342 setl ft=virata
Bram Moolenaar299d8e52022-02-13 20:32:02 +0000343
344 # Strace
Federico Mengozzi6e5a9f92023-04-17 22:31:38 +0100345 # inaccurate fast match first, then use accurate slow match
346 elseif (line1 =~ 'execve(' && line1 =~ '^[0-9:.]* *execve(')
347 || line1 =~ '^__libc_start_main'
Bram Moolenaar0b70aeb2023-05-06 21:21:52 +0100348 setl ft=strace
Bram Moolenaar299d8e52022-02-13 20:32:02 +0000349
350 # VSE JCL
351 elseif line1 =~ '^\* $$ JOB\>' || line1 =~ '^// *JOB\>'
Bram Moolenaar0b70aeb2023-05-06 21:21:52 +0100352 setl ft=vsejcl
Bram Moolenaar299d8e52022-02-13 20:32:02 +0000353
354 # TAK and SINDA
355 elseif line4 =~ 'K & K Associates' || line2 =~ 'TAK 2000'
Bram Moolenaar0b70aeb2023-05-06 21:21:52 +0100356 setl ft=takout
Bram Moolenaar299d8e52022-02-13 20:32:02 +0000357 elseif line3 =~ 'S Y S T E M S I M P R O V E D '
Bram Moolenaar0b70aeb2023-05-06 21:21:52 +0100358 setl ft=sindaout
Bram Moolenaar299d8e52022-02-13 20:32:02 +0000359 elseif getline(6) =~ 'Run Date: '
Bram Moolenaar0b70aeb2023-05-06 21:21:52 +0100360 setl ft=takcmp
Bram Moolenaar299d8e52022-02-13 20:32:02 +0000361 elseif getline(9) =~ 'Node File 1'
Bram Moolenaar0b70aeb2023-05-06 21:21:52 +0100362 setl ft=sindacmp
Bram Moolenaar299d8e52022-02-13 20:32:02 +0000363
364 # DNS zone files
365 elseif line1 .. line2 .. line3 .. line4 =~ '^; <<>> DiG [0-9.]\+.* <<>>\|$ORIGIN\|$TTL\|IN\s\+SOA'
Bram Moolenaar0b70aeb2023-05-06 21:21:52 +0100366 setl ft=bindzone
Bram Moolenaar299d8e52022-02-13 20:32:02 +0000367
368 # BAAN
369 elseif line1 =~ '|\*\{1,80}' && line2 =~ 'VRC '
370 || line2 =~ '|\*\{1,80}' && line3 =~ 'VRC '
Bram Moolenaar0b70aeb2023-05-06 21:21:52 +0100371 setl ft=baan
Bram Moolenaar299d8e52022-02-13 20:32:02 +0000372
373 # Valgrind
374 elseif line1 =~ '^==\d\+== valgrind' || line3 =~ '^==\d\+== Using valgrind'
Bram Moolenaar0b70aeb2023-05-06 21:21:52 +0100375 setl ft=valgrind
Bram Moolenaar299d8e52022-02-13 20:32:02 +0000376
377 # Go docs
378 elseif line1 =~ '^PACKAGE DOCUMENTATION$'
Bram Moolenaar0b70aeb2023-05-06 21:21:52 +0100379 setl ft=godoc
Bram Moolenaar299d8e52022-02-13 20:32:02 +0000380
381 # Renderman Interface Bytestream
382 elseif line1 =~ '^##RenderMan'
Bram Moolenaar0b70aeb2023-05-06 21:21:52 +0100383 setl ft=rib
Bram Moolenaar299d8e52022-02-13 20:32:02 +0000384
385 # Scheme scripts
386 elseif line1 =~ 'exec\s\+\S*scheme' || line2 =~ 'exec\s\+\S*scheme'
Bram Moolenaar0b70aeb2023-05-06 21:21:52 +0100387 setl ft=scheme
Bram Moolenaar299d8e52022-02-13 20:32:02 +0000388
389 # Git output
390 elseif line1 =~ '^\(commit\|tree\|object\) \x\{40,\}\>\|^tag \S\+$'
Bram Moolenaar0b70aeb2023-05-06 21:21:52 +0100391 setl ft=git
Bram Moolenaar299d8e52022-02-13 20:32:02 +0000392
393 # Gprof (gnu profiler)
394 elseif line1 == 'Flat profile:'
395 && line2 == ''
396 && line3 =~ '^Each sample counts as .* seconds.$'
Bram Moolenaar0b70aeb2023-05-06 21:21:52 +0100397 setl ft=gprof
Bram Moolenaar299d8e52022-02-13 20:32:02 +0000398
399 # Erlang terms
400 # (See also: http://www.gnu.org/software/emacs/manual/html_node/emacs/Choosing-Modes.html#Choosing-Modes)
401 elseif line1 =~? '-\*-.*erlang.*-\*-'
Bram Moolenaar0b70aeb2023-05-06 21:21:52 +0100402 setl ft=erlang
Bram Moolenaar299d8e52022-02-13 20:32:02 +0000403
404 # YAML
405 elseif line1 =~ '^%YAML'
Bram Moolenaar0b70aeb2023-05-06 21:21:52 +0100406 setl ft=yaml
Bram Moolenaar299d8e52022-02-13 20:32:02 +0000407
408 # MikroTik RouterOS script
409 elseif line1 =~ '^#.*by RouterOS.*$'
Bram Moolenaar0b70aeb2023-05-06 21:21:52 +0100410 setl ft=routeros
Bram Moolenaar299d8e52022-02-13 20:32:02 +0000411
412 # Sed scripts
413 # #ncomment is allowed but most likely a false positive so require a space
414 # before any trailing comment text
415 elseif line1 =~ '^#n\%($\|\s\)'
Bram Moolenaar0b70aeb2023-05-06 21:21:52 +0100416 setl ft=sed
Bram Moolenaar299d8e52022-02-13 20:32:02 +0000417
418 else
419 var lnum = 1
420 while getline(lnum) =~ "^? " && lnum < line("$")
421 lnum += 1
422 endwhile
423 if getline(lnum) =~ '^Index:\s\+\f\+$'
424 # CVS diff
Bram Moolenaar0b70aeb2023-05-06 21:21:52 +0100425 setl ft=diff
Bram Moolenaar299d8e52022-02-13 20:32:02 +0000426
427 # locale input files: Formal Definitions of Cultural Conventions
428 # filename must be like en_US, fr_FR@euro or en_US.UTF-8
429 elseif expand("%") =~ '\a\a_\a\a\($\|[.@]\)\|i18n$\|POSIX$\|translit_'
430 lnum = 1
431 while lnum < 100 && lnum < line("$")
432 if getline(lnum) =~ '^LC_\(IDENTIFICATION\|CTYPE\|COLLATE\|MONETARY\|NUMERIC\|TIME\|MESSAGES\|PAPER\|TELEPHONE\|MEASUREMENT\|NAME\|ADDRESS\)$'
433 setf fdcc
434 break
435 endif
436 lnum += 1
437 endwhile
438 endif
439 endif
440enddef