(resending with correct cc: address information) Hi,
I've noted a number of issues with the bourne shell syntax highlighting, and have finally got around to coding a patch to fix them. 1. "while" highlighting broken after function definitions: > foo() { }; while true; do :; done 2. "while" highlighting whole predicate unnecessarily: > while pgrep vim; do :; done 3. Marking escaped quotes as errors after parameter dereference operators: > echo ${foo+\"yes\"} > echo ${foo+\'yes\'} 4. Escaping close parens broken in case matches: > case x in \));; esac 5. Escaping quotes broken in lots of places: echo \"hello\" echo \'hello\' echo \`hello\` My motivation - and primary testcase - has been GNU Libtool (/usr/bin/libtool), which has over 7500 lines of fairly complex sh constructs. With the attached patch it seems to get highlighted quite well. Ed Catmur --~--~---------~--~----~------------~-------~--~----~ You received this message from the "vim_dev" maillist. For more information, visit http://www.vim.org/maillist.php -~----------~----~----~----~------~----~------~--~---
--- vim71/runtime/syntax/sh.vim 2007/10/20 19:35:31 1.1 +++ vim71/runtime/syntax/sh.vim 2007/10/20 21:46:17 @@ -71,7 +71,7 @@ syn case match " Clusters: [EMAIL PROTECTED] clusters {{{1 "================================== syn cluster shCaseEsacList contains=shCaseStart,shCase,shCaseBar,shCaseIn,shComment,shDeref,shDerefSimple,shCaseCommandSub,shCaseExSingleQuote,shCaseSingleQuote,shCaseDoubleQuote,shCtrlSeq -syn cluster shCaseList [EMAIL PROTECTED],shCaseEsac,shColon,shCommandSub,shCommandSub,shComment,shDo,shEcho,shExpr,shFor,shHereDoc,shIf,shRedir,shSetList,shSource,shStatement,shVariable,shCtrlSeq +syn cluster shCaseList [EMAIL PROTECTED],shCaseEsac,shColon,shCommandSub,shCommandSub,shComment,shDo,shEcho,shExpr,shFor,shHereDoc,shIf,shRedir,shRepeat,shSetList,shSource,shStatement,shVariable,shCtrlSeq syn cluster shColonList [EMAIL PROTECTED] syn cluster shCommandSubList contains=shArithmetic,shDeref,shDerefSimple,shNumber,shOperator,shPosnParm,shExSingleQuote,shSingleQuote,shDoubleQuote,shStatement,shVariable,shSubSh,shAlias,shTest,shCtrlSeq syn cluster shCurlyList contains=shNumber,shComma,shDeref,shDerefSimple,shDerefSpecial @@ -81,7 +81,7 @@ syn cluster shDerefVarList contains=shDe syn cluster shEchoList contains=shArithmetic,shCommandSub,shDeref,shDerefSimple,shExpr,shExSingleQuote,shSingleQuote,shDoubleQuote,shCtrlSeq syn cluster shExprList1 contains=shCharClass,shNumber,shOperator,shExSingleQuote,shSingleQuote,shDoubleQuote,shExpr,shDblBrace,shDeref,shDerefSimple,shCtrlSeq syn cluster shExprList2 [EMAIL PROTECTED],@shCaseList,shTest -syn cluster shFunctionList [EMAIL PROTECTED],shCaseEsac,shColon,shCommandSub,shCommandSub,shComment,shDo,shEcho,shExpr,shFor,shHereDoc,shIf,shRedir,shSetList,shSource,shStatement,shVariable,shOperator,shFunctionStart,shCtrlSeq +syn cluster shFunctionList [EMAIL PROTECTED],shCaseEsac,shColon,shCommandSub,shCommandSub,shComment,shDo,shEcho,shExpr,shFor,shHereDoc,shIf,shRedir,shRepeat,shSetList,shSource,shStatement,shVariable,shOperator,shFunctionStart,shCtrlSeq if exists("b:is_kornshell") || exists("b:is_bash") syn cluster shFunctionList add=shDblBrace,shDblParen endif @@ -182,7 +182,6 @@ else syn region shFor matchgroup=shLoop start="\<for\>" end="\<in\>" end="\<do\>"me=e-2 [EMAIL PROTECTED],shDblParen skipwhite nextgroup=shCurlyIn endif if exists("b:is_kornshell") || exists("b:is_bash") - syn cluster shCaseList add=shRepeat syn region shRepeat matchgroup=shLoop start="\<while\>" end="\<in\>" end="\<do\>"me=e-2 [EMAIL PROTECTED],shDblParen,shDblBrace syn region shRepeat matchgroup=shLoop start="\<until\>" end="\<in\>" end="\<do\>"me=e-2 [EMAIL PROTECTED],shDblParen,shDblBrace syn region shCaseEsac matchgroup=shConditional start="\<select\>" matchgroup=shConditional end="\<in\>" end="\<do\>" [EMAIL PROTECTED] @@ -195,9 +194,9 @@ syn match shComma contained "," " Case: case...esac {{{1 " ==== -syn match shCaseBar contained skipwhite "[^|"`'()]\{-}|"hs=e nextgroup=shCase,shCaseStart,shCaseBar,shComment,shCaseExSingleQuote,shCaseSingleQuote,shCaseDoubleQuote +syn match shCaseBar contained skipwhite "\([^|"`'()\\]\|\\.\)\{-}|"hs=e nextgroup=shCase,shCaseStart,shCaseBar,shComment,shCaseExSingleQuote,shCaseSingleQuote,shCaseDoubleQuote syn match shCaseStart contained skipwhite skipnl "(" nextgroup=shCase,shCaseBar -syn region shCase contained skipwhite skipnl matchgroup=shSnglCase start="\([^#$()'" \t]\|\\.\)\{-})"ms=s,hs=e end=";;" end="esac"me=s-1 [EMAIL PROTECTED] nextgroup=shCaseStart,shCase,shComment +syn region shCase contained skipwhite skipnl matchgroup=shSnglCase start="\([^#$()'" \t\\]\|\\.\)\{-})"ms=s,hs=e end=";;" end="esac"me=s-1 [EMAIL PROTECTED] nextgroup=shCaseStart,shCase,shComment if g:sh_fold_enabled syn region shCaseEsac fold matchgroup=shConditional start="\<case\>" end="\<esac\>" [EMAIL PROTECTED] else @@ -209,14 +208,14 @@ if exists("b:is_bash") else syn region shCaseExSingleQuote matchgroup=Error start=+\$'+ skip=+\\\\\|\\.+ end=+'+ contains=shStringSpecial skipwhite skipnl nextgroup=shCaseBar contained endif -syn region shCaseSingleQuote matchgroup=shOperator start=+'+ end=+'+ contains=shStringSpecial skipwhite skipnl nextgroup=shCaseBar contained -syn region shCaseDoubleQuote matchgroup=shOperator start=+"+ skip=+\\\\\|\\.+ end=+"+ [EMAIL PROTECTED],shStringSpecial skipwhite skipnl nextgroup=shCaseBar contained -syn region shCaseCommandSub start=+`+ skip=+\\\\\|\\.+ end=+`+ [EMAIL PROTECTED] skipwhite skipnl nextgroup=shCaseBar contained +syn region shCaseSingleQuote matchgroup=shOperator start=+\\\@<!'+ end=+'+ contains=shStringSpecial skipwhite skipnl nextgroup=shCaseBar contained +syn region shCaseDoubleQuote matchgroup=shOperator start=+\\\@<!"+ skip=+\\\\\|\\.+ end=+"+ [EMAIL PROTECTED],shStringSpecial skipwhite skipnl nextgroup=shCaseBar contained +syn region shCaseCommandSub start=+\\\@<!`+ skip=+\\\\\|\\.+ end=+`+ [EMAIL PROTECTED] skipwhite skipnl nextgroup=shCaseBar contained " Misc: {{{1 "====== syn match shWrapLineOperator "\\$" -syn region shCommandSub start="`" skip="\\\\\|\\." end="`" [EMAIL PROTECTED] +syn region shCommandSub start="\\\@<!`" skip="\\\\\|\\." end="`" [EMAIL PROTECTED] " $() and $(()): {{{1 " $(..) is not supported by sh (Bourne shell). However, apparently @@ -247,7 +246,7 @@ if exists("b:is_bash") syn match shSource "^\.\s" syn match shSource "\s\.\s" -syn region shColon start="^\s*:" end="$\|" end="#"me=e-1 [EMAIL PROTECTED] +syn region shColon start="^\s*:" end="$\|" end="[^\\]#"me=e-1 [EMAIL PROTECTED] " String And Character Constants: {{{1 "================================ @@ -263,8 +262,8 @@ if exists("b:is_bash") else syn region shExSingleQuote matchGroup=Error start=+\$'+ skip=+\\\\\|\\.+ end=+'+ contains=shStringSpecial endif -syn region shSingleQuote matchgroup=shOperator start=+'+ end=+'+ contains=shStringSpecial,@Spell -syn region shDoubleQuote matchgroup=shOperator start=+"+ skip=+\\"+ end=+"+ [EMAIL PROTECTED],shStringSpecial,@Spell +syn region shSingleQuote matchgroup=shOperator start=+\\\@<!'+ end=+'+ contains=shStringSpecial,@Spell +syn region shDoubleQuote matchgroup=shOperator start=+\\\@<!"+ skip=+\\"+ end=+"+ [EMAIL PROTECTED],shStringSpecial,@Spell syn match shStringSpecial "[^[:print:]]" contained syn match shStringSpecial "\%(\\\\\)*\\[\\"'`$()#]" syn match shSpecial "[^\\]\zs\%(\\\\\)*\\[\\"'`$()#]" @@ -275,7 +274,7 @@ syn match shSpecial "^\%(\\\\\)*\\[\\" syn cluster shCommentGroup contains=shTodo,@Spell syn keyword shTodo contained COMBAK FIXME TODO XXX syn match shComment "^\s*\zs#.*$" [EMAIL PROTECTED] -syn match shComment "#.*$" [EMAIL PROTECTED] +syn match shComment "\\\@<!#.*$" [EMAIL PROTECTED] " Here Documents: {{{1 " ========================================= @@ -399,9 +398,8 @@ if exists("b:is_bash") || exists("b:is_k syn region shDerefPattern contained start="{" end="}" contains=shDeref,shDerefSimple,shDerefString,shCommandSub nextgroup=shDerefPattern syn match shDerefEscape contained '\%(\\\\\)*\\.' endif -syn region shDerefString contained matchgroup=shOperator start=+'+ end=+'+ contains=shStringSpecial -syn region shDerefString contained matchgroup=shOperator start=+"+ skip=+\\"+ end=+"+ [EMAIL PROTECTED],shStringSpecial -syn match shDerefString contained "\\["']" +syn region shDerefString contained matchgroup=shOperator start=+\\\@<!'+ end=+'+ contains=shStringSpecial +syn region shDerefString contained matchgroup=shOperator start=+\\\@<!"+ skip=+\\"+ end=+"+ [EMAIL PROTECTED],shStringSpecial if exists("b:is_bash") " bash : ${parameter:offset} @@ -541,7 +539,6 @@ hi def link shFunctionKey Function hi def link shFunctionName Function hi def link shNumber Number hi def link shOperator Operator -hi def link shRepeat Repeat hi def link shSet Statement hi def link shSetList Identifier hi def link shShellVariables PreProc