Patch 8.0.1281
Problem:    Loading file type detection slows down startup.
Solution:   Move functions to an autoload script.
Files:      runtime/filetype.vim, runtime/autoload/filetype.vim,
            runtime/scripts.vim


*** ../vim-8.0.1280/runtime/filetype.vim        2017-08-11 20:50:00.722908598 
+0200
--- runtime/filetype.vim        2017-11-09 20:35:00.182149228 +0100
***************
*** 1,7 ****
  " Vim support file to detect file types
  "
  " Maintainer: Bram Moolenaar <[email protected]>
! " Last Change:        2017 Aug 11
  
  " Listen very carefully, I will say this only once
  if exists("did_load_filetypes")
--- 1,7 ----
  " Vim support file to detect file types
  "
  " Maintainer: Bram Moolenaar <[email protected]>
! " Last Change:        2017 Nov 09
  
  " Listen very carefully, I will say this only once
  if exists("did_load_filetypes")
***************
*** 52,78 ****
  au BufNewFile,BufRead $VIMRUNTIME/doc/*.txt   setf help
  
  " Abaqus or Trasys
! au BufNewFile,BufRead *.inp                   call s:Check_inp()
! 
! func! s:Check_inp()
!   if getline(1) =~ '^\*'
!     setf abaqus
!   else
!     let n = 1
!     if line("$") > 500
!       let nmax = 500
!     else
!       let nmax = line("$")
!     endif
!     while n <= nmax
!       if getline(n) =~? "^header surface data"
!       setf trasys
!       break
!       endif
!       let n = n + 1
!     endwhile
!   endif
! endfunc
  
  " A-A-P recipe
  au BufNewFile,BufRead *.aap                   setf aap
--- 52,58 ----
  au BufNewFile,BufRead $VIMRUNTIME/doc/*.txt   setf help
  
  " Abaqus or Trasys
! au BufNewFile,BufRead *.inp                   call filetype#Check_inp()
  
  " A-A-P recipe
  au BufNewFile,BufRead *.aap                   setf aap
***************
*** 174,217 ****
  
  " Assembly (all kinds)
  " *.lst is not pure assembly, it has two extra columns (address, byte codes)
! au BufNewFile,BufRead *.asm,*.[sS],*.[aA],*.mac,*.lst call s:FTasm()
! 
! " This function checks for the kind of assembly that is wanted by the user, or
! " can be detected from the first five lines of the file.
! func! s:FTasm()
!   " make sure b:asmsyntax exists
!   if !exists("b:asmsyntax")
!     let b:asmsyntax = ""
!   endif
! 
!   if b:asmsyntax == ""
!     call s:FTasmsyntax()
!   endif
! 
!   " if b:asmsyntax still isn't set, default to asmsyntax or GNU
!   if b:asmsyntax == ""
!     if exists("g:asmsyntax")
!       let b:asmsyntax = g:asmsyntax
!     else
!       let b:asmsyntax = "asm"
!     endif
!   endif
! 
!   exe "setf " . fnameescape(b:asmsyntax)
! endfunc
! 
! func! s:FTasmsyntax()
!   " see if file contains any asmsyntax=foo overrides. If so, change
!   " b:asmsyntax appropriately
!   let head = " ".getline(1)." ".getline(2)." ".getline(3)." ".getline(4).
!       \" ".getline(5)." "
!   let match = matchstr(head, '\sasmsyntax=\zs[a-zA-Z0-9]\+\ze\s')
!   if match != ''
!     let b:asmsyntax = match
!   elseif ((head =~? '\.title') || (head =~? '\.ident') || (head =~? 
'\.macro') || (head =~? '\.subtitle') || (head =~? '\.library'))
!     let b:asmsyntax = "vmasm"
!   endif
! endfunc
  
  " Macro (VAX)
  au BufNewFile,BufRead *.mar                   setf vmasm
--- 154,160 ----
  
  " Assembly (all kinds)
  " *.lst is not pure assembly, it has two extra columns (address, byte codes)
! au BufNewFile,BufRead *.asm,*.[sS],*.[aA],*.mac,*.lst call filetype#FTasm()
  
  " Macro (VAX)
  au BufNewFile,BufRead *.mar                   setf vmasm
***************
*** 241,257 ****
  au BufNewFile,BufRead *.mch,*.ref,*.imp               setf b
  
  " BASIC or Visual Basic
! au BufNewFile,BufRead *.bas                   call s:FTVB("basic")
! 
! " Check if one of the first five lines contains "VB_Name".  In that case it is
! " probably a Visual Basic file.  Otherwise it's assumed to be "alt" filetype.
! func! s:FTVB(alt)
!   if getline(1).getline(2).getline(3).getline(4).getline(5) =~? 
'VB_Name\|Begin VB\.\(Form\|MDIForm\|UserControl\)'
!     setf vb
!   else
!     exe "setf " . a:alt
!   endif
! endfunc
  
  " Visual Basic Script (close to Visual Basic) or Visual Basic .NET
  au BufNewFile,BufRead *.vb,*.vbs,*.dsm,*.ctl  setf vb
--- 184,190 ----
  au BufNewFile,BufRead *.mch,*.ref,*.imp               setf b
  
  " BASIC or Visual Basic
! au BufNewFile,BufRead *.bas                   call filetype#FTVB("basic")
  
  " Visual Basic Script (close to Visual Basic) or Visual Basic .NET
  au BufNewFile,BufRead *.vb,*.vbs,*.dsm,*.ctl  setf vb
***************
*** 269,282 ****
        \ if getline(1) =~ '^/\*' | setf rexx | else | setf dosbatch | endif
  
  " Batch file for 4DOS
! au BufNewFile,BufRead *.btm                   call s:FTbtm()
! func! s:FTbtm()
!   if exists("g:dosbatch_syntax_for_btm") && g:dosbatch_syntax_for_btm
!     setf dosbatch
!   else
!     setf btm
!   endif
! endfunc
  
  " BC calculator
  au BufNewFile,BufRead *.bc                    setf bc
--- 202,208 ----
        \ if getline(1) =~ '^/\*' | setf rexx | else | setf dosbatch | endif
  
  " Batch file for 4DOS
! au BufNewFile,BufRead *.btm                   call filetype#FTbtm()
  
  " BC calculator
  au BufNewFile,BufRead *.bc                    setf bc
***************
*** 292,310 ****
  
  " BIND configuration
  " sudoedit uses namedXXXX.conf
! au BufNewFile,BufRead named*.conf,rndc*.conf  setf named
  
  " BIND zone
  au BufNewFile,BufRead named.root              setf bindzone
! au BufNewFile,BufRead *.db                    call s:BindzoneCheck('')
! 
! func! s:BindzoneCheck(default)
!   if getline(1).getline(2).getline(3).getline(4) =~ '^; <<>> DiG [0-9.]\+ 
<<>>\|BIND.*named\|$ORIGIN\|$TTL\|IN\s\+SOA'
!     setf bindzone
!   elseif a:default != ''
!     exe 'setf ' . a:default
!   endif
! endfunc
  
  " Blank
  au BufNewFile,BufRead *.bl                    setf blank
--- 218,228 ----
  
  " BIND configuration
  " sudoedit uses namedXXXX.conf
! au BufNewFile,BufRead named*.conf,rndc*.conf,rndc*.key        setf named
  
  " BIND zone
  au BufNewFile,BufRead named.root              setf bindzone
! au BufNewFile,BufRead *.db                    call filetype#BindzoneCheck('')
  
  " Blank
  au BufNewFile,BufRead *.bl                    setf blank
***************
*** 320,340 ****
  endif
  
  " C or lpc
! au BufNewFile,BufRead *.c                     call s:FTlpc()
! 
! func! s:FTlpc()
!   if exists("g:lpc_syntax_for_c")
!     let lnum = 1
!     while lnum <= 12
!       if getline(lnum) =~# 
'^\(//\|inherit\|private\|protected\|nosave\|string\|object\|mapping\|mixed\)'
!       setf lpc
!       return
!       endif
!       let lnum = lnum + 1
!     endwhile
!   endif
!   setf c
! endfunc
  
  " Calendar
  au BufNewFile,BufRead calendar                        setf calendar
--- 238,244 ----
  endif
  
  " C or lpc
! au BufNewFile,BufRead *.c                     call filetype#FTlpc()
  
  " Calendar
  au BufNewFile,BufRead calendar                        setf calendar
***************
*** 388,410 ****
  " .h files can be C, Ch C++, ObjC or ObjC++.
  " Set c_syntax_for_h if you want C, ch_syntax_for_h if you want Ch. ObjC is
  " detected automatically.
! au BufNewFile,BufRead *.h                     call s:FTheader()
! 
! func! s:FTheader()
!   if match(getline(1, min([line("$"), 200])), '^@\(interface\|end\|class\)') 
> -1
!     if exists("g:c_syntax_for_h")
!       setf objc
!     else
!       setf objcpp
!     endif
!   elseif exists("g:c_syntax_for_h")
!     setf c
!   elseif exists("g:ch_syntax_for_h")
!     setf ch
!   else
!     setf cpp
!   endif
! endfunc
  
  " Ch (CHscript)
  au BufNewFile,BufRead *.chf                   setf ch
--- 292,298 ----
  " .h files can be C, Ch C++, ObjC or ObjC++.
  " Set c_syntax_for_h if you want C, ch_syntax_for_h if you want Ch. ObjC is
  " detected automatically.
! au BufNewFile,BufRead *.h                     call filetype#FTheader()
  
  " Ch (CHscript)
  au BufNewFile,BufRead *.chf                   setf ch
***************
*** 438,473 ****
  au BufNewFile,BufRead *..ch                   setf chill
  
  " Changes for WEB and CWEB or CHILL
! au BufNewFile,BufRead *.ch                    call s:FTchange()
! 
! " This function checks if one of the first ten lines start with a '@'.  In
! " that case it is probably a change file.
! " If the first line starts with # or ! it's probably a ch file.
! " If a line has "main", "include", "//" ir "/*" it's probably ch.
! " Otherwise CHILL is assumed.
! func! s:FTchange()
!   let lnum = 1
!   while lnum <= 10
!     if getline(lnum)[0] == '@'
!       setf change
!       return
!     endif
!     if lnum == 1 && (getline(1)[0] == '#' || getline(1)[0] == '!')
!       setf ch
!       return
!     endif
!     if getline(lnum) =~ "MODULE"
!       setf chill
!       return
!     endif
!     if getline(lnum) =~ 'main\s*(\|#\s*include\|//'
!       setf ch
!       return
!     endif
!     let lnum = lnum + 1
!   endwhile
!   setf chill
! endfunc
  
  " ChordPro
  au BufNewFile,BufRead *.chopro,*.crd,*.cho,*.crdpro,*.chordpro        setf 
chordpro
--- 326,332 ----
  au BufNewFile,BufRead *..ch                   setf chill
  
  " Changes for WEB and CWEB or CHILL
! au BufNewFile,BufRead *.ch                    call filetype#FTchange()
  
  " ChordPro
  au BufNewFile,BufRead *.chopro,*.crd,*.cho,*.crdpro,*.chordpro        setf 
chordpro
***************
*** 479,505 ****
  au BufNewFile,BufRead *.eni                   setf cl
  
  " Clever or dtd
! au BufNewFile,BufRead *.ent                   call s:FTent()
! 
! func! s:FTent()
!   " This function checks for valid cl syntax in the first five lines.
!   " Look for either an opening comment, '#', or a block start, '{".
!   " If not found, assume SGML.
!   let lnum = 1
!   while lnum < 6
!     let line = getline(lnum)
!     if line =~ '^\s*[#{]'
!       setf cl
!       return
!     elseif line !~ '^\s*$'
!       " Not a blank line, not a comment, and not a block start,
!       " so doesn't look like valid cl code.
!       break
!     endif
!     let lnum = lnum + 1
!   endw
!   setf dtd
! endfunc
  
  " Clipper (or FoxPro; could also be eviews)
  au BufNewFile,BufRead *.prg
--- 338,344 ----
  au BufNewFile,BufRead *.eni                   setf cl
  
  " Clever or dtd
! au BufNewFile,BufRead *.ent                   call filetype#FTent()
  
  " Clipper (or FoxPro; could also be eviews)
  au BufNewFile,BufRead *.prg
***************
*** 554,572 ****
  au BufNewFile,BufRead *Eterm/*.cfg            setf eterm
  
  " Euphoria 3 or 4
! au BufNewFile,BufRead *.eu,*.ew,*.ex,*.exu,*.exw  call s:EuphoriaCheck()
  if has("fname_case")
!    au BufNewFile,BufRead *.EU,*.EW,*.EX,*.EXU,*.EXW  call s:EuphoriaCheck()
  endif
  
- func! s:EuphoriaCheck()
-   if exists('g:filetype_euphoria')
-     exe 'setf ' . g:filetype_euphoria
-   else
-     setf euphoria3
-   endif
- endfunc
- 
  " Lynx config files
  au BufNewFile,BufRead lynx.cfg                        setf lynx
  
--- 393,403 ----
  au BufNewFile,BufRead *Eterm/*.cfg            setf eterm
  
  " Euphoria 3 or 4
! au BufNewFile,BufRead *.eu,*.ew,*.ex,*.exu,*.exw  call 
filetype#EuphoriaCheck()
  if has("fname_case")
!    au BufNewFile,BufRead *.EU,*.EW,*.EX,*.EXU,*.EXW  call 
filetype#EuphoriaCheck()
  endif
  
  " Lynx config files
  au BufNewFile,BufRead lynx.cfg                        setf lynx
  
***************
*** 611,629 ****
  au BufNewFile,BufRead *.desc                  setf desc
  
  " the D language or dtrace
! au BufNewFile,BufRead *.d                     call s:DtraceCheck()
! 
! func! s:DtraceCheck()
!   let lines = getline(1, min([line("$"), 100]))
!   if match(lines, '^module\>\|^import\>') > -1
!     " D files often start with a module and/or import statement.
!     setf d
!   elseif match(lines, 
'^#!\S\+dtrace\|#pragma\s\+D\s\+option\|:\S\{-}:\S\{-}:') > -1
!     setf dtrace
!   else
!     setf d
!   endif
! endfunc
  
  " Desktop files
  au BufNewFile,BufRead *.desktop,.directory    setf desktop
--- 442,448 ----
  au BufNewFile,BufRead *.desc                  setf desc
  
  " the D language or dtrace
! au BufNewFile,BufRead *.d                     call filetype#DtraceCheck()
  
  " Desktop files
  au BufNewFile,BufRead *.desktop,.directory    setf desktop
***************
*** 655,661 ****
        \ endif
  
  " DCL (Digital Command Language - vms) or DNS zone file
! au BufNewFile,BufRead *.com                   call s:BindzoneCheck('dcl')
  
  " DOT
  au BufNewFile,BufRead *.dot                   setf dot
--- 474,480 ----
        \ endif
  
  " DCL (Digital Command Language - vms) or DNS zone file
! au BufNewFile,BufRead *.com                   call 
filetype#BindzoneCheck('dcl')
  
  " DOT
  au BufNewFile,BufRead *.dot                   setf dot
***************
*** 703,729 ****
  au BufNewFile,BufRead *.ecd                   setf ecd
  
  " Eiffel or Specman or Euphoria
! au BufNewFile,BufRead *.e,*.E                 call s:FTe()
  
  " Elinks configuration
  au BufNewFile,BufRead */etc/elinks.conf,*/.elinks/elinks.conf setf elinks
  
