Update runtime files
diff --git a/runtime/syntax/python.vim b/runtime/syntax/python.vim
index e67bf58..ff58325 100644
--- a/runtime/syntax/python.vim
+++ b/runtime/syntax/python.vim
@@ -1,7 +1,7 @@
 " Vim syntax file
 " Language:	Python
 " Maintainer:	Zvezdan Petkovic <zpetkovic@acm.org>
-" Last Change:	2022 Jun 28
+" Last Change:	2023 Feb 26
 " Credits:	Neil Schemenauer <nas@python.ca>
 "		Dmitry Vasiliev
 "
@@ -35,12 +35,26 @@
 "
 "   let python_highlight_all = 1
 "
+" The use of Python 2 compatible syntax highlighting can be enforced.
+" The straddling code (Python 2 and 3 compatible), up to Python 3.5,
+" will be also supported.
+"
+"   let python_use_python2_syntax = 1
+"
+" This option will exclude all modern Python 3.6 or higher features.
+"
 
 " quit when a syntax file was already loaded.
 if exists("b:current_syntax")
   finish
 endif
 
+" Use of Python 2 and 3.5 or lower requested.
+if exists("python_use_python2_syntax")
+  runtime! syntax/python2.vim
+  finish
+endif
+
 " We need nocompatible mode in order to continue lines with backslashes.
 " Original setting will be restored.
 let s:cpo_save = &cpo
@@ -91,8 +105,8 @@
 syn keyword pythonAsync		async await
 
 " Soft keywords
-" These keywords do not mean anything unless used in the right context
-" See https://docs.python.org/3/reference/lexical_analysis.html#soft-keywords 
+" These keywords do not mean anything unless used in the right context.
+" See https://docs.python.org/3/reference/lexical_analysis.html#soft-keywords
 " for more on this.
 syn match   pythonConditional   "^\s*\zscase\%(\s\+.*:.*$\)\@="
 syn match   pythonConditional   "^\s*\zsmatch\%(\s\+.*:\s*\%(#.*\)\=$\)\@="
