runtime(vim): Improve Vim9 and legacy-script comment highlighting (#13104)

This is a first-pass attempt to limit matching of Vim9 and legacy-script
comments to the appropriate syntactic contexts.

Vim9-script comments are highlighted at top level in a Vim9-script file,
in all :def functions, and in all :autocmd and :commmand command blocks.
Legacy-script comments are highlighted at top level in a legacy script
file, in all :func functions and in the Vim9-script preamble before the
:vim9script marker command.

Fixes #13047, #11307 and #9587.

Signed-off-by: Doug Kearns <dougkearns@gmail.com>
Signed-off-by: Christian Brabandt <cb@256bit.org>
diff --git a/runtime/syntax/testdir/input/vim9_keymap.vim b/runtime/syntax/testdir/input/vim9_keymap.vim
new file mode 100644
index 0000000..a69b723
--- /dev/null
+++ b/runtime/syntax/testdir/input/vim9_keymap.vim
@@ -0,0 +1,26 @@
+vim9script
+
+# Vim Keymap file for syntax testing
+
+scriptencoding utf-8
+
+let b:keymap_name = "syntax-test"
+
+loadkeymap
+
+# Line comment
+
+  # Another line comment
+
+a A    Basic mapping
+'a á   More than one char in first column
+
+# Special notation
+<char-62>      B               Special notation allowed in LHS - decimal
+c              <char-0103>     Special notation allowed in RHS - octal
+<char-0x0064>  <char-0x0044>   Special notation allowed in LHS and RHS - hexadecimal
+
+# Vim-script comment characters
+\# <char-0x00a3>               Line should not match as a Vim9-script comment
+" “                            Line should not match as a legacy-script comment
+: #                            Line should not match as a Vim9-script comment
diff --git a/runtime/syntax/testdir/input/vim9_legacy_header.vim b/runtime/syntax/testdir/input/vim9_legacy_header.vim
new file mode 100644
index 0000000..66aeb39
--- /dev/null
+++ b/runtime/syntax/testdir/input/vim9_legacy_header.vim
@@ -0,0 +1,16 @@
+" comment
+
+if !has('vim9script')
+  # 42 " comment
+  source foo.vim
+  finish
+endif
+
+" comment
+
+vim9script noclear
+
+# comment
+
+ # string only recognised with leading char
+ "useless string"
diff --git a/runtime/syntax/testdir/input/vim_ex_commands.vim b/runtime/syntax/testdir/input/vim_ex_commands.vim
index 571fd7b..aaa351b 100644
--- a/runtime/syntax/testdir/input/vim_ex_commands.vim
+++ b/runtime/syntax/testdir/input/vim_ex_commands.vim
@@ -558,7 +558,7 @@
 :verbose
 :vertical
 :vim9cmd
-:vim9script
+" :vim9script
 :vimgrep
 :vimgrepadd
 :visual
@@ -1152,7 +1152,7 @@
 call Foo() | verbose
 call Foo() | vertical
 call Foo() | vim9cmd
-call Foo() | vim9script
+" call Foo() | vim9script
 call Foo() | vimgrep
 call Foo() | vimgrepadd
 call Foo() | visual
diff --git a/runtime/syntax/testdir/input/vim_ex_comment-vim9.vim b/runtime/syntax/testdir/input/vim_ex_comment-vim9.vim
new file mode 100644
index 0000000..786d11b
--- /dev/null
+++ b/runtime/syntax/testdir/input/vim_ex_comment-vim9.vim
@@ -0,0 +1,41 @@
+vim9script
+
+# Vim comments
+
+# Vim9-script comment
+
+ # string only recognised with leading char
+ "useless string"
+
+function! Foo()
+  " Legacy-script comment
+  # 42 " comment
+endfunction
+
+def! Bar()
+  # Vim9-script comment
+  "useless string" # comment
+enddef
+
+command -count FooCommand {
+  # Vim9-script comment
+  "useless string" # comment
+}
+
+autocmd BufNewFile * {
+  # Vim9-script comment
+  "useless string" # comment
+}
+
+
+# Issue: #13047
+
+if !exists(":DiffOrig")
+  command DiffOrig vert new | set bt=nofile | r ++edit %% | 0d_ | diffthis
+		  \ | wincmd p | diffthis
+endif
+
+
+# Issue: #11307 and #11560
+
+# This is what we call " blah
diff --git a/runtime/syntax/testdir/input/vim_ex_comment.vim b/runtime/syntax/testdir/input/vim_ex_comment.vim
new file mode 100644
index 0000000..54e514e
--- /dev/null
+++ b/runtime/syntax/testdir/input/vim_ex_comment.vim
@@ -0,0 +1,45 @@
+" Vim comments
+
+" Legacy-script comment
+
+# 42 " comment
+
+function! Foo()
+  " Legacy-script comment
+  # 42 " comment
+endfunction
+
+def! Bar()
+  # Vim9-script comment
+  "useless string" # comment
+enddef
+
+command -nargs=1 FooCommand {
+  # Vim9-script comment
+  "useless string" # comment
+}
+
+autocmd BufNewFile * {
+  # Vim9-script comment
+  "useless string" # comment
+}
+
+
+" Issue: #13047
+
+if !exists(":DiffOrig")
+  command DiffOrig vert new | set bt=nofile | r ++edit # | 0d_ | diffthis
+		  \ | wincmd p | diffthis
+endif
+
+
+" Issue: #11307 and #11560
+
+" This is what we call " blah
+
+
+" Issue # #9587
+
+def CommentTitle()
+  # Title: ...
+enddef
diff --git a/runtime/syntax/testdir/input/vim_keymap.vim b/runtime/syntax/testdir/input/vim_keymap.vim
index 983c822..424d437 100644
--- a/runtime/syntax/testdir/input/vim_keymap.vim
+++ b/runtime/syntax/testdir/input/vim_keymap.vim
@@ -23,4 +23,5 @@
                                          
 " Vim-script comment characters                               
 # <char-0x00a3>                Line should not match as a Vim9-script comment
-\" “                   Line should not match as a legacy-script comment 
+\" “                           Line should not match as a legacy-script comment 
+: "                            Line should not match as a legacy-script comment