- func! s:FTe()
-   if exists('g:filetype_euphoria')
-     exe 'setf ' . g:filetype_euphoria
-   else
-     let n = 1
-     while n < 100 && n < line("$")
-       if getline(n) =~ "^\\s*\\(<'\\|'>\\)\\s*$"
-       setf specman
-       return
-       endif
-       let n = n + 1
-     endwhile
-     setf eiffel
-   endif
- endfunc
- 
  " ERicsson LANGuage; Yaws is erlang too
  au BufNewFile,BufRead *.erl,*.hrl,*.yaws      setf erlang
  
--- 522,532 ----
  au BufNewFile,BufRead *.ecd                   setf ecd
  
  " Eiffel or Specman or Euphoria
! au BufNewFile,BufRead *.e,*.E                 call filetype#FTe()
  
  " Elinks configuration
  au BufNewFile,BufRead */etc/elinks.conf,*/.elinks/elinks.conf setf elinks
  
  " ERicsson LANGuage; Yaws is erlang too
  au BufNewFile,BufRead *.erl,*.hrl,*.yaws      setf erlang
  
***************
*** 892,915 ****
  au BufNewFile,BufRead *.t.html                        setf tilde
  
  " HTML (.shtml and .stm for server side)
! au BufNewFile,BufRead *.html,*.htm,*.shtml,*.stm  call s:FThtml()
! 
! " Distinguish between HTML, XHTML and Django
! func! s:FThtml()
!   let n = 1
!   while n < 10 && n < line("$")
!     if getline(n) =~ '\<DTD\s\+XHTML\s'
!       setf xhtml
!       return
!     endif
!     if getline(n) =~ '{%\s*\(extends\|block\|load\)\>\|{#\s\+'
!       setf htmldjango
!       return
!     endif
!     let n = n + 1
!   endwhile
!   setf html
! endfunc
  
  " HTML with Ruby - eRuby
  au BufNewFile,BufRead *.erb,*.rhtml           setf eruby
--- 695,701 ----
  au BufNewFile,BufRead *.t.html                        setf tilde
  
  " HTML (.shtml and .stm for server side)
! au BufNewFile,BufRead *.html,*.htm,*.shtml,*.stm  call filetype#FThtml()
  
  " HTML with Ruby - eRuby
  au BufNewFile,BufRead *.erb,*.rhtml           setf eruby
***************
*** 936,955 ****
  au BufNewFile,BufRead *.icn                   setf icon
  
  " IDL (Interface Description Language)
! au BufNewFile,BufRead *.idl                   call s:FTidl()
! 
! " Distinguish between standard IDL and MS-IDL
! func! s:FTidl()
!   let n = 1
!   while n < 50 && n < line("$")
!     if getline(n) =~ '^\s*import\s\+"\(unknwn\|objidl\)\.idl"'
!       setf msidl
!       return
!     endif
!     let n = n + 1
!   endwhile
!   setf idl
! endfunc
  
  " Microsoft IDL (Interface Description Language)  Also *.idl
  " MOF = WMI (Windows Management Instrumentation) Managed Object Format
--- 722,728 ----
  au BufNewFile,BufRead *.icn                   setf icon
  
  " IDL (Interface Description Language)
! au BufNewFile,BufRead *.idl                   call filetype#FTidl()
  
  " Microsoft IDL (Interface Description Language)  Also *.idl
  " MOF = WMI (Windows Management Instrumentation) Managed Object Format
***************
*** 960,984 ****
  
  " Indent profile (must come before IDL *.pro!)
  au BufNewFile,BufRead .indent.pro             setf indent
! au BufNewFile,BufRead indent.pro              call s:ProtoCheck('indent')
  
  " IDL (Interactive Data Language)
! au BufNewFile,BufRead *.pro                   call s:ProtoCheck('idlang')
! 
! " Distinguish between "default" and Cproto prototype file. */
! func! s:ProtoCheck(default)
!   " Cproto files have a comment in the first line and a function prototype in
!   " the second line, it always ends in ";".  Indent files may also have
!   " comments, thus we can't match comments to see the difference.
!   " IDL files can have a single ';' in the second line, require at least one
!   " chacter before the ';'.
!   if getline(2) =~ '.;$'
!     setf cpp
!   else
!     exe 'setf ' . a:default
!   endif
! endfunc
! 
  
  " Indent RC
  au BufNewFile,BufRead indentrc                        setf indent
--- 733,742 ----
  
  " Indent profile (must come before IDL *.pro!)
  au BufNewFile,BufRead .indent.pro             setf indent
! au BufNewFile,BufRead indent.pro              call 
filetype#ProtoCheck('indent')
  
  " IDL (Interactive Data Language)
! au BufNewFile,BufRead *.pro                   call 
filetype#ProtoCheck('idlang')
  
  " Indent RC
  au BufNewFile,BufRead indentrc                        setf indent
***************
*** 1155,1162 ****
  " MaGic Point
  au BufNewFile,BufRead *.mgp                   setf mgp
  
! " Mail (for Elm, trn, mutt, muttng, rn, slrn)
! au BufNewFile,BufRead 
snd.\d\+,.letter,.letter.\d\+,.followup,.article,.article.\d\+,pico.\d\+,mutt{ng,}-*-\w\+,mutt[[:alnum:]_-]\\\{6\},ae\d\+.txt,/tmp/SLRN[0-9A-Z.]\+,*.eml
 setf mail
  
  " Mail aliases
  au BufNewFile,BufRead */etc/mail/aliases,*/etc/aliases        setf mailaliases
--- 913,920 ----
  " MaGic Point
  au BufNewFile,BufRead *.mgp                   setf mgp
  
! " Mail (for Elm, trn, mutt, muttng, rn, slrn, neomutt)
! au BufNewFile,BufRead 
snd.\d\+,.letter,.letter.\d\+,.followup,.article,.article.\d\+,pico.\d\+,mutt{ng,}-*-\w\+,mutt[[:alnum:]_-]\\\{6\},neomutt-*-\w\+,neomutt[[:alnum:]_-]\\\{6\},ae\d\+.txt,/tmp/SLRN[0-9A-Z.]\+,*.eml
 setf mail
  
  " Mail aliases
  au BufNewFile,BufRead */etc/mail/aliases,*/etc/aliases        setf mailaliases
