Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 1 | " Vim support file to detect file types in scripts |
| 2 | " |
| 3 | " Maintainer: Bram Moolenaar <Bram@vim.org> |
Bram Moolenaar | 942db23 | 2021-02-13 18:14:48 +0100 | [diff] [blame] | 4 | " Last change: 2021 Jan 22 |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 5 | |
| 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 Moolenaar | 3a429ef | 2017-06-11 17:10:32 +0200 | [diff] [blame] | 9 | " |
| 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 Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 13 | |
| 14 | |
| 15 | " Only do the rest when the FileType autocommand has not been triggered yet. |
| 16 | if did_filetype() |
| 17 | finish |
| 18 | endif |
| 19 | |
| 20 | " Load the user defined scripts file first |
| 21 | " Only do this when the FileType autocommand has not been triggered yet |
Bram Moolenaar | f4630b6 | 2005-05-20 21:31:17 +0000 | [diff] [blame] | 22 | if exists("myscriptsfile") && filereadable(expand(myscriptsfile)) |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 23 | execute "source " . myscriptsfile |
| 24 | if did_filetype() |
| 25 | finish |
| 26 | endif |
| 27 | endif |
| 28 | |
| 29 | " Line continuation is used here, remove 'C' from 'cpoptions' |
| 30 | let s:cpo_save = &cpo |
| 31 | set cpo&vim |
| 32 | |
| 33 | let s:line1 = getline(1) |
| 34 | |
Bram Moolenaar | 3a429ef | 2017-06-11 17:10:32 +0200 | [diff] [blame] | 35 | if s:line1 =~# "^#!" |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 36 | " A script that starts with "#!". |
| 37 | |
Bram Moolenaar | b5e18f2 | 2020-06-07 21:58:54 +0200 | [diff] [blame] | 38 | " Check for a line like "#!/usr/bin/env {options} bash". Turn it into |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 39 | " "#!/usr/bin/bash" to make matching easier. |
Bram Moolenaar | b5e18f2 | 2020-06-07 21:58:54 +0200 | [diff] [blame] | 40 | " Recognize only a few {options} that are commonly used. |
Bram Moolenaar | 3a429ef | 2017-06-11 17:10:32 +0200 | [diff] [blame] | 41 | if s:line1 =~# '^#!\s*\S*\<env\s' |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 42 | let s:line1 = substitute(s:line1, '\S\+=\S\+', '', 'g') |
Bram Moolenaar | b5e18f2 | 2020-06-07 21:58:54 +0200 | [diff] [blame] | 43 | let s:line1 = substitute(s:line1, '\(-[iS]\|--ignore-environment\|--split-string\)', '', '') |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 44 | let s:line1 = substitute(s:line1, '\<env\s\+', '', '') |
| 45 | endif |
| 46 | |
| 47 | " Get the program name. |
| 48 | " Only accept spaces in PC style paths: "#!c:/program files/perl [args]". |
Bram Moolenaar | f4630b6 | 2005-05-20 21:31:17 +0000 | [diff] [blame] | 49 | " If the word env is used, use the first word after the space: |
| 50 | " "#!/usr/bin/env perl [path/args]" |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 51 | " If there is no path use the first word: "#!perl [path/args]". |
| 52 | " Otherwise get the last word after a slash: "#!/usr/bin/perl [path/args]". |
Bram Moolenaar | 3a429ef | 2017-06-11 17:10:32 +0200 | [diff] [blame] | 53 | if s:line1 =~# '^#!\s*\a:[/\\]' |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 54 | let s:name = substitute(s:line1, '^#!.*[/\\]\(\i\+\).*', '\1', '') |
Bram Moolenaar | 3a429ef | 2017-06-11 17:10:32 +0200 | [diff] [blame] | 55 | elseif s:line1 =~# '^#!.*\<env\>' |
Bram Moolenaar | f4630b6 | 2005-05-20 21:31:17 +0000 | [diff] [blame] | 56 | let s:name = substitute(s:line1, '^#!.*\<env\>\s\+\(\i\+\).*', '\1', '') |
Bram Moolenaar | 3a429ef | 2017-06-11 17:10:32 +0200 | [diff] [blame] | 57 | elseif s:line1 =~# '^#!\s*[^/\\ ]*\>\([^/\\]\|$\)' |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 58 | let s:name = substitute(s:line1, '^#!\s*\([^/\\ ]*\>\).*', '\1', '') |
| 59 | else |
| 60 | let s:name = substitute(s:line1, '^#!\s*\S*[/\\]\(\i\+\).*', '\1', '') |
| 61 | endif |
| 62 | |
Bram Moolenaar | a8c4d56 | 2006-08-08 18:54:11 +0000 | [diff] [blame] | 63 | " tcl scripts may have #!/bin/sh in the first line and "exec wish" in the |
| 64 | " third line. Suggested by Steven Atkinson. |
Bram Moolenaar | 3a429ef | 2017-06-11 17:10:32 +0200 | [diff] [blame] | 65 | if getline(3) =~# '^exec wish' |
Bram Moolenaar | a8c4d56 | 2006-08-08 18:54:11 +0000 | [diff] [blame] | 66 | let s:name = 'wish' |
| 67 | endif |
| 68 | |
Bram Moolenaar | d4755bb | 2004-09-02 19:12:26 +0000 | [diff] [blame] | 69 | " Bourne-like shell scripts: bash bash2 ksh ksh93 sh |
Bram Moolenaar | 3a429ef | 2017-06-11 17:10:32 +0200 | [diff] [blame] | 70 | if s:name =~# '^\(bash\d*\|\|ksh\d*\|sh\)\>' |
Bram Moolenaar | d09a206 | 2017-11-11 15:37:45 +0100 | [diff] [blame] | 71 | call dist#ft#SetFileTypeSH(s:line1) " defined in filetype.vim |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 72 | |
| 73 | " csh scripts |
Bram Moolenaar | 3a429ef | 2017-06-11 17:10:32 +0200 | [diff] [blame] | 74 | elseif s:name =~# '^csh\>' |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 75 | if exists("g:filetype_csh") |
Bram Moolenaar | d09a206 | 2017-11-11 15:37:45 +0100 | [diff] [blame] | 76 | call dist#ft#SetFileTypeShell(g:filetype_csh) |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 77 | else |
Bram Moolenaar | d09a206 | 2017-11-11 15:37:45 +0100 | [diff] [blame] | 78 | call dist#ft#SetFileTypeShell("csh") |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 79 | endif |
| 80 | |
| 81 | " tcsh scripts |
Bram Moolenaar | 3a429ef | 2017-06-11 17:10:32 +0200 | [diff] [blame] | 82 | elseif s:name =~# '^tcsh\>' |
Bram Moolenaar | d09a206 | 2017-11-11 15:37:45 +0100 | [diff] [blame] | 83 | call dist#ft#SetFileTypeShell("tcsh") |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 84 | |
| 85 | " Z shell scripts |
Bram Moolenaar | 3a429ef | 2017-06-11 17:10:32 +0200 | [diff] [blame] | 86 | elseif s:name =~# '^zsh\>' |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 87 | set ft=zsh |
| 88 | |
| 89 | " TCL scripts |
Bram Moolenaar | 3a429ef | 2017-06-11 17:10:32 +0200 | [diff] [blame] | 90 | elseif s:name =~# '^\(tclsh\|wish\|expectk\|itclsh\|itkwish\)\>' |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 91 | set ft=tcl |
| 92 | |
| 93 | " Expect scripts |
Bram Moolenaar | 3a429ef | 2017-06-11 17:10:32 +0200 | [diff] [blame] | 94 | elseif s:name =~# '^expect\>' |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 95 | set ft=expect |
| 96 | |
| 97 | " Gnuplot scripts |
Bram Moolenaar | 3a429ef | 2017-06-11 17:10:32 +0200 | [diff] [blame] | 98 | elseif s:name =~# '^gnuplot\>' |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 99 | set ft=gnuplot |
| 100 | |
| 101 | " Makefiles |
Bram Moolenaar | 3a429ef | 2017-06-11 17:10:32 +0200 | [diff] [blame] | 102 | elseif s:name =~# 'make\>' |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 103 | set ft=make |
| 104 | |
Bram Moolenaar | 40962ec | 2018-01-28 22:47:25 +0100 | [diff] [blame] | 105 | " Pike |
| 106 | elseif s:name =~# '^pike\%(\>\|[0-9]\)' |
| 107 | set ft=pike |
| 108 | |
Bram Moolenaar | f4630b6 | 2005-05-20 21:31:17 +0000 | [diff] [blame] | 109 | " Lua |
Bram Moolenaar | 3a429ef | 2017-06-11 17:10:32 +0200 | [diff] [blame] | 110 | elseif s:name =~# 'lua' |
Bram Moolenaar | f4630b6 | 2005-05-20 21:31:17 +0000 | [diff] [blame] | 111 | set ft=lua |
| 112 | |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 113 | " Perl |
Bram Moolenaar | 3a429ef | 2017-06-11 17:10:32 +0200 | [diff] [blame] | 114 | elseif s:name =~# 'perl' |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 115 | set ft=perl |
| 116 | |
| 117 | " PHP |
Bram Moolenaar | 3a429ef | 2017-06-11 17:10:32 +0200 | [diff] [blame] | 118 | elseif s:name =~# 'php' |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 119 | set ft=php |
| 120 | |
| 121 | " Python |
Bram Moolenaar | 3a429ef | 2017-06-11 17:10:32 +0200 | [diff] [blame] | 122 | elseif s:name =~# 'python' |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 123 | set ft=python |
| 124 | |
| 125 | " Groovy |
Bram Moolenaar | 3a429ef | 2017-06-11 17:10:32 +0200 | [diff] [blame] | 126 | elseif s:name =~# '^groovy\>' |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 127 | set ft=groovy |
| 128 | |
Bram Moolenaar | 6327668 | 2021-04-20 21:14:09 +0200 | [diff] [blame] | 129 | " Raku |
| 130 | elseif s:name =~# 'raku' |
| 131 | set ft=raku |
| 132 | |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 133 | " Ruby |
Bram Moolenaar | 3a429ef | 2017-06-11 17:10:32 +0200 | [diff] [blame] | 134 | elseif s:name =~# 'ruby' |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 135 | set ft=ruby |
| 136 | |
Bram Moolenaar | 214641f | 2017-03-05 17:04:09 +0100 | [diff] [blame] | 137 | " JavaScript |
Bram Moolenaar | 4bc0bed | 2018-02-03 22:35:40 +0100 | [diff] [blame] | 138 | elseif s:name =~# 'node\(js\)\=\>\|js\>' || s:name =~# 'rhino\>' |
Bram Moolenaar | 214641f | 2017-03-05 17:04:09 +0100 | [diff] [blame] | 139 | set ft=javascript |
| 140 | |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 141 | " BC calculator |
Bram Moolenaar | 3a429ef | 2017-06-11 17:10:32 +0200 | [diff] [blame] | 142 | elseif s:name =~# '^bc\>' |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 143 | set ft=bc |
| 144 | |
| 145 | " sed |
Bram Moolenaar | 3a429ef | 2017-06-11 17:10:32 +0200 | [diff] [blame] | 146 | elseif s:name =~# 'sed\>' |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 147 | set ft=sed |
| 148 | |
| 149 | " OCaml-scripts |
Bram Moolenaar | 3a429ef | 2017-06-11 17:10:32 +0200 | [diff] [blame] | 150 | elseif s:name =~# 'ocaml' |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 151 | set ft=ocaml |
| 152 | |
Bram Moolenaar | 3d1cde8 | 2020-08-15 18:55:18 +0200 | [diff] [blame] | 153 | " Awk scripts; also finds "gawk" |
Bram Moolenaar | 3a429ef | 2017-06-11 17:10:32 +0200 | [diff] [blame] | 154 | elseif s:name =~# 'awk\>' |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 155 | set ft=awk |
| 156 | |
| 157 | " Website MetaLanguage |
Bram Moolenaar | 3a429ef | 2017-06-11 17:10:32 +0200 | [diff] [blame] | 158 | elseif s:name =~# 'wml' |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 159 | set ft=wml |
| 160 | |
| 161 | " Scheme scripts |
Bram Moolenaar | 3a429ef | 2017-06-11 17:10:32 +0200 | [diff] [blame] | 162 | elseif s:name =~# 'scheme' |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 163 | set ft=scheme |
| 164 | |
Bram Moolenaar | af289d3 | 2005-10-12 21:01:44 +0000 | [diff] [blame] | 165 | " CFEngine scripts |
Bram Moolenaar | 3a429ef | 2017-06-11 17:10:32 +0200 | [diff] [blame] | 166 | elseif s:name =~# 'cfengine' |
Bram Moolenaar | af289d3 | 2005-10-12 21:01:44 +0000 | [diff] [blame] | 167 | set ft=cfengine |
| 168 | |
Bram Moolenaar | 203d04d | 2013-06-06 21:36:40 +0200 | [diff] [blame] | 169 | " Erlang scripts |
Bram Moolenaar | 3a429ef | 2017-06-11 17:10:32 +0200 | [diff] [blame] | 170 | elseif s:name =~# 'escript' |
Bram Moolenaar | 203d04d | 2013-06-06 21:36:40 +0200 | [diff] [blame] | 171 | set ft=erlang |
| 172 | |
Bram Moolenaar | 214641f | 2017-03-05 17:04:09 +0100 | [diff] [blame] | 173 | " Haskell |
Bram Moolenaar | 3a429ef | 2017-06-11 17:10:32 +0200 | [diff] [blame] | 174 | elseif s:name =~# 'haskell' |
Bram Moolenaar | 214641f | 2017-03-05 17:04:09 +0100 | [diff] [blame] | 175 | set ft=haskell |
| 176 | |
| 177 | " Scala |
Bram Moolenaar | 3a429ef | 2017-06-11 17:10:32 +0200 | [diff] [blame] | 178 | elseif s:name =~# 'scala\>' |
Bram Moolenaar | 214641f | 2017-03-05 17:04:09 +0100 | [diff] [blame] | 179 | set ft=scala |
| 180 | |
Bram Moolenaar | 8fd2ffc | 2018-02-03 15:43:15 +0100 | [diff] [blame] | 181 | " Clojure |
| 182 | elseif s:name =~# 'clojure' |
| 183 | set ft=clojure |
| 184 | |
Bram Moolenaar | a0122dc | 2021-01-12 17:42:24 +0100 | [diff] [blame] | 185 | " Free Pascal |
| 186 | elseif s:name =~# 'instantfpc\>' |
| 187 | set ft=pascal |
| 188 | |
Bram Moolenaar | 402115f | 2021-01-22 20:55:04 +0100 | [diff] [blame] | 189 | " Fennel |
| 190 | elseif s:name =~# 'fennel\>' |
| 191 | set ft=fennel |
| 192 | |
Bram Moolenaar | 314b773 | 2021-11-16 11:53:13 +0000 | [diff] [blame] | 193 | " MikroTik RouterOS script |
| 194 | elseif s:name =~# 'rsc\>' |
| 195 | set ft=routeros |
| 196 | |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 197 | endif |
| 198 | unlet s:name |
| 199 | |
| 200 | else |
| 201 | " File does not start with "#!". |
| 202 | |
| 203 | let s:line2 = getline(2) |
| 204 | let s:line3 = getline(3) |
| 205 | let s:line4 = getline(4) |
| 206 | let s:line5 = getline(5) |
| 207 | |
| 208 | " Bourne-like shell scripts: sh ksh bash bash2 |
Bram Moolenaar | 3a429ef | 2017-06-11 17:10:32 +0200 | [diff] [blame] | 209 | if s:line1 =~# '^:$' |
Bram Moolenaar | d09a206 | 2017-11-11 15:37:45 +0100 | [diff] [blame] | 210 | call dist#ft#SetFileTypeSH(s:line1) " defined in filetype.vim |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 211 | |
Bram Moolenaar | 6a7af8e | 2019-06-25 21:34:26 +0200 | [diff] [blame] | 212 | " Z shell scripts |
Bram Moolenaar | 3a429ef | 2017-06-11 17:10:32 +0200 | [diff] [blame] | 213 | elseif s:line1 =~# '^#compdef\>' || s:line1 =~# '^#autoload\>' || |
| 214 | \ "\n".s:line1."\n".s:line2."\n".s:line3."\n".s:line4."\n".s:line5 =~# '\n\s*emulate\s\+\%(-[LR]\s\+\)\=[ckz]\=sh\>' |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 215 | set ft=zsh |
| 216 | |
| 217 | " ELM Mail files |
Bram Moolenaar | 3a429ef | 2017-06-11 17:10:32 +0200 | [diff] [blame] | 218 | elseif s:line1 =~# '^From \([a-zA-Z][a-zA-Z_0-9\.=-]*\(@[^ ]*\)\=\|-\) .* \(19\|20\)\d\d$' |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 219 | set ft=mail |
| 220 | |
Bram Moolenaar | 6a7af8e | 2019-06-25 21:34:26 +0200 | [diff] [blame] | 221 | " Mason |
Bram Moolenaar | 3a429ef | 2017-06-11 17:10:32 +0200 | [diff] [blame] | 222 | elseif s:line1 =~# '^<[%&].*>' |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 223 | set ft=mason |
| 224 | |
Bram Moolenaar | 6a7af8e | 2019-06-25 21:34:26 +0200 | [diff] [blame] | 225 | " Vim scripts (must have '" vim' as the first line to trigger this) |
Bram Moolenaar | 3a429ef | 2017-06-11 17:10:32 +0200 | [diff] [blame] | 226 | elseif s:line1 =~# '^" *[vV]im$' |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 227 | set ft=vim |
| 228 | |
Bram Moolenaar | 6a7af8e | 2019-06-25 21:34:26 +0200 | [diff] [blame] | 229 | " libcxx and libstdc++ standard library headers like "iostream" do not have |
| 230 | " an extension, recognize the Emacs file mode. |
| 231 | elseif s:line1 =~? '-\*-.*C++.*-\*-' |
| 232 | set ft=cpp |
| 233 | |
| 234 | " MOO |
Bram Moolenaar | 3a429ef | 2017-06-11 17:10:32 +0200 | [diff] [blame] | 235 | elseif s:line1 =~# '^\*\* LambdaMOO Database, Format Version \%([1-3]\>\)\@!\d\+ \*\*$' |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 236 | set ft=moo |
| 237 | |
| 238 | " Diff file: |
| 239 | " - "diff" in first line (context diff) |
| 240 | " - "Only in " in first line |
| 241 | " - "--- " in first line and "+++ " in second line (unified diff). |
| 242 | " - "*** " in first line and "--- " in second line (context diff). |
| 243 | " - "# It was generated by makepatch " in the second line (makepatch diff). |
| 244 | " - "Index: <filename>" in the first line (CVS file) |
Bram Moolenaar | 899dddf | 2006-03-26 21:06:50 +0000 | [diff] [blame] | 245 | " - "=== ", line of "=", "---", "+++ " (SVK diff) |
Bram Moolenaar | d2cec5b | 2006-03-28 21:08:56 +0000 | [diff] [blame] | 246 | " - "=== ", "--- ", "+++ " (bzr diff, common case) |
| 247 | " - "=== (removed|added|renamed|modified)" (bzr diff, alternative) |
Bram Moolenaar | d09acef | 2012-09-21 14:54:30 +0200 | [diff] [blame] | 248 | " - "# HG changeset patch" in first line (Mercurial export format) |
Bram Moolenaar | 3a429ef | 2017-06-11 17:10:32 +0200 | [diff] [blame] | 249 | 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\)' |
| 250 | \ || (s:line1 =~# '^--- ' && s:line2 =~# '^+++ ') |
| 251 | \ || (s:line1 =~# '^\* looking for ' && s:line2 =~# '^\* comparing to ') |
| 252 | \ || (s:line1 =~# '^\*\*\* ' && s:line2 =~# '^--- ') |
| 253 | \ || (s:line1 =~# '^=== ' && ((s:line2 =~# '^=\{66\}' && s:line3 =~# '^--- ' && s:line4 =~# '^+++') || (s:line2 =~# '^--- ' && s:line3 =~# '^+++ '))) |
| 254 | \ || (s:line1 =~# '^=== \(removed\|added\|renamed\|modified\)') |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 255 | set ft=diff |
| 256 | |
| 257 | " PostScript Files (must have %!PS as the first line, like a2ps output) |
Bram Moolenaar | 3a429ef | 2017-06-11 17:10:32 +0200 | [diff] [blame] | 258 | elseif s:line1 =~# '^%![ \t]*PS' |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 259 | set ft=postscr |
| 260 | |
| 261 | " M4 scripts: Guess there is a line that starts with "dnl". |
Bram Moolenaar | 3a429ef | 2017-06-11 17:10:32 +0200 | [diff] [blame] | 262 | elseif s:line1 =~# '^\s*dnl\>' |
| 263 | \ || s:line2 =~# '^\s*dnl\>' |
| 264 | \ || s:line3 =~# '^\s*dnl\>' |
| 265 | \ || s:line4 =~# '^\s*dnl\>' |
| 266 | \ || s:line5 =~# '^\s*dnl\>' |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 267 | set ft=m4 |
| 268 | |
| 269 | " AmigaDos scripts |
| 270 | elseif $TERM == "amiga" |
Bram Moolenaar | 3a429ef | 2017-06-11 17:10:32 +0200 | [diff] [blame] | 271 | \ && (s:line1 =~# "^;" || s:line1 =~? '^\.bra') |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 272 | set ft=amiga |
| 273 | |
| 274 | " SiCAD scripts (must have procn or procd as the first line to trigger this) |
| 275 | elseif s:line1 =~? '^ *proc[nd] *$' |
| 276 | set ft=sicad |
| 277 | |
| 278 | " Purify log files start with "**** Purify" |
Bram Moolenaar | 3a429ef | 2017-06-11 17:10:32 +0200 | [diff] [blame] | 279 | elseif s:line1 =~# '^\*\*\*\* Purify' |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 280 | set ft=purifylog |
| 281 | |
| 282 | " XML |
Bram Moolenaar | 3a429ef | 2017-06-11 17:10:32 +0200 | [diff] [blame] | 283 | elseif s:line1 =~# '<?\s*xml.*?>' |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 284 | set ft=xml |
| 285 | |
| 286 | " XHTML (e.g.: PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN") |
Bram Moolenaar | 3a429ef | 2017-06-11 17:10:32 +0200 | [diff] [blame] | 287 | elseif s:line1 =~# '\<DTD\s\+XHTML\s' |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 288 | set ft=xhtml |
| 289 | |
Bram Moolenaar | 12b87e5 | 2008-08-25 03:04:18 +0000 | [diff] [blame] | 290 | " HTML (e.g.: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN") |
Bram Moolenaar | 2685212 | 2016-05-24 20:02:38 +0200 | [diff] [blame] | 291 | " Avoid "doctype html", used by slim. |
| 292 | elseif s:line1 =~? '<!DOCTYPE\s\+html\>' |
Bram Moolenaar | 12b87e5 | 2008-08-25 03:04:18 +0000 | [diff] [blame] | 293 | set ft=html |
| 294 | |
Bram Moolenaar | aba8857 | 2008-06-25 20:13:35 +0000 | [diff] [blame] | 295 | " PDF |
Bram Moolenaar | 3a429ef | 2017-06-11 17:10:32 +0200 | [diff] [blame] | 296 | elseif s:line1 =~# '^%PDF-' |
Bram Moolenaar | aba8857 | 2008-06-25 20:13:35 +0000 | [diff] [blame] | 297 | set ft=pdf |
| 298 | |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 299 | " XXD output |
Bram Moolenaar | 3a429ef | 2017-06-11 17:10:32 +0200 | [diff] [blame] | 300 | elseif s:line1 =~# '^\x\{7}: \x\{2} \=\x\{2} \=\x\{2} \=\x\{2} ' |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 301 | set ft=xxd |
| 302 | |
| 303 | " RCS/CVS log output |
Bram Moolenaar | 3a429ef | 2017-06-11 17:10:32 +0200 | [diff] [blame] | 304 | elseif s:line1 =~# '^RCS file:' || s:line2 =~# '^RCS file:' |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 305 | set ft=rcslog |
| 306 | |
| 307 | " CVS commit |
Bram Moolenaar | 3a429ef | 2017-06-11 17:10:32 +0200 | [diff] [blame] | 308 | elseif s:line2 =~# '^CVS:' || getline("$") =~# '^CVS: ' |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 309 | set ft=cvs |
| 310 | |
Bram Moolenaar | 19a09a1 | 2005-03-04 23:39:37 +0000 | [diff] [blame] | 311 | " Prescribe |
Bram Moolenaar | 3a429ef | 2017-06-11 17:10:32 +0200 | [diff] [blame] | 312 | elseif s:line1 =~# '^!R!' |
Bram Moolenaar | 19a09a1 | 2005-03-04 23:39:37 +0000 | [diff] [blame] | 313 | set ft=prescribe |
| 314 | |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 315 | " Send-pr |
Bram Moolenaar | 3a429ef | 2017-06-11 17:10:32 +0200 | [diff] [blame] | 316 | elseif s:line1 =~# '^SEND-PR:' |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 317 | set ft=sendpr |
| 318 | |
| 319 | " SNNS files |
Bram Moolenaar | 3a429ef | 2017-06-11 17:10:32 +0200 | [diff] [blame] | 320 | elseif s:line1 =~# '^SNNS network definition file' |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 321 | set ft=snnsnet |
Bram Moolenaar | 3a429ef | 2017-06-11 17:10:32 +0200 | [diff] [blame] | 322 | elseif s:line1 =~# '^SNNS pattern definition file' |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 323 | set ft=snnspat |
Bram Moolenaar | 3a429ef | 2017-06-11 17:10:32 +0200 | [diff] [blame] | 324 | elseif s:line1 =~# '^SNNS result file' |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 325 | set ft=snnsres |
| 326 | |
| 327 | " Virata |
Bram Moolenaar | 3a429ef | 2017-06-11 17:10:32 +0200 | [diff] [blame] | 328 | elseif s:line1 =~# '^%.\{-}[Vv]irata' |
| 329 | \ || s:line2 =~# '^%.\{-}[Vv]irata' |
| 330 | \ || s:line3 =~# '^%.\{-}[Vv]irata' |
| 331 | \ || s:line4 =~# '^%.\{-}[Vv]irata' |
| 332 | \ || s:line5 =~# '^%.\{-}[Vv]irata' |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 333 | set ft=virata |
| 334 | |
| 335 | " Strace |
Bram Moolenaar | c572da5 | 2017-08-27 16:52:01 +0200 | [diff] [blame] | 336 | elseif s:line1 =~# '[0-9:.]* *execve(' || s:line1 =~# '^__libc_start_main' |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 337 | set ft=strace |
| 338 | |
| 339 | " VSE JCL |
Bram Moolenaar | 3a429ef | 2017-06-11 17:10:32 +0200 | [diff] [blame] | 340 | elseif s:line1 =~# '^\* $$ JOB\>' || s:line1 =~# '^// *JOB\>' |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 341 | set ft=vsejcl |
| 342 | |
| 343 | " TAK and SINDA |
Bram Moolenaar | 3a429ef | 2017-06-11 17:10:32 +0200 | [diff] [blame] | 344 | elseif s:line4 =~# 'K & K Associates' || s:line2 =~# 'TAK 2000' |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 345 | set ft=takout |
Bram Moolenaar | 3a429ef | 2017-06-11 17:10:32 +0200 | [diff] [blame] | 346 | elseif s:line3 =~# 'S Y S T E M S I M P R O V E D ' |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 347 | set ft=sindaout |
Bram Moolenaar | 3a429ef | 2017-06-11 17:10:32 +0200 | [diff] [blame] | 348 | elseif getline(6) =~# 'Run Date: ' |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 349 | set ft=takcmp |
Bram Moolenaar | 3a429ef | 2017-06-11 17:10:32 +0200 | [diff] [blame] | 350 | elseif getline(9) =~# 'Node File 1' |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 351 | set ft=sindacmp |
| 352 | |
| 353 | " DNS zone files |
Bram Moolenaar | 01164a6 | 2017-11-02 22:58:42 +0100 | [diff] [blame] | 354 | elseif s:line1.s:line2.s:line3.s:line4 =~# '^; <<>> DiG [0-9.]\+.* <<>>\|$ORIGIN\|$TTL\|IN\s\+SOA' |
Bram Moolenaar | bd40414 | 2006-03-25 22:05:04 +0000 | [diff] [blame] | 355 | set ft=bindzone |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 356 | |
| 357 | " BAAN |
Bram Moolenaar | 3a429ef | 2017-06-11 17:10:32 +0200 | [diff] [blame] | 358 | elseif s:line1 =~# '|\*\{1,80}' && s:line2 =~# 'VRC ' |
| 359 | \ || s:line2 =~# '|\*\{1,80}' && s:line3 =~# 'VRC ' |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 360 | set ft=baan |
| 361 | |
| 362 | " Valgrind |
Bram Moolenaar | 3a429ef | 2017-06-11 17:10:32 +0200 | [diff] [blame] | 363 | elseif s:line1 =~# '^==\d\+== valgrind' || s:line3 =~# '^==\d\+== Using valgrind' |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 364 | set ft=valgrind |
| 365 | |
Bram Moolenaar | 34401cc | 2014-08-29 15:12:19 +0200 | [diff] [blame] | 366 | " Go docs |
Bram Moolenaar | 3a429ef | 2017-06-11 17:10:32 +0200 | [diff] [blame] | 367 | elseif s:line1 =~# '^PACKAGE DOCUMENTATION$' |
Bram Moolenaar | 34401cc | 2014-08-29 15:12:19 +0200 | [diff] [blame] | 368 | set ft=godoc |
| 369 | |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 370 | " Renderman Interface Bytestream |
Bram Moolenaar | 3a429ef | 2017-06-11 17:10:32 +0200 | [diff] [blame] | 371 | elseif s:line1 =~# '^##RenderMan' |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 372 | set ft=rib |
| 373 | |
| 374 | " Scheme scripts |
Bram Moolenaar | 3a429ef | 2017-06-11 17:10:32 +0200 | [diff] [blame] | 375 | elseif s:line1 =~# 'exec\s\+\S*scheme' || s:line2 =~# 'exec\s\+\S*scheme' |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 376 | set ft=scheme |
| 377 | |
Bram Moolenaar | aba8857 | 2008-06-25 20:13:35 +0000 | [diff] [blame] | 378 | " Git output |
Bram Moolenaar | 3a429ef | 2017-06-11 17:10:32 +0200 | [diff] [blame] | 379 | elseif s:line1 =~# '^\(commit\|tree\|object\) \x\{40\}\>\|^tag \S\+$' |
Bram Moolenaar | aba8857 | 2008-06-25 20:13:35 +0000 | [diff] [blame] | 380 | set ft=git |
| 381 | |
Bram Moolenaar | 543b7ef | 2013-06-01 14:50:56 +0200 | [diff] [blame] | 382 | " Gprof (gnu profiler) |
| 383 | elseif s:line1 == 'Flat profile:' |
| 384 | \ && s:line2 == '' |
Bram Moolenaar | 3a429ef | 2017-06-11 17:10:32 +0200 | [diff] [blame] | 385 | \ && s:line3 =~# '^Each sample counts as .* seconds.$' |
Bram Moolenaar | 543b7ef | 2013-06-01 14:50:56 +0200 | [diff] [blame] | 386 | set ft=gprof |
| 387 | |
Bram Moolenaar | 203d04d | 2013-06-06 21:36:40 +0200 | [diff] [blame] | 388 | " Erlang terms |
| 389 | " (See also: http://www.gnu.org/software/emacs/manual/html_node/emacs/Choosing-Modes.html#Choosing-Modes) |
| 390 | elseif s:line1 =~? '-\*-.*erlang.*-\*-' |
| 391 | set ft=erlang |
| 392 | |
Bram Moolenaar | 8eab731 | 2020-03-06 22:25:56 +0100 | [diff] [blame] | 393 | " YAML |
| 394 | elseif s:line1 =~# '^%YAML' |
| 395 | set ft=yaml |
| 396 | |
Bram Moolenaar | 314b773 | 2021-11-16 11:53:13 +0000 | [diff] [blame] | 397 | " MikroTik RouterOS script |
| 398 | elseif s:line1 =~# '^#.*by RouterOS.*$' |
| 399 | set ft=routeros |
| 400 | |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 401 | " CVS diff |
| 402 | else |
Bram Moolenaar | 5c73622 | 2010-01-06 20:54:52 +0100 | [diff] [blame] | 403 | let s:lnum = 1 |
Bram Moolenaar | 3a429ef | 2017-06-11 17:10:32 +0200 | [diff] [blame] | 404 | while getline(s:lnum) =~# "^? " && s:lnum < line("$") |
Bram Moolenaar | 5c73622 | 2010-01-06 20:54:52 +0100 | [diff] [blame] | 405 | let s:lnum += 1 |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 406 | endwhile |
Bram Moolenaar | 3a429ef | 2017-06-11 17:10:32 +0200 | [diff] [blame] | 407 | if getline(s:lnum) =~# '^Index:\s\+\f\+$' |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 408 | set ft=diff |
| 409 | |
| 410 | " locale input files: Formal Definitions of Cultural Conventions |
| 411 | " filename must be like en_US, fr_FR@euro or en_US.UTF-8 |
Bram Moolenaar | 3a429ef | 2017-06-11 17:10:32 +0200 | [diff] [blame] | 412 | elseif expand("%") =~# '\a\a_\a\a\($\|[.@]\)\|i18n$\|POSIX$\|translit_' |
Bram Moolenaar | 5c73622 | 2010-01-06 20:54:52 +0100 | [diff] [blame] | 413 | let s:lnum = 1 |
| 414 | while s:lnum < 100 && s:lnum < line("$") |
Bram Moolenaar | 3a429ef | 2017-06-11 17:10:32 +0200 | [diff] [blame] | 415 | if getline(s:lnum) =~# '^LC_\(IDENTIFICATION\|CTYPE\|COLLATE\|MONETARY\|NUMERIC\|TIME\|MESSAGES\|PAPER\|TELEPHONE\|MEASUREMENT\|NAME\|ADDRESS\)$' |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 416 | setf fdcc |
| 417 | break |
| 418 | endif |
Bram Moolenaar | 5c73622 | 2010-01-06 20:54:52 +0100 | [diff] [blame] | 419 | let s:lnum += 1 |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 420 | endwhile |
| 421 | endif |
Bram Moolenaar | 5c73622 | 2010-01-06 20:54:52 +0100 | [diff] [blame] | 422 | unlet s:lnum |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 423 | |
| 424 | endif |
| 425 | |
| 426 | unlet s:line2 s:line3 s:line4 s:line5 |
| 427 | |
| 428 | endif |
| 429 | |
| 430 | " Restore 'cpoptions' |
| 431 | let &cpo = s:cpo_save |
| 432 | |
| 433 | unlet s:cpo_save s:line1 |