home *** CD-ROM | disk | FTP | other *** search
/ vim.ftp.fu-berlin.de / 2015-02-03.vim.ftp.fu-berlin.de.tar / vim.ftp.fu-berlin.de / runtime / scripts.vim < prev    next >
Encoding:
Text File  |  2010-09-21  |  9.6 KB  |  362 lines

  1. " Vim support file to detect file types in scripts
  2. "
  3. " Maintainer:    Bram Moolenaar <Bram@vim.org>
  4. " Last change:    2010 Sep 22
  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.
  9.  
  10.  
  11. " Only do the rest when the FileType autocommand has not been triggered yet.
  12. if did_filetype()
  13.   finish
  14. endif
  15.  
  16. " Load the user defined scripts file first
  17. " Only do this when the FileType autocommand has not been triggered yet
  18. if exists("myscriptsfile") && filereadable(expand(myscriptsfile))
  19.   execute "source " . myscriptsfile
  20.   if did_filetype()
  21.     finish
  22.   endif
  23. endif
  24.  
  25. " Line continuation is used here, remove 'C' from 'cpoptions'
  26. let s:cpo_save = &cpo
  27. set cpo&vim
  28.  
  29. let s:line1 = getline(1)
  30.  
  31. if s:line1 =~ "^#!"
  32.   " A script that starts with "#!".
  33.  
  34.   " Check for a line like "#!/usr/bin/env VAR=val bash".  Turn it into
  35.   " "#!/usr/bin/bash" to make matching easier.
  36.   if s:line1 =~ '^#!\s*\S*\<env\s'
  37.     let s:line1 = substitute(s:line1, '\S\+=\S\+', '', 'g')
  38.     let s:line1 = substitute(s:line1, '\<env\s\+', '', '')
  39.   endif
  40.  
  41.   " Get the program name.
  42.   " Only accept spaces in PC style paths: "#!c:/program files/perl [args]".
  43.   " If the word env is used, use the first word after the space:
  44.   " "#!/usr/bin/env perl [path/args]"
  45.   " If there is no path use the first word: "#!perl [path/args]".
  46.   " Otherwise get the last word after a slash: "#!/usr/bin/perl [path/args]".
  47.   if s:line1 =~ '^#!\s*\a:[/\\]'
  48.     let s:name = substitute(s:line1, '^#!.*[/\\]\(\i\+\).*', '\1', '')
  49.   elseif s:line1 =~ '^#!.*\<env\>'
  50.     let s:name = substitute(s:line1, '^#!.*\<env\>\s\+\(\i\+\).*', '\1', '')
  51.   elseif s:line1 =~ '^#!\s*[^/\\ ]*\>\([^/\\]\|$\)'
  52.     let s:name = substitute(s:line1, '^#!\s*\([^/\\ ]*\>\).*', '\1', '')
  53.   else
  54.     let s:name = substitute(s:line1, '^#!\s*\S*[/\\]\(\i\+\).*', '\1', '')
  55.   endif
  56.  
  57.   " tcl scripts may have #!/bin/sh in the first line and "exec wish" in the
  58.   " third line.  Suggested by Steven Atkinson.
  59.   if getline(3) =~ '^exec wish'
  60.     let s:name = 'wish'
  61.   endif
  62.  
  63.   " Bourne-like shell scripts: bash bash2 ksh ksh93 sh
  64.   if s:name =~ '^\(bash\d*\|\|ksh\d*\|sh\)\>'
  65.     call SetFileTypeSH(s:line1)    " defined in filetype.vim
  66.  
  67.     " csh scripts
  68.   elseif s:name =~ '^csh\>'
  69.     if exists("g:filetype_csh")
  70.       call SetFileTypeShell(g:filetype_csh)
  71.     else
  72.       call SetFileTypeShell("csh")
  73.     endif
  74.  
  75.     " tcsh scripts
  76.   elseif s:name =~ '^tcsh\>'
  77.     call SetFileTypeShell("tcsh")
  78.  
  79.     " Z shell scripts
  80.   elseif s:name =~ '^zsh\>'
  81.     set ft=zsh
  82.  
  83.     " TCL scripts
  84.   elseif s:name =~ '^\(tclsh\|wish\|expectk\|itclsh\|itkwish\)\>'
  85.     set ft=tcl
  86.  
  87.     " Expect scripts
  88.   elseif s:name =~ '^expect\>'
  89.     set ft=expect
  90.  
  91.     " Gnuplot scripts
  92.   elseif s:name =~ '^gnuplot\>'
  93.     set ft=gnuplot
  94.  
  95.     " Makefiles
  96.   elseif s:name =~ 'make\>'
  97.     set ft=make
  98.  
  99.     " Lua
  100.   elseif s:name =~ 'lua'
  101.     set ft=lua
  102.  
  103.     " Perl 6
  104.   elseif s:name =~ 'perl6'
  105.     set ft=perl6
  106.  
  107.     " Perl
  108.   elseif s:name =~ 'perl'
  109.     set ft=perl
  110.  
  111.     " PHP
  112.   elseif s:name =~ 'php'
  113.     set ft=php
  114.  
  115.     " Python
  116.   elseif s:name =~ 'python'
  117.     set ft=python
  118.  
  119.     " Groovy
  120.   elseif s:name =~ '^groovy\>'
  121.     set ft=groovy
  122.  
  123.     " Ruby
  124.   elseif s:name =~ 'ruby'
  125.     set ft=ruby
  126.  
  127.     " BC calculator
  128.   elseif s:name =~ '^bc\>'
  129.     set ft=bc
  130.  
  131.     " sed
  132.   elseif s:name =~ 'sed\>'
  133.     set ft=sed
  134.  
  135.     " OCaml-scripts
  136.   elseif s:name =~ 'ocaml'
  137.     set ft=ocaml
  138.  
  139.     " Awk scripts
  140.   elseif s:name =~ 'awk\>'
  141.     set ft=awk
  142.  
  143.     " Website MetaLanguage
  144.   elseif s:name =~ 'wml'
  145.     set ft=wml
  146.  
  147.     " Scheme scripts
  148.   elseif s:name =~ 'scheme'
  149.     set ft=scheme
  150.  
  151.     " CFEngine scripts
  152.   elseif s:name =~ 'cfengine'
  153.     set ft=cfengine
  154.  
  155.   endif
  156.   unlet s:name
  157.  
  158. else
  159.   " File does not start with "#!".
  160.  
  161.   let s:line2 = getline(2)
  162.   let s:line3 = getline(3)
  163.   let s:line4 = getline(4)
  164.   let s:line5 = getline(5)
  165.  
  166.   " Bourne-like shell scripts: sh ksh bash bash2
  167.   if s:line1 =~ '^:$'
  168.     call SetFileTypeSH(s:line1)    " defined in filetype.vim
  169.  
  170.     " Z shell scripts
  171.   elseif s:line1 =~ '^#compdef\>' || s:line1 =~ '^#autoload\>' ||
  172.         \ "\n".s:line1."\n".s:line2."\n".s:line3."\n".s:line4."\n".s:line5 =~ '\n\s*emulate\s\+\%(-[LR]\s\+\)\=[ckz]\=sh\>'
  173.     set ft=zsh
  174.  
  175.   " ELM Mail files
  176.   elseif s:line1 =~ '^From \([a-zA-Z][a-zA-Z_0-9\.=-]*\(@[^ ]*\)\=\|-\) .* \(19\|20\)\d\d$'
  177.     set ft=mail
  178.  
  179.     " Mason
  180.   elseif s:line1 =~ '^<[%&].*>'
  181.     set ft=mason
  182.  
  183.     " Vim scripts (must have '" vim' as the first line to trigger this)
  184.   elseif s:line1 =~ '^" *[vV]im$'
  185.     set ft=vim
  186.  
  187.     " MOO
  188.   elseif s:line1 =~ '^\*\* LambdaMOO Database, Format Version \%([1-3]\>\)\@!\d\+ \*\*$'
  189.     set ft=moo
  190.  
  191.     " Diff file:
  192.     " - "diff" in first line (context diff)
  193.     " - "Only in " in first line
  194.     " - "--- " in first line and "+++ " in second line (unified diff).
  195.     " - "*** " in first line and "--- " in second line (context diff).
  196.     " - "# It was generated by makepatch " in the second line (makepatch diff).
  197.     " - "Index: <filename>" in the first line (CVS file)
  198.     " - "=== ", line of "=", "---", "+++ " (SVK diff)
  199.     " - "=== ", "--- ", "+++ " (bzr diff, common case)
  200.     " - "=== (removed|added|renamed|modified)" (bzr diff, alternative)
  201.   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\+\)'
  202.     \ || (s:line1 =~ '^--- ' && s:line2 =~ '^+++ ')
  203.     \ || (s:line1 =~ '^\* looking for ' && s:line2 =~ '^\* comparing to ')
  204.     \ || (s:line1 =~ '^\*\*\* ' && s:line2 =~ '^--- ')
  205.     \ || (s:line1 =~ '^=== ' && ((s:line2 =~ '^=\{66\}' && s:line3 =~ '^--- ' && s:line4 =~ '^+++') || (s:line2 =~ '^--- ' && s:line3 =~ '^+++ ')))
  206.     \ || (s:line1 =~ '^=== \(removed\|added\|renamed\|modified\)')
  207.     set ft=diff
  208.  
  209.     " PostScript Files (must have %!PS as the first line, like a2ps output)
  210.   elseif s:line1 =~ '^%![ \t]*PS'
  211.     set ft=postscr
  212.  
  213.     " M4 scripts: Guess there is a line that starts with "dnl".
  214.   elseif s:line1 =~ '^\s*dnl\>'
  215.     \ || s:line2 =~ '^\s*dnl\>'
  216.     \ || s:line3 =~ '^\s*dnl\>'
  217.     \ || s:line4 =~ '^\s*dnl\>'
  218.     \ || s:line5 =~ '^\s*dnl\>'
  219.     set ft=m4
  220.  
  221.     " AmigaDos scripts
  222.   elseif $TERM == "amiga"
  223.     \ && (s:line1 =~ "^;" || s:line1 =~ '^\.[bB][rR][aA]')
  224.     set ft=amiga
  225.  
  226.     " SiCAD scripts (must have procn or procd as the first line to trigger this)
  227.   elseif s:line1 =~? '^ *proc[nd] *$'
  228.     set ft=sicad
  229.  
  230.     " Purify log files start with "****  Purify"
  231.   elseif s:line1 =~ '^\*\*\*\*  Purify'
  232.     set ft=purifylog
  233.  
  234.     " XML
  235.   elseif s:line1 =~ '<?\s*xml.*?>'
  236.     set ft=xml
  237.  
  238.     " XHTML (e.g.: PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN")
  239.   elseif s:line1 =~ '\<DTD\s\+XHTML\s'
  240.     set ft=xhtml
  241.  
  242.     " HTML (e.g.: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN")
  243.   elseif s:line1 =~? '\<DOCTYPE\s\+html\>'
  244.     set ft=html
  245.  
  246.     " PDF
  247.   elseif s:line1 =~ '^%PDF-'
  248.     set ft=pdf
  249.  
  250.     " XXD output
  251.   elseif s:line1 =~ '^\x\{7}: \x\{2} \=\x\{2} \=\x\{2} \=\x\{2} '
  252.     set ft=xxd
  253.  
  254.     " RCS/CVS log output
  255.   elseif s:line1 =~ '^RCS file:' || s:line2 =~ '^RCS file:'
  256.     set ft=rcslog
  257.  
  258.     " CVS commit
  259.   elseif s:line2 =~ '^CVS:' || getline("$") =~ '^CVS: '
  260.     set ft=cvs
  261.  
  262.     " Prescribe
  263.   elseif s:line1 =~ '^!R!'
  264.     set ft=prescribe
  265.  
  266.     " Send-pr
  267.   elseif s:line1 =~ '^SEND-PR:'
  268.     set ft=sendpr
  269.  
  270.     " SNNS files
  271.   elseif s:line1 =~ '^SNNS network definition file'
  272.     set ft=snnsnet
  273.   elseif s:line1 =~ '^SNNS pattern definition file'
  274.     set ft=snnspat
  275.   elseif s:line1 =~ '^SNNS result file'
  276.     set ft=snnsres
  277.  
  278.     " Virata
  279.   elseif s:line1 =~ '^%.\{-}[Vv]irata'
  280.     \ || s:line2 =~ '^%.\{-}[Vv]irata'
  281.     \ || s:line3 =~ '^%.\{-}[Vv]irata'
  282.     \ || s:line4 =~ '^%.\{-}[Vv]irata'
  283.     \ || s:line5 =~ '^%.\{-}[Vv]irata'
  284.     set ft=virata
  285.  
  286.     " Strace
  287.   elseif s:line1 =~ '^\(\[pid \d\+\] \)\=[0-9:.]* *execve(' || s:line1 =~ '^__libc_start_main'
  288.     set ft=strace
  289.  
  290.     " VSE JCL
  291.   elseif s:line1 =~ '^\* $$ JOB\>' || s:line1 =~ '^// *JOB\>'
  292.     set ft=vsejcl
  293.  
  294.     " TAK and SINDA
  295.   elseif s:line4 =~ 'K & K  Associates' || s:line2 =~ 'TAK 2000'
  296.     set ft=takout
  297.   elseif s:line3 =~ 'S Y S T E M S   I M P R O V E D '
  298.     set ft=sindaout
  299.   elseif getline(6) =~ 'Run Date: '
  300.     set ft=takcmp
  301.   elseif getline(9) =~ 'Node    File  1'
  302.     set ft=sindacmp
  303.  
  304.     " DNS zone files
  305.   elseif s:line1.s:line2.s:line3.s:line4 =~ '^; <<>> DiG [0-9.]\+ <<>>\|BIND.*named\|$ORIGIN\|$TTL\|IN\s\+SOA'
  306.     set ft=bindzone
  307.  
  308.     " BAAN
  309.   elseif s:line1 =~ '|\*\{1,80}' && s:line2 =~ 'VRC '
  310.     \ || s:line2 =~ '|\*\{1,80}' && s:line3 =~ 'VRC '
  311.     set ft=baan
  312.  
  313.   " Valgrind
  314.   elseif s:line1 =~ '^==\d\+== valgrind' || s:line3 =~ '^==\d\+== Using valgrind'
  315.     set ft=valgrind
  316.  
  317.   " Renderman Interface Bytestream
  318.   elseif s:line1 =~ '^##RenderMan'
  319.     set ft=rib
  320.  
  321.   " Scheme scripts
  322.   elseif s:line1 =~ 'exec\s\+\S*scheme' || s:line2 =~ 'exec\s\+\S*scheme'
  323.     set ft=scheme
  324.  
  325.   " Git output
  326.   elseif s:line1 =~ '^\(commit\|tree\|object\) \x\{40\}\>\|^tag \S\+$'
  327.     set ft=git
  328.  
  329.   " CVS diff
  330.   else
  331.     let s:lnum = 1
  332.     while getline(s:lnum) =~ "^? " && s:lnum < line("$")
  333.       let s:lnum += 1
  334.     endwhile
  335.     if getline(s:lnum) =~ '^Index:\s\+\f\+$'
  336.       set ft=diff
  337.  
  338.       " locale input files: Formal Definitions of Cultural Conventions
  339.       " filename must be like en_US, fr_FR@euro or en_US.UTF-8
  340.     elseif expand("%") =~ '\a\a_\a\a\($\|[.@]\)\|i18n$\|POSIX$\|translit_'
  341.       let s:lnum = 1
  342.       while s:lnum < 100 && s:lnum < line("$")
  343.     if getline(s:lnum) =~ '^LC_\(IDENTIFICATION\|CTYPE\|COLLATE\|MONETARY\|NUMERIC\|TIME\|MESSAGES\|PAPER\|TELEPHONE\|MEASUREMENT\|NAME\|ADDRESS\)$'
  344.       setf fdcc
  345.       break
  346.     endif
  347.     let s:lnum += 1
  348.       endwhile
  349.     endif
  350.     unlet s:lnum
  351.  
  352.   endif
  353.  
  354.   unlet s:line2 s:line3 s:line4 s:line5
  355.  
  356. endif
  357.  
  358. " Restore 'cpoptions'
  359. let &cpo = s:cpo_save
  360.  
  361. unlet s:cpo_save s:line1
  362.