mirror of
				https://github.com/neovim/neovim.git
				synced 2025-11-03 17:24:29 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			124 lines
		
	
	
		
			5.3 KiB
		
	
	
	
		
			VimL
		
	
	
	
	
	
			
		
		
	
	
			124 lines
		
	
	
		
			5.3 KiB
		
	
	
	
		
			VimL
		
	
	
	
	
	
" Vim syntax file
 | 
						|
" Language:		sed
 | 
						|
" Maintainer:		Doug Kearns <dougkearns@gmail.com>
 | 
						|
" Previous Maintainer:	Haakon Riiser <hakonrk@fys.uio.no>
 | 
						|
" Contributor:		Jack Haden-Enneking
 | 
						|
" Last Change:		2022 Oct 15
 | 
						|
 | 
						|
" quit when a syntax file was already loaded
 | 
						|
if exists("b:current_syntax")
 | 
						|
  finish
 | 
						|
endif
 | 
						|
 | 
						|
syn keyword sedTodo	contained TODO FIXME XXX
 | 
						|
 | 
						|
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 sedFunction	"[dDgGhHlnNpPqQx=]\s*\%($\|;\)" contains=sedSemicolon,sedWhitespace
 | 
						|
if exists("g:sed_dialect") && g:sed_dialect ==? "bsd"
 | 
						|
  syn match sedComment	"^\s*#.*$" contains=sedTodo
 | 
						|
else
 | 
						|
  syn match sedFunction	"[dDgGhHlnNpPqQx=]\s*\ze#" contains=sedSemicolon,sedWhitespace
 | 
						|
  syn match sedComment	"#.*$" contains=sedTodo
 | 
						|
endif
 | 
						|
syn match sedLabel	":[^;]*"
 | 
						|
syn match sedLineCont	"^\%(\\\\\)*\\$" contained
 | 
						|
syn match sedLineCont	"[^\\]\%(\\\\\)*\\$"ms=e contained
 | 
						|
syn match sedSpecial	"[{},!]"
 | 
						|
 | 
						|
" continue to silently support the old name
 | 
						|
let s:highlight_tabs = v:false
 | 
						|
if exists("g:highlight_sedtabs") || get(g:, "sed_highlight_tabs", 0)
 | 
						|
  let s:highlight_tabs = v:true
 | 
						|
  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 s:at = char2nr("@")
 | 
						|
let s:i = char2nr(" ") " ASCII: 32, EBCDIC: 64
 | 
						|
if has("ebcdic")
 | 
						|
  let s:last = 255
 | 
						|
else
 | 
						|
  let s:last = 126
 | 
						|
endif
 | 
						|
let s:metacharacters = '$*.\^[~'
 | 
						|
while s:i <= s:last
 | 
						|
  let s:delimiter = escape(nr2char(s:i), s:metacharacters)
 | 
						|
  if s:i != s:at
 | 
						|
    exe 'syn region sedAddress matchgroup=Special start=@\\'.s:delimiter.'\%(\\'.s:delimiter.'\)\=@ skip=@[^\\]\%(\\\\\)*\\'.s:delimiter.'@ end=@'.s:delimiter.'[IM]\=@ contains=sedTab'
 | 
						|
    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
 | 
						|
    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'
 | 
						|
  endif
 | 
						|
  let s:i = s: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 substitution 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\+
 | 
						|
 | 
						|
 | 
						|
hi def link sedAddress		Macro
 | 
						|
hi def link sedACI		NONE
 | 
						|
hi def link sedBranch		Label
 | 
						|
hi def link sedComment		Comment
 | 
						|
hi def link sedDelete		Function
 | 
						|
hi def link sedError		Error
 | 
						|
hi def link sedFlag		Type
 | 
						|
hi def link sedFlagWrite	Constant
 | 
						|
hi def link sedFunction		Function
 | 
						|
hi def link sedLabel		Label
 | 
						|
hi def link sedLineCont		Special
 | 
						|
hi def link sedPutHoldspc	Function
 | 
						|
hi def link sedReplaceMeta	Special
 | 
						|
hi def link sedRegexpMeta	Special
 | 
						|
hi def link sedRW		Constant
 | 
						|
hi def link sedSemicolon	Special
 | 
						|
hi def link sedST		Function
 | 
						|
hi def link sedSpecial		Special
 | 
						|
hi def link sedTodo		Todo
 | 
						|
hi def link sedWhitespace	NONE
 | 
						|
if s:highlight_tabs
 | 
						|
  hi def link sedTab		Todo
 | 
						|
endif
 | 
						|
let s:i = char2nr(" ") " ASCII: 32, EBCDIC: 64
 | 
						|
while s:i <= s:last
 | 
						|
  exe "hi def link sedRegexp".s:i	"Macro"
 | 
						|
  exe "hi def link sedReplacement".s:i	"NONE"
 | 
						|
  let s:i = s:i + 1
 | 
						|
endwhile
 | 
						|
 | 
						|
unlet s:i s:last s:delimiter s:metacharacters s:at
 | 
						|
unlet s:highlight_tabs
 | 
						|
 | 
						|
let b:current_syntax = "sed"
 | 
						|
 | 
						|
" vim: nowrap sw=2 sts=2 ts=8 noet:
 |