diff options
Diffstat (limited to 'runtime/syntax/sed.vim')
-rw-r--r-- | runtime/syntax/sed.vim | 122 |
1 files changed, 122 insertions, 0 deletions
diff --git a/runtime/syntax/sed.vim b/runtime/syntax/sed.vim new file mode 100644 index 000000000..68e395bb5 --- /dev/null +++ b/runtime/syntax/sed.vim @@ -0,0 +1,122 @@ +" Vim syntax file +" Language: sed +" Maintainer: Haakon Riiser <hakonrk@fys.uio.no> +" URL: http://folk.uio.no/hakonrk/vim/syntax/sed.vim +" Last Change: 2003 May 11 + +" For version 5.x: Clear all syntax items +" For version 6.x: Quit when a syntax file was already loaded +if version < 600 + syn clear +elseif exists("b:current_syntax") + finish +endif + +syn match sedError "\S" + +syn match sedWhitespace "\s\+" contained +syn match sedSemicolon ";" +syn match sedAddress "[[:digit:]$]" +syn match sedAddress "\d\+\~\d\+" +syn region sedAddress matchgroup=Special start="[{,;]\s*/\(\\/\)\="lc=1 skip="[^\\]\(\\\\\)*\\/" end="/I\=" contains=sedTab,sedRegexpMeta +syn region sedAddress matchgroup=Special start="^\s*/\(\\/\)\=" skip="[^\\]\(\\\\\)*\\/" end="/I\=" contains=sedTab,sedRegexpMeta +syn match sedComment "^\s*#.*$" +syn match sedFunction "[dDgGhHlnNpPqx=]\s*\($\|;\)" contains=sedSemicolon,sedWhitespace +syn match sedLabel ":[^;]*" +syn match sedLineCont "^\(\\\\\)*\\$" contained +syn match sedLineCont "[^\\]\(\\\\\)*\\$"ms=e contained +syn match sedSpecial "[{},!]" +if exists("highlight_sedtabs") + syn match sedTab "\t" contained +endif + +" Append/Change/Insert +syn region sedACI matchgroup=sedFunction start="[aci]\\$" matchgroup=NONE end="^.*$" contains=sedLineCont,sedTab + +syn region sedBranch matchgroup=sedFunction start="[bt]" matchgroup=sedSemicolon end=";\|$" contains=sedWhitespace +syn region sedRW matchgroup=sedFunction start="[rw]" matchgroup=sedSemicolon end=";\|$" contains=sedWhitespace + +" Substitution/transform with various delimiters +syn region sedFlagwrite matchgroup=sedFlag start="w" matchgroup=sedSemicolon end=";\|$" contains=sedWhitespace contained +syn match sedFlag "[[:digit:]gpI]*w\=" contains=sedFlagwrite contained +syn match sedRegexpMeta "[.*^$]" contained +syn match sedRegexpMeta "\\." contains=sedTab contained +syn match sedRegexpMeta "\[.\{-}\]" contains=sedTab contained +syn match sedRegexpMeta "\\{\d\*,\d*\\}" contained +syn match sedRegexpMeta "\\(.\{-}\\)" contains=sedTab contained +syn match sedReplaceMeta "&\|\\\($\|.\)" contains=sedTab contained + +" Metacharacters: $ * . \ ^ [ ~ +" @ is used as delimiter and treated on its own below +let __at = char2nr("@") +let __sed_i = char2nr(" ") +if has("ebcdic") + let __sed_last = 255 +else + let __sed_last = 126 +endif +let __sed_metacharacters = '$*.\^[~' +while __sed_i <= __sed_last + let __sed_delimiter = escape(nr2char(__sed_i), __sed_metacharacters) + if __sed_i != __at + exe 'syn region sedAddress matchgroup=Special start=@\\'.__sed_delimiter.'\(\\'.__sed_delimiter.'\)\=@ skip=@[^\\]\(\\\\\)*\\'.__sed_delimiter.'@ end=@'.__sed_delimiter.'I\=@ contains=sedTab' + 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 + 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' + endif + let __sed_i = __sed_i + 1 +endwhile +syn region sedAddress matchgroup=Special start=+\\@\(\\@\)\=+ skip=+[^\\]\(\\\\\)*\\@+ end=+@I\=+ contains=sedTab,sedRegexpMeta +syn region sedRegexp64 matchgroup=Special start=+@\(\\\\\|\\@\)*+ skip=+[^\\@]\(\\\\\)*\\@+ end=+@+me=e-1 contains=sedTab,sedRegexpMeta keepend contained nextgroup=sedReplacement64 +syn region sedReplacement64 matchgroup=Special start=+@\(\\\\\|\\@\)*+ skip=+[^\\@]\(\\\\\)*\\@+ end=+@+ contains=sedTab,sedReplaceMeta keepend contained nextgroup=sedFlag + +" Since the syntax for the substituion command is very similar to the +" syntax for the transform command, I use the same pattern matching +" for both commands. There is one problem -- the transform command +" (y) does not allow any flags. To save memory, I ignore this problem. +syn match sedST "[sy]" nextgroup=sedRegexp\d\+ + +if version >= 508 || !exists("did_sed_syntax_inits") + if version < 508 + let did_sed_syntax_inits = 1 + command -nargs=+ HiLink hi link <args> + else + command -nargs=+ HiLink hi def link <args> + endif + + HiLink sedAddress Macro + HiLink sedACI NONE + HiLink sedBranch Label + HiLink sedComment Comment + HiLink sedDelete Function + HiLink sedError Error + HiLink sedFlag Type + HiLink sedFlagwrite Constant + HiLink sedFunction Function + HiLink sedLabel Label + HiLink sedLineCont Special + HiLink sedPutHoldspc Function + HiLink sedReplaceMeta Special + HiLink sedRegexpMeta Special + HiLink sedRW Constant + HiLink sedSemicolon Special + HiLink sedST Function + HiLink sedSpecial Special + HiLink sedWhitespace NONE + if exists("highlight_sedtabs") + HiLink sedTab Todo + endif + let __sed_i = 32 + while __sed_i <= 126 + exe "HiLink sedRegexp".__sed_i "Macro" + exe "HiLink sedReplacement".__sed_i "NONE" + let __sed_i = __sed_i + 1 + endwhile + + delcommand HiLink +endif + +unlet __sed_i __sed_delimiter __sed_metacharacters + +let b:current_syntax = "sed" + +" vim: sts=4 sw=4 ts=8 |