diff options
Diffstat (limited to 'kate/data/bash.xml')
-rw-r--r-- | kate/data/bash.xml | 511 |
1 files changed, 284 insertions, 227 deletions
diff --git a/kate/data/bash.xml b/kate/data/bash.xml index 7fe38d3a4..cbb0f7643 100644 --- a/kate/data/bash.xml +++ b/kate/data/bash.xml @@ -1,15 +1,18 @@ <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE language SYSTEM "language.dtd" [ - <!ENTITY funcname "[A-Za-z_:][A-Za-z0-9_:#%@-]*"> - <!ENTITY varname "[A-Za-z_][A-Za-z0-9_]*"> - <!ENTITY word "[^|&;()<>\s]+"> <!-- see man bash --> - <!ENTITY eos "(?=($|\s))"> <!-- eol or space following --> - <!ENTITY noword "(?![\w$+-])"> <!-- no word, $, + or - following --> + <!ENTITY funcname "[A-Za-z_:][A-Za-z0-9_:#%@-]*"> + <!ENTITY varname "[A-Za-z_][A-Za-z0-9_]*"> + <!ENTITY word "[^|&;()<>\s]+"> <!-- see man bash --> + <!ENTITY eos "(?=($|\s))"> <!-- eol or space following --> + <!ENTITY noword "(?![\w$+-])"> <!-- no word, $, + or - following --> + <!ENTITY pathpart "([\w_@.%*?+-]|\\ )"> <!-- valid character in a file name --> ]> -<language name="Bash" version="2.06" kateversion="2.4" section="Scripts" extensions="*.sh;*.bash;*.ebuild;*.eclass" mimetype="application/x-shellscript" casesensitive="1" author="Wilbert Berendsen (wilbert@kde.nl)" license="LGPL"> +<language name="Bash" version="2.12" kateversion="2.4" section="Scripts" extensions="*.sh;*.bash;*.ebuild;*.eclass;.bashrc;.bash_profile;.bash_login;.profile" mimetype="application/x-shellscript" casesensitive="1" author="Wilbert Berendsen (wilbert@kde.nl)" license="LGPL"> -<!-- (c) 2004 by Wilbert Berendsen, wilbert@kde.nl +<!-- (c) 2004 by Wilbert Berendsen (wilbert@kde.nl) + Changes by Matthew Woehlke (mw_triad@users.sourceforge.net) + Changes by Sebastian Pipping (webmaster@hartwork.org) Released under the LGPL, part of kdelibs/kate --> <highlighting> @@ -21,7 +24,6 @@ <item> select </item> <item> until </item> <item> while </item> - <item> . </item> <item> elif </item> <item> then </item> <item> set </item> @@ -29,7 +31,6 @@ <list name="builtins"> <item> : </item> - <item> . </item> <item> source </item> <item> alias </item> <item> bg </item> @@ -37,6 +38,7 @@ <item> break </item> <item> builtin </item> <item> cd </item> + <item> caller </item> <item> command </item> <item> compgen </item> <item> complete </item> @@ -68,6 +70,7 @@ <item> shopt </item> <item> suspend </item> <item> test </item> + <item> time </item> <item> times </item> <item> trap </item> <item> type </item> @@ -76,7 +79,7 @@ <item> unalias </item> <item> wait </item> </list> - + <list name="builtins_var"> <item> export </item> <item> unset </item> @@ -86,7 +89,7 @@ <item> read </item> <item> readonly </item> </list> - + <list name="unixcommands"> <!-- /bin --> <item> arch </item> @@ -132,6 +135,7 @@ <item> getkeycodes </item> <item> gocr </item> <item> grep </item> + <item> groff </item> <item> groups </item> <item> gunzip </item> <item> gzexe </item> @@ -165,6 +169,7 @@ <item> nano </item> <item> netstat </item> <item> nisdomainname </item> + <item> nroff </item> <item> openvt </item> <item> pgawk </item> <item> pidof </item> @@ -198,6 +203,7 @@ <item> tar </item> <item> tempfile </item> <item> touch </item> + <item> troff </item> <item> true </item> <item> umount </item> <item> uname </item> @@ -414,7 +420,7 @@ <item> yes </item> <item> zip </item> <item> zsoelim </item> - + <!-- others --> <item> dcop </item> <item> kdialog </item> @@ -424,317 +430,366 @@ <item> xset </item> </list> - + <contexts> <context attribute="Normal Text" lineEndContext="#stay" name="Start"> - <IncludeRules context="FindAll" /> + <IncludeRules context="FindAll" /> </context> <!-- ====== The following rulessets are meant to be included ======== --> <!-- FindAll tries to interpret everything --> <context attribute="Normal Text" lineEndContext="#stay" name="FindAll"> - <IncludeRules context="FindComments" /> - <IncludeRules context="FindCommands" /> - <IncludeRules context="FindStrings" /> - <IncludeRules context="FindSubstitutions" /> - <IncludeRules context="FindOthers" /> + <IncludeRules context="FindComments" /> + <IncludeRules context="FindCommands" /> + <IncludeRules context="FindStrings" /> + <IncludeRules context="FindSubstitutions" /> + <IncludeRules context="FindOthers" /> </context> - + <!-- FindMost tries to interpret anything except commands --> <context attribute="Normal Text" lineEndContext="#stay" name="FindMost"> - <IncludeRules context="FindComments" /> - <IncludeRules context="FindStrings" /> - <IncludeRules context="FindSubstitutions" /> - <IncludeRules context="FindOthers" /> + <IncludeRules context="FindComments" /> + <IncludeRules context="FindStrings" /> + <IncludeRules context="FindSubstitutions" /> + <IncludeRules context="FindOthers" /> </context> <!-- FindComments consumes shell comments till EOL --> <context attribute="Normal Text" lineEndContext="#pop" name="FindComments"> - <DetectChar attribute="Comment" context="Comment" char="#" firstNonSpace="true"/> - <RegExpr attribute="Normal Text" context="Comment" String="[\s;](?=#)" /> + <DetectChar attribute="Comment" context="Comment" char="#" firstNonSpace="true"/> + <RegExpr attribute="Normal Text" context="Comment" String="[\s;](?=#)" /> </context> <context attribute="Comment" lineEndContext="#pop" name="Comment"> - <IncludeRules context="##Alerts" /> + <IncludeRules context="##Alerts" /> </context> - + <!-- FindCommentsParen consumes shell comments till EOL or a closing parenthese --> <context attribute="Normal Text" lineEndContext="#pop" name="FindCommentsParen"> - <DetectChar attribute="Comment" context="CommentParen" char="#" firstNonSpace="true"/> - <RegExpr attribute="Normal Text" context="CommentParen" String="[\s;](?=#)" /> + <DetectChar attribute="Comment" context="CommentParen" char="#" firstNonSpace="true"/> + <RegExpr attribute="Normal Text" context="CommentParen" String="[\s;](?=#)" /> </context> <context attribute="Comment" lineEndContext="#pop" name="CommentParen"> - <RegExpr attribute="Comment" context="#pop" String="[^)](?=\))" /> - <IncludeRules context="##Alerts" /> + <RegExpr attribute="Comment" context="#pop" String="[^)](?=\))" /> + <IncludeRules context="##Alerts" /> </context> - + <!-- FindCommentsBackq consumes shell comments till EOL or a backquote --> <context attribute="Normal Text" lineEndContext="#pop" name="FindCommentsBackq"> - <DetectChar attribute="Comment" context="CommentBackq" char="#" firstNonSpace="true"/> - <RegExpr attribute="Normal Text" context="CommentBackq" String="[\s;](?=#)" /> + <DetectChar attribute="Comment" context="CommentBackq" char="#" firstNonSpace="true"/> + <RegExpr attribute="Normal Text" context="CommentBackq" String="[\s;](?=#)" /> </context> <context attribute="Comment" lineEndContext="#pop" name="CommentBackq"> - <RegExpr attribute="Comment" context="#pop" String="[^`](?=`)" /> - <IncludeRules context="##Alerts" /> + <RegExpr attribute="Comment" context="#pop" String="[^`](?=`)" /> + <IncludeRules context="##Alerts" /> </context> - - + + <!-- FindCommands matches many items that can be expected outside strings, substitutions etc. --> <context attribute="Normal Text" lineEndContext="#stay" name="FindCommands"> - <!-- start expression in double parentheses --> - <Detect2Chars attribute="Keyword" context="ExprDblParen" char="(" char1="(" beginRegion="expression" /> - <!-- start expression in double brackets --> - <RegExpr attribute="Keyword" context="ExprDblBracket" String="\[\[&eos;" beginRegion="expression" column="0"/> - <RegExpr attribute="Keyword" context="ExprDblBracket" String="\s\[\[&eos;" beginRegion="expression" /> - <!-- start expression in single brackets --> - <RegExpr attribute="Builtin" context="ExprBracket" String="\[&eos;" beginRegion="expression" column="0"/> - <RegExpr attribute="Builtin" context="ExprBracket" String="\s\[&eos;" beginRegion="expression" /> - <!-- start a group command with { --> - <RegExpr attribute="Keyword" context="Group" String="\{&eos;" beginRegion="group" /> - <!-- start a subshell --> - <DetectChar attribute="Keyword" context="SubShell" char="(" beginRegion="subshell" /> - <!-- match do and if blocks --> - <RegExpr attribute="Keyword" context="#stay" String="\bdo&noword;" beginRegion="do" /> - <RegExpr attribute="Keyword" context="#stay" String="\bdone&noword;" endRegion="do" /> - <RegExpr attribute="Keyword" context="#stay" String="\bif&noword;" beginRegion="if" /> - <RegExpr attribute="Keyword" context="#stay" String="\bfi&noword;" endRegion="if" /> - <!-- handle case as a special case --> - <RegExpr attribute="Keyword" context="Case" String="\bcase&noword;" beginRegion="case" /> - <!-- handle command line options --> - <RegExpr attribute="Option" context="#stay" String="-[A-Za-z0-9]+" /> - <RegExpr attribute="Option" context="#stay" String="--[a-z][A-Za-z0-9_-]*" /> - <!-- handle variable assignments --> - <RegExpr attribute="Variable" context="Assign" String="\b&varname;\+?=" /> - <RegExpr attribute="Variable" context="AssignSubscr" String="\b&varname;(?=\[[^]]+\]=)" /> - <!-- handle functions with function keyword before keywords --> - <StringDetect attribute="Function" context="#stay" String=":()" /> - <RegExpr attribute="Keyword" context="FunctionDef" String="\bfunction\b" /> - <!-- handle keywords --> - <keyword attribute="Keyword" context="#stay" String="keywords" /> - <keyword attribute="Builtin" context="#stay" String="builtins" /> + <!-- start expression in double parentheses --> + <Detect2Chars attribute="Keyword" context="ExprDblParen" char="(" char1="(" beginRegion="expression" /> + <!-- start expression in double brackets --> + <RegExpr attribute="Keyword" context="ExprDblBracket" String="\[\[&eos;" beginRegion="expression" column="0"/> + <RegExpr attribute="Keyword" context="ExprDblBracket" String="\s\[\[&eos;" beginRegion="expression" /> + <!-- start expression in single brackets --> + <RegExpr attribute="Builtin" context="ExprBracket" String="\[&eos;" beginRegion="expression" column="0"/> + <RegExpr attribute="Builtin" context="ExprBracket" String="\s\[&eos;" beginRegion="expression" /> + <!-- start a group command with { --> + <RegExpr attribute="Keyword" context="Group" String="\{&eos;" beginRegion="group" /> + <!-- start a subshell --> + <DetectChar attribute="Keyword" context="SubShell" char="(" beginRegion="subshell" /> + <!-- match do and if blocks --> + <RegExpr attribute="Keyword" context="#stay" String="\bdo&noword;" beginRegion="do" /> + <RegExpr attribute="Keyword" context="#stay" String="\bdone&noword;" endRegion="do" /> + <RegExpr attribute="Keyword" context="#stay" String="\bif&noword;" beginRegion="if" /> + <RegExpr attribute="Keyword" context="#stay" String="\bfi&noword;" endRegion="if" /> + <!-- handle case as a special case --> + <RegExpr attribute="Keyword" context="Case" String="\bcase&noword;" beginRegion="case" /> + <!-- handle command line options --> + <RegExpr attribute="Option" context="#stay" String="-[A-Za-z0-9][A-Za-z0-9_]*" /> + <RegExpr attribute="Option" context="#stay" String="--[a-z][A-Za-z0-9_-]*" /> + <!-- handle variable assignments --> + <RegExpr attribute="Variable" context="Assign" String="\b&varname;\+?=" /> + <RegExpr attribute="Variable" context="AssignSubscr" String="\b&varname;(?=\[.+\]\+?=)" /> + <!-- handle functions with function keyword before keywords --> + <StringDetect attribute="Function" context="#stay" String=":()" /> + <RegExpr attribute="Keyword" context="FunctionDef" String="\bfunction\b" /> + <!-- handle keywords --> + <keyword attribute="Keyword" context="#stay" String="keywords" /> + <RegExpr attribute="Builtin" context="#stay" String="\.(?=\s)" /> + <keyword attribute="Builtin" context="#stay" String="builtins" /> <keyword attribute="Command" context="#stay" String="unixcommands" /> - <!-- handle commands that have variable names as argument --> - <keyword attribute="Builtin" context="VarName" String="builtins_var" /> + <!-- handle commands that have variable names as argument --> + <keyword attribute="Builtin" context="VarName" String="builtins_var" /> <!-- handle here-string --> - <StringDetect attribute="Redirection" context="#stay" String="<<<" /> - <!-- handle here document --> - <StringDetect attribute="Redirection" context="HereDoc" String="<<" lookAhead="true" /> + <RegExpr attribute="Redirection" context="#stay" String="\d*<<<" /> + <!-- handle here document --> + <StringDetect attribute="Redirection" context="HereDoc" String="<<" lookAhead="true" /> <!-- handle process subst --> <RegExpr attribute="Redirection" context="ProcessSubst" String="[<>]\(" /> <!-- handle redirection --> <RegExpr attribute="Redirection" context="#stay" String="([0-9]*(>{1,2}|<)(&[0-9]+-?)?|&>|>&|[0-9]*<>)" /> - <!-- handle &, &&, | and || --> - <RegExpr attribute="Control" context="#stay" String="([|&])\1?" /> - <!-- mark function definitions without function keyword --> + <!-- handle &, &&, | and || --> + <RegExpr attribute="Control" context="#stay" String="([|&])\1?" /> + <!-- mark function definitions without function keyword --> <RegExpr attribute="Function" context="#stay" String="&funcname;\s*\(\)" /> </context> <!-- FindOthers contains various rules to mark different shell input --> <context attribute="Normal Text" lineEndContext="#stay" name="FindOthers"> - <RegExpr attribute="Escape" context="#stay" String="\\[][;"\\'$`{}()|&<>* ]" /> - <RegExpr attribute="Keyword" context="#stay" String="\\$" /> - <RegExpr attribute="Escape" context="#stay" String="\{(?!(\s|$))\S*\}" /> - <RegExpr attribute="Path" context="#stay" String="\.?/[\w_@.+-]+(?=([\s/):]|$))" /> - <!-- TODO: shell globs --> + <RegExpr attribute="Escape" context="#stay" String="\\[][;\\$`{}()|&<>* ]" /> + <RegExpr attribute="Keyword" context="#stay" String="\\$" /> + <RegExpr attribute="Escape" context="#stay" String="\{(?!(\s|$))\S*\}" /> + <RegExpr attribute="Path" context="#stay" String="&pathpart;*(?=/)" /> + <RegExpr attribute="Path" context="#stay" String="~\w*" /> + <RegExpr attribute="Path" context="#stay" String="/&pathpart;*(?=([\s/):;$`'"]|$))" /> + <!-- TODO: shell globs beside * and ? (in Path's) --> </context> - + <!-- FindStrings looks for single and double quoted strings, also with $-prefix --> <context attribute="Normal Text" lineEndContext="#stay" name="FindStrings"> - <DetectChar attribute="String SingleQ" context="StringSQ" char="'" /> - <DetectChar attribute="String DoubleQ" context="StringDQ" char=""" /> - <Detect2Chars attribute="String SingleQ" context="StringEsc" char="$" char1="'" /> - <Detect2Chars attribute="String Transl." context="StringDQ" char="$" char1=""" /> + <Detect2Chars attribute="Escape" context="#stay" char="\\" char1="'" /> + <Detect2Chars attribute="Escape" context="#stay" char="\\" char1=""" /> + <DetectChar attribute="String SingleQ" context="StringSQ" char="'" /> + <DetectChar attribute="String DoubleQ" context="StringDQ" char=""" /> + <Detect2Chars attribute="String SingleQ" context="StringEsc" char="$" char1="'" /> + <Detect2Chars attribute="String Transl." context="StringDQ" char="$" char1=""" /> </context> - + <!-- FindSubstitutions goes after anything starting with $ and ` and their escapes --> <context attribute="Normal Text" lineEndContext="#stay" name="FindSubstitutions"> - <RegExpr attribute="Variable" context="#stay" String="\$[*@#?$!_0-9-]" /> - <RegExpr attribute="Variable" context="Subscript" String="\$&varname;\[" /> - <RegExpr attribute="Variable" context="#stay" String="\$&varname;" /> - <RegExpr attribute="Variable" context="#stay" String="\$\{[*@#?$!_0-9-]\}" /> - <RegExpr attribute="Variable" context="#stay" String="\$\{#&varname;\}" /> - <RegExpr attribute="Variable" context="#stay" String="\$\{!&varname;\*?\}" /> - <RegExpr attribute="Variable" context="VarBrace" String="\$\{&varname;" /> - <RegExpr attribute="Variable" context="VarBrace" String="\$\{[*@#?$!_0-9-](?=[:#%/])" /> - <StringDetect attribute="Variable" context="ExprDblParenSubst" String="$((" beginRegion="expression" /> - <StringDetect attribute="Redirection" context="SubstFile" String="$(<" /> + <RegExpr attribute="Variable" context="Subscript" String="\$&varname;\[" /> + <RegExpr attribute="Variable" context="#stay" String="\$&varname;" /> + <RegExpr attribute="Variable" context="#stay" String="\$[*@#?$!_0-9-]" /> + <RegExpr attribute="Variable" context="#stay" String="\$\{[*@#?$!_0-9-]\}" /> + <RegExpr attribute="Variable" context="#stay" String="\$\{#&varname;(\[[*@]\])?\}" /> + <RegExpr attribute="Variable" context="#stay" String="\$\{!&varname;(\[[*@]\]|[*@])?\}" /> + <RegExpr attribute="Variable" context="VarBrace" String="\$\{&varname;" /> + <RegExpr attribute="Variable" context="VarBrace" String="\$\{[*@#?$!_0-9-](?=[:#%/=?+-])" /> + <StringDetect attribute="Variable" context="ExprDblParenSubst" String="$((" beginRegion="expression" /> + <StringDetect attribute="Redirection" context="SubstFile" String="$(<" /> <StringDetect attribute="Variable" context="SubstCommand" String="$(" /> - <DetectChar attribute="Backquote" context="SubstBackq" char="`" /> - <RegExpr attribute="Escape" context="#stay" String="\\[`$\\]" /> + <DetectChar attribute="Backquote" context="SubstBackq" char="`" /> + <RegExpr attribute="Escape" context="#stay" String="\\[`$\\]" /> + </context> + + <!-- FindTests finds operators valid in tests --> + <context attribute="Normal Text" lineEndContext="#stay" name="FindTests"> + <RegExpr attribute="Expression" context="#stay" String="-[abcdefghkprstuwxOGLSNozn](?=\s)"/> + <RegExpr attribute="Expression" context="#stay" String="-([no]t|ef)(?=\s)"/> + <RegExpr attribute="Expression" context="#stay" String="([!=]=?|[><])(?=\s)"/> + <RegExpr attribute="Expression" context="#stay" String="-(eq|ne|[gl][te])(?=\s)"/> </context> - - - <!-- ====== These are the contexts that can be branched to ======= --> <!-- ExprDblParen consumes an expression started in command mode till )) --> <context attribute="Normal Text" lineEndContext="#stay" name="ExprDblParen"> - <Detect2Chars attribute="Keyword" context="#pop" char=")" char1=")" endRegion="expression" /> - <DetectChar attribute="Normal Text" context="ExprSubParen" char="(" /> - <IncludeRules context="FindMost" /> + <Detect2Chars attribute="Keyword" context="#pop" char=")" char1=")" endRegion="expression" /> + <DetectChar attribute="Normal Text" context="ExprSubParen" char="(" /> + <IncludeRules context="FindMost" /> </context> - + <!-- ExprDblParenSubst like ExprDblParen but matches )) as Variable --> <context attribute="Normal Text" lineEndContext="#stay" name="ExprDblParenSubst"> - <Detect2Chars attribute="Variable" context="#pop" char=")" char1=")" endRegion="expression" /> - <DetectChar attribute="Normal Text" context="ExprSubParen" char="(" /> - <IncludeRules context="FindMost" /> + <Detect2Chars attribute="Variable" context="#pop" char=")" char1=")" endRegion="expression" /> + <DetectChar attribute="Normal Text" context="ExprSubParen" char="(" /> + <IncludeRules context="FindMost" /> </context> <!-- ExprSubParen consumes an expression till ) --> <context attribute="Normal Text" lineEndContext="#stay" name="ExprSubParen"> - <DetectChar attribute="Normal Text" context="#pop" char=")" /> - <DetectChar attribute="Normal Text" context="ExprSubParen" char="(" /> - <IncludeRules context="FindMost" /> + <DetectChar attribute="Normal Text" context="#pop" char=")" /> + <DetectChar attribute="Normal Text" context="ExprSubParen" char="(" /> + <IncludeRules context="FindMost" /> </context> <!-- ExprBracket consumes an expression till ] --> <context attribute="Normal Text" lineEndContext="#stay" name="ExprBracket"> - <RegExpr attribute="Builtin" context="#pop" String="\s\](?=($|[\s;|&]))" endRegion="expression" /> - <RegExpr attribute="Builtin" context="#pop" String="\](?=($|[\s;|&]))" endRegion="expression" column="0"/> - <DetectChar attribute="Normal Text" context="ExprSubParen" char="(" /> - <IncludeRules context="FindMost" /> + <RegExpr attribute="Builtin" context="#pop" String="\s\](?=($|[\s;|&]))" endRegion="expression" /> + <RegExpr attribute="Builtin" context="#pop" String="\](?=($|[\s;|&]))" endRegion="expression" column="0"/> + <DetectChar attribute="Normal Text" context="ExprSubParen" char="(" /> + <IncludeRules context="FindTests" /> + <IncludeRules context="FindMost" /> </context> <!-- ExprDblBracket consumes an expression till ]] --> <context attribute="Normal Text" lineEndContext="#stay" name="ExprDblBracket"> - <RegExpr attribute="Keyword" context="#pop" String="\s\]\](?=($|[\s;|&]))" endRegion="expression" /> - <RegExpr attribute="Keyword" context="#pop" String="\]\](?=($|[\s;|&]))" endRegion="expression" column="0"/> - <DetectChar attribute="Normal Text" context="ExprSubParen" char="(" /> - <IncludeRules context="FindMost" /> + <RegExpr attribute="Keyword" context="#pop" String="\s\]\](?=($|[\s;|&]))" endRegion="expression" /> + <RegExpr attribute="Keyword" context="#pop" String="\]\](?=($|[\s;|&]))" endRegion="expression" column="0"/> + <DetectChar attribute="Normal Text" context="ExprSubParen" char="(" /> + <IncludeRules context="FindTests" /> + <IncludeRules context="FindMost" /> </context> <!-- Group consumes shell input till } --> <context attribute="Normal Text" lineEndContext="#stay" name="Group"> - <DetectChar attribute="Keyword" context="#pop" char="}" endRegion="group" /> - <IncludeRules context="FindAll" /> - </context> + <DetectChar attribute="Keyword" context="#pop" char="}" endRegion="group" /> + <IncludeRules context="FindAll" /> + </context> <!-- SubShell consumes shell input till ) --> <context attribute="Normal Text" lineEndContext="#stay" name="SubShell"> - <DetectChar attribute="Keyword" context="#pop" char=")" endRegion="subshell" /> - <IncludeRules context="FindAll" /> - </context> + <DetectChar attribute="Keyword" context="#pop" char=")" endRegion="subshell" /> + <IncludeRules context="FindAll" /> + </context> <!-- Assign consumes an expression till EOL or whitespace --> <context attribute="Normal Text" lineEndContext="#pop" name="Assign" fallthrough="true" fallthroughContext="#pop"> - <DetectChar attribute="Variable" context="AssignArray" char="(" /> - <IncludeRules context="FindStrings" /> - <IncludeRules context="FindSubstitutions" /> - <IncludeRules context="FindOthers" /> - <RegExpr attribute="Normal Text" context="#stay" String="[\w:,+_./-]+" /> + <DetectChar attribute="Variable" context="AssignArray" char="(" /> + <IncludeRules context="FindStrings" /> + <IncludeRules context="FindSubstitutions" /> + <IncludeRules context="FindOthers" /> + <RegExpr attribute="Normal Text" context="#stay" String="[\w:,+_./-]" /> </context> <!-- AssignArray consumes everything till ), marking assignments --> <context attribute="Normal Text" lineEndContext="#pop" name="AssignArray"> - <DetectChar attribute="Variable" context="#pop" char=")" /> - <DetectChar attribute="Variable" context="Subscript" char="[" /> - <DetectChar attribute="Variable" context="Assign" char="=" /> - <IncludeRules context="FindMost" /> + <DetectChar attribute="Variable" context="#pop" char=")" /> + <DetectChar attribute="Variable" context="Subscript" char="[" /> + <DetectChar attribute="Variable" context="Assign" char="=" /> + <IncludeRules context="FindMost" /> </context> - + <!-- AssignSubscr first expects a [ then parses subscript and continues with '=value' --> <context attribute="Normal Text" lineEndContext="#pop" name="AssignSubscr" fallthrough="true" fallthroughContext="#pop"> - <DetectChar attribute="Variable" context="Subscript" char="[" /> - <DetectChar attribute="Variable" context="Assign" char="=" /> - <IncludeRules context="FindStrings" /> - <IncludeRules context="FindSubstitutions" /> - <IncludeRules context="FindOthers" /> + <DetectChar attribute="Variable" context="Subscript" char="[" /> + <Detect2Chars attribute="Variable" context="Assign" char="+" char1="=" /> + <DetectChar attribute="Variable" context="Assign" char="=" /> + <IncludeRules context="FindStrings" /> + <IncludeRules context="FindSubstitutions" /> + <IncludeRules context="FindOthers" /> </context> <!-- Subscript consumes anything till ], marks as Variable --> <context attribute="Variable" lineEndContext="#stay" name="Subscript"> - <DetectChar attribute="Variable" context="#pop" char="]" /> - <IncludeRules context="FindStrings" /> - <IncludeRules context="FindSubstitutions" /> - <IncludeRules context="FindOthers" /> + <DetectChar attribute="Variable" context="#pop" char="]" /> + <IncludeRules context="FindStrings" /> + <IncludeRules context="FindSubstitutions" /> + <IncludeRules context="FindOthers" /> </context> - + <!-- FunctionDef consumes a name, possibly with (), marks as Function --> <context attribute="Function" lineEndContext="#pop" name="FunctionDef" fallthrough="true" fallthroughContext="#pop"> - <RegExpr attribute="Function" context="#pop" String="\s+&funcname;(\s*\(\))?" /> - </context> - + <RegExpr attribute="Function" context="#pop" String="\s+&funcname;(\s*\(\))?" /> + </context> + <!-- VarName consumes spare variable names and assignments --> <context attribute="Normal Text" lineEndContext="#pop" name="VarName" fallthrough="true" fallthroughContext="#pop"> - <!-- handle command line options --> - <RegExpr attribute="Option" context="#stay" String="-[A-Za-z0-9]+" /> - <RegExpr attribute="Option" context="#stay" String="--[a-z][A-Za-z0-9_-]*" /> - <RegExpr attribute="Variable" context="#stay" String="\b&varname;" /> - <DetectChar attribute="Variable" context="Subscript" char="[" /> - <DetectChar attribute="Variable" context="Assign" char="=" /> - <IncludeRules context="FindMost" /> - <!-- stay here in spaces and other safe characters --> - <RegExpr attribute="Normal Text" context="#stay" String="[^]})|;`&><]" /> + <!-- handle command line options --> + <RegExpr attribute="Option" context="#stay" String="-[A-Za-z0-9]+" /> + <RegExpr attribute="Option" context="#stay" String="--[a-z][A-Za-z0-9_-]*" /> + <RegExpr attribute="Variable" context="#stay" String="\b&varname;" /> + <DetectChar attribute="Variable" context="Subscript" char="[" /> + <DetectChar attribute="Variable" context="Assign" char="=" /> + <IncludeRules context="FindMost" /> + <!-- stay here in spaces and other safe characters --> + <RegExpr attribute="Normal Text" context="#stay" String="[^]})|;`&><]" /> </context> <!-- ProcessSubst handles <(command) and >(command) --> <context attribute="Normal Text" lineEndContext="#stay" name="ProcessSubst"> - <DetectChar attribute="Redirection" context="#pop" char=")" /> - <IncludeRules context="FindCommentsParen" /> - <IncludeRules context="FindCommands" /> - <IncludeRules context="FindStrings" /> - <IncludeRules context="FindSubstitutions" /> - <IncludeRules context="FindOthers" /> + <DetectChar attribute="Redirection" context="#pop" char=")" /> + <IncludeRules context="FindCommentsParen" /> + <IncludeRules context="FindCommands" /> + <IncludeRules context="FindStrings" /> + <IncludeRules context="FindSubstitutions" /> + <IncludeRules context="FindOthers" /> </context> - <!-- StringSQ consumes anything till ' --> + <!-- StringSQ consumes anything till ' --> <context attribute="String SingleQ" lineEndContext="#stay" name="StringSQ"> - <DetectChar attribute="String SingleQ" context="#pop" char="'" /> + <DetectChar attribute="String SingleQ" context="#pop" char="'" /> </context> <!-- StringDQ consumes anything till ", substitutes vars and expressions --> <context attribute="String DoubleQ" lineEndContext="#stay" name="StringDQ"> - <DetectChar attribute="String DoubleQ" context="#pop" char=""" /> - <RegExpr attribute="String Escape" context="#stay" String="\\[`"\\$\n]" /> - <IncludeRules context="FindSubstitutions" /> + <DetectChar attribute="String DoubleQ" context="#pop" char=""" /> + <RegExpr attribute="String Escape" context="#stay" String="\\[`"\\$\n]" /> + <IncludeRules context="FindSubstitutions" /> </context> - + <!-- StringEsc eats till ', but escaping many characters --> <context attribute="String SingleQ" lineEndContext="#stay" name="StringEsc"> - <DetectChar attribute="String SingleQ" context="#pop" char="'" /> - <RegExpr attribute="String Escape" context="#stay" String="\\[abefnrtv\\']" /> - <RegExpr attribute="String Escape" context="#stay" String="\\([0-7]{1,3}|x[A-Fa-f0-9]{1,2}|c.)" /> + <DetectChar attribute="String SingleQ" context="#pop" char="'" /> + <RegExpr attribute="String Escape" context="#stay" String="\\[abefnrtv\\']" /> + <RegExpr attribute="String Escape" context="#stay" String="\\([0-7]{1,3}|x[A-Fa-f0-9]{1,2}|c.)" /> </context> <!-- VarBrace is called as soon as ${xxx is encoutered --> - <context attribute="Variable" lineEndContext="#stay" name="VarBrace"> + <context attribute="Error" lineEndContext="#stay" name="VarBrace"> <DetectChar attribute="Variable" context="#pop" char="}" /> - <DetectChar attribute="Variable" context="Subscript" char="[" /> - <IncludeRules context="FindStrings" /> - <IncludeRules context="FindSubstitutions" /> - <!-- TODO: highlight various special parameter expansions } --> + <DetectChar attribute="Variable" context="Subscript" char="[" /> + <RegExpr attribute="Variable" context="VarAlt" String="(:?[-=?+]|##?|%%?)" /> + <RegExpr attribute="Variable" context="VarSubst" String="//?" /> + <DetectChar attribute="Variable" context="VarSub" char=":" /> + </context> + + <!-- VarAlt is to handle default/alternate/etc values of variables --> + <context attribute="Normal Text" lineEndContext="#stay" name="VarAlt"> + <DetectChar attribute="Variable" context="#pop#pop" char="}" /> + <IncludeRules context="FindStrings" /> + <IncludeRules context="FindSubstitutions" /> + </context> + + <!-- VarSubst is to handle substitutions on variables --> + <context attribute="Normal Text" lineEndContext="#stay" name="VarSubst"> + <DetectChar attribute="Variable" context="#pop#pop" char="}" /> + <DetectChar attribute="Variable" context="VarSubst2" char="/" /> + <IncludeRules context="FindStrings" /> + <IncludeRules context="FindSubstitutions" /> </context> - + <context attribute="Normal Text" lineEndContext="#stay" name="VarSubst2"> + <DetectChar attribute="Variable" context="#pop#pop#pop" char="}" /> + <IncludeRules context="FindStrings" /> + <IncludeRules context="FindSubstitutions" /> + </context> + + <!-- VarSub is to substrings of variables --> + <context attribute="Error" lineEndContext="#stay" name="VarSub"> + <DetectChar attribute="Variable" context="VarSub2" char=":" /> + <DetectChar attribute="Variable" context="#pop#pop" char="}" /> + <RegExpr attribute="Variable" context="#stay" String="&varname;" /> + <RegExpr attribute="Variable" context="#stay" String="[0-9]+(?=[:}])" /> + <IncludeRules context="FindSubstitutions" /> + </context> + <context attribute="Error" lineEndContext="#stay" name="VarSub2"> + <DetectChar attribute="Variable" context="#pop#pop#pop" char="}" /> + <RegExpr attribute="Variable" context="#stay" String="&varname;" /> + <RegExpr attribute="Variable" context="#stay" String="[0-9](?=[:}])" /> + <IncludeRules context="FindSubstitutions" /> + </context> + + <!-- SubstFile is called after a <( or >( is encoutered --> <context attribute="Normal Text" lineEndContext="#stay" name="SubstFile"> - <DetectChar attribute="Redirection" context="#pop" char=")" /> - <IncludeRules context="FindCommentsParen" /> - <IncludeRules context="FindStrings" /> - <IncludeRules context="FindSubstitutions" /> - <IncludeRules context="FindOthers" /> + <DetectChar attribute="Redirection" context="#pop" char=")" /> + <IncludeRules context="FindCommentsParen" /> + <IncludeRules context="FindStrings" /> + <IncludeRules context="FindSubstitutions" /> + <IncludeRules context="FindOthers" /> </context> - + <!-- SubstCommand is called after a $( is encountered --> <context attribute="Normal Text" lineEndContext="#stay" name="SubstCommand"> - <DetectChar attribute="Variable" context="#pop" char=")" /> - <IncludeRules context="FindCommentsParen" /> - <IncludeRules context="FindCommands" /> - <IncludeRules context="FindStrings" /> - <IncludeRules context="FindSubstitutions" /> - <IncludeRules context="FindOthers" /> - </context> - + <DetectChar attribute="Variable" context="#pop" char=")" /> + <IncludeRules context="FindCommentsParen" /> + <IncludeRules context="FindCommands" /> + <IncludeRules context="FindStrings" /> + <IncludeRules context="FindSubstitutions" /> + <IncludeRules context="FindOthers" /> + </context> + <!-- SubstBackq is called when a backquote is encountered --> <context attribute="Normal Text" lineEndContext="#stay" name="SubstBackq"> - <DetectChar attribute="Keyword" context="#pop" char="`" /> - <IncludeRules context="FindCommentsBackq" /> - <IncludeRules context="FindCommands" /> - <IncludeRules context="FindStrings" /> - <IncludeRules context="FindSubstitutions" /> - <IncludeRules context="FindOthers" /> + <DetectChar attribute="Backquote" context="#pop" char="`" /> + <IncludeRules context="FindCommentsBackq" /> + <IncludeRules context="FindCommands" /> + <IncludeRules context="FindStrings" /> + <IncludeRules context="FindSubstitutions" /> + <IncludeRules context="FindOthers" /> </context> <!-- Case is called after the case keyword is encoutered. We handle this because of @@ -747,58 +802,59 @@ <!-- CaseIn is called when the construct 'case ... in' has been found. --> <context attribute="Normal Text" lineEndContext="#stay" name="CaseIn"> <RegExpr attribute="Keyword" context="#pop#pop" String="\besac(?=$|[\s;)])" endRegion="case" /> - <DetectChar attribute="Keyword" context="CaseExpr" char=")" beginRegion="caseexpr" /> - <AnyChar attribute="Keyword" context="#stay" String="(|" /> + <DetectChar attribute="Keyword" context="CaseExpr" char=")" beginRegion="caseexpr" /> + <AnyChar attribute="Keyword" context="#stay" String="(|" /> <IncludeRules context="FindMost" /> </context> <!-- CaseExpr eats shell input till ;; --> <context attribute="Normal Text" lineEndContext="#stay" name="CaseExpr"> <Detect2Chars attribute="Keyword" context="#pop" char=";" char1=";" endRegion="caseexpr" /> - <IncludeRules context="FindAll" /> + <RegExpr attribute="Keyword" context="#pop" String="esac(?=$|[\s;)])" lookAhead="true" firstNonSpace="true" endRegion="caseexpr"/> + <IncludeRules context="FindAll" /> </context> <!-- HereDoc consumes Here-documents. It is called at the beginning of the "<<" construct. --> <context attribute="Normal Text" lineEndContext="#stay" name="HereDoc"> - <RegExpr attribute="Redirection" context="HereDocQ" String="(<<\s*"(&word;)")" lookAhead="true" /> - <RegExpr attribute="Redirection" context="HereDocQ" String="(<<\s*'(&word;)')" lookAhead="true" /> - <RegExpr attribute="Redirection" context="HereDocQ" String="(<<\s*\\(&word;))" lookAhead="true" /> - <RegExpr attribute="Redirection" context="HereDocNQ" String="(<<(?!-)\s*(&word;))" lookAhead="true" /> - <RegExpr attribute="Redirection" context="HereDocIQ" String="(<<-\s*"(&word;)")" lookAhead="true" /> - <RegExpr attribute="Redirection" context="HereDocIQ" String="(<<-\s*'(&word;)')" lookAhead="true" /> - <RegExpr attribute="Redirection" context="HereDocIQ" String="(<<-\s*\\(&word;))" lookAhead="true" /> - <RegExpr attribute="Redirection" context="HereDocINQ" String="(<<-\s*(&word;))" lookAhead="true" /> - <StringDetect attribute="Redirection" context="#pop" String="<<" /><!-- always met --> + <RegExpr attribute="Redirection" context="HereDocIQ" String="(<<-\s*"(&word;)")" lookAhead="true" /> + <RegExpr attribute="Redirection" context="HereDocIQ" String="(<<-\s*'(&word;)')" lookAhead="true" /> + <RegExpr attribute="Redirection" context="HereDocIQ" String="(<<-\s*\\(&word;))" lookAhead="true" /> + <RegExpr attribute="Redirection" context="HereDocINQ" String="(<<-\s*(&word;))" lookAhead="true" /> + <RegExpr attribute="Redirection" context="HereDocQ" String="(<<\s*"(&word;)")" lookAhead="true" /> + <RegExpr attribute="Redirection" context="HereDocQ" String="(<<\s*'(&word;)')" lookAhead="true" /> + <RegExpr attribute="Redirection" context="HereDocQ" String="(<<\s*\\(&word;))" lookAhead="true" /> + <RegExpr attribute="Redirection" context="HereDocNQ" String="(<<\s*(&word;))" lookAhead="true" /> + <StringDetect attribute="Redirection" context="#pop" String="<<" /><!-- always met --> </context> <context attribute="Normal Text" lineEndContext="#pop" name="HereDocRemainder"> - <IncludeRules context="FindAll" /> + <IncludeRules context="FindAll" /> </context> <context attribute="Normal Text" lineEndContext="#stay" name="HereDocQ" dynamic="true"> - <RegExpr attribute="Redirection" context="HereDocRemainder" String="%1" dynamic="true" /> - <RegExpr attribute="Redirection" context="#pop#pop" String="%2[\s;]*$" dynamic="true" column="0"/> + <RegExpr attribute="Redirection" context="HereDocRemainder" String="%1" dynamic="true" /> + <RegExpr attribute="Redirection" context="#pop#pop" String="^%2\b" dynamic="true" column="0"/> </context> <context attribute="Normal Text" lineEndContext="#stay" name="HereDocNQ" dynamic="true"> - <RegExpr attribute="Redirection" context="HereDocRemainder" String="%1" dynamic="true" /> - <RegExpr attribute="Redirection" context="#pop#pop" String="%2[\s;]*$" dynamic="true" column="0"/> - <IncludeRules context="FindSubstitutions" /> + <RegExpr attribute="Redirection" context="HereDocRemainder" String="%1" dynamic="true" /> + <RegExpr attribute="Redirection" context="#pop#pop" String="^%2\b" dynamic="true" column="0"/> + <IncludeRules context="FindSubstitutions" /> </context> <context attribute="Normal Text" lineEndContext="#stay" name="HereDocIQ" dynamic="true"> - <RegExpr attribute="Redirection" context="HereDocRemainder" String="%1" dynamic="true" /> - <RegExpr attribute="Redirection" context="#pop#pop" String="\s*%2[\s;]*$" dynamic="true" column="0"/> + <RegExpr attribute="Redirection" context="HereDocRemainder" String="%1" dynamic="true" /> + <RegExpr attribute="Redirection" context="#pop#pop" String="^\t*%2\b" dynamic="true" column="0"/> </context> <context attribute="Normal Text" lineEndContext="#stay" name="HereDocINQ" dynamic="true"> - <RegExpr attribute="Redirection" context="HereDocRemainder" String="%1" dynamic="true" /> - <RegExpr attribute="Redirection" context="#pop#pop" String="\s*%2[\s;]*$" dynamic="true" column="0"/> - <IncludeRules context="FindSubstitutions" /> + <RegExpr attribute="Redirection" context="HereDocRemainder" String="%1" dynamic="true" /> + <RegExpr attribute="Redirection" context="#pop#pop" String="^\t*%2\b" dynamic="true" column="0"/> + <IncludeRules context="FindSubstitutions" /> </context> </contexts> - + <itemDatas> <itemData name="Normal Text" defStyleNum="dsNormal" /> <itemData name="Comment" defStyleNum="dsComment" /> @@ -815,15 +871,16 @@ <itemData name="String Escape" defStyleNum="dsDataType" /> <itemData name="Variable" defStyleNum="dsOthers" /> <itemData name="Expression" defStyleNum="dsOthers" /> - <itemData name="Function" defStyleNum="dsChar" bold="1" /> + <itemData name="Function" defStyleNum="dsFunction" /> <itemData name="Path" defStyleNum="dsNormal" /> <itemData name="Option" defStyleNum="dsNormal" /> + <itemData name="Error" defStyleNum="dsError" /> </itemDatas> </highlighting> <general> <comments> <comment name="singleLine" start="#"/> </comments> - <keywords casesensitive="1" weakDeliminator="^%#[]$._{}:-" additionalDeliminator="`"/> + <keywords casesensitive="1" weakDeliminator="^%#[]$._{}:-/" additionalDeliminator="`"/> </general> </language> |