diff --git a/runtime/syntax/python2.vim b/runtime/syntax/python2.vim
new file mode 100644
index 0000000..3b30eab
--- /dev/null
+++ b/runtime/syntax/python2.vim
@@ -0,0 +1,345 @@
+" Vim syntax file
+" Language:	Python 2
+" Maintainer:	Zvezdan Petkovic <zpetkovic@acm.org>
+" Last Change:	2016 Oct 29
+" Credits:	Neil Schemenauer <nas@python.ca>
+"		Dmitry Vasiliev
+"
+"		This version is a major rewrite by Zvezdan Petkovic.
+"
+"		- introduced highlighting of doctests
+"		- updated keywords, built-ins, and exceptions
+"		- corrected regular expressions for
+"
+"		  * functions
+"		  * decorators
+"		  * strings
+"		  * escapes
+"		  * numbers
+"		  * space error
+"
+"		- corrected synchronization
+"		- more highlighting is ON by default, except
+"		- space error highlighting is OFF by default
+"
+" Optional highlighting can be controlled using these variables.
+"
+"   let python_no_builtin_highlight = 1
+"   let python_no_doctest_code_highlight = 1
+"   let python_no_doctest_highlight = 1
+"   let python_no_exception_highlight = 1
+"   let python_no_number_highlight = 1
+"   let python_space_error_highlight = 1
+"
+" All the options above can be switched on together.
+"
+"   let python_highlight_all = 1
+"
+""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+" NOTE: This file is a copy of the last commit of runtime/syntax/python.vim
+" that still supported Python 2. There is support for Python 3, up to 3.5,
+" and it was kept in the file as is, because it supports the straddling code
+" (Python 2 and 3 compatible) better.
+""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+
+" quit when a syntax file was already loaded.
+if exists("b:current_syntax")
+  finish
+endif
+
+" We need nocompatible mode in order to continue lines with backslashes.
+" Original setting will be restored.
+let s:cpo_save = &cpo
+set cpo&vim
+
+if exists("python_no_doctest_highlight")
+  let python_no_doctest_code_highlight = 1
+endif
+
+if exists("python_highlight_all")
+  if exists("python_no_builtin_highlight")
+    unlet python_no_builtin_highlight
+  endif
+  if exists("python_no_doctest_code_highlight")
+    unlet python_no_doctest_code_highlight
+  endif
+  if exists("python_no_doctest_highlight")
+    unlet python_no_doctest_highlight
+  endif
+  if exists("python_no_exception_highlight")
+    unlet python_no_exception_highlight
+  endif
+  if exists("python_no_number_highlight")
+    unlet python_no_number_highlight
+  endif
+  let python_space_error_highlight = 1
+endif
+
+" Keep Python keywords in alphabetical order inside groups for easy
+" comparison with the table in the 'Python Language Reference'
+" https://docs.python.org/2/reference/lexical_analysis.html#keywords,
+" https://docs.python.org/3/reference/lexical_analysis.html#keywords.
+" Groups are in the order presented in NAMING CONVENTIONS in syntax.txt.
+" Exceptions come last at the end of each group (class and def below).
+"
+" Keywords 'with' and 'as' are new in Python 2.6
+" (use 'from __future__ import with_statement' in Python 2.5).
+"
+" Some compromises had to be made to support both Python 3 and 2.
+" We include Python 3 features, but when a definition is duplicated,
+" the last definition takes precedence.
+"
+" - 'False', 'None', and 'True' are keywords in Python 3 but they are
+"   built-ins in 2 and will be highlighted as built-ins below.
+" - 'exec' is a built-in in Python 3 and will be highlighted as
+"   built-in below.
+" - 'nonlocal' is a keyword in Python 3 and will be highlighted.
+" - 'print' is a built-in in Python 3 and will be highlighted as
+"   built-in below (use 'from __future__ import print_function' in 2)
+" - async and await were added in Python 3.5 and are soft keywords.
+"
+syn keyword pythonStatement	False None True
+syn keyword pythonStatement	as assert break continue del exec global
+syn keyword pythonStatement	lambda nonlocal pass print return with yield
+syn keyword pythonStatement	class def nextgroup=pythonFunction skipwhite
+syn keyword pythonConditional	elif else if
+syn keyword pythonRepeat	for while
+syn keyword pythonOperator	and in is not or
+syn keyword pythonException	except finally raise try
+syn keyword pythonInclude	from import
+syn keyword pythonAsync		async await
+
+" Decorators (new in Python 2.4)
+" A dot must be allowed because of @MyClass.myfunc decorators.
+syn match   pythonDecorator	"@" display contained
+syn match   pythonDecoratorName	"@\s*\h\%(\w\|\.\)*" display contains=pythonDecorator
+
+" Python 3.5 introduced the use of the same symbol for matrix multiplication:
+" https://www.python.org/dev/peps/pep-0465/.  We now have to exclude the
+" symbol from highlighting when used in that context.
+" Single line multiplication.
+syn match   pythonMatrixMultiply
+      \ "\%(\w\|[])]\)\s*@"
+      \ contains=ALLBUT,pythonDecoratorName,pythonDecorator,pythonFunction,pythonDoctestValue
+      \ transparent
+" Multiplication continued on the next line after backslash.
+syn match   pythonMatrixMultiply
+      \ "[^\\]\\\s*\n\%(\s*\.\.\.\s\)\=\s\+@"
+      \ contains=ALLBUT,pythonDecoratorName,pythonDecorator,pythonFunction,pythonDoctestValue
+      \ transparent
+" Multiplication in a parenthesized expression over multiple lines with @ at
+" the start of each continued line; very similar to decorators and complex.
+syn match   pythonMatrixMultiply
+      \ "^\s*\%(\%(>>>\|\.\.\.\)\s\+\)\=\zs\%(\h\|\%(\h\|[[(]\).\{-}\%(\w\|[])]\)\)\s*\n\%(\s*\.\.\.\s\)\=\s\+@\%(.\{-}\n\%(\s*\.\.\.\s\)\=\s\+@\)*"
+      \ contains=ALLBUT,pythonDecoratorName,pythonDecorator,pythonFunction,pythonDoctestValue
+      \ transparent
+
+syn match   pythonFunction	"\h\w*" display contained
+
+syn match   pythonComment	"#.*$" contains=pythonTodo,@Spell
+syn keyword pythonTodo		FIXME NOTE NOTES TODO XXX contained
+
+" Triple-quoted strings can contain doctests.
+syn region  pythonString matchgroup=pythonQuotes
+      \ start=+[uU]\=\z(['"]\)+ end="\z1" skip="\\\\\|\\\z1"
+      \ contains=pythonEscape,@Spell
+syn region  pythonString matchgroup=pythonTripleQuotes
+      \ start=+[uU]\=\z('''\|"""\)+ end="\z1" keepend
+      \ contains=pythonEscape,pythonSpaceError,pythonDoctest,@Spell
+syn region  pythonRawString matchgroup=pythonQuotes
+      \ start=+[uU]\=[rR]\z(['"]\)+ end="\z1" skip="\\\\\|\\\z1"
+      \ contains=@Spell
+syn region  pythonRawString matchgroup=pythonTripleQuotes
+      \ start=+[uU]\=[rR]\z('''\|"""\)+ end="\z1" keepend
+      \ contains=pythonSpaceError,pythonDoctest,@Spell
+
+syn match   pythonEscape	+\\[abfnrtv'"\\]+ contained
+syn match   pythonEscape	"\\\o\{1,3}" contained
+syn match   pythonEscape	"\\x\x\{2}" contained
+syn match   pythonEscape	"\%(\\u\x\{4}\|\\U\x\{8}\)" contained
+" Python allows case-insensitive Unicode IDs: http://www.unicode.org/charts/
+syn match   pythonEscape	"\\N{\a\+\%(\s\a\+\)*}" contained
+syn match   pythonEscape	"\\$"
+
+" It is very important to understand all details before changing the
+" regular expressions below or their order.
+" The word boundaries are *not* the floating-point number boundaries
+" because of a possible leading or trailing decimal point.
+" The expressions below ensure that all valid number literals are
+" highlighted, and invalid number literals are not.  For example,
+"
+" - a decimal point in '4.' at the end of a line is highlighted,
+" - a second dot in 1.0.0 is not highlighted,
+" - 08 is not highlighted,
+" - 08e0 or 08j are highlighted,
+"
+" and so on, as specified in the 'Python Language Reference'.
+" https://docs.python.org/2/reference/lexical_analysis.html#numeric-literals
+" https://docs.python.org/3/reference/lexical_analysis.html#numeric-literals
+if !exists("python_no_number_highlight")
+  " numbers (including longs and complex)
+  syn match   pythonNumber	"\<0[oO]\=\o\+[Ll]\=\>"
+  syn match   pythonNumber	"\<0[xX]\x\+[Ll]\=\>"
+  syn match   pythonNumber	"\<0[bB][01]\+[Ll]\=\>"
+  syn match   pythonNumber	"\<\%([1-9]\d*\|0\)[Ll]\=\>"
+  syn match   pythonNumber	"\<\d\+[jJ]\>"
+  syn match   pythonNumber	"\<\d\+[eE][+-]\=\d\+[jJ]\=\>"
+  syn match   pythonNumber
+	\ "\<\d\+\.\%([eE][+-]\=\d\+\)\=[jJ]\=\%(\W\|$\)\@="
+  syn match   pythonNumber
+	\ "\%(^\|\W\)\zs\d*\.\d\+\%([eE][+-]\=\d\+\)\=[jJ]\=\>"
+endif
+
+" Group the built-ins in the order in the 'Python Library Reference' for
+" easier comparison.
+" https://docs.python.org/2/library/constants.html
+" https://docs.python.org/3/library/constants.html
+" http://docs.python.org/2/library/functions.html
+" http://docs.python.org/3/library/functions.html
+" http://docs.python.org/2/library/functions.html#non-essential-built-in-functions
+" http://docs.python.org/3/library/functions.html#non-essential-built-in-functions
+" Python built-in functions are in alphabetical order.
+if !exists("python_no_builtin_highlight")
+  " built-in constants
+  " 'False', 'True', and 'None' are also reserved words in Python 3
+  syn keyword pythonBuiltin	False True None
+  syn keyword pythonBuiltin	NotImplemented Ellipsis __debug__
+  " built-in functions
+  syn keyword pythonBuiltin	abs all any bin bool bytearray callable chr
+  syn keyword pythonBuiltin	classmethod compile complex delattr dict dir
+  syn keyword pythonBuiltin	divmod enumerate eval filter float format
+  syn keyword pythonBuiltin	frozenset getattr globals hasattr hash
+  syn keyword pythonBuiltin	help hex id input int isinstance
+  syn keyword pythonBuiltin	issubclass iter len list locals map max
+  syn keyword pythonBuiltin	memoryview min next object oct open ord pow
+  syn keyword pythonBuiltin	print property range repr reversed round set
+  syn keyword pythonBuiltin	setattr slice sorted staticmethod str
+  syn keyword pythonBuiltin	sum super tuple type vars zip __import__
+  " Python 2 only
+  syn keyword pythonBuiltin	basestring cmp execfile file
+  syn keyword pythonBuiltin	long raw_input reduce reload unichr
+  syn keyword pythonBuiltin	unicode xrange
+  " Python 3 only
+  syn keyword pythonBuiltin	ascii bytes exec
+  " non-essential built-in functions; Python 2 only
+  syn keyword pythonBuiltin	apply buffer coerce intern
+  " avoid highlighting attributes as builtins
+  syn match   pythonAttribute	/\.\h\w*/hs=s+1
+	\ contains=ALLBUT,pythonBuiltin,pythonFunction,pythonAsync
+	\ transparent
+endif
+
+" From the 'Python Library Reference' class hierarchy at the bottom.
+" http://docs.python.org/2/library/exceptions.html
+" http://docs.python.org/3/library/exceptions.html
+if !exists("python_no_exception_highlight")
+  " builtin base exceptions (used mostly as base classes for other exceptions)
+  syn keyword pythonExceptions	BaseException Exception
+  syn keyword pythonExceptions	ArithmeticError BufferError
+  syn keyword pythonExceptions	LookupError
+  " builtin base exceptions removed in Python 3
+  syn keyword pythonExceptions	EnvironmentError StandardError
+  " builtin exceptions (actually raised)
+  syn keyword pythonExceptions	AssertionError AttributeError
+  syn keyword pythonExceptions	EOFError FloatingPointError GeneratorExit
+  syn keyword pythonExceptions	ImportError IndentationError
+  syn keyword pythonExceptions	IndexError KeyError KeyboardInterrupt
+  syn keyword pythonExceptions	MemoryError NameError NotImplementedError
+  syn keyword pythonExceptions	OSError OverflowError ReferenceError
+  syn keyword pythonExceptions	RuntimeError StopIteration SyntaxError
+  syn keyword pythonExceptions	SystemError SystemExit TabError TypeError
+  syn keyword pythonExceptions	UnboundLocalError UnicodeError
+  syn keyword pythonExceptions	UnicodeDecodeError UnicodeEncodeError
+  syn keyword pythonExceptions	UnicodeTranslateError ValueError
+  syn keyword pythonExceptions	ZeroDivisionError
+  " builtin OS exceptions in Python 3
+  syn keyword pythonExceptions	BlockingIOError BrokenPipeError
+  syn keyword pythonExceptions	ChildProcessError ConnectionAbortedError
+  syn keyword pythonExceptions	ConnectionError ConnectionRefusedError
+  syn keyword pythonExceptions	ConnectionResetError FileExistsError
+  syn keyword pythonExceptions	FileNotFoundError InterruptedError
+  syn keyword pythonExceptions	IsADirectoryError NotADirectoryError
+  syn keyword pythonExceptions	PermissionError ProcessLookupError
+  syn keyword pythonExceptions	RecursionError StopAsyncIteration
+  syn keyword pythonExceptions	TimeoutError
+  " builtin exceptions deprecated/removed in Python 3
+  syn keyword pythonExceptions	IOError VMSError WindowsError
+  " builtin warnings
+  syn keyword pythonExceptions	BytesWarning DeprecationWarning FutureWarning
+  syn keyword pythonExceptions	ImportWarning PendingDeprecationWarning
+  syn keyword pythonExceptions	RuntimeWarning SyntaxWarning UnicodeWarning
+  syn keyword pythonExceptions	UserWarning Warning
+  " builtin warnings in Python 3
+  syn keyword pythonExceptions	ResourceWarning
+endif
+
+if exists("python_space_error_highlight")
+  " trailing whitespace
+  syn match   pythonSpaceError	display excludenl "\s\+$"
+  " mixed tabs and spaces
+  syn match   pythonSpaceError	display " \+\t"
+  syn match   pythonSpaceError	display "\t\+ "
+endif
+
+" Do not spell doctests inside strings.
+" Notice that the end of a string, either ''', or """, will end the contained
+" doctest too.  Thus, we do *not* need to have it as an end pattern.
+if !exists("python_no_doctest_highlight")
+  if !exists("python_no_doctest_code_highlight")
+    syn region pythonDoctest
+	  \ start="^\s*>>>\s" end="^\s*$"
+	  \ contained contains=ALLBUT,pythonDoctest,pythonFunction,@Spell
+    syn region pythonDoctestValue
+	  \ start=+^\s*\%(>>>\s\|\.\.\.\s\|"""\|'''\)\@!\S\++ end="$"
+	  \ contained
+  else
+    syn region pythonDoctest
+	  \ start="^\s*>>>" end="^\s*$"
+	  \ contained contains=@NoSpell
+  endif
+endif
+
+" Sync at the beginning of class, function, or method definition.
+syn sync match pythonSync grouphere NONE "^\%(def\|class\)\s\+\h\w*\s*[(:]"
+
+" The default highlight links.  Can be overridden later.
+hi def link pythonStatement		Statement
+hi def link pythonConditional		Conditional
+hi def link pythonRepeat		Repeat
+hi def link pythonOperator		Operator
+hi def link pythonException		Exception
+hi def link pythonInclude		Include
+hi def link pythonAsync			Statement
+hi def link pythonDecorator		Define
+hi def link pythonDecoratorName		Function
+hi def link pythonFunction		Function
+hi def link pythonComment		Comment
+hi def link pythonTodo			Todo
+hi def link pythonString		String
+hi def link pythonRawString		String
+hi def link pythonQuotes		String
+hi def link pythonTripleQuotes		pythonQuotes
+hi def link pythonEscape		Special
+if !exists("python_no_number_highlight")
+  hi def link pythonNumber		Number
+endif
+if !exists("python_no_builtin_highlight")
+  hi def link pythonBuiltin		Function
+endif
+if !exists("python_no_exception_highlight")
+  hi def link pythonExceptions		Structure
+endif
+if exists("python_space_error_highlight")
+  hi def link pythonSpaceError		Error
+endif
+if !exists("python_no_doctest_highlight")
+  hi def link pythonDoctest		Special
+  hi def link pythonDoctestValue	Define
+endif
+
+let b:current_syntax = "python"
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
+
+" vim:set sw=2 sts=2 ts=8 noet:
diff --git a/runtime/syntax/quarto.vim b/runtime/syntax/quarto.vim
new file mode 100644
index 0000000..d5d4ee2
--- /dev/null
+++ b/runtime/syntax/quarto.vim
@@ -0,0 +1,17 @@
+" Language: Quarto (Markdown with chunks of R, Python and other languages)
+" Provisory Maintainer: Jakson Aquino <jalvesaq@gmail.com>
+" Homepage: https://github.com/jalvesaq/R-Vim-runtime
+" Last Change: Fri Feb 24, 2023  08:26AM
+"
+" The developers of tools for Quarto maintain Vim runtime files in their
+" Github repository and, if required, I will hand over the maintenance of
+" this script for them.
+
+runtime syntax/rmd.vim
+
+syn match quartoShortarg /\S\+/ contained
+syn keyword quartoShortkey var meta env pagebreak video include contained
+syn region quartoShortcode matchgroup=PreProc start='{{< ' end=' >}}' contains=quartoShortkey,quartoShortarg transparent keepend
+
+hi def link quartoShortkey Include
+hi def link quartoShortarg String
diff --git a/runtime/syntax/r.vim b/runtime/syntax/r.vim
index a8100cf..9b3754a 100644
--- a/runtime/syntax/r.vim
+++ b/runtime/syntax/r.vim
@@ -5,7 +5,7 @@
 " 		      Tom Payne <tom@tompayne.org>
 " Contributor:        Johannes Ranke <jranke@uni-bremen.de>
 " Homepage:           https://github.com/jalvesaq/R-Vim-runtime
-" Last Change:	      Sun Mar 28, 2021  01:47PM
+" Last Change:	      Thu Nov 17, 2022  10:13PM
 " Filenames:	      *.R *.r *.Rhistory *.Rt
 "
 " NOTE: The highlighting of R functions might be defined in
@@ -65,41 +65,35 @@
   " roxygen line containing only a roxygen comment marker, optionally followed
   " by whitespace is called an empty roxygen line.
 
+  syn match rOCommentKey "^\s*#\{1,2}'" contained
+  syn region rOExamples start="^\s*#\{1,2}' @examples.*"rs=e+1,hs=e+1 end="^\(#\{1,2}' @.*\)\@=" end="^\(#\{1,2}'\)\@!" contained contains=rOTag fold
+  
+  " R6 classes may contain roxygen lines independent of roxygen blocks
+  syn region rOR6Class start=/R6Class(/ end=/)/ transparent contains=ALLBUT,rError,rBraceError,rCurlyError fold
+  syn match rOR6Block "#\{1,2}'.*" contains=rOTag,rOExamples,@Spell containedin=rOR6Class contained
+  syn match rOR6Block "^\s*#\{1,2}'.*" contains=rOTag,rOExamples,@Spell containedin=rOR6Class contained
+
   " First we match all roxygen blocks as containing only a title. In case an
   " empty roxygen line ending the title or a tag is found, this will be
   " overridden later by the definitions of rOBlock.
-  syn match rOTitleBlock "\%^\(\s*#\{1,2}' .*\n\)\{1,}" contains=rOCommentKey,rOTitleTag
-  syn match rOTitleBlock "^\s*\n\(\s*#\{1,2}' .*\n\)\{1,}" contains=rOCommentKey,rOTitleTag
+  syn match rOTitleBlock "\(\%^\|^\s*\n\)\@<=\(\s*#\{1,2}' .*\n\)\{1,}" contains=rOCommentKey,rOTitleTag
 
   " A title as part of a block is always at the beginning of the block, i.e.
   " either at the start of a file or after a completely empty line.
-  syn match rOTitle "\%^\(\s*#\{1,2}' .*\n\)\{-1,}\s*#\{1,2}'\s*$" contained contains=rOCommentKey,rOTitleTag
-  syn match rOTitle "^\s*\n\(\s*#\{1,2}' .*\n\)\{-1,}\s*#\{1,2}'\s*$" contained contains=rOCommentKey,rOTitleTag
+  syn match rOTitle "\(\%^\|^\s*\n\)\@<=\(\s*#\{1,2}' .*\n\)\{-1,}\s*#\{1,2}'\s*$" contained contains=rOCommentKey,rOTitleTag
   syn match rOTitleTag contained "@title"
 
   " When a roxygen block has a title and additional content, the title
   " consists of one or more roxygen lines (as little as possible are matched),
   " followed either by an empty roxygen line
-  syn region rOBlock start="\%^\(\s*#\{1,2}' .*\n\)\{-1,}\s*#\{1,2}'\s*$" end="^\s*\(#\{1,2}'\)\@!" contains=rOTitle,rOTag,rOExamples,@Spell keepend fold
-  syn region rOBlock start="^\s*\n\(\s*#\{1,2}' .*\n\)\{-1,}\s*#\{1,2}'\s*$" end="^\s*\(#\{1,2}'\)\@!" contains=rOTitle,rOTag,rOExamples,@Spell keepend fold
+  syn region rOBlock start="\(\%^\|^\s*\n\)\@<=\(\s*#\{1,2}' .*\n\)\{-1,}\s*#\{1,2}'\s*$" end="^\s*\(#\{1,2}'\)\@!" contains=rOTitle,rOTag,rOExamples,@Spell keepend fold
 
   " or by a roxygen tag (we match everything starting with @ but not @@ which is used as escape sequence for a literal @).
-  syn region rOBlock start="\%^\(\s*#\{1,2}' .*\n\)\{-}\s*#\{1,2}' @\(@\)\@!" end="^\s*\(#\{1,2}'\)\@!" contains=rOTitle,rOTag,rOExamples,@Spell keepend fold
-  syn region rOBlock start="^\s*\n\(\s*#\{1,2}' .*\n\)\{-}\s*#\{1,2}' @\(@\)\@!" end="^\s*\(#\{1,2}'\)\@!" contains=rOTitle,rOTag,rOExamples,@Spell keepend fold
+  syn region rOBlock start="\(\%^\|^\s*\n\)\@<=\(\s*#\{1,2}' .*\n\)\{-}\s*#\{1,2}' @\(@\)\@!" end="^\s*\(#\{1,2}'\)\@!" contains=rOTitle,rOTag,rOExamples,@Spell keepend fold
 
   " If a block contains an @rdname, @describeIn tag, it may have paragraph breaks, but does not have a title
-  syn region rOBlockNoTitle start="\%^\(\s*#\{1,2}' .*\n\)\{-1,}\s*#\{1,2}'\s*\n\(\s*#\{1,2}'.*\n\)\{-}\s*#\{1,2}' @rdname" end="^\s*\(#\{1,2}'\)\@!" contains=rOTag,rOExamples,@Spell keepend fold
-  syn region rOBlockNoTitle start="^\s*\n\(\s*#\{1,2}' .*\n\)\{-1,}\s*#\{1,2}'\s*\n\(\s*#\{1,2}'.*\n\)\{-}\s*#\{1,2}' @rdname" end="^\s*\(#\{1,2}'\)\@!" contains=rOTag,rOExamples,@Spell keepend fold
-  syn region rOBlockNoTitle start="\%^\(\s*#\{1,2}' .*\n\)\{-1,}\s*#\{1,2}'\s*\n\(\s*#\{1,2}'.*\n\)\{-}\s*#\{1,2}' @describeIn" end="^\s*\(#\{1,2}'\)\@!" contains=rOTag,rOExamples,@Spell keepend fold
-  syn region rOBlockNoTitle start="^\s*\n\(\s*#\{1,2}' .*\n\)\{-1,}\s*#\{1,2}'\s*\n\(\s*#\{1,2}'.*\n\)\{-}\s*#\{1,2}' @describeIn" end="^\s*\(#\{1,2}'\)\@!" contains=rOTag,rOExamples,@Spell keepend fold
-
-  syn match rOCommentKey "^\s*#\{1,2}'" contained
-  syn region rOExamples start="^\s*#\{1,2}' @examples.*"rs=e+1,hs=e+1 end="^\(#\{1,2}' @.*\)\@=" end="^\(#\{1,2}'\)\@!" contained contains=rOTag fold
-
-  " R6 classes may contain roxygen lines independent of roxygen blocks
-  syn region rOR6Class start=/R6Class(/ end=/)/ transparent contains=ALLBUT,rError,rBraceError,rCurlyError fold
-  syn match rOR6Block "#\{1,2}'.*" contains=rOTag,rOExamples,@Spell containedin=rOR6Class contained
-  syn match rOR6Block "^\s*#\{1,2}'.*" contains=rOTag,rOExamples,@Spell containedin=rOR6Class contained
+  syn region rOBlockNoTitle start="\(\%^\|^\s*\n\)\@<=\(\s*#\{1,2}' .*\n\)\{-1,}\s*#\{1,2}'\s*\n\(\s*#\{1,2}'.*\n\)\{-}\s*#\{1,2}' @rdname" end="^\s*\(#\{1,2}'\)\@!" contains=rOTag,rOExamples,@Spell keepend fold
+  syn region rOBlockNoTitle start="\(\%^\|^\s*\n\)\@<=\(\s*#\{1,2}' .*\n\)\{-1,}\s*#\{1,2}'\s*\n\(\s*#\{1,2}'.*\n\)\{-}\s*#\{1,2}' @describeIn" end="^\s*\(#\{1,2}'\)\@!" contains=rOTag,rOExamples,@Spell keepend fold
 
   " rOTag list originally generated from the lists that were available in
   " https://github.com/klutometis/roxygen/R/rd.R and
@@ -245,14 +239,15 @@
 syn match rOperator    '-'
 syn match rOperator    '\*'
 syn match rOperator    '+'
-if &filetype != "rmd" && &filetype != "rrst"
-  syn match rOperator    "[|!<>^~/:]"
-else
+if &filetype == "quarto" || &filetype == "rmd" || &filetype == "rrst"
   syn match rOperator    "[|!<>^~`/:]"
+else
+  syn match rOperator    "[|!<>^~/:]"
 endif
 syn match rOperator    "%\{2}\|%\S\{-}%"
 syn match rOperator '\([!><]\)\@<=='
 syn match rOperator '=='
+syn match rOperator '|>'
 syn match rOpError  '\*\{3}'
 syn match rOpError  '//'
 syn match rOpError  '&&&'
@@ -318,10 +313,13 @@
 endif
 
 " Type
+syn match rType "\\"
 syn keyword rType array category character complex double function integer list logical matrix numeric vector data.frame
 
 " Name of object with spaces
-if &filetype != "rmd" && &filetype != "rrst"
+if &filetype == "rmd" || &filetype == "rrst" || &filetype == "quarto"
+  syn region rNameWSpace start="`" end="`" contains=rSpaceFun containedin=rmdrChunk
+else
   syn region rNameWSpace start="`" end="`" contains=rSpaceFun
 endif
 
diff --git a/runtime/syntax/rmd.vim b/runtime/syntax/rmd.vim
index cccd411..f849af9 100644
--- a/runtime/syntax/rmd.vim
+++ b/runtime/syntax/rmd.vim
@@ -1,7 +1,7 @@
-" markdown Text with R statements
-" Language: markdown with R code chunks
+" Language: Markdown with chunks of R, Python and other languages
+" Maintainer: Jakson Aquino <jalvesaq@gmail.com>
 " Homepage: https://github.com/jalvesaq/R-Vim-runtime
-" Last Change: Wed Apr 21, 2021  09:55AM
+" Last Change: Fri Feb 24, 2023  08:28AM
 "
 "   For highlighting pandoc extensions to markdown like citations and TeX and
 "   many other advanced features like folding of markdown sections, it is
@@ -13,63 +13,120 @@
   finish
 endif
 
+let s:cpo_save = &cpo
+set cpo&vim
+
 " Highlight the header of the chunks as R code
 let g:rmd_syn_hl_chunk = get(g:, 'rmd_syn_hl_chunk', 0)
 
 " Pandoc-syntax has more features, but it is slower.
 " https://github.com/vim-pandoc/vim-pandoc-syntax
-let g:pandoc#syntax#codeblocks#embeds#langs = get(g:, 'pandoc#syntax#codeblocks#embeds#langs', ['r'])
+
+" Don't waste time loading syntax that will be discarded:
+let s:save_pandoc_lngs = get(g:, 'pandoc#syntax#codeblocks#embeds#langs', [])
+let g:pandoc#syntax#codeblocks#embeds#langs = []
+
+" Step_1: Source pandoc.vim if it is installed:
 runtime syntax/pandoc.vim
 if exists("b:current_syntax")
-  " Recognize inline R code
-  syn region rmdrInline matchgroup=rmdInlineDelim start="`r "  end="`" contains=@R containedin=pandocLaTeXRegion,yamlFlowString keepend
-  hi def link rmdInlineDelim Delimiter
-
-  " Fix recognition of language chunks (code adapted from pandoc, 2021-03-28)
-  " Knitr requires braces in the block's header
-  for s:lng in g:pandoc#syntax#codeblocks#embeds#langs
-    let s:nm = matchstr(s:lng, '^[^=]*')
-    exe 'syn clear pandocDelimitedCodeBlock_'.s:nm
-    exe 'syn clear pandocDelimitedCodeBlockinBlockQuote_'.s:nm
-    if g:rmd_syn_hl_chunk
-      exe 'syn region rmd'.s:nm.'ChunkDelim matchgroup=rmdCodeDelim start="^\s*```\s*{\s*'.s:nm.'\>" matchgroup=rmdCodeDelim end="}$" keepend containedin=rmd'.s:nm.'Chunk contains=@R'
-      exe 'syn region rmd'.s:nm.'Chunk start="^\s*```\s*{\s*'.s:nm.'\>.*$" matchgroup=rmdCodeDelim end="^\s*```\ze\s*$" keepend contains=rmd'.s:nm.'ChunkDelim,@'.toupper(s:nm)
-    else
-      exe 'syn region rmd'.s:nm.'Chunk matchgroup=rmdCodeDelim start="^\s*```\s*{\s*'.s:nm.'\>.*$" matchgroup=rmdCodeDelim end="^\s*```\ze\s*$" keepend contains=@'.toupper(s:nm)
-    endif
-  endfor
-  unlet s:lng
-  unlet s:nm
-  hi def link rmdInlineDelim Delimiter
-  hi def link rmdCodeDelim Delimiter
-  let b:current_syntax = "rmd"
-  finish
-endif
-
-" Configuration if not using pandoc syntax:
-" Add syntax highlighting of YAML header
-let g:rmd_syn_hl_yaml = get(g:, 'rmd_syn_hl_yaml', 1)
-" Add syntax highlighting of citation keys
-let g:rmd_syn_hl_citations = get(g:, 'rmd_syn_hl_citations', 1)
-
-let s:cpo_save = &cpo
-set cpo&vim
-
-" R chunks will not be highlighted by syntax/markdown because their headers
-" follow a non standard pattern: "```{lang" instead of "^```lang".
-" Make a copy of g:markdown_fenced_languages to highlight the chunks later:
-if exists('g:markdown_fenced_languages')
-  if !exists('g:rmd_fenced_languages')
-    let g:rmd_fenced_languages = deepcopy(g:markdown_fenced_languages)
-    let g:markdown_fenced_languages = []
+  if hlexists('pandocDelimitedCodeBlock')
+    syn clear pandocDelimitedCodeBlock
   endif
+
+  if len(s:save_pandoc_lngs) > 0 && !exists('g:rmd_fenced_languages')
+    let g:rmd_fenced_languages = deepcopy(s:save_pandoc_lngs)
+  endif
+
+  " Recognize inline R code
+  syn region rmdrInline matchgroup=rmdInlineDelim start="`r "  end="`" contains=@Rmdr containedin=pandocLaTeXRegion,yamlFlowString keepend
 else
-  let g:rmd_fenced_languages = ['r']
+  " Step_2: Source markdown.vim if pandoc.vim is not installed
+
+  " Configuration if not using pandoc syntax:
+  " Add syntax highlighting of YAML header
+  let g:rmd_syn_hl_yaml = get(g:, 'rmd_syn_hl_yaml', 1)
+  " Add syntax highlighting of citation keys
+  let g:rmd_syn_hl_citations = get(g:, 'rmd_syn_hl_citations', 1)
+
+  " R chunks will not be highlighted by syntax/markdown because their headers
+  " follow a non standard pattern: "```{lang" instead of "^```lang".
+  " Make a copy of g:markdown_fenced_languages to highlight the chunks later:
+  if exists('g:markdown_fenced_languages') && !exists('g:rmd_fenced_languages')
+    let g:rmd_fenced_languages = deepcopy(g:markdown_fenced_languages)
+  endif
+
+  if exists('g:markdown_fenced_languages') && len(g:markdown_fenced_languages) > 0
+    let s:save_mfl = deepcopy(g:markdown_fenced_languages)
+  endif
+  " Don't waste time loading syntax that will be discarded:
+  let g:markdown_fenced_languages = []
+  runtime syntax/markdown.vim
+  if exists('s:save_mfl') > 0
+    let g:markdown_fenced_languages = deepcopy(s:save_mfl)
+    unlet s:save_mfl
+  endif
+  syn region rmdrInline matchgroup=rmdInlineDelim start="`r "  end="`" contains=@Rmdr keepend
+
+  " Step_2a: Add highlighting for both YAML and citations which are pandoc
+  " specific, but also used in Rmd files
+
+  " You don't need this if either your markdown/syntax.vim already highlights
+  " the YAML header or you are writing standard markdown
+  if g:rmd_syn_hl_yaml
+    " Basic highlighting of YAML header
+    syn match rmdYamlFieldTtl /^\s*\zs\w\%(-\|\w\)*\ze:/ contained
+    syn match rmdYamlFieldTtl /^\s*-\s*\zs\w\%(-\|\w\)*\ze:/ contained
+    syn region yamlFlowString matchgroup=yamlFlowStringDelimiter start='"' skip='\\"' end='"' contains=yamlEscape,rmdrInline contained
+    syn region yamlFlowString matchgroup=yamlFlowStringDelimiter start="'" skip="''"  end="'" contains=yamlSingleEscape,rmdrInline contained
+    syn match  yamlEscape contained '\\\%([\\"abefnrtv\^0_ NLP\n]\|x\x\x\|u\x\{4}\|U\x\{8}\)'
+    syn match  yamlSingleEscape contained "''"
+    syn match yamlComment /#.*/ contained
+    " A second colon is a syntax error, unles within a string or following !expr
+    syn match yamlColonError /:\s*[^'^"^!]*:/ contained
+    if &filetype == 'quarto'
+      syn region pandocYAMLHeader matchgroup=rmdYamlBlockDelim start=/\%(\%^\|\_^\s*\n\)\@<=\_^-\{3}\ze\n.\+/ end=/^---$/ keepend contains=rmdYamlFieldTtl,yamlFlowString,yamlComment,yamlColonError
+    else
+      syn region pandocYAMLHeader matchgroup=rmdYamlBlockDelim start=/\%(\%^\|\_^\s*\n\)\@<=\_^-\{3}\ze\n.\+/ end=/^\([-.]\)\1\{2}$/ keepend contains=rmdYamlFieldTtl,yamlFlowString,yamlComment,yamlColonError
+    endif
+    hi def link rmdYamlBlockDelim Delimiter
+    hi def link rmdYamlFieldTtl Identifier
+    hi def link yamlFlowString String
+    hi def link yamlComment Comment
+    hi def link yamlColonError Error
+  endif
+
+  " You don't need this if either your markdown/syntax.vim already highlights
+  " citations or you are writing standard markdown
+  if g:rmd_syn_hl_citations
+    " From vim-pandoc-syntax
+    " parenthetical citations
+    syn match pandocPCite /\^\@<!\[[^\[\]]\{-}-\{0,1}@[[:alnum:]_][[:alnum:]à-öø-ÿÀ-ÖØ-ß_:.#$%&\-+?<>~\/]*.\{-}\]/ contains=pandocEmphasis,pandocStrong,pandocLatex,pandocCiteKey,@Spell,pandocAmpersandEscape display
+    " in-text citations with location
+    syn match pandocICite /@[[:alnum:]_][[:alnum:]à-öø-ÿÀ-ÖØ-ß_:.#$%&\-+?<>~\/]*\s\[.\{-1,}\]/ contains=pandocCiteKey,@Spell display
+    " cite keys
+    syn match pandocCiteKey /\(-\=@[[:alnum:]_][[:alnum:]à-öø-ÿÀ-ÖØ-ß_:.#$%&\-+?<>~\/]*\)/ containedin=pandocPCite,pandocICite contains=@NoSpell display
+    syn match pandocCiteAnchor /[-@]/ contained containedin=pandocCiteKey display
+    syn match pandocCiteLocator /[\[\]]/ contained containedin=pandocPCite,pandocICite
+    hi def link pandocPCite Operator
+    hi def link pandocICite Operator
+    hi def link pandocCiteKey Label
+    hi def link pandocCiteAnchor Operator
+    hi def link pandocCiteLocator Operator
+  endif
 endif
 
-runtime syntax/markdown.vim
+" Step_3: Highlight code blocks.
+
+syn region rmdCodeBlock matchgroup=rmdCodeDelim start="^\s*```\s*{.*}$" matchgroup=rmdCodeDelim end="^\s*```\ze\s*$" keepend
+syn region rmdCodeBlock matchgroup=rmdCodeDelim start="^\s*```.+$" matchgroup=rmdCodeDelim end="^```$" keepend
+hi link rmdCodeBlock Special
 
 " Now highlight chunks:
+syn region knitrBodyOptions start='^#| ' end='$' contained  containedin=rComment,pythonComment contains=knitrBodyVar,knitrBodyValue transparent
+syn match knitrBodyValue ': \zs.*\ze$' keepend contained containedin=knitrBodyOptions
+syn match knitrBodyVar '| \zs\S\{-}\ze:' contained containedin=knitrBodyOptions
+
+let g:rmd_fenced_languages = get(g:, 'rmd_fenced_languages', ['r'])
 for s:type in g:rmd_fenced_languages
   if s:type =~ '='
     let s:ft = substitute(s:type, '.*=', '', '')
@@ -81,58 +138,40 @@
   unlet! b:current_syntax
   exe 'syn include @Rmd'.s:nm.' syntax/'.s:ft.'.vim'
   if g:rmd_syn_hl_chunk
-    exe 'syn region rmd'.s:nm.'ChunkDelim matchgroup=rmdCodeDelim start="^\s*```\s*{\s*'.s:nm.'\>" matchgroup=rmdCodeDelim end="}$" keepend containedin=rmd'.s:nm.'Chunk contains=@Rmdr'
-    exe 'syn region rmd'.s:nm.'Chunk start="^\s*```\s*{\s*'.s:nm.'\>.*$" matchgroup=rmdCodeDelim end="^\s*```\ze\s*$" keepend contains=rmd'.s:nm.'ChunkDelim,@Rmd'.s:nm
+    exe 'syn match knitrChunkDelim /```\s*{\s*'.s:nm.'/ contained containedin=knitrChunkBrace contains=knitrChunkLabel'
+    exe 'syn match knitrChunkLabelDelim /```\s*{\s*'.s:nm.',\=\s*[-[:alnum:]]\{-1,}[,}]/ contained containedin=knitrChunkBrace'
+    syn match knitrChunkDelim /}\s*$/ contained containedin=knitrChunkBrace
+    exe 'syn match knitrChunkBrace /```\s*{\s*'.s:nm.'.*$/ contained containedin=rmd'.s:nm.'Chunk contains=knitrChunkDelim,knitrChunkLabelDelim,@Rmd'.s:nm
+    exe 'syn region rmd'.s:nm.'Chunk start="^\s*```\s*{\s*=\?'.s:nm.'\>.*$" matchgroup=rmdCodeDelim end="^\s*```\ze\s*$" keepend contains=knitrChunkBrace,@Rmd'.s:nm
+
+    hi link knitrChunkLabel Identifier
+    hi link knitrChunkDelim rmdCodeDelim
+    hi link knitrChunkLabelDelim rmdCodeDelim
   else
-    exe 'syn region rmd'.s:nm.'Chunk matchgroup=rmdCodeDelim start="^\s*```\s*{\s*'.s:nm.'\>.*$" matchgroup=rmdCodeDelim end="^\s*```\ze\s*$" keepend contains=@Rmd'.s:nm
+    exe 'syn region rmd'.s:nm.'Chunk matchgroup=rmdCodeDelim start="^\s*```\s*{\s*=\?'.s:nm.'\>.*$" matchgroup=rmdCodeDelim end="^\s*```\ze\s*$" keepend contains=@Rmd'.s:nm
   endif
 endfor
 unlet! s:type
 
-" Recognize inline R code
-syn region rmdrInline matchgroup=rmdInlineDelim start="`r "  end="`" contains=@Rmdr keepend
+" Step_4: Highlight code recognized by pandoc but not defined in pandoc.vim yet:
+syn match pandocDivBegin '^:::\+ {.\{-}}' contains=pandocHeaderAttr
+syn match pandocDivEnd '^:::\+$'
 
+hi def link knitrBodyVar PreProc
+hi def link knitrBodyValue Constant
+hi def link knitrBodyOptions rComment
+hi def link pandocDivBegin Delimiter
+hi def link pandocDivEnd Delimiter
 hi def link rmdInlineDelim Delimiter
 hi def link rmdCodeDelim Delimiter
 
-" You don't need this if either your markdown/syntax.vim already highlights
-" the YAML header or you are writing standard markdown
-if g:rmd_syn_hl_yaml
-  " Minimum highlighting of yaml header
-  syn match rmdYamlFieldTtl /^\s*\zs\w*\ze:/ contained
-  syn match rmdYamlFieldTtl /^\s*-\s*\zs\w*\ze:/ contained
-  syn region yamlFlowString matchgroup=yamlFlowStringDelimiter start='"' skip='\\"' end='"' contains=yamlEscape,rmdrInline contained
-  syn region yamlFlowString matchgroup=yamlFlowStringDelimiter start="'" skip="''"  end="'" contains=yamlSingleEscape,rmdrInline contained
-  syn match  yamlEscape contained '\\\%([\\"abefnrtv\^0_ NLP\n]\|x\x\x\|u\x\{4}\|U\x\{8}\)'
-  syn match  yamlSingleEscape contained "''"
-  syn region pandocYAMLHeader matchgroup=rmdYamlBlockDelim start=/\%(\%^\|\_^\s*\n\)\@<=\_^-\{3}\ze\n.\+/ end=/^\([-.]\)\1\{2}$/ keepend contains=rmdYamlFieldTtl,yamlFlowString
-  hi def link rmdYamlBlockDelim Delimiter
-  hi def link rmdYamlFieldTtl Identifier
-  hi def link yamlFlowString String
+if len(s:save_pandoc_lngs)
+  let g:pandoc#syntax#codeblocks#embeds#langs = s:save_pandoc_lngs
 endif
-
-" You don't need this if either your markdown/syntax.vim already highlights
-" citations or you are writing standard markdown
-if g:rmd_syn_hl_citations
-  " From vim-pandoc-syntax
-  " parenthetical citations
-  syn match pandocPCite /\^\@<!\[[^\[\]]\{-}-\{0,1}@[[:alnum:]_][[:alnum:]à-öø-ÿÀ-ÖØ-ß_:.#$%&\-+?<>~\/]*.\{-}\]/ contains=pandocEmphasis,pandocStrong,pandocLatex,pandocCiteKey,@Spell,pandocAmpersandEscape display
-  " in-text citations with location
-  syn match pandocICite /@[[:alnum:]_][[:alnum:]à-öø-ÿÀ-ÖØ-ß_:.#$%&\-+?<>~\/]*\s\[.\{-1,}\]/ contains=pandocCiteKey,@Spell display
-  " cite keys
-  syn match pandocCiteKey /\(-\=@[[:alnum:]_][[:alnum:]à-öø-ÿÀ-ÖØ-ß_:.#$%&\-+?<>~\/]*\)/ containedin=pandocPCite,pandocICite contains=@NoSpell display
-  syn match pandocCiteAnchor /[-@]/ contained containedin=pandocCiteKey display
-  syn match pandocCiteLocator /[\[\]]/ contained containedin=pandocPCite,pandocICite
-  hi def link pandocPCite Operator
-  hi def link pandocICite Operator
-  hi def link pandocCiteKey Label
-  hi def link pandocCiteAnchor Operator
-  hi def link pandocCiteLocator Operator
-endif
-
-let b:current_syntax = "rmd"
-
+unlet s:save_pandoc_lngs
 let &cpo = s:cpo_save
 unlet s:cpo_save
 
+let b:current_syntax = "rmd"
+
 " vim: ts=8 sw=2
diff --git a/runtime/syntax/sh.vim b/runtime/syntax/sh.vim
index 13d74db..f455f19 100644
--- a/runtime/syntax/sh.vim
+++ b/runtime/syntax/sh.vim
@@ -2,8 +2,8 @@
 " Language:		shell (sh) Korn shell (ksh) bash (sh)
 " Maintainer:		Charles E. Campbell <NcampObell@SdrPchip.AorgM-NOSPAM>
 " Previous Maintainer:	Lennart Schultz <Lennart.Schultz@ecmwf.int>
-" Last Change:		Dec 20, 2022
-" Version:		205
+" Last Change:		Feb 11, 2023
+" Version:		207
 " URL:		http://www.drchip.org/astronaut/vim/index.html#SYNTAX_SH
 " For options and settings, please use:      :help ft-sh-syntax
 " This file includes many ideas from Eric Brunet (eric.brunet@ens.fr) and heredoc fixes from Felipe Contreras
@@ -166,7 +166,7 @@
  syn cluster shLoopoList	add=shForPP
 endif
 syn cluster shPPSLeftList	contains=shAlias,shArithmetic,shCmdParenRegion,shCommandSub,shCtrlSeq,shDeref,shDerefSimple,shDoubleQuote,shEcho,shEscape,shExDoubleQuote,shExpr,shExSingleQuote,shHereDoc,shNumber,shOperator,shOption,shPosnParm,shHereString,shRedir,shSingleQuote,shSpecial,shStatement,shSubSh,shTest,shVariable
-syn cluster shPPSRightList	contains=shComment,shDeref,shDerefSimple,shEscape,shPosnParm
+syn cluster shPPSRightList	contains=shDeref,shDerefSimple,shEscape,shPosnParm
 syn cluster shSubShList	contains=@shCommandSubList,shCommandSubBQ,shCaseEsac,shColon,shCommandSub,shComment,shDo,shEcho,shExpr,shFor,shIf,shHereString,shRedir,shSetList,shSource,shStatement,shVariable,shCtrlSeq,shOperator
 syn cluster shTestList	contains=shArithmetic,shCharClass,shCommandSub,shCommandSubBQ,shCtrlSeq,shDeref,shDerefSimple,shDoubleQuote,shSpecialDQ,shExDoubleQuote,shExpr,shExSingleQuote,shNumber,shOperator,shSingleQuote,shTest,shTestOpr
 syn cluster shNoZSList	contains=shSpecialNoZS
@@ -335,7 +335,7 @@
 " systems too, however, so the following syntax will flag $(..) as
 " an Error under /bin/sh.  By consensus of vimdev'ers!
 if exists("b:is_kornshell") || exists("b:is_bash") || exists("b:is_posix")
- syn region shCommandSub matchgroup=shCmdSubRegion start="\$(\ze[^(]\|$"  skip='\\\\\|\\.' end=")"  contains=@shCommandSubList
+ syn region shCommandSub matchgroup=shCmdSubRegion start="\$(\ze[^(]"  skip='\\\\\|\\.' end=")"  contains=@shCommandSubList
  syn region shArithmetic matchgroup=shArithRegion  start="\$((" skip='\\\\\|\\.' end="))" contains=@shArithList
  syn region shArithmetic matchgroup=shArithRegion  start="\$\[" skip='\\\\\|\\.' end="\]" contains=@shArithList
  syn match  shSkipInitWS contained	"^\s\+"
@@ -503,7 +503,6 @@
 " ksh: ${.sh.*} variables: {{{1
 " ========================================
 if exists("b:is_kornshell")
-" syn match  shDerefVar	contained	"[.]*"	nextgroup=@shDerefVarList
  syn match  shDerefVar	contained	"\.\+"	nextgroup=@shDerefVarList
 endif
 
@@ -548,6 +547,7 @@
 "        bash : ${parameter,pattern}  Case modification
 "        bash : ${parameter,,pattern} Case modification
 "        bash : ${@:start:qty}        display command line arguments from start to start+qty-1 (inferred)
+"        bash : ${parameter@operator} transforms parameter (operator∈[uULqEPARa])
 syn cluster shDerefPatternList	contains=shDerefPattern,shDerefString
 if !exists("g:sh_no_error")
  syn match shDerefOpError	contained	":[[:punct:]]"
@@ -563,6 +563,7 @@
 endif
 if exists("b:is_bash")
  syn match  shDerefOp	contained	"[,^]\{1,2}"	nextgroup=@shDerefPatternList
+ syn match  shDerefOp	contained	"@[uULQEPAKa]"
 endif
 syn region shDerefString	contained	matchgroup=shDerefDelim start=+\%(\\\)\@<!'+ end=+'+	contains=shStringSpecial
 syn region shDerefString	contained	matchgroup=shDerefDelim start=+\%(\\\)\@<!"+ skip=+\\"+ end=+"+	contains=@shDblQuoteList,shStringSpecial