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