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