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