1071d4279SBram Moolenaar" Vim syntax file 2071d4279SBram Moolenaar" Language: sed 3071d4279SBram Moolenaar" Maintainer: Haakon Riiser <[email protected]> 4071d4279SBram Moolenaar" URL: http://folk.uio.no/hakonrk/vim/syntax/sed.vim 59db58063SBram Moolenaar" Last Change: 2010 May 29 6071d4279SBram Moolenaar 789bcfda6SBram Moolenaar" quit when a syntax file was already loaded 889bcfda6SBram Moolenaarif exists("b:current_syntax") 9071d4279SBram Moolenaar finish 10071d4279SBram Moolenaarendif 11071d4279SBram Moolenaar 12071d4279SBram Moolenaarsyn match sedError "\S" 13071d4279SBram Moolenaar 14071d4279SBram Moolenaarsyn match sedWhitespace "\s\+" contained 15071d4279SBram Moolenaarsyn match sedSemicolon ";" 16071d4279SBram Moolenaarsyn match sedAddress "[[:digit:]$]" 17071d4279SBram Moolenaarsyn match sedAddress "\d\+\~\d\+" 18071d4279SBram Moolenaarsyn region sedAddress matchgroup=Special start="[{,;]\s*/\(\\/\)\="lc=1 skip="[^\\]\(\\\\\)*\\/" end="/I\=" contains=sedTab,sedRegexpMeta 19071d4279SBram Moolenaarsyn region sedAddress matchgroup=Special start="^\s*/\(\\/\)\=" skip="[^\\]\(\\\\\)*\\/" end="/I\=" contains=sedTab,sedRegexpMeta 20071d4279SBram Moolenaarsyn match sedComment "^\s*#.*$" 2112033fb4SBram Moolenaarsyn match sedFunction "[dDgGhHlnNpPqQx=]\s*\($\|;\)" contains=sedSemicolon,sedWhitespace 22071d4279SBram Moolenaarsyn match sedLabel ":[^;]*" 23071d4279SBram Moolenaarsyn match sedLineCont "^\(\\\\\)*\\$" contained 24071d4279SBram Moolenaarsyn match sedLineCont "[^\\]\(\\\\\)*\\$"ms=e contained 25071d4279SBram Moolenaarsyn match sedSpecial "[{},!]" 26071d4279SBram Moolenaarif exists("highlight_sedtabs") 27071d4279SBram Moolenaar syn match sedTab "\t" contained 28071d4279SBram Moolenaarendif 29071d4279SBram Moolenaar 30071d4279SBram Moolenaar" Append/Change/Insert 31071d4279SBram Moolenaarsyn region sedACI matchgroup=sedFunction start="[aci]\\$" matchgroup=NONE end="^.*$" contains=sedLineCont,sedTab 32071d4279SBram Moolenaar 33071d4279SBram Moolenaarsyn region sedBranch matchgroup=sedFunction start="[bt]" matchgroup=sedSemicolon end=";\|$" contains=sedWhitespace 34071d4279SBram Moolenaarsyn region sedRW matchgroup=sedFunction start="[rw]" matchgroup=sedSemicolon end=";\|$" contains=sedWhitespace 35071d4279SBram Moolenaar 36071d4279SBram Moolenaar" Substitution/transform with various delimiters 37071d4279SBram Moolenaarsyn region sedFlagwrite matchgroup=sedFlag start="w" matchgroup=sedSemicolon end=";\|$" contains=sedWhitespace contained 38071d4279SBram Moolenaarsyn match sedFlag "[[:digit:]gpI]*w\=" contains=sedFlagwrite contained 39071d4279SBram Moolenaarsyn match sedRegexpMeta "[.*^$]" contained 40071d4279SBram Moolenaarsyn match sedRegexpMeta "\\." contains=sedTab contained 41071d4279SBram Moolenaarsyn match sedRegexpMeta "\[.\{-}\]" contains=sedTab contained 42071d4279SBram Moolenaarsyn match sedRegexpMeta "\\{\d\*,\d*\\}" contained 43071d4279SBram Moolenaarsyn match sedRegexpMeta "\\(.\{-}\\)" contains=sedTab contained 44071d4279SBram Moolenaarsyn match sedReplaceMeta "&\|\\\($\|.\)" contains=sedTab contained 45071d4279SBram Moolenaar 46071d4279SBram Moolenaar" Metacharacters: $ * . \ ^ [ ~ 47071d4279SBram Moolenaar" @ is used as delimiter and treated on its own below 48071d4279SBram Moolenaarlet __at = char2nr("@") 499db58063SBram Moolenaarlet __sed_i = char2nr(" ") " ASCII: 32, EBCDIC: 64 50071d4279SBram Moolenaarif has("ebcdic") 51071d4279SBram Moolenaar let __sed_last = 255 52071d4279SBram Moolenaarelse 53071d4279SBram Moolenaar let __sed_last = 126 54071d4279SBram Moolenaarendif 55071d4279SBram Moolenaarlet __sed_metacharacters = '$*.\^[~' 56071d4279SBram Moolenaarwhile __sed_i <= __sed_last 57071d4279SBram Moolenaar let __sed_delimiter = escape(nr2char(__sed_i), __sed_metacharacters) 58071d4279SBram Moolenaar if __sed_i != __at 59071d4279SBram Moolenaar exe 'syn region sedAddress matchgroup=Special start=@\\'.__sed_delimiter.'\(\\'.__sed_delimiter.'\)\=@ skip=@[^\\]\(\\\\\)*\\'.__sed_delimiter.'@ end=@'.__sed_delimiter.'I\=@ contains=sedTab' 60071d4279SBram Moolenaar exe 'syn region sedRegexp'.__sed_i 'matchgroup=Special start=@'.__sed_delimiter.'\(\\\\\|\\'.__sed_delimiter.'\)*@ skip=@[^\\'.__sed_delimiter.']\(\\\\\)*\\'.__sed_delimiter.'@ end=@'.__sed_delimiter.'@me=e-1 contains=sedTab,sedRegexpMeta keepend contained nextgroup=sedReplacement'.__sed_i 61071d4279SBram Moolenaar exe 'syn region sedReplacement'.__sed_i 'matchgroup=Special start=@'.__sed_delimiter.'\(\\\\\|\\'.__sed_delimiter.'\)*@ skip=@[^\\'.__sed_delimiter.']\(\\\\\)*\\'.__sed_delimiter.'@ end=@'.__sed_delimiter.'@ contains=sedTab,sedReplaceMeta keepend contained nextgroup=sedFlag' 62071d4279SBram Moolenaar endif 63071d4279SBram Moolenaar let __sed_i = __sed_i + 1 64071d4279SBram Moolenaarendwhile 65071d4279SBram Moolenaarsyn region sedAddress matchgroup=Special start=+\\@\(\\@\)\=+ skip=+[^\\]\(\\\\\)*\\@+ end=+@I\=+ contains=sedTab,sedRegexpMeta 66071d4279SBram Moolenaarsyn region sedRegexp64 matchgroup=Special start=+@\(\\\\\|\\@\)*+ skip=+[^\\@]\(\\\\\)*\\@+ end=+@+me=e-1 contains=sedTab,sedRegexpMeta keepend contained nextgroup=sedReplacement64 67071d4279SBram Moolenaarsyn region sedReplacement64 matchgroup=Special start=+@\(\\\\\|\\@\)*+ skip=+[^\\@]\(\\\\\)*\\@+ end=+@+ contains=sedTab,sedReplaceMeta keepend contained nextgroup=sedFlag 68071d4279SBram Moolenaar 69071d4279SBram Moolenaar" Since the syntax for the substituion command is very similar to the 70071d4279SBram Moolenaar" syntax for the transform command, I use the same pattern matching 71071d4279SBram Moolenaar" for both commands. There is one problem -- the transform command 72071d4279SBram Moolenaar" (y) does not allow any flags. To save memory, I ignore this problem. 73071d4279SBram Moolenaarsyn match sedST "[sy]" nextgroup=sedRegexp\d\+ 74071d4279SBram Moolenaar 75071d4279SBram Moolenaar 76*f37506f6SBram Moolenaarhi def link sedAddress Macro 77*f37506f6SBram Moolenaarhi def link sedACI NONE 78*f37506f6SBram Moolenaarhi def link sedBranch Label 79*f37506f6SBram Moolenaarhi def link sedComment Comment 80*f37506f6SBram Moolenaarhi def link sedDelete Function 81*f37506f6SBram Moolenaarhi def link sedError Error 82*f37506f6SBram Moolenaarhi def link sedFlag Type 83*f37506f6SBram Moolenaarhi def link sedFlagwrite Constant 84*f37506f6SBram Moolenaarhi def link sedFunction Function 85*f37506f6SBram Moolenaarhi def link sedLabel Label 86*f37506f6SBram Moolenaarhi def link sedLineCont Special 87*f37506f6SBram Moolenaarhi def link sedPutHoldspc Function 88*f37506f6SBram Moolenaarhi def link sedReplaceMeta Special 89*f37506f6SBram Moolenaarhi def link sedRegexpMeta Special 90*f37506f6SBram Moolenaarhi def link sedRW Constant 91*f37506f6SBram Moolenaarhi def link sedSemicolon Special 92*f37506f6SBram Moolenaarhi def link sedST Function 93*f37506f6SBram Moolenaarhi def link sedSpecial Special 94*f37506f6SBram Moolenaarhi def link sedWhitespace NONE 95071d4279SBram Moolenaarif exists("highlight_sedtabs") 96*f37506f6SBram Moolenaarhi def link sedTab Todo 97071d4279SBram Moolenaarendif 989db58063SBram Moolenaarlet __sed_i = char2nr(" ") " ASCII: 32, EBCDIC: 64 999db58063SBram Moolenaarwhile __sed_i <= __sed_last 100*f37506f6SBram Moolenaarexe "hi def link sedRegexp".__sed_i "Macro" 101*f37506f6SBram Moolenaarexe "hi def link sedReplacement".__sed_i "NONE" 102071d4279SBram Moolenaarlet __sed_i = __sed_i + 1 103071d4279SBram Moolenaarendwhile 104071d4279SBram Moolenaar 105071d4279SBram Moolenaar 1069db58063SBram Moolenaarunlet __sed_i __sed_last __sed_delimiter __sed_metacharacters 107071d4279SBram Moolenaar 108071d4279SBram Moolenaarlet b:current_syntax = "sed" 109071d4279SBram Moolenaar 110071d4279SBram Moolenaar" vim: sts=4 sw=4 ts=8 111