sed.vim 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  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. " quit when a syntax file was already loaded
  8. if exists("b:current_syntax")
  9. finish
  10. endif
  11. syn keyword sedTodo contained TODO FIXME XXX
  12. syn match sedError "\S"
  13. syn match sedWhitespace "\s\+" contained
  14. syn match sedSemicolon ";"
  15. syn match sedAddress "[[:digit:]$]"
  16. syn match sedAddress "\d\+\~\d\+"
  17. syn region sedAddress matchgroup=Special start="[{,;]\s*/\%(\\/\)\="lc=1 skip="[^\\]\%(\\\\\)*\\/" end="/I\=" contains=sedTab,sedRegexpMeta
  18. syn region sedAddress matchgroup=Special start="^\s*/\%(\\/\)\=" skip="[^\\]\%(\\\\\)*\\/" end="/I\=" contains=sedTab,sedRegexpMeta
  19. syn match sedFunction "[dDgGhHlnNpPqQx=]\s*\%($\|;\)" contains=sedSemicolon,sedWhitespace
  20. if exists("g:sed_dialect") && g:sed_dialect ==? "bsd"
  21. syn match sedComment "^\s*#.*$" contains=sedTodo
  22. else
  23. syn match sedFunction "[dDgGhHlnNpPqQx=]\s*\ze#" contains=sedSemicolon,sedWhitespace
  24. syn match sedComment "#.*$" contains=sedTodo
  25. endif
  26. syn match sedLabel ":[^;]*"
  27. syn match sedLineCont "^\%(\\\\\)*\\$" contained
  28. syn match sedLineCont "[^\\]\%(\\\\\)*\\$"ms=e contained
  29. syn match sedSpecial "[{},!]"
  30. " continue to silently support the old name
  31. let s:highlight_tabs = v:false
  32. if exists("g:highlight_sedtabs") || get(g:, "sed_highlight_tabs", 0)
  33. let s:highlight_tabs = v:true
  34. syn match sedTab "\t" contained
  35. endif
  36. " Append/Change/Insert
  37. syn region sedACI matchgroup=sedFunction start="[aci]\\$" matchgroup=NONE end="^.*$" contains=sedLineCont,sedTab
  38. syn region sedBranch matchgroup=sedFunction start="[bt]" matchgroup=sedSemicolon end=";\|$" contains=sedWhitespace
  39. syn region sedRW matchgroup=sedFunction start="[rw]" matchgroup=sedSemicolon end=";\|$" contains=sedWhitespace
  40. " Substitution/transform with various delimiters
  41. syn region sedFlagWrite matchgroup=sedFlag start="w" matchgroup=sedSemicolon end=";\|$" contains=sedWhitespace contained
  42. syn match sedFlag "[[:digit:]gpI]*w\=" contains=sedFlagWrite contained
  43. syn match sedRegexpMeta "[.*^$]" contained
  44. syn match sedRegexpMeta "\\." contains=sedTab contained
  45. syn match sedRegexpMeta "\[.\{-}\]" contains=sedTab contained
  46. syn match sedRegexpMeta "\\{\d\*,\d*\\}" contained
  47. syn match sedRegexpMeta "\\%(.\{-}\\)" contains=sedTab contained
  48. syn match sedReplaceMeta "&\|\\\%($\|.\)" contains=sedTab contained
  49. " Metacharacters: $ * . \ ^ [ ~
  50. " @ is used as delimiter and treated on its own below
  51. let s:at = char2nr("@")
  52. let s:i = char2nr(" ") " ASCII: 32, EBCDIC: 64
  53. if has("ebcdic")
  54. let s:last = 255
  55. else
  56. let s:last = 126
  57. endif
  58. let s:metacharacters = '$*.\^[~'
  59. while s:i <= s:last
  60. let s:delimiter = escape(nr2char(s:i), s:metacharacters)
  61. if s:i != s:at
  62. exe 'syn region sedAddress matchgroup=Special start=@\\'.s:delimiter.'\%(\\'.s:delimiter.'\)\=@ skip=@[^\\]\%(\\\\\)*\\'.s:delimiter.'@ end=@'.s:delimiter.'[IM]\=@ contains=sedTab'
  63. 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
  64. 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'
  65. endif
  66. let s:i = s:i + 1
  67. endwhile
  68. syn region sedAddress matchgroup=Special start=+\\@\%(\\@\)\=+ skip=+[^\\]\%(\\\\\)*\\@+ end=+@I\=+ contains=sedTab,sedRegexpMeta
  69. syn region sedRegexp64 matchgroup=Special start=+@\%(\\\\\|\\@\)*+ skip=+[^\\@]\%(\\\\\)*\\@+ end=+@+me=e-1 contains=sedTab,sedRegexpMeta keepend contained nextgroup=sedReplacement64
  70. syn region sedReplacement64 matchgroup=Special start=+@\%(\\\\\|\\@\)*+ skip=+[^\\@]\%(\\\\\)*\\@+ end=+@+ contains=sedTab,sedReplaceMeta keepend contained nextgroup=sedFlag
  71. " Since the syntax for the substitution command is very similar to the
  72. " syntax for the transform command, I use the same pattern matching
  73. " for both commands. There is one problem -- the transform command
  74. " (y) does not allow any flags. To save memory, I ignore this problem.
  75. syn match sedST "[sy]" nextgroup=sedRegexp\d\+
  76. hi def link sedAddress Macro
  77. hi def link sedACI NONE
  78. hi def link sedBranch Label
  79. hi def link sedComment Comment
  80. hi def link sedDelete Function
  81. hi def link sedError Error
  82. hi def link sedFlag Type
  83. hi def link sedFlagWrite Constant
  84. hi def link sedFunction Function
  85. hi def link sedLabel Label
  86. hi def link sedLineCont Special
  87. hi def link sedPutHoldspc Function
  88. hi def link sedReplaceMeta Special
  89. hi def link sedRegexpMeta Special
  90. hi def link sedRW Constant
  91. hi def link sedSemicolon Special
  92. hi def link sedST Function
  93. hi def link sedSpecial Special
  94. hi def link sedTodo Todo
  95. hi def link sedWhitespace NONE
  96. if s:highlight_tabs
  97. hi def link sedTab Todo
  98. endif
  99. let s:i = char2nr(" ") " ASCII: 32, EBCDIC: 64
  100. while s:i <= s:last
  101. exe "hi def link sedRegexp".s:i "Macro"
  102. exe "hi def link sedReplacement".s:i "NONE"
  103. let s:i = s:i + 1
  104. endwhile
  105. unlet s:i s:last s:delimiter s:metacharacters s:at
  106. unlet s:highlight_tabs
  107. let b:current_syntax = "sed"
  108. " vim: nowrap sw=2 sts=2 ts=8 noet: