neovim

Neovim text editor
git clone https://git.dasho.dev/neovim.git
Log | Files | Refs | README

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: