erlang.vim 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262
  1. " Vim syntax file
  2. " Language: Erlang (http://www.erlang.org)
  3. " Maintainer: Csaba Hoch <csaba.hoch@gmail.com>
  4. " Contributor: Adam Rutkowski <hq@mtod.org>
  5. " Last Update: 2020-May-26
  6. " License: Vim license
  7. " URL: https://github.com/vim-erlang/vim-erlang-runtime
  8. " Acknowledgements: This script was originally created by Kresimir Marzic [1].
  9. " The script was then revamped by Csaba Hoch [2]. During the revamp, the new
  10. " highlighting style and some code was taken from the Erlang syntax script
  11. " that is part of vimerl [3], created by Oscar Hellström [4] and improved by
  12. " Ricardo Catalinas Jiménez [5].
  13. " [1]: Kreąimir Marľić (Kresimir Marzic) <kmarzic@fly.srk.fer.hr>
  14. " [2]: Csaba Hoch <csaba.hoch@gmail.com>
  15. " [3]: https://github.com/jimenezrick/vimerl
  16. " [4]: Oscar Hellström <oscar@oscarh.net> (http://oscar.hellstrom.st)
  17. " [5]: Ricardo Catalinas Jiménez <jimenezrick@gmail.com>
  18. " Customization:
  19. "
  20. " To use the old highlighting style, add this to your .vimrc:
  21. "
  22. " let g:erlang_old_style_highlight = 1
  23. "
  24. " To highlight further module attributes, add them to
  25. " ~/.vim/after/syntax/erlang.vim:
  26. "
  27. " syn keyword erlangAttribute myattr1 myattr2 contained
  28. " quit when a syntax file was already loaded
  29. if exists("b:current_syntax")
  30. finish
  31. endif
  32. let s:cpo_save = &cpo
  33. set cpo&vim
  34. " Case sensitive
  35. syn case match
  36. setlocal iskeyword+=$,@-@
  37. " Comments
  38. syn match erlangComment '%.*$' contains=erlangCommentAnnotation,erlangTodo
  39. syn match erlangCommentAnnotation ' \@<=@\%(clear\|docfile\|end\|headerfile\|todo\|TODO\|type\|author\|copyright\|doc\|reference\|see\|since\|title\|version\|deprecated\|hidden\|param\|private\|equiv\|spec\|throws\)' contained
  40. syn match erlangCommentAnnotation /`[^']*'/ contained
  41. syn keyword erlangTodo TODO FIXME XXX contained
  42. " Numbers (minimum base is 2, maximum is 36.)
  43. syn match erlangNumberInteger '\<\d\+\>'
  44. syn match erlangNumberInteger '\<\%([2-9]\|[12]\d\|3[0-6]\)\+#[[:alnum:]]\+\>'
  45. syn match erlangNumberFloat '\<\d\+\.\d\+\%([eE][+-]\=\d\+\)\=\>'
  46. " Strings, atoms, characters
  47. syn region erlangString start=/"/ end=/"/ contains=erlangStringModifier
  48. syn region erlangQuotedAtom start=/'/ end=/'/ contains=erlangQuotedAtomModifier
  49. syn match erlangStringModifier '\\\%(\o\{1,3}\|x\x\x\|x{\x\+}\|\^.\|.\)\|\~\%([ni~]\|\%(-\=\d\+\|\*\)\=\.\=\%(\*\|\d\+\)\=\%(\..\)\=[tl]*[cfegswpWPBX#bx+]\)' contained
  50. syn match erlangQuotedAtomModifier '\\\%(\o\{1,3}\|x\x\x\|x{\x\+}\|\^.\|.\)' contained
  51. syn match erlangModifier '\$\%([^\\]\|\\\%(\o\{1,3}\|x\x\x\|x{\x\+}\|\^.\|.\)\)'
  52. " Operators, separators
  53. syn match erlangOperator '==\|=:=\|/=\|=/=\|<\|=<\|>\|>=\|=>\|:=\|++\|--\|=\|!\|<-\|+\|-\|\*\|\/'
  54. syn keyword erlangOperator div rem or xor bor bxor bsl bsr and band not bnot andalso orelse
  55. syn match erlangBracket '{\|}\|\[\|]\||\|||'
  56. syn match erlangPipe '|'
  57. syn match erlangRightArrow '->'
  58. " Atoms, function calls (order is important)
  59. syn match erlangAtom '\<\l[[:alnum:]_@]*' contains=erlangBoolean
  60. syn keyword erlangBoolean true false contained
  61. syn match erlangLocalFuncCall '\<\a[[:alnum:]_@]*\>\%(\%(\s\|\n\|%.*\n\)*(\)\@=' contains=erlangBIF
  62. syn match erlangLocalFuncRef '\<\a[[:alnum:]_@]*\>\%(\%(\s\|\n\|%.*\n\)*/\)\@='
  63. syn match erlangGlobalFuncCall '\<\%(\a[[:alnum:]_@]*\%(\s\|\n\|%.*\n\)*\.\%(\s\|\n\|%.*\n\)*\)*\a[[:alnum:]_@]*\%(\s\|\n\|%.*\n\)*:\%(\s\|\n\|%.*\n\)*\a[[:alnum:]_@]*\>\%(\%(\s\|\n\|%.*\n\)*(\)\@=' contains=erlangComment,erlangVariable
  64. syn match erlangGlobalFuncRef '\<\%(\a[[:alnum:]_@]*\%(\s\|\n\|%.*\n\)*\.\%(\s\|\n\|%.*\n\)*\)*\a[[:alnum:]_@]*\%(\s\|\n\|%.*\n\)*:\%(\s\|\n\|%.*\n\)*\a[[:alnum:]_@]*\>\%(\%(\s\|\n\|%.*\n\)*/\)\@=' contains=erlangComment,erlangVariable
  65. " Variables, macros, records, maps
  66. syn match erlangVariable '\<[A-Z_][[:alnum:]_@]*'
  67. syn match erlangMacro '??\=[[:alnum:]_@]\+'
  68. syn match erlangMacro '\%(-define(\)\@<=[[:alnum:]_@]\+'
  69. syn region erlangQuotedMacro start=/??\=\s*'/ end=/'/ contains=erlangQuotedAtomModifier
  70. syn match erlangMap '#'
  71. syn match erlangRecord '#\s*\l[[:alnum:]_@]*'
  72. syn region erlangQuotedRecord start=/#\s*'/ end=/'/ contains=erlangQuotedAtomModifier
  73. " Shebang (this line has to be after the ErlangMap)
  74. syn match erlangShebang '^#!.*'
  75. " Bitstrings
  76. syn match erlangBitType '\%(\/\%(\s\|\n\|%.*\n\)*\)\@<=\%(integer\|float\|binary\|bytes\|bitstring\|bits\|binary\|utf8\|utf16\|utf32\|signed\|unsigned\|big\|little\|native\|unit\)\%(\%(\s\|\n\|%.*\n\)*-\%(\s\|\n\|%.*\n\)*\%(integer\|float\|binary\|bytes\|bitstring\|bits\|binary\|utf8\|utf16\|utf32\|signed\|unsigned\|big\|little\|native\|unit\)\)*' contains=erlangComment
  77. " Constants and Directives
  78. syn match erlangUnknownAttribute '^\s*-\%(\s\|\n\|%.*\n\)*\l[[:alnum:]_@]*' contains=erlangComment
  79. syn match erlangAttribute '^\s*-\%(\s\|\n\|%.*\n\)*\%(behaviou\=r\|compile\|export\(_type\)\=\|file\|import\|module\|author\|copyright\|doc\|vsn\|on_load\|optional_callbacks\)\>' contains=erlangComment
  80. syn match erlangInclude '^\s*-\%(\s\|\n\|%.*\n\)*\%(include\|include_lib\)\>' contains=erlangComment
  81. syn match erlangRecordDef '^\s*-\%(\s\|\n\|%.*\n\)*record\>' contains=erlangComment
  82. syn match erlangDefine '^\s*-\%(\s\|\n\|%.*\n\)*\%(define\|undef\)\>' contains=erlangComment
  83. syn match erlangPreCondit '^\s*-\%(\s\|\n\|%.*\n\)*\%(ifdef\|ifndef\|else\|endif\)\>' contains=erlangComment
  84. syn match erlangType '^\s*-\%(\s\|\n\|%.*\n\)*\%(spec\|type\|opaque\|callback\)\>' contains=erlangComment
  85. " Keywords
  86. syn keyword erlangKeyword after begin case catch cond end fun if let of
  87. syn keyword erlangKeyword receive when try
  88. " Build-in-functions (BIFs)
  89. syn keyword erlangBIF abs alive apply atom_to_binary atom_to_list contained
  90. syn keyword erlangBIF binary_part binary_to_atom contained
  91. syn keyword erlangBIF binary_to_existing_atom binary_to_float contained
  92. syn keyword erlangBIF binary_to_integer bitstring_to_list contained
  93. syn keyword erlangBIF binary_to_list binary_to_term bit_size contained
  94. syn keyword erlangBIF byte_size check_old_code check_process_code contained
  95. syn keyword erlangBIF concat_binary date delete_module demonitor contained
  96. syn keyword erlangBIF disconnect_node element erase error exit contained
  97. syn keyword erlangBIF float float_to_binary float_to_list contained
  98. syn keyword erlangBIF garbage_collect get get_keys group_leader contained
  99. syn keyword erlangBIF halt hd integer_to_binary integer_to_list contained
  100. syn keyword erlangBIF iolist_to_binary iolist_size is_alive contained
  101. syn keyword erlangBIF is_atom is_binary is_bitstring is_boolean contained
  102. syn keyword erlangBIF is_float is_function is_integer is_list is_map is_map_key contained
  103. syn keyword erlangBIF is_number is_pid is_port is_process_alive contained
  104. syn keyword erlangBIF is_record is_reference is_tuple length link contained
  105. syn keyword erlangBIF list_to_atom list_to_binary contained
  106. syn keyword erlangBIF list_to_bitstring list_to_existing_atom contained
  107. syn keyword erlangBIF list_to_float list_to_integer list_to_pid contained
  108. syn keyword erlangBIF list_to_tuple load_module make_ref map_size max contained
  109. syn keyword erlangBIF min module_loaded monitor monitor_node node contained
  110. syn keyword erlangBIF nodes now open_port pid_to_list port_close contained
  111. syn keyword erlangBIF port_command port_connect pre_loaded contained
  112. syn keyword erlangBIF process_flag process_flag process_info contained
  113. syn keyword erlangBIF process purge_module put register registered contained
  114. syn keyword erlangBIF round self setelement size spawn spawn_link contained
  115. syn keyword erlangBIF spawn_monitor spawn_opt split_binary contained
  116. syn keyword erlangBIF statistics term_to_binary throw time tl contained
  117. syn keyword erlangBIF trunc tuple_size tuple_to_list unlink contained
  118. syn keyword erlangBIF unregister whereis contained
  119. " Sync at the beginning of functions: if this is not used, multiline string
  120. " are not always recognized, and the indentation script cannot use the
  121. " "searchpair" (because it would not always skip strings and comments when
  122. " looking for keywords and opening parens/brackets).
  123. syn sync match erlangSync grouphere NONE "^[a-z]\s*("
  124. let b:erlang_syntax_synced = 1
  125. " Define the default highlighting. See ":help group-name" for the groups and
  126. " their colors.
  127. let s:old_style = (exists("g:erlang_old_style_highlight") &&
  128. \g:erlang_old_style_highlight == 1)
  129. " Comments
  130. hi def link erlangComment Comment
  131. hi def link erlangCommentAnnotation Special
  132. hi def link erlangTodo Todo
  133. hi def link erlangShebang Comment
  134. " Numbers
  135. hi def link erlangNumberInteger Number
  136. hi def link erlangNumberFloat Float
  137. " Strings, atoms, characters
  138. hi def link erlangString String
  139. if s:old_style
  140. hi def link erlangQuotedAtom Type
  141. else
  142. hi def link erlangQuotedAtom String
  143. endif
  144. hi def link erlangStringModifier Special
  145. hi def link erlangQuotedAtomModifier Special
  146. hi def link erlangModifier Special
  147. " Operators, separators
  148. hi def link erlangOperator Operator
  149. hi def link erlangRightArrow Operator
  150. if s:old_style
  151. hi def link erlangBracket Normal
  152. hi def link erlangPipe Normal
  153. else
  154. hi def link erlangBracket Delimiter
  155. hi def link erlangPipe Delimiter
  156. endif
  157. " Atoms, functions, variables, macros
  158. if s:old_style
  159. hi def link erlangAtom Normal
  160. hi def link erlangLocalFuncCall Normal
  161. hi def link erlangLocalFuncRef Normal
  162. hi def link erlangGlobalFuncCall Function
  163. hi def link erlangGlobalFuncRef Function
  164. hi def link erlangVariable Normal
  165. hi def link erlangMacro Normal
  166. hi def link erlangQuotedMacro Normal
  167. hi def link erlangRecord Normal
  168. hi def link erlangQuotedRecord Normal
  169. hi def link erlangMap Normal
  170. else
  171. hi def link erlangAtom String
  172. hi def link erlangLocalFuncCall Normal
  173. hi def link erlangLocalFuncRef Normal
  174. hi def link erlangGlobalFuncCall Normal
  175. hi def link erlangGlobalFuncRef Normal
  176. hi def link erlangVariable Identifier
  177. hi def link erlangMacro Macro
  178. hi def link erlangQuotedMacro Macro
  179. hi def link erlangRecord Structure
  180. hi def link erlangQuotedRecord Structure
  181. hi def link erlangMap Structure
  182. endif
  183. " Bitstrings
  184. if !s:old_style
  185. hi def link erlangBitType Type
  186. endif
  187. " Constants and Directives
  188. if s:old_style
  189. hi def link erlangAttribute Type
  190. hi def link erlangMacroDef Type
  191. hi def link erlangUnknownAttribute Normal
  192. hi def link erlangInclude Type
  193. hi def link erlangRecordDef Type
  194. hi def link erlangDefine Type
  195. hi def link erlangPreCondit Type
  196. hi def link erlangType Type
  197. else
  198. hi def link erlangAttribute Keyword
  199. hi def link erlangMacroDef Macro
  200. hi def link erlangUnknownAttribute Normal
  201. hi def link erlangInclude Include
  202. hi def link erlangRecordDef Keyword
  203. hi def link erlangDefine Define
  204. hi def link erlangPreCondit PreCondit
  205. hi def link erlangType Type
  206. endif
  207. " Keywords
  208. hi def link erlangKeyword Keyword
  209. " Build-in-functions (BIFs)
  210. hi def link erlangBIF Function
  211. if s:old_style
  212. hi def link erlangBoolean Statement
  213. hi def link erlangExtra Statement
  214. hi def link erlangSignal Statement
  215. else
  216. hi def link erlangBoolean Boolean
  217. hi def link erlangExtra Statement
  218. hi def link erlangSignal Statement
  219. endif
  220. let b:current_syntax = "erlang"
  221. let &cpo = s:cpo_save
  222. unlet s:cpo_save
  223. " vim: sw=2 et