***************
*** 1192,1242 ****
  au BufNewFile,BufRead *.mason,*.mhtml,*.comp  setf mason
  
  " Mathematica, Matlab, Murphi or Objective C
! au BufNewFile,BufRead *.m                     call s:FTm()
! 
! func! s:FTm()
!   let n = 1
!   let saw_comment = 0 " Whether we've seen a multiline comment leader.
!   while n < 100
!     let line = getline(n)
!     if line =~ '^\s*/\*'
!       " /* ... */ is a comment in Objective C and Murphi, so we can't conclude
!       " it's either of them yet, but track this as a hint in case we don't see
!       " anything more definitive.
!       let saw_comment = 1
!     endif
!     if line =~ '^\s*\(#\s*\(include\|import\)\>\|@import\>\|//\)'
!       setf objc
!       return
!     endif
!     if line =~ '^\s*%'
!       setf matlab
!       return
!     endif
!     if line =~ '^\s*(\*'
!       setf mma
!       return
!     endif
!     if line =~ '^\c\s*\(\(type\|var\)\>\|--\)'
!       setf murphi
!       return
!     endif
!     let n = n + 1
!   endwhile
! 
!   if saw_comment
!     " We didn't see anything definitive, but this looks like either Objective 
C
!     " or Murphi based on the comment leader. Assume the former as it is more
!     " common.
!     setf objc
!   elseif exists("g:filetype_m")
!     " Use user specified default filetype for .m
!     exe "setf " . g:filetype_m
!   else
!     " Default is matlab
!     setf matlab
!   endif
! endfunc
  
  " Mathematica notebook
  au BufNewFile,BufRead *.nb                    setf mma
--- 950,956 ----
  au BufNewFile,BufRead *.mason,*.mhtml,*.comp  setf mason
  
  " Mathematica, Matlab, Murphi or Objective C
! au BufNewFile,BufRead *.m                     call filetype#FTm()
  
  " Mathematica notebook
  au BufNewFile,BufRead *.nb                    setf mma
***************
*** 1266,1294 ****
  au BufNewFile,BufRead *.mix,*.mixal           setf mix
  
  " MMIX or VMS makefile
! au BufNewFile,BufRead *.mms                   call s:FTmms()
  
  " Symbian meta-makefile definition (MMP)
  au BufNewFile,BufRead *.mmp                   setf mmp
  
- func! s:FTmms()
-   let n = 1
-   while n < 10
-     let line = getline(n)
-     if line =~ '^\s*\(%\|//\)' || line =~ '^\*'
-       setf mmix
-       return
-     endif
-     if line =~ '^\s*#'
-       setf make
-       return
-     endif
-     let n = n + 1
-   endwhile
-   setf mmix
- endfunc
- 
- 
  " Modsim III (or LambdaProlog)
  au BufNewFile,BufRead *.mod
        \ if getline(1) =~ '\<module\>' |
--- 980,990 ----
  au BufNewFile,BufRead *.mix,*.mixal           setf mix
  
  " MMIX or VMS makefile
! au BufNewFile,BufRead *.mms                   call filetype#FTmms()
  
  " Symbian meta-makefile definition (MMP)
  au BufNewFile,BufRead *.mmp                   setf mmp
  
  " Modsim III (or LambdaProlog)
  au BufNewFile,BufRead *.mod
        \ if getline(1) =~ '\<module\>' |
***************
*** 1354,1359 ****
--- 1050,1058 ----
  " Natural
  au BufNewFile,BufRead *.NS[ACGLMNPS]          setf natural
  
+ " Noemutt setup file
+ au BufNewFile,BufRead Neomuttrc                       setf neomuttrc
+ 
  " Netrc
  au BufNewFile,BufRead .netrc                  setf netrc
  
***************
*** 1369,1401 ****
        \   setf nroff |
        \ endif
  au BufNewFile,BufRead *.tr,*.nr,*.roff,*.tmac,*.mom   setf nroff
! au BufNewFile,BufRead *.[1-9]                 call s:FTnroff()
! 
! " This function checks if one of the first five lines start with a dot.  In
! " that case it is probably an nroff file: 'filetype' is set and 1 is returned.
! func! s:FTnroff()
!   if getline(1)[0] . getline(2)[0] . getline(3)[0] . getline(4)[0] . 
getline(5)[0] =~ '\.'
!     setf nroff
!     return 1
!   endif
!   return 0
! endfunc
  
  " Nroff or Objective C++
! au BufNewFile,BufRead *.mm                    call s:FTmm()
! 
! func! s:FTmm()
!   let n = 1
!   while n < 10
!     let line = getline(n)
!     if line =~ '^\s*\(#\s*\(include\|import\)\>\|@import\>\|/\*\)'
!       setf objcpp
!       return
!     endif
!     let n = n + 1
!   endwhile
!   setf nroff
! endfunc
  
  " Not Quite C
  au BufNewFile,BufRead *.nqc                   setf nqc
--- 1068,1077 ----
        \   setf nroff |
        \ endif
  au BufNewFile,BufRead *.tr,*.nr,*.roff,*.tmac,*.mom   setf nroff
! au BufNewFile,BufRead *.[1-9]                 call filetype#FTnroff()
  
  " Nroff or Objective C++
! au BufNewFile,BufRead *.mm                    call filetype#FTmm()
  
  " Not Quite C
  au BufNewFile,BufRead *.nqc                   setf nqc
***************
*** 1445,1474 ****
  " PDF
  au BufNewFile,BufRead *.pdf                   setf pdf
  
  " Perl
  if has("fname_case")
!   au BufNewFile,BufRead *.pl,*.PL             call s:FTpl()
  else
!   au BufNewFile,BufRead *.pl                  call s:FTpl()
  endif
  au BufNewFile,BufRead *.plx,*.al,*.psgi               setf perl
  au BufNewFile,BufRead *.p6,*.pm6,*.pl6                setf perl6
  
- func! s:FTpl()
-   if exists("g:filetype_pl")
-     exe "setf " . g:filetype_pl
-   else
-     " recognize Prolog by specific text in the first non-empty line
-     " require a blank after the '%' because Perl uses "%list" and "%translate"
-     let l = getline(nextnonblank(1))
-     if l =~ '\<prolog\>' || l =~ '^\s*\(%\+\(\s\|$\)\|/\*\)' || l =~ ':-'
-       setf prolog
-     else
-       setf perl
-     endif
-   endif
- endfunc
- 
  " Perl, XPM or XPM2
  au BufNewFile,BufRead *.pm
        \ if getline(1) =~ "XPM2" |
--- 1121,1138 ----
  " PDF
  au BufNewFile,BufRead *.pdf                   setf pdf
  
+ " PCMK - HAE - crm configure edit 
+ au BufNewFile,BufRead *.pcmk                  setf pcmk
+ 
  " Perl
  if has("fname_case")
!   au BufNewFile,BufRead *.pl,*.PL             call filetype#FTpl()
  else
!   au BufNewFile,BufRead *.pl                  call filetype#FTpl()
  endif
  au BufNewFile,BufRead *.plx,*.al,*.psgi               setf perl
  au BufNewFile,BufRead *.p6,*.pm6,*.pl6                setf perl6
  
  " Perl, XPM or XPM2
  au BufNewFile,BufRead *.pm
        \ if getline(1) =~ "XPM2" |
***************
*** 1531,1559 ****
  au BufNewFile,BufRead .povrayrc                       setf povini
  
  " Povray, PHP or assembly
! au BufNewFile,BufRead *.inc                   call s:FTinc()
! 
! func! s:FTinc()
!   if exists("g:filetype_inc")
!     exe "setf " . g:filetype_inc
!   else
!     let lines = getline(1).getline(2).getline(3)
!     if lines =~? "perlscript"
!       setf aspperl
!     elseif lines =~ "<%"
!       setf aspvbs
!     elseif lines =~ "<?"
!       setf php
!     else
!       call s:FTasmsyntax()
!       if exists("b:asmsyntax")
!       exe "setf " . fnameescape(b:asmsyntax)
!       else
!       setf pov
!       endif
!     endif
!   endif
! endfunc
  
  " Printcap and Termcap
  au BufNewFile,BufRead *printcap
--- 1195,1201 ----
  au BufNewFile,BufRead .povrayrc                       setf povini
  
  " Povray, PHP or assembly
! au BufNewFile,BufRead *.inc                   call filetype#FTinc()
  
  " Printcap and Termcap
  au BufNewFile,BufRead *printcap
***************
*** 1582,1655 ****
  au BufNewFile,BufRead .procmail,.procmailrc   setf procmail
  
  " Progress or CWEB
! au BufNewFile,BufRead *.w                     call s:FTprogress_cweb()
! 
! func! s:FTprogress_cweb()
!   if exists("g:filetype_w")
!     exe "setf " . g:filetype_w
!     return
!   endif
!   if getline(1) =~ '&ANALYZE' || getline(3) =~ '&GLOBAL-DEFINE'
!     setf progress
!   else
!     setf cweb
!   endif
! endfunc
  
  " Progress or assembly
! au BufNewFile,BufRead *.i                     call s:FTprogress_asm()
! 
! func! s:FTprogress_asm()
!   if exists("g:filetype_i")
!     exe "setf " . g:filetype_i
!     return
!   endif
!   " This function checks for an assembly comment the first ten lines.
!   " If not found, assume Progress.
!   let lnum = 1
!   while lnum <= 10 && lnum < line('$')
!     let line = getline(lnum)
!     if line =~ '^\s*;' || line =~ '^\*'
!       call s:FTasm()
!       return
!     elseif line !~ '^\s*$' || line =~ '^/\*'
!       " Not an empty line: Doesn't look like valid assembly code.
!       " Or it looks like a Progress /* comment
!       break
!     endif
!     let lnum = lnum + 1
!   endw
!   setf progress
! endfunc
  
  " Progress or Pascal
! au BufNewFile,BufRead *.p                     call s:FTprogress_pascal()
! 
! func! s:FTprogress_pascal()
!   if exists("g:filetype_p")
!     exe "setf " . g:filetype_p
!     return
!   endif
!   " This function checks for valid Pascal syntax in the first ten lines.
!   " Look for either an opening comment or a program start.
!   " If not found, assume Progress.
!   let lnum = 1
!   while lnum <= 10 && lnum < line('$')
!     let line = getline(lnum)
!     if line =~ 
'^\s*\(program\|unit\|procedure\|function\|const\|type\|var\)\>'
!       \ || line =~ '^\s*{' || line =~ '^\s*(\*'
!       setf pascal
!       return
!     elseif line !~ '^\s*$' || line =~ '^/\*'
!       " Not an empty line: Doesn't look like valid Pascal code.
!       " Or it looks like a Progress /* comment
!       break
!     endif
!     let lnum = lnum + 1
!   endw
!   setf progress
! endfunc
! 
  
  " Software Distributor Product Specification File (POSIX 1387.2-1995)
  au BufNewFile,BufRead *.psf                   setf psf
