erlang.vim 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259
  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: 2017-Mar-05
  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\|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 match erlangMap '#'
  70. syn match erlangRecord '#\s*\l[[:alnum:]_@]*'
  71. syn region erlangQuotedRecord start=/#\s*'/ end=/'/ contains=erlangQuotedAtomModifier
  72. " Shebang (this line has to be after the ErlangMap)
  73. syn match erlangShebang '^#!.*'
  74. " Bitstrings
  75. 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
  76. " Constants and Directives
  77. syn match erlangUnknownAttribute '^\s*-\%(\s\|\n\|%.*\n\)*\l[[:alnum:]_@]*' contains=erlangComment
  78. syn match erlangAttribute '^\s*-\%(\s\|\n\|%.*\n\)*\%(behaviou\=r\|compile\|export\(_type\)\=\|file\|import\|module\|author\|copyright\|doc\|vsn\|on_load\)\>' contains=erlangComment
  79. syn match erlangInclude '^\s*-\%(\s\|\n\|%.*\n\)*\%(include\|include_lib\)\>' contains=erlangComment
  80. syn match erlangRecordDef '^\s*-\%(\s\|\n\|%.*\n\)*record\>' contains=erlangComment
  81. syn match erlangDefine '^\s*-\%(\s\|\n\|%.*\n\)*\%(define\|undef\)\>' contains=erlangComment
  82. syn match erlangPreCondit '^\s*-\%(\s\|\n\|%.*\n\)*\%(ifdef\|ifndef\|else\|endif\)\>' contains=erlangComment
  83. syn match erlangType '^\s*-\%(\s\|\n\|%.*\n\)*\%(spec\|type\|opaque\|callback\)\>' contains=erlangComment
  84. " Keywords
  85. syn keyword erlangKeyword after begin case catch cond end fun if let of
  86. syn keyword erlangKeyword receive when try
  87. " Build-in-functions (BIFs)
  88. syn keyword erlangBIF abs alive apply atom_to_binary atom_to_list contained
  89. syn keyword erlangBIF binary_part binary_to_atom contained
  90. syn keyword erlangBIF binary_to_existing_atom binary_to_float contained
  91. syn keyword erlangBIF binary_to_integer bitstring_to_list contained
  92. syn keyword erlangBIF binary_to_list binary_to_term bit_size contained
  93. syn keyword erlangBIF byte_size check_old_code check_process_code contained
  94. syn keyword erlangBIF concat_binary date delete_module demonitor contained
  95. syn keyword erlangBIF disconnect_node element erase error exit contained
  96. syn keyword erlangBIF float float_to_binary float_to_list contained
  97. syn keyword erlangBIF garbage_collect get get_keys group_leader contained
  98. syn keyword erlangBIF halt hd integer_to_binary integer_to_list contained
  99. syn keyword erlangBIF iolist_to_binary iolist_size is_alive contained
  100. syn keyword erlangBIF is_atom is_binary is_bitstring is_boolean contained
  101. syn keyword erlangBIF is_float is_function is_integer is_list contained
  102. syn keyword erlangBIF is_number is_pid is_port is_process_alive contained
  103. syn keyword erlangBIF is_record is_reference is_tuple length link contained
  104. syn keyword erlangBIF list_to_atom list_to_binary contained
  105. syn keyword erlangBIF list_to_bitstring list_to_existing_atom contained
  106. syn keyword erlangBIF list_to_float list_to_integer list_to_pid contained
  107. syn keyword erlangBIF list_to_tuple load_module make_ref max min contained
  108. syn keyword erlangBIF module_loaded monitor monitor_node node contained
  109. syn keyword erlangBIF nodes now open_port pid_to_list port_close contained
  110. syn keyword erlangBIF port_command port_connect pre_loaded contained
  111. syn keyword erlangBIF process_flag process_flag process_info contained
  112. syn keyword erlangBIF process purge_module put register registered contained
  113. syn keyword erlangBIF round self setelement size spawn spawn_link contained
  114. syn keyword erlangBIF spawn_monitor spawn_opt split_binary contained
  115. syn keyword erlangBIF statistics term_to_binary throw time tl contained
  116. syn keyword erlangBIF trunc tuple_size tuple_to_list unlink contained
  117. syn keyword erlangBIF unregister whereis contained
  118. " Sync at the beginning of functions: if this is not used, multiline string
  119. " are not always recognized, and the indentation script cannot use the
  120. " "searchpair" (because it would not always skip strings and comments when
  121. " looking for keywords and opening parens/brackets).
  122. syn sync match erlangSync grouphere NONE "^[a-z]\s*("
  123. let b:erlang_syntax_synced = 1
  124. " Define the default highlighting. See ":help group-name" for the groups and
  125. " their colors.
  126. let s:old_style = (exists("g:erlang_old_style_highlight") &&
  127. \g:erlang_old_style_highlight == 1)
  128. " Comments
  129. hi def link erlangComment Comment
  130. hi def link erlangCommentAnnotation Special
  131. hi def link erlangTodo Todo
  132. hi def link erlangShebang Comment
  133. " Numbers
  134. hi def link erlangNumberInteger Number
  135. hi def link erlangNumberFloat Float
  136. " Strings, atoms, characters
  137. hi def link erlangString String
  138. if s:old_style
  139. hi def link erlangQuotedAtom Type
  140. else
  141. hi def link erlangQuotedAtom String
  142. endif
  143. hi def link erlangStringModifier Special
  144. hi def link erlangQuotedAtomModifier Special
  145. hi def link erlangModifier Special
  146. " Operators, separators
  147. hi def link erlangOperator Operator
  148. hi def link erlangRightArrow Operator
  149. if s:old_style
  150. hi def link erlangBracket Normal
  151. hi def link erlangPipe Normal
  152. else
  153. hi def link erlangBracket Delimiter
  154. hi def link erlangPipe Delimiter
  155. endif
  156. " Atoms, functions, variables, macros
  157. if s:old_style
  158. hi def link erlangAtom Normal
  159. hi def link erlangLocalFuncCall Normal
  160. hi def link erlangLocalFuncRef Normal
  161. hi def link erlangGlobalFuncCall Function
  162. hi def link erlangGlobalFuncRef Function
  163. hi def link erlangVariable Normal
  164. hi def link erlangMacro Normal
  165. hi def link erlangRecord Normal
  166. hi def link erlangQuotedRecord Normal
  167. hi def link erlangMap Normal
  168. else
  169. hi def link erlangAtom String
  170. hi def link erlangLocalFuncCall Normal
  171. hi def link erlangLocalFuncRef Normal
  172. hi def link erlangGlobalFuncCall Normal
  173. hi def link erlangGlobalFuncRef Normal
  174. hi def link erlangVariable Identifier
  175. hi def link erlangMacro Macro
  176. hi def link erlangRecord Structure
  177. hi def link erlangQuotedRecord Structure
  178. hi def link erlangMap Structure
  179. endif
  180. " Bitstrings
  181. if !s:old_style
  182. hi def link erlangBitType Type
  183. endif
  184. " Constants and Directives
  185. if s:old_style
  186. hi def link erlangAttribute Type
  187. hi def link erlangMacroDef Type
  188. hi def link erlangUnknownAttribute Normal
  189. hi def link erlangInclude Type
  190. hi def link erlangRecordDef Type
  191. hi def link erlangDefine Type
  192. hi def link erlangPreCondit Type
  193. hi def link erlangType Type
  194. else
  195. hi def link erlangAttribute Keyword
  196. hi def link erlangMacroDef Macro
  197. hi def link erlangUnknownAttribute Normal
  198. hi def link erlangInclude Include
  199. hi def link erlangRecordDef Keyword
  200. hi def link erlangDefine Define
  201. hi def link erlangPreCondit PreCondit
  202. hi def link erlangType Type
  203. endif
  204. " Keywords
  205. hi def link erlangKeyword Keyword
  206. " Build-in-functions (BIFs)
  207. hi def link erlangBIF Function
  208. if s:old_style
  209. hi def link erlangBoolean Statement
  210. hi def link erlangExtra Statement
  211. hi def link erlangSignal Statement
  212. else
  213. hi def link erlangBoolean Boolean
  214. hi def link erlangExtra Statement
  215. hi def link erlangSignal Statement
  216. endif
  217. let b:current_syntax = "erlang"
  218. let &cpo = s:cpo_save
  219. unlet s:cpo_save
  220. " vim: sw=2 et