updated for version 7.0014
diff --git a/runtime/syntax/sh.vim b/runtime/syntax/sh.vim
index c8f6ee0..f8624ae 100644
--- a/runtime/syntax/sh.vim
+++ b/runtime/syntax/sh.vim
@@ -2,11 +2,11 @@
 " Language:		shell (sh) Korn shell (ksh) bash (sh)
 " Maintainer:		Dr. Charles E. Campbell, Jr.  <NdrOchipS@PcampbellAfamily.Mbiz>
 " Previous Maintainer:	Lennart Schultz <Lennart.Schultz@ecmwf.int>
-" Last Change:		Apr 28, 2004
-" Version:		68
+" Last Change:		Jul 26, 2004
+" Version:		69
 " URL:		http://www.erols.com/astronaut/vim/index.html#vimlinks_syntax
 "
-" Using the following VIM variables:
+" Using the following VIM variables: {{{1
 " b:is_kornshell	if defined, enhance with kornshell syntax
 " b:is_bash		if defined, enhance with bash syntax
 "   is_kornshell	if neither b:is_kornshell or b:is_bash is
@@ -20,7 +20,7 @@
 "
 " This file includes many ideas from Éric Brunet (eric.brunet@ens.fr)
 
-" For version 5.x: Clear all syntax items
+" For version 5.x: Clear all syntax items {{{1
 " For version 6.x: Quit when a syntax file was already loaded
 if version < 600
   syntax clear
@@ -28,6 +28,7 @@
   finish
 endif
 
+" handling /bin/sh with is_kornshell/is_sh {{{1
 " b:is_sh is set when "#! /bin/sh" is found;
 " However, it often is just a masquerade by bash (typically Linux)
 " or kornshell (typically workstations with Posix "sh").
@@ -57,7 +58,7 @@
 " sh syntax is case sensitive
 syn case match
 
-" Clusters: contains=@... clusters
+" Clusters: contains=@... clusters {{{1
 "==================================
 syn cluster shCaseEsacList	contains=shCaseStart,shCase,shCaseBar,shCaseIn,shComment,shDeref,shDerefSimple,shCaseCommandSub,shCaseSingleQuote,shCaseDoubleQuote,shSpecial
 syn cluster shCaseList	contains=@shCommandSubList,shCaseEsac,shColon,shCommandSub,shCommandSub,shComment,shDo,shEcho,shExpr,shFor,shHereDoc,shIf,shRedir,shSetList,shSource,shStatement,shVariable,bkshFunction,shSpecial
@@ -79,7 +80,7 @@
 syn cluster shTestList	contains=shCharClass,shComment,shCommandSub,shDeref,shDerefSimple,shDoubleQuote,shExpr,shExpr,shNumber,shOperator,shSingleQuote,shSpecial,shTestOpr
 
 
-" Echo:
+" Echo: {{{1
 " ====
 " This one is needed INSIDE a CommandSub, so that `echo bla` be correct
 syn region shEcho matchgroup=shStatement start="\<echo\>"  skip="\\$" matchgroup=shOperator end="$" matchgroup=NONE end="[<>;&|()]"me=e-1 end="\d[<>]"me=e-2 end="#"me=e-1 contains=@shEchoList
@@ -88,7 +89,7 @@
 " This must be after the strings, so that bla \" be correct
 syn region shEmbeddedEcho contained matchgroup=shStatement start="\<print\>" skip="\\$" matchgroup=shOperator end="$" matchgroup=NONE end="[<>;&|`)]"me=e-1 end="\d[<>]"me=e-2 end="#"me=e-1 contains=shNumber,shSingleQuote,shDeref,shDerefSimple,shSpecialVar,shSpecial,shOperator,shDoubleQuote,shCharClass
 
-" Alias:
+" Alias: {{{1
 " =====
 if exists("b:is_kornshell") || exists("b:is_bash")
  syn match shStatement "\<alias\>"