--- 1224,1236 ----
  au BufNewFile,BufRead .procmail,.procmailrc   setf procmail
  
  " Progress or CWEB
! au BufNewFile,BufRead *.w                     call filetype#FTprogress_cweb()
  
  " Progress or assembly
! au BufNewFile,BufRead *.i                     call filetype#FTprogress_asm()
  
  " Progress or Pascal
! au BufNewFile,BufRead *.p                     call 
filetype#FTprogress_pascal()
  
  " Software Distributor Product Specification File (POSIX 1387.2-1995)
  au BufNewFile,BufRead *.psf                   setf psf
***************
*** 1735,1774 ****
  endif
  
  " Rexx, Rebol or R
! au BufNewFile,BufRead *.r,*.R                 call s:FTr()
! 
! func! s:FTr()
!   let max = line("$") > 50 ? 50 : line("$")
! 
!   for n in range(1, max)
!     " Rebol is easy to recognize, check for that first
!     if getline(n) =~? '\<REBOL\>'
!       setf rebol
!       return
!     endif
!   endfor
! 
!   for n in range(1, max)
!     " R has # comments
!     if getline(n) =~ '^\s*#'
!       setf r
!       return
!     endif
!     " Rexx has /* comments */
!     if getline(n) =~ '^\s*/\*'
!       setf rexx
!       return
!     endif
!   endfor
! 
!   " Nothing recognized, use user default or assume Rexx
!   if exists("g:filetype_r")
!     exe "setf " . g:filetype_r
!   else
!     " Rexx used to be the default, but R appears to be much more popular.
!     setf r
!   endif
! endfunc
  
  " Remind
  au BufNewFile,BufRead .reminders,*.remind,*.rem               setf remind
--- 1316,1322 ----
  endif
  
  " Rexx, Rebol or R
! au BufNewFile,BufRead *.r,*.R                         call filetype#FTr()
  
  " Remind
  au BufNewFile,BufRead .reminders,*.remind,*.rem               setf remind
***************
*** 1864,1886 ****
  au BufNewFile,BufRead sendmail.cf             setf sm
  
  " Sendmail .mc files are actually m4.  Could also be MS Message text file.
! au BufNewFile,BufRead *.mc                    call s:McSetf()
! 
! func! s:McSetf()
!   " Rely on the file to start with a comment.
!   " MS message text files use ';', Sendmail files use '#' or 'dnl'
!   for lnum in range(1, min([line("$"), 20]))
!     let line = getline(lnum)
!     if line =~ '^\s*\(#\|dnl\)'
!       setf m4  " Sendmail .mc file
!       return
!     elseif line =~ '^\s*;'
!       setf msmessages  " MS Message text file
!       return
!     endif
!   endfor
!   setf m4  " Default: Sendmail .mc file
! endfunc
  
  " Services
  au BufNewFile,BufRead */etc/services          setf services
--- 1412,1418 ----
  au BufNewFile,BufRead sendmail.cf             setf sm
  
  " Sendmail .mc files are actually m4.  Could also be MS Message text file.
! au BufNewFile,BufRead *.mc                    call filetype#McSetf()
  
  " Services
  au BufNewFile,BufRead */etc/services          setf services
***************
*** 1921,2021 ****
  
  " Shell scripts (sh, ksh, bash, bash2, csh); Allow .profile_foo etc.
  " Gentoo ebuilds and Arch Linux PKGBUILDs are actually bash scripts
