changeset 11504:a58229e3aff6 v8.0.0635

patch 8.0.0635: when 'ignorecase' is set script detection is inaccurate commit https://github.com/vim/vim/commit/3a429efb628a3925d13c3fe415e02a7ce117071f Author: Bram Moolenaar <Bram@vim.org> Date: Sun Jun 11 17:10:32 2017 +0200 patch 8.0.0635: when 'ignorecase' is set script detection is inaccurate Problem: When 'ignorecase' is set script detection is inaccurate. Solution: Enforce matching case for text. (closes https://github.com/vim/vim/issues/1753)
author Christian Brabandt <cb@256bit.org>
date Sun, 11 Jun 2017 17:15:03 +0200
parents ce206a9d1faa
children 50d0acf50b18
files runtime/scripts.vim src/version.c
diffstat 2 files changed, 95 insertions(+), 89 deletions(-) [+]
line wrap: on
line diff
--- a/runtime/scripts.vim
+++ b/runtime/scripts.vim
@@ -1,11 +1,15 @@
 " Vim support file to detect file types in scripts
 "
 " Maintainer:	Bram Moolenaar <Bram@vim.org>
-" Last change:	2017 Mar 04
+" Last change:	2017 Jun 11
 
 " 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
 " the file contents.  The autocommand is in $VIMRUNTIME/filetype.vim.
+"
+" Note that the pattern matches are done with =~# to avoid the value of the
+" 'ignorecase' option making a difference.  Where case is to be ignored use
+" =~? instead.  Do not use =~ anywhere.
 
 
 " Only do the rest when the FileType autocommand has not been triggered yet.
@@ -28,12 +32,12 @@ set cpo&vim
 
 let s:line1 = getline(1)
 
-if s:line1 =~ "^#!"
+if s:line1 =~# "^#!"
   " A script that starts with "#!".
 
   " Check for a line like "#!/usr/bin/env VAR=val bash".  Turn it into
   " "#!/usr/bin/bash" to make matching easier.
-  if s:line1 =~ '^#!\s*\S*\<env\s'
+  if s:line1 =~# '^#!\s*\S*\<env\s'
     let s:line1 = substitute(s:line1, '\S\+=\S\+', '', 'g')
     let s:line1 = substitute(s:line1, '\<env\s\+', '', '')
   endif
@@ -44,11 +48,11 @@ if s:line1 =~ "^#!"
   " "#!/usr/bin/env perl [path/args]"
   " If there is no path use the first word: "#!perl [path/args]".
   " Otherwise get the last word after a slash: "#!/usr/bin/perl [path/args]".
-  if s:line1 =~ '^#!\s*\a:[/\\]'
+  if s:line1 =~# '^#!\s*\a:[/\\]'
     let s:name = substitute(s:line1, '^#!.*[/\\]\(\i\+\).*', '\1', '')
-  elseif s:line1 =~ '^#!.*\<env\>'
+  elseif s:line1 =~# '^#!.*\<env\>'
     let s:name = substitute(s:line1, '^#!.*\<env\>\s\+\(\i\+\).*', '\1', '')
-  elseif s:line1 =~ '^#!\s*[^/\\ ]*\>\([^/\\]\|$\)'
+  elseif s:line1 =~# '^#!\s*[^/\\ ]*\>\([^/\\]\|$\)'
     let s:name = substitute(s:line1, '^#!\s*\([^/\\ ]*\>\).*', '\1', '')
   else
     let s:name = substitute(s:line1, '^#!\s*\S*[/\\]\(\i\+\).*', '\1', '')
@@ -56,16 +60,16 @@ if s:line1 =~ "^#!"
 
   " tcl scripts may have #!/bin/sh in the first line and "exec wish" in the
   " third line.  Suggested by Steven Atkinson.
-  if getline(3) =~ '^exec wish'
+  if getline(3) =~# '^exec wish'
     let s:name = 'wish'
   endif
 
   " Bourne-like shell scripts: bash bash2 ksh ksh93 sh
-  if s:name =~ '^\(bash\d*\|\|ksh\d*\|sh\)\>'
+  if s:name =~# '^\(bash\d*\|\|ksh\d*\|sh\)\>'
     call SetFileTypeSH(s:line1)	" defined in filetype.vim
 
     " csh scripts
-  elseif s:name =~ '^csh\>'
+  elseif s:name =~# '^csh\>'
     if exists("g:filetype_csh")
       call SetFileTypeShell(g:filetype_csh)
     else