@@ -96,8 +97,8 @@
  syn region shAlias matchgroup=shStatement start="\<alias\>\s\+\(\w\+=\)\@=" skip="\\$" end="="
 endif
 
-" Error Codes
-" ===========
+" Error Codes: {{{1
+" ============
 syn match   shDoError "\<done\>"
 syn match   shIfError "\<fi\>"
 syn match   shInError "\<in\>"
@@ -110,25 +111,25 @@
 endif
 syn match     shTestError "]"
 
-" Options interceptor
-" ===================
+" Options Interceptor: {{{1
+" ====================
 syn match   shOption  "\s[\-+][a-zA-Z0-9]\+\>"ms=s+1
 syn match   shOption  "\s--\S\+"ms=s+1
 
-" Operators:
-" =========
+" Operators: {{{1
+" ==========
 syn match   shOperator	"[!&;|]"
 syn match   shOperator	"\[[[^:]\|\]]"
 syn match   shOperator	"!\=="		skipwhite nextgroup=shPattern
 syn match   shPattern	"\<\S\+\())\)\@="	contained contains=shSingleQuote,shDoubleQuote,shDeref
 
-" Subshells:
-" =========
+" Subshells: {{{1
+" ==========
 syn region shExpr  transparent matchgroup=shExprRegion  start="{" end="}"	contains=@shExprList2
 syn region shSubSh transparent matchgroup=shSubShRegion start="(" end=")"	contains=@shSubShList
 
-" Tests
-"======
+" Tests: {{{1
+"=======
 "syn region  shExpr transparent matchgroup=shRange start="\[" skip=+\\\\\|\\$+ end="\]" contains=@shTestList
 syn region  shExpr matchgroup=shRange start="\[" skip=+\\\\\|\\$+ end="\]" contains=@shTestList
 syn region  shExpr transparent matchgroup=shStatement start="\<test\>" skip=+\\\\\|\\$+ matchgroup=NONE end="[;&|]"me=e-1 end="$" contains=@shExprList1
@@ -138,12 +139,12 @@
  syn region  shDblParen matchgroup=Delimiter start="((" skip=+\\\\\|\\$+ end="))"	contains=@shTestList
 endif
 
-" Character Class in Range
-" ========================
+" Character Class In Range: {{{1
+" =========================
 syn match   shCharClass	contained	"\[:\(backspace\|escape\|return\|xdigit\|alnum\|alpha\|blank\|cntrl\|digit\|graph\|lower\|print\|punct\|space\|upper\|tab\):\]"
 
-" Loops: do, if, while, until
-" =====
+" Loops: do, if, while, until {{{1
+" ======
 syn region shDo		transparent matchgroup=shConditional start="\<do\>" matchgroup=shConditional end="\<done\>" contains=@shLoopList
 syn region shIf		transparent matchgroup=shConditional start="\<if\>" matchgroup=shConditional end="\<;\_s*then\>" end="\<fi\>"   contains=@shLoopList,shDblBrace,shDblParen
 syn region shFor	matchgroup=shLoop start="\<for\>" end="\<in\>" end="\<do\>"me=e-2	contains=@shLoopList,shDblParen
@@ -157,7 +158,7 @@
  syn region shRepeat   matchgroup=shLoop   start="\<until\>" end="\<do\>"me=e-2		contains=@shLoopList
 endif
 
