blob: d1f631df4b889c28b3c85df8becab06798d3e3f1 [file] [log] [blame]
Bram Moolenaar071d4272004-06-13 20:20:40 +00001" Vim syntax file
Bram Moolenaar3c053a12022-10-16 13:11:12 +01002" 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
Bram Moolenaar071d4272004-06-13 20:20:40 +00007
Bram Moolenaar89bcfda2016-08-30 23:26:57 +02008" quit when a syntax file was already loaded
9if exists("b:current_syntax")
Bram Moolenaar3c053a12022-10-16 13:11:12 +010010 finish
Bram Moolenaar071d4272004-06-13 20:20:40 +000011endif
12
Bram Moolenaar3c053a12022-10-16 13:11:12 +010013syn keyword sedTodo contained TODO FIXME XXX
14
Bram Moolenaar071d4272004-06-13 20:20:40 +000015syn match sedError "\S"
16
17syn match sedWhitespace "\s\+" contained
18syn match sedSemicolon ";"
19syn match sedAddress "[[:digit:]$]"
20syn match sedAddress "\d\+\~\d\+"
Bram Moolenaar3c053a12022-10-16 13:11:12 +010021syn region sedAddress matchgroup=Special start="[{,;]\s*/\%(\\/\)\="lc=1 skip="[^\\]\%(\\\\\)*\\/" end="/I\=" contains=sedTab,sedRegexpMeta
22syn region sedAddress matchgroup=Special start="^\s*/\%(\\/\)\=" skip="[^\\]\%(\\\\\)*\\/" end="/I\=" contains=sedTab,sedRegexpMeta
23syn match sedFunction "[dDgGhHlnNpPqQx=]\s*\%($\|;\)" contains=sedSemicolon,sedWhitespace
24if exists("g:sed_dialect") && g:sed_dialect ==? "bsd"
25 syn match sedComment "^\s*#.*$" contains=sedTodo
26else
27 syn match sedFunction "[dDgGhHlnNpPqQx=]\s*\ze#" contains=sedSemicolon,sedWhitespace
28 syn match sedComment "#.*$" contains=sedTodo
29endif
Bram Moolenaar071d4272004-06-13 20:20:40 +000030syn match sedLabel ":[^;]*"
Bram Moolenaar3c053a12022-10-16 13:11:12 +010031syn match sedLineCont "^\%(\\\\\)*\\$" contained
32syn match sedLineCont "[^\\]\%(\\\\\)*\\$"ms=e contained
Bram Moolenaar071d4272004-06-13 20:20:40 +000033syn match sedSpecial "[{},!]"
Bram Moolenaar3c053a12022-10-16 13:11:12 +010034
35" continue to silently support the old name
36let s:highlight_tabs = v:false
37if exists("g:highlight_sedtabs") || get(g:, "sed_highlight_tabs", 0)
38 let s:highlight_tabs = v:true
39 syn match sedTab "\t" contained
Bram Moolenaar071d4272004-06-13 20:20:40 +000040endif
41
42" Append/Change/Insert
43syn region sedACI matchgroup=sedFunction start="[aci]\\$" matchgroup=NONE end="^.*$" contains=sedLineCont,sedTab
44
45syn region sedBranch matchgroup=sedFunction start="[bt]" matchgroup=sedSemicolon end=";\|$" contains=sedWhitespace
46syn region sedRW matchgroup=sedFunction start="[rw]" matchgroup=sedSemicolon end=";\|$" contains=sedWhitespace
47
48" Substitution/transform with various delimiters
Bram Moolenaar3c053a12022-10-16 13:11:12 +010049syn region sedFlagWrite matchgroup=sedFlag start="w" matchgroup=sedSemicolon end=";\|$" contains=sedWhitespace contained
50syn match sedFlag "[[:digit:]gpI]*w\=" contains=sedFlagWrite contained
Bram Moolenaar071d4272004-06-13 20:20:40 +000051syn match sedRegexpMeta "[.*^$]" contained
52syn match sedRegexpMeta "\\." contains=sedTab contained
53syn match sedRegexpMeta "\[.\{-}\]" contains=sedTab contained
54syn match sedRegexpMeta "\\{\d\*,\d*\\}" contained
Bram Moolenaar3c053a12022-10-16 13:11:12 +010055syn match sedRegexpMeta "\\%(.\{-}\\)" contains=sedTab contained
56syn match sedReplaceMeta "&\|\\\%($\|.\)" contains=sedTab contained
Bram Moolenaar071d4272004-06-13 20:20:40 +000057
58" Metacharacters: $ * . \ ^ [ ~
59" @ is used as delimiter and treated on its own below
Bram Moolenaar3c053a12022-10-16 13:11:12 +010060let s:at = char2nr("@")
61let s:i = char2nr(" ") " ASCII: 32, EBCDIC: 64
Bram Moolenaar071d4272004-06-13 20:20:40 +000062if has("ebcdic")
Bram Moolenaar3c053a12022-10-16 13:11:12 +010063 let s:last = 255
Bram Moolenaar071d4272004-06-13 20:20:40 +000064else
Bram Moolenaar3c053a12022-10-16 13:11:12 +010065 let s:last = 126
Bram Moolenaar071d4272004-06-13 20:20:40 +000066endif
Bram Moolenaar3c053a12022-10-16 13:11:12 +010067let s:metacharacters = '$*.\^[~'
68while 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
Bram Moolenaar071d4272004-06-13 20:20:40 +000076endwhile
Bram Moolenaar3c053a12022-10-16 13:11:12 +010077syn region sedAddress matchgroup=Special start=+\\@\%(\\@\)\=+ skip=+[^\\]\%(\\\\\)*\\@+ end=+@I\=+ contains=sedTab,sedRegexpMeta
78syn region sedRegexp64 matchgroup=Special start=+@\%(\\\\\|\\@\)*+ skip=+[^\\@]\%(\\\\\)*\\@+ end=+@+me=e-1 contains=sedTab,sedRegexpMeta keepend contained nextgroup=sedReplacement64
79syn region sedReplacement64 matchgroup=Special start=+@\%(\\\\\|\\@\)*+ skip=+[^\\@]\%(\\\\\)*\\@+ end=+@+ contains=sedTab,sedReplaceMeta keepend contained nextgroup=sedFlag
Bram Moolenaar071d4272004-06-13 20:20:40 +000080
Bram Moolenaar3c053a12022-10-16 13:11:12 +010081" Since the syntax for the substitution command is very similar to the
Bram Moolenaar071d4272004-06-13 20:20:40 +000082" 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.
85syn match sedST "[sy]" nextgroup=sedRegexp\d\+
86
Bram Moolenaar071d4272004-06-13 20:20:40 +000087
Bram Moolenaarf37506f2016-08-31 22:22:10 +020088hi def link sedAddress Macro
89hi def link sedACI NONE
90hi def link sedBranch Label
91hi def link sedComment Comment
92hi def link sedDelete Function
93hi def link sedError Error
94hi def link sedFlag Type
Bram Moolenaar3c053a12022-10-16 13:11:12 +010095hi def link sedFlagWrite Constant
Bram Moolenaarf37506f2016-08-31 22:22:10 +020096hi def link sedFunction Function
97hi def link sedLabel Label
98hi def link sedLineCont Special
99hi def link sedPutHoldspc Function
100hi def link sedReplaceMeta Special
101hi def link sedRegexpMeta Special
102hi def link sedRW Constant
Bram Moolenaar3c053a12022-10-16 13:11:12 +0100103hi def link sedSemicolon Special
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200104hi def link sedST Function
105hi def link sedSpecial Special
Bram Moolenaar3c053a12022-10-16 13:11:12 +0100106hi def link sedTodo Todo
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200107hi def link sedWhitespace NONE
Bram Moolenaar3c053a12022-10-16 13:11:12 +0100108if s:highlight_tabs
109 hi def link sedTab Todo
Bram Moolenaar071d4272004-06-13 20:20:40 +0000110endif
Bram Moolenaar3c053a12022-10-16 13:11:12 +0100111let s:i = char2nr(" ") " ASCII: 32, EBCDIC: 64
112while 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
Bram Moolenaar89bcfda2016-08-30 23:26:57 +0200116endwhile
117
Bram Moolenaar3c053a12022-10-16 13:11:12 +0100118unlet s:i s:last s:delimiter s:metacharacters s:at
119unlet s:highlight_tabs
Bram Moolenaar071d4272004-06-13 20:20:40 +0000120
121let b:current_syntax = "sed"
122
Bram Moolenaar3c053a12022-10-16 13:11:12 +0100123" vim: nowrap sw=2 sts=2 ts=8 noet: