sed.vim (5396B)
1 " Vim syntax file 2 " Language: sed 3 " Maintainer: Doug Kearns <dougkearns@gmail.com> 4 " Previous Maintainer: Haakon Riiser <hakonrk@fys.uio.no> 5 " Contributor: Jack Haden-Enneking 6 " Last Change: 2022 Oct 15 7 8 " quit when a syntax file was already loaded 9 if exists("b:current_syntax") 10 finish 11 endif 12 13 syn keyword sedTodo contained TODO FIXME XXX 14 15 syn match sedError "\S" 16 17 syn match sedWhitespace "\s\+" contained 18 syn match sedSemicolon ";" 19 syn match sedAddress "[[:digit:]$]" 20 syn match sedAddress "\d\+\~\d\+" 21 syn region sedAddress matchgroup=Special start="[{,;]\s*/\%(\\/\)\="lc=1 skip="[^\\]\%(\\\\\)*\\/" end="/I\=" contains=sedTab,sedRegexpMeta 22 syn region sedAddress matchgroup=Special start="^\s*/\%(\\/\)\=" skip="[^\\]\%(\\\\\)*\\/" end="/I\=" contains=sedTab,sedRegexpMeta 23 syn match sedFunction "[dDgGhHlnNpPqQx=]\s*\%($\|;\)" contains=sedSemicolon,sedWhitespace 24 if exists("g:sed_dialect") && g:sed_dialect ==? "bsd" 25 syn match sedComment "^\s*#.*$" contains=sedTodo 26 else 27 syn match sedFunction "[dDgGhHlnNpPqQx=]\s*\ze#" contains=sedSemicolon,sedWhitespace 28 syn match sedComment "#.*$" contains=sedTodo 29 endif 30 syn match sedLabel ":[^;]*" 31 syn match sedLineCont "^\%(\\\\\)*\\$" contained 32 syn match sedLineCont "[^\\]\%(\\\\\)*\\$"ms=e contained 33 syn match sedSpecial "[{},!]" 34 35 " continue to silently support the old name 36 let s:highlight_tabs = v:false 37 if exists("g:highlight_sedtabs") || get(g:, "sed_highlight_tabs", 0) 38 let s:highlight_tabs = v:true 39 syn match sedTab "\t" contained 40 endif 41 42 " Append/Change/Insert 43 syn region sedACI matchgroup=sedFunction start="[aci]\\$" matchgroup=NONE end="^.*$" contains=sedLineCont,sedTab 44 45 syn region sedBranch matchgroup=sedFunction start="[bt]" matchgroup=sedSemicolon end=";\|$" contains=sedWhitespace 46 syn region sedRW matchgroup=sedFunction start="[rw]" matchgroup=sedSemicolon end=";\|$" contains=sedWhitespace 47 48 " Substitution/transform with various delimiters 49 syn region sedFlagWrite matchgroup=sedFlag start="w" matchgroup=sedSemicolon end=";\|$" contains=sedWhitespace contained 50 syn match sedFlag "[[:digit:]gpI]*w\=" contains=sedFlagWrite contained 51 syn match sedRegexpMeta "[.*^$]" contained 52 syn match sedRegexpMeta "\\." contains=sedTab contained 53 syn match sedRegexpMeta "\[.\{-}\]" contains=sedTab contained 54 syn match sedRegexpMeta "\\{\d\*,\d*\\}" contained 55 syn match sedRegexpMeta "\\%(.\{-}\\)" contains=sedTab contained 56 syn match sedReplaceMeta "&\|\\\%($\|.\)" contains=sedTab contained 57 58 " Metacharacters: $ * . \ ^ [ ~ 59 " @ is used as delimiter and treated on its own below 60 let s:at = char2nr("@") 61 let s:i = char2nr(" ") " ASCII: 32, EBCDIC: 64 62 if has("ebcdic") 63 let s:last = 255 64 else 65 let s:last = 126 66 endif 67 let s:metacharacters = '$*.\^[~' 68 while s:i <= s:last 69 let s:delimiter = escape(nr2char(s:i), s:metacharacters) 70 if s:i != s:at 71 exe 'syn region sedAddress matchgroup=Special start=@\\'.s:delimiter.'\%(\\'.s:delimiter.'\)\=@ skip=@[^\\]\%(\\\\\)*\\'.s:delimiter.'@ end=@'.s:delimiter.'[IM]\=@ contains=sedTab' 72 exe 'syn region sedRegexp'.s:i 'matchgroup=Special start=@'.s:delimiter.'\%(\\\\\|\\'.s:delimiter.'\)*@ skip=@[^\\'.s:delimiter.']\%(\\\\\)*\\'.s:delimiter.'@ end=@'.s:delimiter.'@me=e-1 contains=sedTab,sedRegexpMeta keepend contained nextgroup=sedReplacement'.s:i 73 exe 'syn region sedReplacement'.s:i 'matchgroup=Special start=@'.s:delimiter.'\%(\\\\\|\\'.s:delimiter.'\)*@ skip=@[^\\'.s:delimiter.']\%(\\\\\)*\\'.s:delimiter.'@ end=@'.s:delimiter.'@ contains=sedTab,sedReplaceMeta keepend contained nextgroup=@sedFlags' 74 endif 75 let s:i = s:i + 1 76 endwhile 77 syn region sedAddress matchgroup=Special start=+\\@\%(\\@\)\=+ skip=+[^\\]\%(\\\\\)*\\@+ end=+@I\=+ contains=sedTab,sedRegexpMeta 78 syn region sedRegexp64 matchgroup=Special start=+@\%(\\\\\|\\@\)*+ skip=+[^\\@]\%(\\\\\)*\\@+ end=+@+me=e-1 contains=sedTab,sedRegexpMeta keepend contained nextgroup=sedReplacement64 79 syn region sedReplacement64 matchgroup=Special start=+@\%(\\\\\|\\@\)*+ skip=+[^\\@]\%(\\\\\)*\\@+ end=+@+ contains=sedTab,sedReplaceMeta keepend contained nextgroup=sedFlag 80 81 " Since the syntax for the substitution command is very similar to the 82 " syntax for the transform command, I use the same pattern matching 83 " for both commands. There is one problem -- the transform command 84 " (y) does not allow any flags. To save memory, I ignore this problem. 85 syn match sedST "[sy]" nextgroup=sedRegexp\d\+ 86 87 88 hi def link sedAddress Macro 89 hi def link sedACI NONE 90 hi def link sedBranch Label 91 hi def link sedComment Comment 92 hi def link sedDelete Function 93 hi def link sedError Error 94 hi def link sedFlag Type 95 hi def link sedFlagWrite Constant 96 hi def link sedFunction Function 97 hi def link sedLabel Label 98 hi def link sedLineCont Special 99 hi def link sedPutHoldspc Function 100 hi def link sedReplaceMeta Special 101 hi def link sedRegexpMeta Special 102 hi def link sedRW Constant 103 hi def link sedSemicolon Special 104 hi def link sedST Function 105 hi def link sedSpecial Special 106 hi def link sedTodo Todo 107 hi def link sedWhitespace NONE 108 if s:highlight_tabs 109 hi def link sedTab Todo 110 endif 111 let s:i = char2nr(" ") " ASCII: 32, EBCDIC: 64 112 while s:i <= s:last 113 exe "hi def link sedRegexp".s:i "Macro" 114 exe "hi def link sedReplacement".s:i "NONE" 115 let s:i = s:i + 1 116 endwhile 117 118 unlet s:i s:last s:delimiter s:metacharacters s:at 119 unlet s:highlight_tabs 120 121 let b:current_syntax = "sed" 122 123 " vim: nowrap sw=2 sts=2 ts=8 noet: