" Vim syntax file " Language: Plan 9 rc shell " Maintainer: Noah if version < 600 syntax clear elseif exists("b:current_syntax") finish endif syn iskeyword @,48-57,_,* syn case match syn cluster rcshTop contains=rcshComment,rcshString,rcshBackquote,rcshBlock,rcshVar,rcshCountVar,rcshFlatVar,rcshSubscript,rcshRedir,rcshPipe,rcshConditional,rcshOperator,rcshDelimiter,rcshKeyword,rcshBuiltin,rcshPatternClass,rcshPattern,rcshShebang,rcshContinuation " rc only uses single quotes for strings. A literal quote is written as ''. " Double quotes are deliberately not a string delimiter; $"var and $^var are " flattening operators. syn region rcshString matchgroup=rcshQuote keepend extend start="'" skip="''" end="'" contains=rcshQuoteQuote,@Spell syn match rcshQuoteQuote contained "''" syn match rcshComment "#.*" contains=rcshTodo,@Spell extend syn keyword rcshTodo contained TODO TBD FIXME XXX NOTE BUG WARNING DEBUG OPTIMIZATION WORKAROUND syn match rcshShebang "^#!.*\<\%(env\s\+\)\?rc\>\%(\s\+.*\)\?$" contains=rcshOption syn match rcshOption contained "\s-\S\+" " A backslash is ordinary in rc, except before a newline. syn match rcshContinuation "\\\n" syn keyword rcshKeyword if else for in while switch case fn syn keyword rcshBuiltin break builtin cd continue echo eval exec exit flag limit newpgrp return shift umask wait whatis syn match rcshBuiltin "\(^\|[ \t;|&(){}]\)\zs\.\ze\($\|[ \t;|&(){}]\)" syn match rcshConditional "&&\|||" syn match rcshPipe "|\%(\[\d\+\%([=]\d*\)\?\]\)\?" syn match rcshRedir "\%(>>\|<<<\|<<\|<\|>\)\%(\[\d\+\%([=]\d*\)\?\]\)\?" syn match rcshOperator "[=^~!@`$]" syn match rcshDelimiter "[;&()]" syn region rcshBlock matchgroup=rcshDelimiter keepend extend start="{" end="}" contains=@rcshTop,@NoSpell syn region rcshBackquote matchgroup=rcshBackquoteDelimiter keepend extend start="`{" end="}" contains=@rcshTop,@NoSpell syn match rcshBackquoteDelimiter "``" syn match rcshCountVar "\$#\%([A-Za-z0-9_*]\+\|'[^']*\%(''[^']*\)*'\)" syn match rcshFlatVar "\$[\^"]\%([A-Za-z0-9_*]\+\|'[^']*\%(''[^']*\)*'\)" syn match rcshVar "\$[A-Za-z0-9_*]\+" syn match rcshVar "\$\ze'" syn region rcshSubscript matchgroup=rcshDelimiter keepend extend start="\%(\$[#\^"]\?\)\?[A-Za-z0-9_*]\+(" end=")" contains=@rcshTop,@NoSpell syn region rcshPatternClass matchgroup=rcshPattern keepend extend oneline start="\[^\?" end="\]" contains=rcshPatternRange syn match rcshPatternRange contained "\(\[^\?\)\@= 508 || !exists("did_rcsh_syn_inits") if version < 508 let did_rcsh_syn_inits = 1 command -nargs=+ HiLink hi link else command -nargs=+ HiLink hi def link endif HiLink rcshBackquote PreProc HiLink rcshBackquoteDelimiter Include HiLink rcshBuiltin Statement HiLink rcshComment Comment HiLink rcshConditional Conditional HiLink rcshContinuation Special HiLink rcshCountVar Special HiLink rcshDelimiter Delimiter HiLink rcshFlatVar Special HiLink rcshKeyword Keyword HiLink rcshOperator Operator HiLink rcshOption PreProc HiLink rcshPattern SpecialChar HiLink rcshPatternRange SpecialChar HiLink rcshPipe Type HiLink rcshQuote String HiLink rcshQuoteQuote SpecialChar HiLink rcshRedir Type HiLink rcshShebang Comment HiLink rcshString String HiLink rcshSubscript Identifier HiLink rcshTodo Todo HiLink rcshVar Identifier delcommand HiLink endif let b:current_syntax = "rcsh"