@@ -73,99 +77,99 @@ if s:line1 =~ "^#!"
     endif
 
     " tcsh scripts
-  elseif s:name =~ '^tcsh\>'
+  elseif s:name =~# '^tcsh\>'
     call SetFileTypeShell("tcsh")
 
     " Z shell scripts
-  elseif s:name =~ '^zsh\>'
+  elseif s:name =~# '^zsh\>'
     set ft=zsh
 
     " TCL scripts
-  elseif s:name =~ '^\(tclsh\|wish\|expectk\|itclsh\|itkwish\)\>'
+  elseif s:name =~# '^\(tclsh\|wish\|expectk\|itclsh\|itkwish\)\>'
     set ft=tcl
 
     " Expect scripts
-  elseif s:name =~ '^expect\>'
+  elseif s:name =~# '^expect\>'
     set ft=expect
 
     " Gnuplot scripts
-  elseif s:name =~ '^gnuplot\>'
+  elseif s:name =~# '^gnuplot\>'
     set ft=gnuplot
 
     " Makefiles
-  elseif s:name =~ 'make\>'
+  elseif s:name =~# 'make\>'
     set ft=make
 
     " Lua
-  elseif s:name =~ 'lua'
+  elseif s:name =~# 'lua'
     set ft=lua
 
     " Perl 6
-  elseif s:name =~ 'perl6'
+  elseif s:name =~# 'perl6'
     set ft=perl6
 
     " Perl
-  elseif s:name =~ 'perl'
+  elseif s:name =~# 'perl'
     set ft=perl
 
     " PHP
-  elseif s:name =~ 'php'
+  elseif s:name =~# 'php'
     set ft=php
 
     " Python
-  elseif s:name =~ 'python'
+  elseif s:name =~# 'python'
     set ft=python
 
     " Groovy
-  elseif s:name =~ '^groovy\>'
+  elseif s:name =~# '^groovy\>'
     set ft=groovy
 
     " Ruby
-  elseif s:name =~ 'ruby'
+  elseif s:name =~# 'ruby'
     set ft=ruby
 
     " JavaScript
-  elseif s:name =~ 'node\(js\)\=\>' || s:name =~ 'rhino\>'
+  elseif s:name =~# 'node\(js\)\=\>' || s:name =~# 'rhino\>'
     set ft=javascript
 
     " BC calculator
-  elseif s:name =~ '^bc\>'
+  elseif s:name =~# '^bc\>'
     set ft=bc
 
     " sed
-  elseif s:name =~ 'sed\>'
+  elseif s:name =~# 'sed\>'
     set ft=sed
 
     " OCaml-scripts
-  elseif s:name =~ 'ocaml'
+  elseif s:name =~# 'ocaml'
     set ft=ocaml
 
     " Awk scripts
-  elseif s:name =~ 'awk\>'
+  elseif s:name =~# 'awk\>'
     set ft=awk
 
     " Website MetaLanguage
-  elseif s:name =~ 'wml'
+  elseif s:name =~# 'wml'
     set ft=wml
 
     " Scheme scripts
-  elseif s:name =~ 'scheme'
+  elseif s:name =~# 'scheme'
     set ft=scheme
 
     " CFEngine scripts
-  elseif s:name =~ 'cfengine'
+  elseif s:name =~# 'cfengine'
     set ft=cfengine
 
     " Erlang scripts
-  elseif s:name =~ 'escript'
+  elseif s:name =~# 'escript'
     set ft=erlang
 
     " Haskell
-  elseif s:name =~ 'haskell'
+  elseif s:name =~# 'haskell'
     set ft=haskell
 
     " Scala
-  elseif s:name =~ 'scala\>'
+  elseif s:name =~# 'scala\>'
     set ft=scala
 
   endif
@@ -180,28 +184,28 @@ else
   let s:line5 = getline(5)
 
   " Bourne-like shell scripts: sh ksh bash bash2
-  if s:line1 =~ '^:$'
+  if s:line1 =~# '^:$'
     call SetFileTypeSH(s:line1)	" defined in filetype.vim
 
     " Z shell scripts
