Repository: sharkdp/bat (language: rust)

Issue:
Incorrect syntax highlighting in Vim file
**Describe the bug you encountered:**

File:

```vim
set runtimepath=~/foo/bar
```

`/foo/` is incorrectly considered Regular Expression:

![screenshot](https://user-images.githubusercontent.com/52205/85144036-9828ee80-b218-11ea-9771-0c0fcab382b8.png)

**Describe what you expected to happen?**

`/foo/` should have the same color as `bar` following it.

**How did you install `bat`?**

MacPorts

<details><summary>diagnostics information</summary>

system
------

**$ uname -srm**
Darwin 19.5.0 x86_64

**$ sw_vers**
ProductName:	Mac OS X
ProductVersion:	10.15.5
BuildVersion:	19F101

bat
---

**$ bat --version**
bat 0.13.0

**$ env**

bat_config
----------

bat_wrapper
-----------

No wrapper script for 'bat'.

bat_wrapper_function
--------------------

No wrapper function for 'bat'.

No wrapper function for 'cat'.

tool
----

**$ less --version**
less 487 (POSIX regular expressions)
</details>


Discussion / hints:
Thank you for reporting this.

This needs to be fixed in https://github.com/SalGnt/Sublime-VimL

Fix patch:
diff --git a/assets/syntaxes.bin b/assets/syntaxes.bin
index 71c64c84df..c1f3051e72 100644
Binary files a/assets/syntaxes.bin and b/assets/syntaxes.bin differ
diff --git a/assets/syntaxes/02_Extra/VimL b/assets/syntaxes/02_Extra/VimL
index ed40c3bc81..23afc89097 160000
--- a/assets/syntaxes/02_Extra/VimL
+++ b/assets/syntaxes/02_Extra/VimL
@@ -1,1 +1,1 @@
-Subproject commit ed40c3bc814cd0c8107dbbb8fcd95946b33217f0
+Subproject commit 23afc890977bb1fd43fd05e7d983f994993d4982
diff --git a/assets/syntaxes/02_Extra/VimL.sublime-syntax b/assets/syntaxes/02_Extra/VimL.sublime-syntax
index f2b202c331..3f96a9850a 100644
--- a/assets/syntaxes/02_Extra/VimL.sublime-syntax
+++ b/assets/syntaxes/02_Extra/VimL.sublime-syntax
@@ -75,10 +75,10 @@ contexts:
     - match: '''(''''|\n[^\S\n]*\\|[^\n''])*'''
       scope: string.quoted.single.viml
   string_regex:
-    - match: '/(\\\\|\\/|\n[^\S\n]*\\|[^\n/])*/'
+    - match: '[gvs]{1}/(\\\\|\\/|\n[^\S\n]*\\|[^\n/])*/'
       scope: string.regexp.viml
   support_function:
-    - match: \b(set(local|global)?|let|command|filetype|colorscheme|\w*map|\w*a(b|brev)?|syn|exe(c|cute)?|ec(ho|)?|au(tocmd|)?)\b
+    - match: \b(set(local|global)?|let|command|filetype|syntax|colorscheme|\w*map|\w*a(b|brev)?|syn|exe(c|cute)?|ec(ho|)?|au(tocmd|)?)\b
       scope: support.function.viml
   support_type:
     - match: <.*?>


Test patch:
diff --git a/tests/syntax-tests/highlighted/VimL/source.vim b/tests/syntax-tests/highlighted/VimL/source.vim
new file mode 100644
index 0000000000..77a5638c38
--- /dev/null
+++ b/tests/syntax-tests/highlighted/VimL/source.vim
@@ -0,0 +1,92 @@
+[38;2;249;38;114mif[0m[38;2;248;248;242m [0m[38;2;255;255;255m&compatible[0m
+[38;2;248;248;242m  [0m[38;2;102;217;239mset[0m[38;2;248;248;242m nocompatible[0m
+[38;2;249;38;114mendif[0m
+
+[38;2;249;38;114mif[0m[38;2;248;248;242m [0m[38;2;102;217;239mhas[0m[38;2;248;248;242m([0m[38;2;230;219;116m'win32'[0m[38;2;248;248;242m) [0m[38;2;249;38;114m||[0m[38;2;248;248;242m has ([0m[38;2;230;219;116m'win64'[0m[38;2;248;248;242m)[0m
+[38;2;248;248;242m  [0m[38;2;102;217;239mlet[0m[38;2;248;248;242m $VIMHOME = $HOME [0m[38;2;249;38;114m.[0m[38;2;248;248;242m [0m[38;2;230;219;116m"/vimfiles"[0m
+[38;2;249;38;114melseif[0m[38;2;248;248;242m [0m[38;2;255;255;255mv:false[0m[38;2;248;248;242m [0m[38;2;249;38;114m&&[0m[38;2;248;248;242m [0m[38;2;255;255;255mv:true[0m
+[38;2;248;248;242m  [0m[38;2;102;217;239mecho[0m[38;2;248;248;242m [0m[38;2;230;219;116m"Can't get here"[0m
+[38;2;249;38;114melse[0m
+[38;2;248;248;242m  [0m[38;2;102;217;239mlet[0m[38;2;248;248;242m $VIMHOME = $HOME [0m[38;2;249;38;114m.[0m[38;2;248;248;242m [0m[38;2;230;219;116m"/.vim"[0m
+[38;2;249;38;114mendif[0m
+
+[38;2;117;113;94m" show existing tab with 2 spaces width[0m
+[38;2;102;217;239mset[0m[38;2;248;248;242m tabstop=[0m[38;2;190;132;255m2[0m
+[38;2;117;113;94m" when indenting with '>', use 2 spaces width[0m
+[38;2;102;217;239mset[0m[38;2;248;248;242m shiftwidth=[0m[38;2;190;132;255m2[0m
+[38;2;117;113;94m" always set autoindenting on[0m
+[38;2;102;217;239mset[0m[38;2;248;248;242m autoindent[0m
+
+[38;2;102;217;239mautocmd[0m[38;2;248;248;242m VimEnter [0m[38;2;249;38;114m*[0m[38;2;248;248;242m [0m[38;2;102;217;239mecho[0m[38;2;248;248;242m [0m[38;2;230;219;116m"Hello Vim"[0m
+
+[38;2;117;113;94m" Allow :W and :Wq to save too[0m
+[38;2;102;217;239mcommand[0m[38;2;248;248;242m! Wq :wq[0m
+[38;2;102;217;239mcommand[0m[38;2;248;248;242m! W :w[0m
+
+[38;2;249;38;114maugroup[0m[38;2;248;248;242m vimrc[0m
+[38;2;248;248;242m    [0m[38;2;102;217;239mautocmd[0m[38;2;248;248;242m![0m
+[38;2;248;248;242m    [0m[38;2;102;217;239mautocmd[0m[38;2;248;248;242m [0m[38;2;248;248;242mFileType[0m[38;2;248;248;242m [0m[38;2;249;38;114m*[0m[38;2;248;248;242m [0m[38;2;102;217;239mecho[0m[38;2;248;248;242m [0m[38;2;230;219;116m"New filetype"[0m
+[38;2;249;38;114maugroup[0m[38;2;248;248;242m END[0m
+
+[38;2;249;38;114mfunction[0m[38;2;248;248;242m! [0m[38;2;166;226;46ms:echo[0m[38;2;248;248;242m([0m[38;2;248;248;242mwhat)[0m
+[38;2;248;248;242m  [0m[38;2;249;38;114mreturn[0m[38;2;248;248;242m [0m[38;2;102;217;239ma[0m[38;2;249;38;114m:[0m[38;2;248;248;242mwhat[0m
+[38;2;249;38;114mendfunction[0m
+
+[38;2;249;38;114mfunction[0m[38;2;248;248;242m! [0m[38;2;166;226;46mHelloWorld[0m[38;2;248;248;242m([0m[38;2;248;248;242mname)[0m
+[38;2;248;248;242m  [0m[38;2;102;217;239mlet[0m[38;2;248;248;242m [0m[38;2;255;255;255ml:function_local[0m[38;2;248;248;242m = [0m[38;2;230;219;116m"function_local_var"[0m
+[38;2;248;248;242m  [0m[38;2;102;217;239mlet[0m[38;2;248;248;242m [0m[38;2;255;255;255ml:parts[0m[38;2;248;248;242m = [0m[38;2;102;217;239msplit[0m[38;2;248;248;242m([0m[38;2;255;255;255ml:function_local[0m[38;2;248;248;242m, [0m[38;2;230;219;116m"_"[0m[38;2;248;248;242m)[0m
+[38;2;248;248;242m  [0m[38;2;102;217;239mlet[0m[38;2;248;248;242m [0m[38;2;255;255;255ml:greeting[0m[38;2;248;248;242m = [0m[38;2;230;219;116m"Hello "[0m[38;2;248;248;242m [0m[38;2;249;38;114m.[0m[38;2;248;248;242m [0m[38;2;102;217;239ma[0m[38;2;249;38;114m:[0m[38;2;248;248;242mname[0m
+[38;2;248;248;242m  [0m[38;2;249;38;114mreturn[0m[38;2;248;248;242m [0m[38;2;102;217;239ms:echo[0m[38;2;248;248;242m([0m[38;2;255;255;255ml:greeting[0m[38;2;248;248;242m)[0m
+[38;2;249;38;114mendfunction[0m
+
+[38;2;249;38;114mfunction[0m[38;2;248;248;242m! [0m[38;2;166;226;46msource#Hello[0m[38;2;248;248;242m([0m[38;2;248;248;242m)[0m
+[38;2;248;248;242m  [0m[38;2;249;38;114mreturn[0m[38;2;248;248;242m [0m[38;2;230;219;116m"Hello from namespace"[0m
+[38;2;249;38;114mendfunction[0m
+
+[38;2;249;38;114mfunction[0m[38;2;248;248;242m! [0m[38;2;166;226;46mEchoFunc[0m[38;2;248;248;242m([0m[38;2;249;38;114m.[0m[38;2;249;38;114m.[0m[38;2;249;38;114m.[0m[38;2;248;248;242m)[0m
+[38;2;248;248;242m  [0m[38;2;249;38;114mfor[0m[38;2;248;248;242m s [0m[38;2;249;38;114min[0m[38;2;248;248;242m [0m[38;2;102;217;239ma[0m[38;2;249;38;114m:[0m[38;2;190;132;255m000[0m
+[38;2;248;248;242m    echon [0m[38;2;230;219;116m' '[0m[38;2;248;248;242m [0m[38;2;249;38;114m.[0m[38;2;248;248;242m s[0m
+[38;2;248;248;242m  [0m[38;2;249;38;114mendfor[0m
+[38;2;249;38;114mendfunction[0m
+
+[38;2;102;217;239mimap[0m[38;2;248;248;242m [0m[3;38;2;166;226;46m<C-h>[0m[38;2;248;248;242m [0m[3;38;2;166;226;46m<C-r>[0m[38;2;248;248;242m=[0m[38;2;102;217;239mHelloWorld[0m[38;2;248;248;242m([0m[38;2;230;219;116m"World"[0m[38;2;248;248;242m)[0m[3;38;2;166;226;46m<CR>[0m
+
+[38;2;102;217;239mcommand[0m[38;2;248;248;242m! [0m[3;38;2;166;226;46m-nargs=[0m[38;2;248;248;242m? Echo :call [0m[38;2;102;217;239mEchoFunc[0m[38;2;248;248;242m([0m[3;38;2;166;226;46m<args>[0m[38;2;248;248;242m)[0m
+
+[38;2;117;113;94m" TODO test stuff[0m
+[38;2;102;217;239mlet[0m[38;2;248;248;242m [0m[38;2;255;255;255mg:global[0m[38;2;248;248;242m = [0m[38;2;230;219;116m"global var"[0m
+[38;2;102;217;239mlet[0m[38;2;248;248;242m [0m[38;2;255;255;255ms:script_var[0m[38;2;248;248;242m = [0m[38;2;230;219;116m"script var"[0m
+[38;2;102;217;239mlet[0m[38;2;248;248;242m [0m[38;2;255;255;255mw:window_var[0m[38;2;248;248;242m = [0m[38;2;230;219;116m"window war"[0m
+[38;2;102;217;239mlet[0m[38;2;248;248;242m [0m[38;2;255;255;255mb:buffer_var[0m[38;2;248;248;242m = [0m[38;2;230;219;116m"buffer war"[0m
+[38;2;102;217;239mlet[0m[38;2;248;248;242m t[0m[38;2;249;38;114m:[0m[38;2;248;248;242mtab_var = [0m[38;2;230;219;116m"tab war"[0m
+[38;2;102;217;239mecho[0m[38;2;248;248;242m [0m[38;2;255;255;255mv:false[0m
+
+[38;2;190;132;255m3[0m[38;2;248;248;242m + [0m[38;2;190;132;255m5[0m
+
+[38;2;102;217;239mecho[0m[38;2;248;248;242m [0m[38;2;230;219;116m"Hello"[0m[38;2;248;248;242m [0m[38;2;249;38;114m==#[0m[38;2;248;248;242m [0m[38;2;230;219;116m"Hello2"[0m
+[38;2;102;217;239mecho[0m[38;2;248;248;242m [0m[38;2;230;219;116m"Hello"[0m[38;2;248;248;242m [0m[38;2;249;38;114m==?[0m[38;2;248;248;242m [0m[38;2;230;219;116m"Hello2"[0m
+[38;2;102;217;239mecho[0m[38;2;248;248;242m [0m[38;2;230;219;116m"Hello"[0m[38;2;248;248;242m [0m[38;2;249;38;114m==[0m[38;2;248;248;242m [0m[38;2;230;219;116m"Hello2"[0m
+[38;2;102;217;239mecho[0m[38;2;248;248;242m [0m[38;2;230;219;116m"Hello"[0m[38;2;248;248;242m is [0m[38;2;230;219;116m"Hello2"[0m
+[38;2;102;217;239mecho[0m[38;2;248;248;242m [0m[38;2;230;219;116m"Hello"[0m[38;2;248;248;242m [0m[38;2;249;38;114misnot[0m[38;2;248;248;242m [0m[38;2;230;219;116m"Hello2"[0m
+[38;2;102;217;239mecho[0m[38;2;248;248;242m [0m[38;2;230;219;116m"Hello"[0m[38;2;248;248;242m [0m[38;2;249;38;114m=~[0m[38;2;248;248;242m [0m[38;2;230;219;116m'xx*'[0m
+[38;2;102;217;239mecho[0m[38;2;248;248;242m [0m[38;2;230;219;116m"Hello"[0m[38;2;248;248;242m [0m[38;2;249;38;114m!~[0m[38;2;248;248;242m [0m[38;2;230;219;116m"Hello2"[0m
+[38;2;102;217;239mecho[0m[38;2;248;248;242m [0m[38;2;230;219;116m"Hello"[0m[38;2;248;248;242m [0m[38;2;249;38;114m!~[0m[38;2;248;248;242m [0m[38;2;230;219;116m"Hello2"[0m
+
+[38;2;102;217;239mecho[0m[38;2;248;248;242m [0m[38;2;230;219;116m"/This/should/not/be/a/regex"[0m
+
+[38;2;117;113;94m" Error case from issue #1604 (https://github.com/sharkdp/bat/issues/1064)[0m
+[38;2;102;217;239mset[0m[38;2;248;248;242m runtimepath[0m[38;2;249;38;114m=~[0m[38;2;248;248;242m/foo/bar[0m
+
+[38;2;248;248;242msilent [0m[38;2;246;170;17mg/Aap/[0m[38;2;248;248;242mp[0m
+
+[38;2;102;217;239mlet[0m[38;2;248;248;242m [0m[38;2;255;255;255mg:dict[0m[38;2;248;248;242m = {}[0m
+[38;2;102;217;239mlet[0m[38;2;248;248;242m [0m[38;2;255;255;255mg:dict[0m[38;2;249;38;114m.[0m[38;2;248;248;242mitem = [[0m[38;2;230;219;116m'l1'[0m[38;2;248;248;242m, [0m[38;2;230;219;116m'l2'[0m[38;2;248;248;242m][0m
+
+[38;2;102;217;239mlet[0m[38;2;248;248;242m [0m[38;2;255;255;255mg:dict2[0m[38;2;248;248;242m = {[0m[38;2;230;219;116m'dict_item'[0m[38;2;248;248;242m: [[0m[38;2;230;219;116m'l1'[0m[38;2;248;248;242m, [0m[38;2;230;219;116m'l2'[0m[38;2;248;248;242m], [0m[38;2;230;219;116m'di2'[0m[38;2;248;248;242m: [0m[38;2;230;219;116m'x'[0m[38;2;248;248;242m}[0m
+
+[38;2;248;248;242msilent [0m[38;2;246;170;17mg/regex/[0m
+[38;2;248;248;242msilent [0m[38;2;246;170;17mv/regex/[0m
+[38;2;248;248;242msilent [0m[38;2;249;38;114m%[0m[38;2;246;170;17ms/regex/[0m[38;2;248;248;242mnot_regex/[0m
+
+[38;2;102;217;239mfiletype[0m[38;2;248;248;242m plugin indent on[0m
+[38;2;102;217;239msyntax[0m[38;2;248;248;242m enable[0m
diff --git a/tests/syntax-tests/source/VimL/source.vim b/tests/syntax-tests/source/VimL/source.vim
new file mode 100644
index 0000000000..3b1f35f85b
--- /dev/null
+++ b/tests/syntax-tests/source/VimL/source.vim
@@ -0,0 +1,92 @@
+if &compatible
+  set nocompatible
+endif
+
+if has('win32') || has ('win64')
+  let $VIMHOME = $HOME . "/vimfiles"
+elseif v:false && v:true
+  echo "Can't get here"
+else
+  let $VIMHOME = $HOME . "/.vim"
+endif
+
+" show existing tab with 2 spaces width
+set tabstop=2
+" when indenting with '>', use 2 spaces width
+set shiftwidth=2
+" always set autoindenting on
+set autoindent
+
+autocmd VimEnter * echo "Hello Vim"
+
+" Allow :W and :Wq to save too
+command! Wq :wq
+command! W :w
+
+augroup vimrc
+    autocmd!
+    autocmd FileType * echo "New filetype"
+augroup END
+
+function! s:echo(what)
+  return a:what
+endfunction
+
+function! HelloWorld(name)
+  let l:function_local = "function_local_var"
+  let l:parts = split(l:function_local, "_")
+  let l:greeting = "Hello " . a:name
+  return s:echo(l:greeting)
+endfunction
+
+function! source#Hello()
+  return "Hello from namespace"
+endfunction
+
+function! EchoFunc(...)
+  for s in a:000
+    echon ' ' . s
+  endfor
+endfunction
+
+imap <C-h> <C-r>=HelloWorld("World")<CR>
+
+command! -nargs=? Echo :call EchoFunc(<args>)
+
+" TODO test stuff
+let g:global = "global var"
+let s:script_var = "script var"
+let w:window_var = "window war"
+let b:buffer_var = "buffer war"
+let t:tab_var = "tab war"
+echo v:false
+
+3 + 5
+
+echo "Hello" ==# "Hello2"
+echo "Hello" ==? "Hello2"
+echo "Hello" == "Hello2"
+echo "Hello" is "Hello2"
+echo "Hello" isnot "Hello2"
+echo "Hello" =~ 'xx*'
+echo "Hello" !~ "Hello2"
+echo "Hello" !~ "Hello2"
+
+echo "/This/should/not/be/a/regex"
+
+" Error case from issue #1604 (https://github.com/sharkdp/bat/issues/1064)
+set runtimepath=~/foo/bar
+
+silent g/Aap/p
+
+let g:dict = {}
+let g:dict.item = ['l1', 'l2']
+
+let g:dict2 = {'dict_item': ['l1', 'l2'], 'di2': 'x'}
+
+silent g/regex/
+silent v/regex/
+silent %s/regex/not_regex/
+
+filetype plugin indent on
+syntax enable