1" Vim syntax file 2" Language: sed 3" Maintainer: Haakon Riiser <[email protected]> 4" URL: http://folk.uio.no/hakonrk/vim/syntax/sed.vim 5" Last Change: 2010 May 29 6 7" quit when a syntax file was already loaded 8if exists("b:current_syntax") 9 finish 10endif 11 12syn match sedError "\S" 13 14syn match sedWhitespace "\s\+" contained 15syn match sedSemicolon ";" 16syn match sedAddress "[[:digit:]$]" 17syn match sedAddress "\d\+\~\d\+" 18syn region sedAddress matchgroup=Special start="[{,;]\s*/\(\\/\)\="lc=1 skip="[^\\]\(\\\\\)*\\/" end="/I\=" contains=sedTab,sedRegexpMeta 19syn region sedAddress matchgroup=Special start="^\s*/\(\\/\)\=" skip="[^\\]\(\\\\\)*\\/" end="/I\=" contains=sedTab,sedRegexpMeta 20syn match sedComment "^\s*#.*$" 21syn match sedFunction "[dDgGhHlnNpPqQx=]\s*\($\|;\)" contains=sedSemicolon,sedWhitespace 22syn match sedLabel ":[^;]*" 23syn match sedLineCont "^\(\\\\\)*\\$" contained 24syn match sedLineCont "[^\\]\(\\\\\)*\\$"ms=e contained 25syn match sedSpecial "[{},!]" 26if exists("highlight_sedtabs") 27 syn match sedTab "\t" contained 28endif 29 30" Append/Change/Insert 31syn region sedACI matchgroup=sedFunction start="[aci]\\$" matchgroup=NONE end="^.*$" contains=sedLineCont,sedTab 32 33syn region sedBranch matchgroup=sedFunction start="[bt]" matchgroup=sedSemicolon end=";\|$" contains=sedWhitespace 34syn region sedRW matchgroup=sedFunction start="[rw]" matchgroup=sedSemicolon end=";\|$" contains=sedWhitespace 35 36" Substitution/transform with various delimiters 37syn region sedFlagwrite matchgroup=sedFlag start="w" matchgroup=sedSemicolon end=";\|$" contains=sedWhitespace contained 38syn match sedFlag "[[:digit:]gpI]*w\=" contains=sedFlagwrite contained 39syn match sedRegexpMeta "[.*^$]" contained 40syn match sedRegexpMeta "\\." contains=sedTab contained 41syn match sedRegexpMeta "\[.\{-}\]" contains=sedTab contained 42syn match sedRegexpMeta "\\{\d\*,\d*\\}" contained 43syn match sedRegexpMeta "\\(.\{-}\\)" contains=sedTab contained 44syn match sedReplaceMeta "&\|\\\($\|.\)" contains=sedTab contained 45 46" Metacharacters: $ * . \ ^ [ ~ 47" @ is used as delimiter and treated on its own below 48let __at = char2nr("@") 49let __sed_i = char2nr(" ") " ASCII: 32, EBCDIC: 64 50if has("ebcdic") 51 let __sed_last = 255 52else 53 let __sed_last = 126 54endif 55let __sed_metacharacters = '$*.\^[~' 56while __sed_i <= __sed_last 57 let __sed_delimiter = escape(nr2char(__sed_i), __sed_metacharacters) 58 if __sed_i != __at 59 exe 'syn region sedAddress matchgroup=Special start=@\\'.__sed_delimiter.'\(\\'.__sed_delimiter.'\)\=@ skip=@[^\\]\(\\\\\)*\\'.__sed_delimiter.'@ end=@'.__sed_delimiter.'I\=@ contains=sedTab' 60 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 61 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' 62 endif 63 let __sed_i = __sed_i + 1 64endwhile 65syn region sedAddress matchgroup=Special start=+\\@\(\\@\)\=+ skip=+[^\\]\(\\\\\)*\\@+ end=+@I\=+ contains=sedTab,sedRegexpMeta 66syn region sedRegexp64 matchgroup=Special start=+@\(\\\\\|\\@\)*+ skip=+[^\\@]\(\\\\\)*\\@+ end=+@+me=e-1 contains=sedTab,sedRegexpMeta keepend contained nextgroup=sedReplacement64 67syn region sedReplacement64 matchgroup=Special start=+@\(\\\\\|\\@\)*+ skip=+[^\\@]\(\\\\\)*\\@+ end=+@+ contains=sedTab,sedReplaceMeta keepend contained nextgroup=sedFlag 68 69" Since the syntax for the substituion command is very similar to the 70" syntax for the transform command, I use the same pattern matching 71" for both commands. There is one problem -- the transform command 72" (y) does not allow any flags. To save memory, I ignore this problem. 73syn match sedST "[sy]" nextgroup=sedRegexp\d\+ 74 75command -nargs=+ HiLink hi def link <args> 76 77HiLink sedAddress Macro 78HiLink sedACI NONE 79HiLink sedBranch Label 80HiLink sedComment Comment 81HiLink sedDelete Function 82HiLink sedError Error 83HiLink sedFlag Type 84HiLink sedFlagwrite Constant 85HiLink sedFunction Function 86HiLink sedLabel Label 87HiLink sedLineCont Special 88HiLink sedPutHoldspc Function 89HiLink sedReplaceMeta Special 90HiLink sedRegexpMeta Special 91HiLink sedRW Constant 92HiLink sedSemicolon Special 93HiLink sedST Function 94HiLink sedSpecial Special 95HiLink sedWhitespace NONE 96if exists("highlight_sedtabs") 97HiLink sedTab Todo 98endif 99let __sed_i = char2nr(" ") " ASCII: 32, EBCDIC: 64 100while __sed_i <= __sed_last 101exe "HiLink sedRegexp".__sed_i "Macro" 102exe "HiLink sedReplacement".__sed_i "NONE" 103let __sed_i = __sed_i + 1 104endwhile 105 106delcommand HiLink 107 108unlet __sed_i __sed_last __sed_delimiter __sed_metacharacters 109 110let b:current_syntax = "sed" 111 112" vim: sts=4 sw=4 ts=8 113