-  elseif s:line1 =~ '^#compdef\>' || s:line1 =~ '^#autoload\>' ||
-        \ "\n".s:line1."\n".s:line2."\n".s:line3."\n".s:line4."\n".s:line5 =~ '\n\s*emulate\s\+\%(-[LR]\s\+\)\=[ckz]\=sh\>'
+  elseif s:line1 =~# '^#compdef\>' || s:line1 =~# '^#autoload\>' ||
+        \ "\n".s:line1."\n".s:line2."\n".s:line3."\n".s:line4."\n".s:line5 =~# '\n\s*emulate\s\+\%(-[LR]\s\+\)\=[ckz]\=sh\>'
     set ft=zsh
 
   " ELM Mail files
-  elseif s:line1 =~ '^From \([a-zA-Z][a-zA-Z_0-9\.=-]*\(@[^ ]*\)\=\|-\) .* \(19\|20\)\d\d$'
+  elseif s:line1 =~# '^From \([a-zA-Z][a-zA-Z_0-9\.=-]*\(@[^ ]*\)\=\|-\) .* \(19\|20\)\d\d$'
     set ft=mail
 
     " Mason
-  elseif s:line1 =~ '^<[%&].*>'
+  elseif s:line1 =~# '^<[%&].*>'
     set ft=mason
 
     " Vim scripts (must have '" vim' as the first line to trigger this)
-  elseif s:line1 =~ '^" *[vV]im$'
+  elseif s:line1 =~# '^" *[vV]im$'
     set ft=vim
 
     " MOO
-  elseif s:line1 =~ '^\*\* LambdaMOO Database, Format Version \%([1-3]\>\)\@!\d\+ \*\*$'
+  elseif s:line1 =~# '^\*\* LambdaMOO Database, Format Version \%([1-3]\>\)\@!\d\+ \*\*$'
     set ft=moo
 
     " Diff file:
@@ -215,29 +219,29 @@ else
     " - "=== ", "--- ", "+++ " (bzr diff, common case)
     " - "=== (removed|added|renamed|modified)" (bzr diff, alternative)
     " - "# HG changeset patch" in first line (Mercurial export format)