! au BufNewFile,BufRead 
.bashrc*,bashrc,bash.bashrc,.bash[_-]profile*,.bash[_-]logout*,.bash[_-]aliases*,*.bash,*/{,.}bash[_-]completion{,.d,.sh}{,/*},*.ebuild,*.eclass,PKGBUILD*
 call SetFileTypeSH("bash")
! au BufNewFile,BufRead .kshrc*,*.ksh call SetFileTypeSH("ksh")
! au BufNewFile,BufRead */etc/profile,.profile*,*.sh,*.env call 
SetFileTypeSH(getline(1))
  
  " Shell script (Arch Linux) or PHP file (Drupal)
  au BufNewFile,BufRead *.install
        \ if getline(1) =~ '<?php' |
        \   setf php |
        \ else |
!       \   call SetFileTypeSH("bash") |
        \ endif
  
- " Also called from scripts.vim.
- func! SetFileTypeSH(name)
-   if expand("<amatch>") =~ g:ft_ignore_pat
-     return
-   endif
-   if a:name =~ '\<csh\>'
-     " Some .sh scripts contain #!/bin/csh.
-     call SetFileTypeShell("csh")
-     return
-   elseif a:name =~ '\<tcsh\>'
-     " Some .sh scripts contain #!/bin/tcsh.
-     call SetFileTypeShell("tcsh")
-     return
-   elseif a:name =~ '\<zsh\>'
-     " Some .sh scripts contain #!/bin/zsh.
-     call SetFileTypeShell("zsh")
-     return
-   elseif a:name =~ '\<ksh\>'
-     let b:is_kornshell = 1
-     if exists("b:is_bash")
-       unlet b:is_bash
-     endif
-     if exists("b:is_sh")
-       unlet b:is_sh
-     endif
-   elseif exists("g:bash_is_sh") || a:name =~ '\<bash\>' || a:name =~ 
'\<bash2\>'
-     let b:is_bash = 1
-     if exists("b:is_kornshell")
-       unlet b:is_kornshell
-     endif
-     if exists("b:is_sh")
-       unlet b:is_sh
-     endif
-   elseif a:name =~ '\<sh\>'
-     let b:is_sh = 1
-     if exists("b:is_kornshell")
-       unlet b:is_kornshell
-     endif
-     if exists("b:is_bash")
-       unlet b:is_bash
-     endif
-   endif
-   call SetFileTypeShell("sh")
- endfunc
- 
- " For shell-like file types, check for an "exec" command hidden in a comment,
- " as used for Tcl.
- " Also called from scripts.vim, thus can't be local to this script.
- func! SetFileTypeShell(name)
-   if expand("<amatch>") =~ g:ft_ignore_pat
-     return
-   endif
-   let l = 2
-   while l < 20 && l < line("$") && getline(l) =~ '^\s*\(#\|$\)'
-     " Skip empty and comment lines.
-     let l = l + 1
-   endwhile
-   if l < line("$") && getline(l) =~ '\s*exec\s' && getline(l - 1) =~ 
'^\s*#.*\\$'
-     " Found an "exec" line after a comment with continuation
-     let n = substitute(getline(l),'\s*exec\s\+\([^ ]*/\)\=', '', '')
-     if n =~ '\<tclsh\|\<wish'
-       setf tcl
-       return
-     endif
-   endif
-   exe "setf " . a:name
- endfunc
- 
  " tcsh scripts
! au BufNewFile,BufRead .tcshrc*,*.tcsh,tcsh.tcshrc,tcsh.login  call 
SetFileTypeShell("tcsh")
  
  " csh scripts, but might also be tcsh scripts (on some systems csh is tcsh)
! au BufNewFile,BufRead 
.login*,.cshrc*,csh.cshrc,csh.login,csh.logout,*.csh,.alias  call s:CSH()
! 
! func! s:CSH()
!   if exists("g:filetype_csh")
!     call SetFileTypeShell(g:filetype_csh)
!   elseif &shell =~ "tcsh"
!     call SetFileTypeShell("tcsh")
!   else
!     call SetFileTypeShell("csh")
!   endif
! endfunc
  
  " Z-Shell script
  au BufNewFile,BufRead .zprofile,*/etc/zprofile,.zfbfmarks  setf zsh
--- 1453,1475 ----
  
  " Shell scripts (sh, ksh, bash, bash2, csh); Allow .profile_foo etc.
  " Gentoo ebuilds and Arch Linux PKGBUILDs are actually bash scripts
! au BufNewFile,BufRead 
.bashrc*,bashrc,bash.bashrc,.bash[_-]profile*,.bash[_-]logout*,.bash[_-]aliases*,*.bash,*/{,.}bash[_-]completion{,.d,.sh}{,/*},*.ebuild,*.eclass,PKGBUILD*
 call filetype#SetFileTypeSH("bash")
! au BufNewFile,BufRead .kshrc*,*.ksh call filetype#SetFileTypeSH("ksh")
! au BufNewFile,BufRead */etc/profile,.profile*,*.sh,*.env call 
filetype#SetFileTypeSH(getline(1))
  
  " Shell script (Arch Linux) or PHP file (Drupal)
  au BufNewFile,BufRead *.install
        \ if getline(1) =~ '<?php' |
        \   setf php |
        \ else |
!       \   call filetype#SetFileTypeSH("bash") |
        \ endif
  
  " tcsh scripts
! au BufNewFile,BufRead .tcshrc*,*.tcsh,tcsh.tcshrc,tcsh.login  call 
filetype#SetFileTypeShell("tcsh")
  
  " csh scripts, but might also be tcsh scripts (on some systems csh is tcsh)
! au BufNewFile,BufRead 
.login*,.cshrc*,csh.cshrc,csh.login,csh.logout,*.csh,.alias  call filetype#CSH()
  
  " Z-Shell script
  au BufNewFile,BufRead .zprofile,*/etc/zprofile,.zfbfmarks  setf zsh
***************
*** 2086,2128 ****
  
  " Snort Configuration
  au BufNewFile,BufRead *.hog,snort.conf,vision.conf    setf hog
! au BufNewFile,BufRead *.rules                 call s:FTRules()
  
  let s:ft_rules_udev_rules_pattern = 
'^\s*\cudev_rules\s*=\s*"\([^"]\{-1,}\)/*".*'
- func! s:FTRules()
-   let path = expand('<amatch>:p')
-   if path =~ 
'^/\(etc/udev/\%(rules\.d/\)\=.*\.rules\|lib/udev/\%(rules\.d/\)\=.*\.rules\)$'
-     setf udevrules
-     return
-   endif
-   if path =~ '^/etc/ufw/'
-     setf conf  " Better than hog
-     return
-   endif
-   if path =~ '^/\(etc\|usr/share\)/polkit-1/rules\.d'
-     setf javascript
-     return
-   endif
-   try
-     let config_lines = readfile('/etc/udev/udev.conf')
-   catch /^Vim\%((\a\+)\)\=:E484/
-     setf hog
-     return
-   endtry
-   let dir = expand('<amatch>:p:h')
-   for line in config_lines
-     if line =~ s:ft_rules_udev_rules_pattern
-       let udev_rules = substitute(line, s:ft_rules_udev_rules_pattern, '\1', 
"")
-       if dir == udev_rules
-       setf udevrules
-       endif
-       break
-     endif
-   endfor
-   setf hog
- endfunc
- 
- 
  " Spec (Linux RPM)
  au BufNewFile,BufRead *.spec                  setf spec
  
--- 1540,1548 ----
  
  " Snort Configuration
  au BufNewFile,BufRead *.hog,snort.conf,vision.conf    setf hog
! au BufNewFile,BufRead *.rules                 call filetype#FTRules()
  
  let s:ft_rules_udev_rules_pattern = 
'^\s*\cudev_rules\s*=\s*"\([^"]\{-1,}\)/*".*'
  " Spec (Linux RPM)
  au BufNewFile,BufRead *.spec                  setf spec
  
***************
*** 2145,2159 ****
  au BufNewFile,BufRead *.tyb,*.typ,*.tyc,*.pkb,*.pks   setf sql
  
  " SQL
! au BufNewFile,BufRead *.sql                   call s:SQL()
! 
! func! s:SQL()
!   if exists("g:filetype_sql")
!     exe "setf " . g:filetype_sql
!   else
!     setf sql
!   endif
! endfunc
  
  " SQLJ
  au BufNewFile,BufRead *.sqlj                  setf sqlj
--- 1565,1571 ----
  au BufNewFile,BufRead *.tyb,*.typ,*.tyc,*.pkb,*.pks   setf sql
  
  " SQL
! au BufNewFile,BufRead *.sql                   call filetype#SQL()
  
  " SQLJ
  au BufNewFile,BufRead *.sqlj                  setf sqlj
***************
*** 2200,2231 ****
  " SVG (Scalable Vector Graphics)
  au BufNewFile,BufRead *.svg                   setf svg
  
- " If the file has an extension of 't' and is in a directory 't' or 'xt' then
- " it is almost certainly a Perl test file.
- " If the first line starts with '#' and contains 'perl' it's probably a Perl
- " file.
- " (Slow test) If a file contains a 'use' statement then it is almost certainly
- " a Perl file.
- func! s:FTperl()
-   let dirname = expand("%:p:h:t")
-   if expand("%:e") == 't' && (dirname == 't' || dirname == 'xt')
-     setf perl
-     return 1
-   endif
-   if getline(1)[0] == '#' && getline(1) =~ 'perl'
-     setf perl
-     return 1
-   endif
-   if search('^use\s\s*\k', 'nc', 30)
-     setf perl
-     return 1
-   endif
-   return 0
- endfunc
- 
  " Tads (or Nroff or Perl test file)
  au BufNewFile,BufRead *.t
!       \ if !s:FTnroff() && !s:FTperl() | setf tads | endif
  
  " Tags
  au BufNewFile,BufRead tags                    setf tags
--- 1612,1620 ----
  " SVG (Scalable Vector Graphics)
  au BufNewFile,BufRead *.svg                   setf svg
  
  " Tads (or Nroff or Perl test file)
  au BufNewFile,BufRead *.t
!       \ if !filetype#FTnroff() && !filetype#FTperl() | setf tads | endif
  
  " Tags
  au BufNewFile,BufRead tags                    setf tags
***************
*** 2254,2316 ****
  
  " TeX
  au BufNewFile,BufRead *.latex,*.sty,*.dtx,*.ltx,*.bbl setf tex
! au BufNewFile,BufRead *.tex                   call s:FTtex()
! 
! " Choose context, plaintex, or tex (LaTeX) based on these rules:
! " 1. Check the first line of the file for "%&<format>".
! " 2. Check the first 1000 non-comment lines for LaTeX or ConTeXt keywords.
! " 3. Default to "latex" or to g:tex_flavor, can be set in user's vimrc.
! func! s:FTtex()
!   let firstline = getline(1)
!   if firstline =~ '^%&\s*\a\+'
!     let format = tolower(matchstr(firstline, '\a\+'))
!     let format = substitute(format, 'pdf', '', '')
!     if format == 'tex'
!       let format = 'latex'
!     elseif format == 'plaintex'
!       let format = 'plain'
!     endif
!   elseif expand('%') =~ 'tex/context/.*/.*.tex'
!     let format = 'context'
!   else
!     " Default value, may be changed later:
!     let format = exists("g:tex_flavor") ? g:tex_flavor : 'plain'
!     " Save position, go to the top of the file, find first non-comment line.
!     let save_cursor = getpos('.')
!     call cursor(1,1)
!     let firstNC = search('^\s*[^[:space:]%]', 'c', 1000)
!     if firstNC " Check the next thousand lines for a LaTeX or ConTeXt keyword.
!       let lpat = 
'documentclass\>\|usepackage\>\|begin{\|newcommand\>\|renewcommand\>'
!       let cpat = 
'start\a\+\|setup\a\+\|usemodule\|enablemode\|enableregime\|setvariables\|useencoding\|usesymbols\|stelle\a\+\|verwende\a\+\|stel\a\+\|gebruik\a\+\|usa\a\+\|imposta\a\+\|regle\a\+\|utilisemodule\>'
!       let kwline = search('^\s*\\\%(' . lpat . '\)\|^\s*\\\(' . cpat . '\)',
!                             \ 'cnp', firstNC + 1000)
!       if kwline == 1  " lpat matched
!       let format = 'latex'
!       elseif kwline == 2      " cpat matched
!       let format = 'context'
!       endif           " If neither matched, keep default set above.
!       " let lline = search('^\s*\\\%(' . lpat . '\)', 'cn', firstNC + 1000)
!       " let cline = search('^\s*\\\%(' . cpat . '\)', 'cn', firstNC + 1000)
!       " if cline > 0
!       "   let format = 'context'
!       " endif
!       " if lline > 0 && (cline == 0 || cline > lline)
!       "   let format = 'tex'
!       " endif
!     endif " firstNC
!     call setpos('.', save_cursor)
!   endif " firstline =~ '^%&\s*\a\+'
! 
!   " Translation from formats to file types.  TODO:  add AMSTeX, RevTex, 
others?
!   if format == 'plain'
!     setf plaintex
!   elseif format == 'context'
!     setf context
!   else " probably LaTeX
!     setf tex
!   endif
!   return
! endfunc
  
  " ConTeXt
  au BufNewFile,BufRead *.mkii,*.mkiv,*.mkvi   setf context
--- 1643,1649 ----
  
  " TeX
  au BufNewFile,BufRead *.latex,*.sty,*.dtx,*.ltx,*.bbl setf tex
! au BufNewFile,BufRead *.tex                   call filetype#FTtex()
  
  " ConTeXt
  au BufNewFile,BufRead *.mkii,*.mkiv,*.mkvi   setf context
***************
*** 2408,2414 ****
        \ endif
  
  " Visual Basic (also uses *.bas) or FORM
! au BufNewFile,BufRead *.frm                   call s:FTVB("form")
  
  " SaxBasic is close to Visual Basic
  au BufNewFile,BufRead *.sba                   setf vb
--- 1741,1747 ----
        \ endif
  
  " Visual Basic (also uses *.bas) or FORM
! au BufNewFile,BufRead *.frm                   call filetype#FTVB("form")
  
  " SaxBasic is close to Visual Basic
  au BufNewFile,BufRead *.sba                   setf vb
***************
*** 2437,2442 ****
--- 1770,1778 ----
  " WSML
  au BufNewFile,BufRead *.wsml                  setf wsml
  
+ " WPL
+ au BufNewFile,BufRead *.wpl                   setf xml
+ 
  " WvDial
  au BufNewFile,BufRead wvdial.conf,.wvdialrc   setf wvdial
  
***************
*** 2495,2530 ****
  " Xmath
  au BufNewFile,BufRead *.msc,*.msf             setf xmath
  au BufNewFile,BufRead *.ms
!       \ if !s:FTnroff() | setf xmath | endif
  
  " XML  specific variants: docbk and xbl
! au BufNewFile,BufRead *.xml                   call s:FTxml()
! 
! func! s:FTxml()
!   let n = 1
!   while n < 100 && n < line("$")
!     let line = getline(n)
!     " DocBook 4 or DocBook 5.
!     let is_docbook4 = line =~ '<!DOCTYPE.*DocBook'
!     let is_docbook5 = line =~ ' xmlns="http://docbook.org/ns/docbook";'
!     if is_docbook4 || is_docbook5
!       let b:docbk_type = "xml"
!       if is_docbook5
!       let b:docbk_ver = 5
!       else
!       let b:docbk_ver = 4
!       endif
!       setf docbk
!       return
!     endif
!     if line =~ 'xmlns:xbl="http://www.mozilla.org/xbl";'
!       setf xbl
!       return
!     endif
!     let n += 1
!   endwhile
!   setf xml
! endfunc
  
  " XMI (holding UML models) is also XML
  au BufNewFile,BufRead *.xmi                   setf xml
--- 1831,1840 ----
  " Xmath
  au BufNewFile,BufRead *.msc,*.msf             setf xmath
  au BufNewFile,BufRead *.ms
!       \ if !filetype#FTnroff() | setf xmath | endif
  
  " XML  specific variants: docbk and xbl
! au BufNewFile,BufRead *.xml                   call filetype#FTxml()
  
  " XMI (holding UML models) is also XML
  au BufNewFile,BufRead *.xmi                   setf xml
***************
*** 2567,2591 ****
  au BufNewFile,BufRead *.yy,*.yxx,*.y++                setf yacc
  
  " Yacc or racc
! au BufNewFile,BufRead *.y                     call s:FTy()
! 
! func! s:FTy()
!   let n = 1
!   while n < 100 && n < line("$")
!     let line = getline(n)
!     if line =~ '^\s*%'
!       setf yacc
!       return
!     endif
!     if getline(n) =~ '^\s*\(#\|class\>\)' && getline(n) !~ '^\s*#\s*include'
!       setf racc
!       return
!     endif
!     let n = n + 1
!   endwhile
!   setf yacc
! endfunc
! 
  
  " Yaml
  au BufNewFile,BufRead *.yaml,*.yml            setf yaml
--- 1877,1883 ----
  au BufNewFile,BufRead *.yy,*.yxx,*.y++                setf yacc
  
  " Yacc or racc
! au BufNewFile,BufRead *.y                     call filetype#FTy()
  
  " Yaml
  au BufNewFile,BufRead *.yaml,*.yml            setf yaml
***************
*** 2601,2609 ****
  " Zope
  "   dtml (zope dynamic template markup language), pt (zope page template),
  "   cpt (zope form controller page template)
! au BufNewFile,BufRead *.dtml,*.pt,*.cpt               call s:FThtml()
  "   zsql (zope sql method)
! au BufNewFile,BufRead *.zsql                  call s:SQL()
  
  " Z80 assembler asz80
  au BufNewFile,BufRead *.z8a                   setf z8a
--- 1893,1901 ----
  " Zope
  "   dtml (zope dynamic template markup language), pt (zope page template),
  "   cpt (zope form controller page template)
! au BufNewFile,BufRead *.dtml,*.pt,*.cpt               call filetype#FThtml()
  "   zsql (zope sql method)
! au BufNewFile,BufRead *.zsql                  call filetype#SQL()
  
  " Z80 assembler asz80
  au BufNewFile,BufRead *.z8a                   setf z8a
***************
*** 2717,2723 ****
  au BufNewFile,BufRead [rR]akefile*            call s:StarSetf('ruby')
  
  " Mail (also matches muttrc.vim, so this is below the other checks)
! au BufNewFile,BufRead mutt[[:alnum:]._-]\\\{6\}       setf mail
  
  au BufNewFile,BufRead reportbug-*             call s:StarSetf('mail')
  
--- 2009,2015 ----
  au BufNewFile,BufRead [rR]akefile*            call s:StarSetf('ruby')
  
  " Mail (also matches muttrc.vim, so this is below the other checks)
! au BufNewFile,BufRead {neo,}mutt[[:alnum:]._-]\\\{6\} setf mail
  
  au BufNewFile,BufRead reportbug-*             call s:StarSetf('mail')
  
***************
*** 2732,2737 ****
--- 2024,2033 ----
  au BufNewFile,BufRead .mutt{ng,}rc*,*/.mutt{ng,}/mutt{ng,}rc* call 
s:StarSetf('muttrc')
  au BufNewFile,BufRead mutt{ng,}rc*,Mutt{ng,}rc*               call 
s:StarSetf('muttrc')
  
+ " Neomutt setup file
+ au BufNewFile,BufRead .neomuttrc*,*/.neomutt/neomuttrc*       call 
s:StarSetf('neomuttrc')
+ au BufNewFile,BufRead neomuttrc*,Neomuttrc*           call 
s:StarSetf('neomuttrc')
+ 
  " Nroff macros
  au BufNewFile,BufRead tmac.*                  call s:StarSetf('nroff')
  
***************
*** 2753,2769 ****
  
  " ReDIF
  " Only used when the .rdf file was not detected to be XML.
! au BufRead,BufNewFile *.rdf                   call s:Redif()
! func! s:Redif()
!   let lnum = 1
!   while lnum <= 5 && lnum < line('$')
!     if getline(lnum) =~ "^\ctemplate-type:"
!       setf redif
!       return
!     endif
!     let lnum = lnum + 1
!   endwhile
! endfunc
  
  " Remind
  au BufNewFile,BufRead .reminders*             call s:StarSetf('remind')
--- 2049,2055 ----
  
  " ReDIF
  " Only used when the .rdf file was not detected to be XML.
! au BufRead,BufNewFile *.rdf                   call filetype#Redif()
  
  " Remind
  au BufNewFile,BufRead .reminders*             call s:StarSetf('remind')
*** ../vim-8.0.1280/runtime/autoload/filetype.vim       2017-11-09 
20:43:33.322412809 +0100
--- runtime/autoload/filetype.vim       2017-11-09 20:33:48.539231589 +0100
***************
*** 0 ****
--- 1,740 ----
+ " Vim functions for file type detection
+ "
+ " Maintainer: Bram Moolenaar <[email protected]>
+ " Last Change:        2017 Nov 09
+ 
+ " These functions are moved here from runtime/filetype.vim to make startup
+ " faster.
+ 
+ " Line continuation is used here, remove 'C' from 'cpoptions'
+ let s:cpo_save = &cpo
+ set cpo&vim
+ 
+ func filetype#Check_inp()
+   if getline(1) =~ '^\*'
+     setf abaqus
+   else
+     let n = 1
+     if line("$") > 500
+       let nmax = 500
+     else
+       let nmax = line("$")
+     endif
+     while n <= nmax
+       if getline(n) =~? "^header surface data"
+       setf trasys
+       break
+       endif
+       let n = n + 1
+     endwhile
+   endif
+ endfunc
+ 
+ " This function checks for the kind of assembly that is wanted by the user, or
+ " can be detected from the first five lines of the file.
+ func filetype#FTasm()
+   " make sure b:asmsyntax exists
+   if !exists("b:asmsyntax")
+     let b:asmsyntax = ""
+   endif
+ 
+   if b:asmsyntax == ""
+     call filetype#FTasmsyntax()
+   endif
+ 
+   " if b:asmsyntax still isn't set, default to asmsyntax or GNU
+   if b:asmsyntax == ""
+     if exists("g:asmsyntax")
+       let b:asmsyntax = g:asmsyntax
+     else
+       let b:asmsyntax = "asm"
+     endif
+   endif
+ 
+   exe "setf " . fnameescape(b:asmsyntax)
+ endfunc
+ 
+ func filetype#FTasmsyntax()
+   " see if file contains any asmsyntax=foo overrides. If so, change
+   " b:asmsyntax appropriately
+   let head = " ".getline(1)." ".getline(2)." ".getline(3)." ".getline(4).
+       \" ".getline(5)." "
+   let match = matchstr(head, '\sasmsyntax=\zs[a-zA-Z0-9]\+\ze\s')
+   if match != ''
+     let b:asmsyntax = match
+   elseif ((head =~? '\.title') || (head =~? '\.ident') || (head =~? 
'\.macro') || (head =~? '\.subtitle') || (head =~? '\.library'))
+     let b:asmsyntax = "vmasm"
+   endif
+ endfunc
+ 
+ " Check if one of the first five lines contains "VB_Name".  In that case it is
+ " probably a Visual Basic file.  Otherwise it's assumed to be "alt" filetype.
+ func filetype#FTVB(alt)
+   if getline(1).getline(2).getline(3).getline(4).getline(5) =~? 
'VB_Name\|Begin VB\.\(Form\|MDIForm\|UserControl\)'
+     setf vb
+   else
+     exe "setf " . a:alt
+   endif
+ endfunc
+ 
+ func filetype#FTbtm()
+   if exists("g:dosbatch_syntax_for_btm") && g:dosbatch_syntax_for_btm
+     setf dosbatch
+   else
+     setf btm
+   endif
+ endfunc
+ 
+ func filetype#BindzoneCheck(default)
+   if getline(1).getline(2).getline(3).getline(4) =~ '^; <<>> DiG [0-9.]\+.* 
<<>>\|$ORIGIN\|$TTL\|IN\s\+SOA'
+     setf bindzone
+   elseif a:default != ''
+     exe 'setf ' . a:default
+   endif
+ endfunc
+ 
+ func filetype#FTlpc()
+   if exists("g:lpc_syntax_for_c")
+     let lnum = 1
+     while lnum <= 12
+       if getline(lnum) =~# 
'^\(//\|inherit\|private\|protected\|nosave\|string\|object\|mapping\|mixed\)'
+       setf lpc
+       return
+       endif
+       let lnum = lnum + 1
+     endwhile
+   endif
+   setf c
+ endfunc
+ 
+ func filetype#FTheader()
+   if match(getline(1, min([line("$"), 200])), '^@\(interface\|end\|class\)') 
> -1
+     if exists("g:c_syntax_for_h")
+       setf objc
+     else
+       setf objcpp
+     endif
+   elseif exists("g:c_syntax_for_h")
+     setf c
+   elseif exists("g:ch_syntax_for_h")
+     setf ch
+   else
+     setf cpp
+   endif
+ endfunc
+ 
+ " This function checks if one of the first ten lines start with a '@'.  In
+ " that case it is probably a change file.
+ " If the first line starts with # or ! it's probably a ch file.
+ " If a line has "main", "include", "//" ir "/*" it's probably ch.
+ " Otherwise CHILL is assumed.
+ func filetype#FTchange()
+   let lnum = 1
+   while lnum <= 10
+     if getline(lnum)[0] == '@'
+       setf change
+       return
+     endif
+     if lnum == 1 && (getline(1)[0] == '#' || getline(1)[0] == '!')
+       setf ch
+       return
+     endif
+     if getline(lnum) =~ "MODULE"
+       setf chill
+       return
+     endif
+     if getline(lnum) =~ 'main\s*(\|#\s*include\|//'
+       setf ch
+       return
+     endif
+     let lnum = lnum + 1
+   endwhile
+   setf chill
+ endfunc
+ 
+ func filetype#FTent()
+   " This function checks for valid cl syntax in the first five lines.
+   " Look for either an opening comment, '#', or a block start, '{".
+   " If not found, assume SGML.
+   let lnum = 1
+   while lnum < 6
+     let line = getline(lnum)
+     if line =~ '^\s*[#{]'
+       setf cl
+       return
+     elseif line !~ '^\s*$'
+       " Not a blank line, not a comment, and not a block start,
+       " so doesn't look like valid cl code.
+       break
+     endif
+     let lnum = lnum + 1
+   endw
+   setf dtd
+ endfunc
+ 
+ func filetype#EuphoriaCheck()
+   if exists('g:filetype_euphoria')
+     exe 'setf ' . g:filetype_euphoria
+   else
+     setf euphoria3
+   endif
+ endfunc
+ 
+ func filetype#DtraceCheck()
+   let lines = getline(1, min([line("$"), 100]))
+   if match(lines, '^module\>\|^import\>') > -1
+     " D files often start with a module and/or import statement.
+     setf d
+   elseif match(lines, 
'^#!\S\+dtrace\|#pragma\s\+D\s\+option\|:\S\{-}:\S\{-}:') > -1
+     setf dtrace
+   else
+     setf d
+   endif
+ endfunc
+ 
+ func filetype#FTe()
+   if exists('g:filetype_euphoria')
+     exe 'setf ' . g:filetype_euphoria
+   else
+     let n = 1
+     while n < 100 && n < line("$")
+       if getline(n) =~ "^\\s*\\(<'\\|'>\\)\\s*$"
+       setf specman
+       return
+       endif
+       let n = n + 1
+     endwhile
+     setf eiffel
+   endif
+ endfunc
+ 
+ " Distinguish between HTML, XHTML and Django
+ func filetype#FThtml()
+   let n = 1
+   while n < 10 && n < line("$")
+     if getline(n) =~ '\<DTD\s\+XHTML\s'
+       setf xhtml
+       return
+     endif
+     if getline(n) =~ '{%\s*\(extends\|block\|load\)\>\|{#\s\+'
+       setf htmldjango
+       return
+     endif
+     let n = n + 1
+   endwhile
+   setf html
+ endfunc
+ 
+ " Distinguish between standard IDL and MS-IDL
+ func filetype#FTidl()
+   let n = 1
+   while n < 50 && n < line("$")
+     if getline(n) =~ '^\s*import\s\+"\(unknwn\|objidl\)\.idl"'
+       setf msidl
+       return
+     endif
+     let n = n + 1
+   endwhile
+   setf idl
+ endfunc
+ 
+ " Distinguish between "default" and Cproto prototype file. */
+ func filetype#ProtoCheck(default)
+   " Cproto files have a comment in the first line and a function prototype in
+   " the second line, it always ends in ";".  Indent files may also have
+   " comments, thus we can't match comments to see the difference.
+   " IDL files can have a single ';' in the second line, require at least one
+   " chacter before the ';'.
+   if getline(2) =~ '.;$'
+     setf cpp
+   else
+     exe 'setf ' . a:default
+   endif
+ endfunc
+ 
+ func filetype#FTm()
+   let n = 1
+   let saw_comment = 0 " Whether we've seen a multiline comment leader.
+   while n < 100
+     let line = getline(n)
+     if line =~ '^\s*/\*'
+       " /* ... */ is a comment in Objective C and Murphi, so we can't conclude
+       " it's either of them yet, but track this as a hint in case we don't see
+       " anything more definitive.
+       let saw_comment = 1
+     endif
+     if line =~ '^\s*\(#\s*\(include\|import\)\>\|@import\>\|//\)'
+       setf objc
+       return
+     endif
+     if line =~ '^\s*%'
+       setf matlab
+       return
+     endif
+     if line =~ '^\s*(\*'
+       setf mma
+       return
+     endif
+     if line =~ '^\c\s*\(\(type\|var\)\>\|--\)'
+       setf murphi
+       return
+     endif
+     let n = n + 1
+   endwhile
+ 
+   if saw_comment
+     " We didn't see anything definitive, but this looks like either Objective 
C
+     " or Murphi based on the comment leader. Assume the former as it is more
+     " common.
+     setf objc
+   elseif exists("g:filetype_m")
+     " Use user specified default filetype for .m
+     exe "setf " . g:filetype_m
+   else
+     " Default is matlab
+     setf matlab
+   endif
+ endfunc
+ 
+ func filetype#FTmms()
+   let n = 1
+   while n < 10
+     let line = getline(n)
+     if line =~ '^\s*\(%\|//\)' || line =~ '^\*'
+       setf mmix
+       return
+     endif
+     if line =~ '^\s*#'
+       setf make
+       return
+     endif
+     let n = n + 1
+   endwhile
+   setf mmix
+ endfunc
+ 
+ " This function checks if one of the first five lines start with a dot.  In
+ " that case it is probably an nroff file: 'filetype' is set and 1 is returned.
+ func filetype#FTnroff()
+   if getline(1)[0] . getline(2)[0] . getline(3)[0] . getline(4)[0] . 
getline(5)[0] =~ '\.'
+     setf nroff
+     return 1
+   endif
+   return 0
+ endfunc
+ 
+ func filetype#FTmm()
+   let n = 1
+   while n < 10
+     let line = getline(n)
+     if line =~ '^\s*\(#\s*\(include\|import\)\>\|@import\>\|/\*\)'
+       setf objcpp
+       return
+     endif
+     let n = n + 1
+   endwhile
+   setf nroff
+ endfunc
+ 
+ func filetype#FTpl()
+   if exists("g:filetype_pl")
+     exe "setf " . g:filetype_pl
+   else
+     " recognize Prolog by specific text in the first non-empty line
+     " require a blank after the '%' because Perl uses "%list" and "%translate"
+     let l = getline(nextnonblank(1))
+     if l =~ '\<prolog\>' || l =~ '^\s*\(%\+\(\s\|$\)\|/\*\)' || l =~ ':-'
+       setf prolog
+     else
+       setf perl
+     endif
+   endif
+ endfunc
+ 
+ func filetype#FTinc()
+   if exists("g:filetype_inc")
+     exe "setf " . g:filetype_inc
+   else
+     let lines = getline(1).getline(2).getline(3)
+     if lines =~? "perlscript"
+       setf aspperl
+     elseif lines =~ "<%"
+       setf aspvbs
+     elseif lines =~ "<?"
+       setf php
+     else
+       call filetype#FTasmsyntax()
+       if exists("b:asmsyntax")
+       exe "setf " . fnameescape(b:asmsyntax)
+       else
+       setf pov
+       endif
+     endif
+   endif
+ endfunc
+ 
+ func filetype#FTprogress_cweb()
+   if exists("g:filetype_w")
+     exe "setf " . g:filetype_w
+     return
+   endif
+   if getline(1) =~ '&ANALYZE' || getline(3) =~ '&GLOBAL-DEFINE'
+     setf progress
+   else
+     setf cweb
+   endif
+ endfunc
+ 
+ func filetype#FTprogress_asm()
+   if exists("g:filetype_i")
+     exe "setf " . g:filetype_i
+     return
+   endif
+   " This function checks for an assembly comment the first ten lines.
+   " If not found, assume Progress.
+   let lnum = 1
+   while lnum <= 10 && lnum < line('$')
+     let line = getline(lnum)
+     if line =~ '^\s*;' || line =~ '^\*'
+       call filetype#FTasm()
+       return
+     elseif line !~ '^\s*$' || line =~ '^/\*'
+       " Not an empty line: Doesn't look like valid assembly code.
+       " Or it looks like a Progress /* comment
+       break
+     endif
+     let lnum = lnum + 1
+   endw
+   setf progress
+ endfunc
+ 
+ func filetype#FTprogress_pascal()
+   if exists("g:filetype_p")
+     exe "setf " . g:filetype_p
+     return
+   endif
+   " This function checks for valid Pascal syntax in the first ten lines.
+   " Look for either an opening comment or a program start.
+   " If not found, assume Progress.
+   let lnum = 1
+   while lnum <= 10 && lnum < line('$')
+     let line = getline(lnum)
+     if line =~ 
'^\s*\(program\|unit\|procedure\|function\|const\|type\|var\)\>'
+       \ || line =~ '^\s*{' || line =~ '^\s*(\*'
+       setf pascal
+       return
+     elseif line !~ '^\s*$' || line =~ '^/\*'
+       " Not an empty line: Doesn't look like valid Pascal code.
+       " Or it looks like a Progress /* comment
+       break
+     endif
+     let lnum = lnum + 1
+   endw
+   setf progress
+ endfunc
+ 
+ func filetype#FTr()
+   let max = line("$") > 50 ? 50 : line("$")
+ 
+   for n in range(1, max)
+     " Rebol is easy to recognize, check for that first
+     if getline(n) =~? '\<REBOL\>'
+       setf rebol
+       return
+     endif
+   endfor
+ 
+   for n in range(1, max)
+     " R has # comments
+     if getline(n) =~ '^\s*#'
+       setf r
+       return
+     endif
+     " Rexx has /* comments */
+     if getline(n) =~ '^\s*/\*'
+       setf rexx
+       return
+     endif
+   endfor
+ 
+   " Nothing recognized, use user default or assume Rexx
+   if exists("g:filetype_r")
+     exe "setf " . g:filetype_r
+   else
+     " Rexx used to be the default, but R appears to be much more popular.
+     setf r
+   endif
+ endfunc
+ 
+ func filetype#McSetf()
+   " Rely on the file to start with a comment.
+   " MS message text files use ';', Sendmail files use '#' or 'dnl'
+   for lnum in range(1, min([line("$"), 20]))
+     let line = getline(lnum)
+     if line =~ '^\s*\(#\|dnl\)'
+       setf m4  " Sendmail .mc file
+       return
+     elseif line =~ '^\s*;'
+       setf msmessages  " MS Message text file
+       return
+     endif
+   endfor
+   setf m4  " Default: Sendmail .mc file
+ endfunc
+ 
+ " Called from filetype.vim and scripts.vim.
+ func filetype#SetFileTypeSH(name)
+   if expand("<amatch>") =~ g:ft_ignore_pat
+     return
+   endif
+   if a:name =~ '\<csh\>'
+     " Some .sh scripts contain #!/bin/csh.
+     call filetype#SetFileTypeShell("csh")
+     return
+   elseif a:name =~ '\<tcsh\>'
+     " Some .sh scripts contain #!/bin/tcsh.
+     call filetype#SetFileTypeShell("tcsh")
+     return
+   elseif a:name =~ '\<zsh\>'
+     " Some .sh scripts contain #!/bin/zsh.
+     call filetype#SetFileTypeShell("zsh")
+     return
+   elseif a:name =~ '\<ksh\>'
+     let b:is_kornshell = 1
+     if exists("b:is_bash")
+       unlet b:is_bash
+     endif
+     if exists("b:is_sh")
+       unlet b:is_sh
+     endif
+   elseif exists("g:bash_is_sh") || a:name =~ '\<bash\>' || a:name =~ 
'\<bash2\>'
+     let b:is_bash = 1
+     if exists("b:is_kornshell")
+       unlet b:is_kornshell
+     endif
+     if exists("b:is_sh")
+       unlet b:is_sh
+     endif
+   elseif a:name =~ '\<sh\>'
+     let b:is_sh = 1
+     if exists("b:is_kornshell")
+       unlet b:is_kornshell
+     endif
+     if exists("b:is_bash")
+       unlet b:is_bash
+     endif
+   endif
+   call filetype#SetFileTypeShell("sh")
+ endfunc
+ 
+ " For shell-like file types, check for an "exec" command hidden in a comment,
+ " as used for Tcl.
+ " Also called from scripts.vim, thus can't be local to this script.
+ func filetype#SetFileTypeShell(name)
+   if expand("<amatch>") =~ g:ft_ignore_pat
+     return
+   endif
+   let l = 2
+   while l < 20 && l < line("$") && getline(l) =~ '^\s*\(#\|$\)'
+     " Skip empty and comment lines.
+     let l = l + 1
+   endwhile
+   if l < line("$") && getline(l) =~ '\s*exec\s' && getline(l - 1) =~ 
'^\s*#.*\\$'
+     " Found an "exec" line after a comment with continuation
+     let n = substitute(getline(l),'\s*exec\s\+\([^ ]*/\)\=', '', '')
+     if n =~ '\<tclsh\|\<wish'
+       setf tcl
+       return
+     endif
+   endif
+   exe "setf " . a:name
+ endfunc
+ 
+ func filetype#CSH()
+   if exists("g:filetype_csh")
+     call filetype#SetFileTypeShell(g:filetype_csh)
+   elseif &shell =~ "tcsh"
+     call filetype#SetFileTypeShell("tcsh")
+   else
+     call filetype#SetFileTypeShell("csh")
+   endif
+ endfunc
+ 
+ func filetype#FTRules()
+   let path = expand('<amatch>:p')
+   if path =~ 
'^/\(etc/udev/\%(rules\.d/\)\=.*\.rules\|lib/udev/\%(rules\.d/\)\=.*\.rules\)$'
+     setf udevrules
+     return
+   endif
+   if path =~ '^/etc/ufw/'
+     setf conf  " Better than hog
+     return
+   endif
+   if path =~ '^/\(etc\|usr/share\)/polkit-1/rules\.d'
+     setf javascript
+     return
+   endif
+   try
+     let config_lines = readfile('/etc/udev/udev.conf')
+   catch /^Vim\%((\a\+)\)\=:E484/
+     setf hog
+     return
+   endtry
+   let dir = expand('<amatch>:p:h')
+   for line in config_lines
+     if line =~ s:ft_rules_udev_rules_pattern
+       let udev_rules = substitute(line, s:ft_rules_udev_rules_pattern, '\1', 
"")
+       if dir == udev_rules
+       setf udevrules
+       endif
+       break
+     endif
+   endfor
+   setf hog
+ endfunc
+ 
+ func filetype#SQL()
+   if exists("g:filetype_sql")
+     exe "setf " . g:filetype_sql
+   else
+     setf sql
+   endif
+ endfunc
+ 
+ " If the file has an extension of 't' and is in a directory 't' or 'xt' then
+ " it is almost certainly a Perl test file.
+ " If the first line starts with '#' and contains 'perl' it's probably a Perl
+ " file.
+ " (Slow test) If a file contains a 'use' statement then it is almost certainly
+ " a Perl file.
+ func filetype#FTperl()
+   let dirname = expand("%:p:h:t")
+   if expand("%:e") == 't' && (dirname == 't' || dirname == 'xt')
+     setf perl
+     return 1
+   endif
+   if getline(1)[0] == '#' && getline(1) =~ 'perl'
+     setf perl
+     return 1
+   endif
+   if search('^use\s\s*\k', 'nc', 30)
+     setf perl
+     return 1
+   endif
+   return 0
+ endfunc
+ 
+ " Choose context, plaintex, or tex (LaTeX) based on these rules:
+ " 1. Check the first line of the file for "%&<format>".
+ " 2. Check the first 1000 non-comment lines for LaTeX or ConTeXt keywords.
+ " 3. Default to "latex" or to g:tex_flavor, can be set in user's vimrc.
+ func filetype#FTtex()
+   let firstline = getline(1)
+   if firstline =~ '^%&\s*\a\+'
+     let format = tolower(matchstr(firstline, '\a\+'))
+     let format = substitute(format, 'pdf', '', '')
+     if format == 'tex'
+       let format = 'latex'
+     elseif format == 'plaintex'
+       let format = 'plain'
+     endif
+   elseif expand('%') =~ 'tex/context/.*/.*.tex'
+     let format = 'context'
+   else
+     " Default value, may be changed later:
+     let format = exists("g:tex_flavor") ? g:tex_flavor : 'plain'
+     " Save position, go to the top of the file, find first non-comment line.
+     let save_cursor = getpos('.')
+     call cursor(1,1)
+     let firstNC = search('^\s*[^[:space:]%]', 'c', 1000)
+     if firstNC " Check the next thousand lines for a LaTeX or ConTeXt keyword.
+       let lpat = 
'documentclass\>\|usepackage\>\|begin{\|newcommand\>\|renewcommand\>'
+       let cpat = 
'start\a\+\|setup\a\+\|usemodule\|enablemode\|enableregime\|setvariables\|useencoding\|usesymbols\|stelle\a\+\|verwende\a\+\|stel\a\+\|gebruik\a\+\|usa\a\+\|imposta\a\+\|regle\a\+\|utilisemodule\>'
+       let kwline = search('^\s*\\\%(' . lpat . '\)\|^\s*\\\(' . cpat . '\)',
+                             \ 'cnp', firstNC + 1000)
+       if kwline == 1  " lpat matched
+       let format = 'latex'
+       elseif kwline == 2      " cpat matched
+       let format = 'context'
+       endif           " If neither matched, keep default set above.
+       " let lline = search('^\s*\\\%(' . lpat . '\)', 'cn', firstNC + 1000)
+       " let cline = search('^\s*\\\%(' . cpat . '\)', 'cn', firstNC + 1000)
+       " if cline > 0
+       "   let format = 'context'
+       " endif
+       " if lline > 0 && (cline == 0 || cline > lline)
+       "   let format = 'tex'
+       " endif
+     endif " firstNC
+     call setpos('.', save_cursor)
+   endif " firstline =~ '^%&\s*\a\+'
+ 
+   " Translation from formats to file types.  TODO:  add AMSTeX, RevTex, 
others?
+   if format == 'plain'
+     setf plaintex
+   elseif format == 'context'
+     setf context
+   else " probably LaTeX
+     setf tex
+   endif
+   return
+ endfunc
+ 
+ func filetype#FTxml()
+   let n = 1
+   while n < 100 && n < line("$")
+     let line = getline(n)
+     " DocBook 4 or DocBook 5.
+     let is_docbook4 = line =~ '<!DOCTYPE.*DocBook'
+     let is_docbook5 = line =~ ' xmlns="http://docbook.org/ns/docbook";'
+     if is_docbook4 || is_docbook5
+       let b:docbk_type = "xml"
+       if is_docbook5
+       let b:docbk_ver = 5
+       else
+       let b:docbk_ver = 4
+       endif
+       setf docbk
+       return
+     endif
+     if line =~ 'xmlns:xbl="http://www.mozilla.org/xbl";'
+       setf xbl
+       return
+     endif
+     let n += 1
+   endwhile
+   setf xml
+ endfunc
+ 
+ func filetype#FTy()
+   let n = 1
+   while n < 100 && n < line("$")
+     let line = getline(n)
+     if line =~ '^\s*%'
+       setf yacc
+       return
+     endif
+     if getline(n) =~ '^\s*\(#\|class\>\)' && getline(n) !~ '^\s*#\s*include'
+       setf racc
+       return
+     endif
+     let n = n + 1
+   endwhile
+   setf yacc
+ endfunc
+ 
+ func filetype#Redif()
+   let lnum = 1
+   while lnum <= 5 && lnum < line('$')
+     if getline(lnum) =~ "^\ctemplate-type:"
+       setf redif
+       return
+     endif
+     let lnum = lnum + 1
+   endwhile
+ endfunc
+ 
+ 
+ " Restore 'cpoptions'
+ let &cpo = s:cpo_save
+ unlet s:cpo_save
*** ../vim-8.0.1280/runtime/scripts.vim 2017-08-27 16:53:57.786032946 +0200
--- runtime/scripts.vim 2017-11-09 20:29:52.090810187 +0100
***************
*** 1,7 ****
  " Vim support file to detect file types in scripts
  "
  " Maintainer: Bram Moolenaar <[email protected]>
! " Last change:        2017 Aug 27
  
  " This file is called by an autocommand for every file that has just been
  " loaded into a buffer.  It checks if the type of file can be recognized by
--- 1,7 ----
  " Vim support file to detect file types in scripts
  "
  " Maintainer: Bram Moolenaar <[email protected]>
! " Last change:        2017 Nov 09
  
  " This file is called by an autocommand for every file that has just been
  " loaded into a buffer.  It checks if the type of file can be recognized by
***************
*** 66,84 ****
  
    " Bourne-like shell scripts: bash bash2 ksh ksh93 sh
    if s:name =~# '^\(bash\d*\|\|ksh\d*\|sh\)\>'
!     call SetFileTypeSH(s:line1)       " defined in filetype.vim
  
      " csh scripts
    elseif s:name =~# '^csh\>'
      if exists("g:filetype_csh")
!       call SetFileTypeShell(g:filetype_csh)
      else
!       call SetFileTypeShell("csh")
      endif
  
      " tcsh scripts
    elseif s:name =~# '^tcsh\>'
!     call SetFileTypeShell("tcsh")
  
      " Z shell scripts
    elseif s:name =~# '^zsh\>'
--- 66,84 ----
  
    " Bourne-like shell scripts: bash bash2 ksh ksh93 sh
    if s:name =~# '^\(bash\d*\|\|ksh\d*\|sh\)\>'
!     call filetype#SetFileTypeSH(s:line1)      " defined in filetype.vim
  
      " csh scripts
    elseif s:name =~# '^csh\>'
      if exists("g:filetype_csh")
!       call filetype#SetFileTypeShell(g:filetype_csh)
      else
!       call filetype#SetFileTypeShell("csh")
      endif
  
      " tcsh scripts
    elseif s:name =~# '^tcsh\>'
!     call filetype#SetFileTypeShell("tcsh")
  
      " Z shell scripts
    elseif s:name =~# '^zsh\>'
***************
*** 185,191 ****
  
    " Bourne-like shell scripts: sh ksh bash bash2
    if s:line1 =~# '^:$'
!     call SetFileTypeSH(s:line1)       " defined in filetype.vim
  
      " Z shell scripts
    elseif s:line1 =~# '^#compdef\>' || s:line1 =~# '^#autoload\>' ||
--- 185,191 ----
  
    " Bourne-like shell scripts: sh ksh bash bash2
    if s:line1 =~# '^:$'
!     call filetype#SetFileTypeSH(s:line1)      " defined in filetype.vim
  
      " Z shell scripts
    elseif s:line1 =~# '^#compdef\>' || s:line1 =~# '^#autoload\>' ||
***************
*** 324,330 ****
      set ft=sindacmp
  
      " DNS zone files
!   elseif s:line1.s:line2.s:line3.s:line4 =~# '^; <<>> DiG [0-9.]\+ 
<<>>\|BIND.*named\|$ORIGIN\|$TTL\|IN\s\+SOA'
      set ft=bindzone
  
      " BAAN
--- 324,330 ----
      set ft=sindacmp
  
      " DNS zone files
!   elseif s:line1.s:line2.s:line3.s:line4 =~# '^; <<>> DiG [0-9.]\+.* 
<<>>\|$ORIGIN\|$TTL\|IN\s\+SOA'
      set ft=bindzone
  
      " BAAN
*** ../vim-8.0.1280/src/version.c       2017-11-09 19:56:00.853332902 +0100
--- src/version.c       2017-11-09 20:12:28.390510940 +0100
***************
*** 763,764 ****
--- 763,766 ----
  {   /* Add new patch number below this line */
+ /**/
+     1281,
  /**/

-- 
If you don't get everything you want, think of
everything you didn't get and don't want.

 /// Bram Moolenaar -- [email protected] -- http://www.Moolenaar.net   \\\
///        sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
\\\  an exciting new programming language -- http://www.Zimbu.org        ///
 \\\            help me help AIDS victims -- http://ICCF-Holland.org    ///

-- 
-- 
You received this message from the "vim_dev" maillist.
Do not top-post! Type your reply below the text you are replying to.
For more information, visit http://www.vim.org/maillist.php

--- 
You received this message because you are subscribed to the Google Groups 
"vim_dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/d/optout.

Raspunde prin e-mail lui