-" Case: case...esac
+" Case: case...esac {{{1
 " ====
 syn match   shCaseBar	contained skipwhite "[^|"`'()]\{-}|"hs=e		nextgroup=shCase,shCaseStart,shCaseBar,shComment,shCaseSingleQuote,shCaseDoubleQuote
 syn match   shCaseStart	contained skipwhite skipnl "("			nextgroup=shCase,shCaseBar
@@ -168,11 +169,12 @@
 syn region  shCaseDoubleQuote	matchgroup=shOperator start=+"+ skip=+\\\\\|\\.+ end=+"+	contains=@shDblQuoteList,shStringSpecial	skipwhite skipnl nextgroup=shCaseBar	contained
 syn region  shCaseCommandSub	start=+`+ skip=+\\\\\|\\.+ end=+`+		contains=@shCommandSubList		skipwhite skipnl nextgroup=shCaseBar	contained
 
-" Misc
-"=====
+" Misc: {{{1
+"======
 syn match   shWrapLineOperator "\\$"
 syn region  shCommandSub   start="`" skip="\\\\\|\\." end="`" contains=@shCommandSubList
 
+" $() and $(()): {{{1
 " $(..) is not supported by sh (Bourne shell).  However, apparently
 " some systems (HP?) have as their /bin/sh a (link to) Korn shell
 " (ie. Posix compliant shell).  /bin/ksh should work for those
@@ -205,8 +207,8 @@
 syn match   shSource	"\s\.\s"
 syn region  shColon	start="^\s*:" end="$\|" end="#"me=e-1 contains=@shColonList
 
-" String and Character constants
-"===============================
+" String And Character Constants: {{{1
+"================================
 syn match   shNumber	"-\=\<\d\+\>"
 syn match   shSpecial	"\\\d\d\d\|\\[abcfnrtv0]"	contained
 syn region  shSingleQuote	matchgroup=shOperator start=+'+ end=+'+		contains=shStringSpecial
@@ -214,20 +216,21 @@
 syn match   shStringSpecial	"[^[:print:]]"	contained
 syn match   shSpecial	"\\[\\\"\'`$()#]"
 
-" Comments
-"=========
+" Comments: {{{1
+"==========
 syn cluster    shCommentGroup	contains=shTodo,@Spell
 syn keyword    shTodo	contained	TODO
 syn match      shComment	"#.*$" contains=@shCommentGroup
 
-" File redirection highlighted as operators
-"==========================================
+" File Redirection Highlighted As Operators: {{{1
+"===========================================
 syn match      shRedir	"\d\=>\(&[-0-9]\)\="
 syn match      shRedir	"\d\=>>-\="
 syn match      shRedir	"\d\=<\(&[-0-9]\)\="
 syn match      shRedir	"\d<<-\="
 
-" Shell Input Redirection (Here Documents)
+" Here Documents: {{{1
+" =========================================
 if version < 600
  syn region shHereDoc matchgroup=shRedir start="<<\s*\**END[a-zA-Z_0-9]*\**"  matchgroup=shRedir end="^END[a-zA-Z_0-9]*$" contains=@shDblQuoteList
  syn region shHereDoc matchgroup=shRedir start="<<-\s*\**END[a-zA-Z_0-9]*\**" matchgroup=shRedir end="^\s*END[a-zA-Z_0-9]*$" contains=@shDblQuoteList
@@ -298,13 +301,16 @@
   syn match  shBeginLine ".*$"		contained	skipnl	nextgroup=shHerePayload	contains=@shCommandSubList
   syn match  shBeginHere "<<-\=\s*\S\+"	contained		nextgroup=shBeginLine
  endif
- if exists("b:is_bash")
-  syn match shRedir "<<<"
- endif
 endif
 
-" Identifiers
-"============
+" Here Strings: {{{1
+" =============
+if exists("b:is_bash")
+ syn match shRedir "<<<"
+endif
+
+" Identifiers: {{{1
+"=============
 syn match  shVariable "\<\([bwglsav]:\)\=[a-zA-Z0-9.!@_%+,]*\ze="	nextgroup=shSetIdentifier
 syn match  shIdWhiteSpace  contained	"\s"
 syn match  shSetIdentifier contained	"="	nextgroup=shPattern,shDeref,shDerefSimple,shDoubleQuote,shSingleQuote
@@ -321,6 +327,7 @@
   syn match  shStatement "\<\(set\|export\|unset\)$"
 endif
 
+" Functions: {{{1
 " handles functions which start:  Function () {
 "   Apparently Bourne shell accepts functions too,
 "   even though it isn't documented by my man pages