-  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\)'
-	\ || (s:line1 =~ '^--- ' && s:line2 =~ '^+++ ')
-	\ || (s:line1 =~ '^\* looking for ' && s:line2 =~ '^\* comparing to ')
-	\ || (s:line1 =~ '^\*\*\* ' && s:line2 =~ '^--- ')
-	\ || (s:line1 =~ '^=== ' && ((s:line2 =~ '^=\{66\}' && s:line3 =~ '^--- ' && s:line4 =~ '^+++') || (s:line2 =~ '^--- ' && s:line3 =~ '^+++ ')))
-	\ || (s:line1 =~ '^=== \(removed\|added\|renamed\|modified\)')
+  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\)'
+	\ || (s:line1 =~# '^--- ' && s:line2 =~# '^+++ ')
+	\ || (s:line1 =~# '^\* looking for ' && s:line2 =~# '^\* comparing to ')
+	\ || (s:line1 =~# '^\*\*\* ' && s:line2 =~# '^--- ')
+	\ || (s:line1 =~# '^=== ' && ((s:line2 =~# '^=\{66\}' && s:line3 =~# '^--- ' && s:line4 =~# '^+++') || (s:line2 =~# '^--- ' && s:line3 =~# '^+++ ')))
+	\ || (s:line1 =~# '^=== \(removed\|added\|renamed\|modified\)')
     set ft=diff
 
     " PostScript Files (must have %!PS as the first line, like a2ps output)
-  elseif s:line1 =~ '^%![ \t]*PS'
+  elseif s:line1 =~# '^%![ \t]*PS'
     set ft=postscr
 
     " M4 scripts: Guess there is a line that starts with "dnl".
-  elseif s:line1 =~ '^\s*dnl\>'
-	\ || s:line2 =~ '^\s*dnl\>'
-	\ || s:line3 =~ '^\s*dnl\>'
-	\ || s:line4 =~ '^\s*dnl\>'
-	\ || s:line5 =~ '^\s*dnl\>'
+  elseif s:line1 =~# '^\s*dnl\>'
+	\ || s:line2 =~# '^\s*dnl\>'
+	\ || s:line3 =~# '^\s*dnl\>'
+	\ || s:line4 =~# '^\s*dnl\>'
+	\ || s:line5 =~# '^\s*dnl\>'
     set ft=m4
 
     " AmigaDos scripts
   elseif $TERM == "amiga"
-	\ && (s:line1 =~ "^;" || s:line1 =~ '^\.[bB][rR][aA]')
+	\ && (s:line1 =~# "^;" || s:line1 =~? '^\.bra')
     set ft=amiga
 
     " SiCAD scripts (must have procn or procd as the first line to trigger this)
@@ -245,15 +249,15 @@ else
     set ft=sicad
 
     " Purify log files start with "****  Purify"
-  elseif s:line1 =~ '^\*\*\*\*  Purify'
+  elseif s:line1 =~# '^\*\*\*\*  Purify'
     set ft=purifylog
 
     " XML
-  elseif s:line1 =~ '<?\s*xml.*?>'
+  elseif s:line1 =~# '<?\s*xml.*?>'
     set ft=xml
 
     " XHTML (e.g.: PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN")
-  elseif s:line1 =~ '\<DTD\s\+XHTML\s'
+  elseif s:line1 =~# '\<DTD\s\+XHTML\s'
     set ft=xhtml
 
     " HTML (e.g.: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN")
@@ -262,96 +266,96 @@ else
     set ft=html
 
     " PDF
-  elseif s:line1 =~ '^%PDF-'
+  elseif s:line1 =~# '^%PDF-'
     set ft=pdf
 
     " XXD output
-  elseif s:line1 =~ '^\x\{7}: \x\{2} \=\x\{2} \=\x\{2} \=\x\{2} '
+  elseif s:line1 =~# '^\x\{7}: \x\{2} \=\x\{2} \=\x\{2} \=\x\{2} '
     set ft=xxd
 
     " RCS/CVS log output
-  elseif s:line1 =~ '^RCS file:' || s:line2 =~ '^RCS file:'
+  elseif s:line1 =~# '^RCS file:' || s:line2 =~# '^RCS file:'
     set ft=rcslog
 
     " CVS commit
-  elseif s:line2 =~ '^CVS:' || getline("$") =~ '^CVS: '
+  elseif s:line2 =~# '^CVS:' || getline("$") =~# '^CVS: '
     set ft=cvs
 
     " Prescribe
-  elseif s:line1 =~ '^!R!'
+  elseif s:line1 =~# '^!R!'
     set ft=prescribe
 
     " Send-pr
-  elseif s:line1 =~ '^SEND-PR:'
+  elseif s:line1 =~# '^SEND-PR:'
     set ft=sendpr
 
     " SNNS files
-  elseif s:line1 =~ '^SNNS network definition file'
+  elseif s:line1 =~# '^SNNS network definition file'
     set ft=snnsnet
-  elseif s:line1 =~ '^SNNS pattern definition file'
+  elseif s:line1 =~# '^SNNS pattern definition file'
     set ft=snnspat
-  elseif s:line1 =~ '^SNNS result file'
+  elseif s:line1 =~# '^SNNS result file'
     set ft=snnsres
 
     " Virata
-  elseif s:line1 =~ '^%.\{-}[Vv]irata'
-	\ || s:line2 =~ '^%.\{-}[Vv]irata'
-	\ || s:line3 =~ '^%.\{-}[Vv]irata'
-	\ || s:line4 =~ '^%.\{-}[Vv]irata'
-	\ || s:line5 =~ '^%.\{-}[Vv]irata'
+  elseif s:line1 =~# '^%.\{-}[Vv]irata'
+	\ || s:line2 =~# '^%.\{-}[Vv]irata'
+	\ || s:line3 =~# '^%.\{-}[Vv]irata'
+	\ || s:line4 =~# '^%.\{-}[Vv]irata'
+	\ || s:line5 =~# '^%.\{-}[Vv]irata'
     set ft=virata
 
     " Strace
-  elseif s:line1 =~ '^\(\[pid \d\+\] \)\=[0-9:.]* *execve(' || s:line1 =~ '^__libc_start_main'
+  elseif s:line1 =~# '^\(\[pid \d\+\] \)\=[0-9:.]* *execve(' || s:line1 =~# '^__libc_start_main'
     set ft=strace
 
     " VSE JCL
-  elseif s:line1 =~ '^\* $$ JOB\>' || s:line1 =~ '^// *JOB\>'
+  elseif s:line1 =~# '^\* $$ JOB\>' || s:line1 =~# '^// *JOB\>'
     set ft=vsejcl
 
     " TAK and SINDA
-  elseif s:line4 =~ 'K & K  Associates' || s:line2 =~ 'TAK 2000'
+  elseif s:line4 =~# 'K & K  Associates' || s:line2 =~# 'TAK 2000'
     set ft=takout
-  elseif s:line3 =~ 'S Y S T E M S   I M P R O V E D '
+  elseif s:line3 =~# 'S Y S T E M S   I M P R O V E D '
     set ft=sindaout
-  elseif getline(6) =~ 'Run Date: '
+  elseif getline(6) =~# 'Run Date: '
     set ft=takcmp
-  elseif getline(9) =~ 'Node    File  1'
+  elseif getline(9) =~# 'Node    File  1'
     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'
+  elseif s:line1.s:line2.s:line3.s:line4 =~# '^; <<>> DiG [0-9.]\+ <<>>\|BIND.*named\|$ORIGIN\|$TTL\|IN\s\+SOA'
     set ft=bindzone
 
     " BAAN
-  elseif s:line1 =~ '|\*\{1,80}' && s:line2 =~ 'VRC '
-	\ || s:line2 =~ '|\*\{1,80}' && s:line3 =~ 'VRC '
+  elseif s:line1 =~# '|\*\{1,80}' && s:line2 =~# 'VRC '
+	\ || s:line2 =~# '|\*\{1,80}' && s:line3 =~# 'VRC '
     set ft=baan
 
   " Valgrind
-  elseif s:line1 =~ '^==\d\+== valgrind' || s:line3 =~ '^==\d\+== Using valgrind'
+  elseif s:line1 =~# '^==\d\+== valgrind' || s:line3 =~# '^==\d\+== Using valgrind'
     set ft=valgrind
 
   " Go docs
-  elseif s:line1 =~ '^PACKAGE DOCUMENTATION$'
+  elseif s:line1 =~# '^PACKAGE DOCUMENTATION$'
     set ft=godoc
 
   " Renderman Interface Bytestream
-  elseif s:line1 =~ '^##RenderMan'
+  elseif s:line1 =~# '^##RenderMan'
     set ft=rib
 
   " Scheme scripts
-  elseif s:line1 =~ 'exec\s\+\S*scheme' || s:line2 =~ 'exec\s\+\S*scheme'
+  elseif s:line1 =~# 'exec\s\+\S*scheme' || s:line2 =~# 'exec\s\+\S*scheme'
     set ft=scheme
 
   " Git output
-  elseif s:line1 =~ '^\(commit\|tree\|object\) \x\{40\}\>\|^tag \S\+$'
+  elseif s:line1 =~# '^\(commit\|tree\|object\) \x\{40\}\>\|^tag \S\+$'
     set ft=git
 
    " Gprof (gnu profiler)
    elseif s:line1 == 'Flat profile:'
      \ && s:line2 == ''
-     \ && s:line3 =~ '^Each sample counts as .* seconds.$'
+     \ && s:line3 =~# '^Each sample counts as .* seconds.$'
      set ft=gprof
 
   " Erlang terms
@@ -362,18 +366,18 @@ else
   " CVS diff
   else
     let s:lnum = 1
-    while getline(s:lnum) =~ "^? " && s:lnum < line("$")
+    while getline(s:lnum) =~# "^? " && s:lnum < line("$")
       let s:lnum += 1
     endwhile
-    if getline(s:lnum) =~ '^Index:\s\+\f\+$'
+    if getline(s:lnum) =~# '^Index:\s\+\f\+$'
       set ft=diff
 
       " locale input files: Formal Definitions of Cultural Conventions
       " filename must be like en_US, fr_FR@euro or en_US.UTF-8
-    elseif expand("%") =~ '\a\a_\a\a\($\|[.@]\)\|i18n$\|POSIX$\|translit_'
+    elseif expand("%") =~# '\a\a_\a\a\($\|[.@]\)\|i18n$\|POSIX$\|translit_'
       let s:lnum = 1
       while s:lnum < 100 && s:lnum < line("$")
-	if getline(s:lnum) =~ '^LC_\(IDENTIFICATION\|CTYPE\|COLLATE\|MONETARY\|NUMERIC\|TIME\|MESSAGES\|PAPER\|TELEPHONE\|MEASUREMENT\|NAME\|ADDRESS\)$'
+	if getline(s:lnum) =~# '^LC_\(IDENTIFICATION\|CTYPE\|COLLATE\|MONETARY\|NUMERIC\|TIME\|MESSAGES\|PAPER\|TELEPHONE\|MEASUREMENT\|NAME\|ADDRESS\)$'
 	  setf fdcc
 	  break
 	endif
--- a/src/version.c
+++ b/src/version.c
@@ -765,6 +765,8 @@ static char *(features[]) =
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    635,
+/**/
     634,
 /**/
     633,