@@ -335,8 +342,8 @@
 syn match bkshFunctionParen	"[()]"	contained
 syn match bkshFunctionDelim	"[{}]"	contained
 
-" Parameter Dereferencing
-" =======================
+" Parameter Dereferencing: {{{1
+" ========================
 syn match  shDerefSimple	"\$\w\+"
 syn region shDeref	matchgroup=PreProc start="\${" end="}"	contains=@shDerefList,shDerefVarArray
 syn match  shDerefWordError	"[^}$[]"	contained
@@ -346,8 +353,8 @@
  syn region shDeref	matchgroup=PreProc start="\${##\=" end="}"	contains=@shDerefList
 endif
 
-" bash : ${!prefix*}
-" bash : ${#parameter}
+" bash: ${!prefix*} and ${#parameter}: {{{1
+" ====================================
 if exists("b:is_bash")
  syn region shDeref	matchgroup=PreProc start="\${!" end="\*\=}"	contains=@shDerefList,shDerefOp
  syn match  shDerefVar	contained	"{\@<=!\w\+"		nextgroup=@shDerefVarList
@@ -357,9 +364,10 @@
 syn match  shDerefSpecial	contained	"\({[#!]\)\@<=[[:alnum:]*@_]\+"	nextgroup=@shDerefVarList,shDerefOp
 syn match  shDerefVar	contained	"{\@<=\w\+"		nextgroup=@shDerefVarList
 
-" sh ksh bash : ${var[... ]...}  array reference
+" sh ksh bash : ${var[... ]...}  array reference: {{{1
 syn region  shDerefVarArray   contained	matchgroup=shDeref start="\[" end="]"	contains=@shCommandSubList nextgroup=shDerefOp,shDerefOpError
 
+" Special ${parameter OPERATOR word} handling: {{{1
 " sh ksh bash : ${parameter:-word}    word is default value
 " sh ksh bash : ${parameter:=word}    assign word as default value
 " sh ksh bash : ${parameter:?word}    display word if parameter is null
@@ -395,15 +403,20 @@
  syn match  shDerefPatString	contained	"[^}]\{1,}"
 endif
 
-" A bunch of useful sh keywords
+" Useful sh Keywords: {{{1
+" ===================
 syn keyword shStatement break cd chdir continue eval exec exit kill newgrp pwd read readonly return shift test trap ulimit umask wait
 syn keyword shConditional contained elif else then
 syn keyword shCondError elif else then
 
+" Useful ksh Keywords: {{{1
+" ====================
 if exists("b:is_kornshell") || exists("b:is_bash")
  syn keyword shFunction	function
  syn keyword shStatement autoload bg false fc fg functions getopts hash history integer jobs let nohup print printf r stop suspend time times true type unalias whence
 
+" Useful bash Keywords: {{{1
+" =====================
  if exists("b:is_bash")
   syn keyword shStatement bind builtin dirs disown enable help local logout popd pushd shopt source
  else
@@ -411,8 +424,8 @@
  endif
 endif
 
-" Syncs
-" =====
+" Synchronization: {{{1
+" ================
 if !exists("sh_minlines")
   let sh_minlines = 200
 endif
@@ -431,7 +444,8 @@
 syn sync match shUntilSync	grouphere	shRepeat	"\<until\>"
 syn sync match shWhileSync	grouphere	shRepeat	"\<while\>"
 
-" The default highlighting.
+" Default Highlighting: {{{1
+" =====================
 hi def link shArithRegion	shShellVariables
 hi def link shCaseBar	shConditional
 hi def link shCaseIn	shConditional
@@ -525,8 +539,8 @@
 hi def link shTodo		Todo
 hi def link shAlias		Identifier
 
-" Current Syntax
-" ==============
+" Set Current Syntax: {{{1
+" ===================
 if exists("b:is_bash")
  let b:current_syntax = "bash"
 elseif exists("b:is_kornshell")
@@ -535,4 +549,4 @@
  let b:current_syntax = "sh"
 endif
 
-" vim: ts=16
+" vim: ts=16 fdm=marker