blob: 02597e75f3bf811566833013e9e871f531d58397 [file] [log] [blame]
Bram Moolenaar071d4272004-06-13 20:20:40 +00001" Vim syntax file
Bram Moolenaarad3b3662013-05-17 18:14:19 +02002" Language: Erlang (http://www.erlang.org)
3" Maintainer: Csaba Hoch <csaba.hoch@gmail.com>
Bram Moolenaar9d98fe92013-08-03 18:35:36 +02004" Last Update: 2013-Jul-25
Bram Moolenaar6be7f872012-01-20 21:08:56 +01005" License: Vim license
Bram Moolenaarad3b3662013-05-17 18:14:19 +02006" URL: https://github.com/hcs42/vim-erlang
Bram Moolenaar071d4272004-06-13 20:20:40 +00007
Bram Moolenaar203d04d2013-06-06 21:36:40 +02008" 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) <kmarzic@fly.srk.fer.hr>
15" [2]: Csaba Hoch <csaba.hoch@gmail.com>
16" [3]: https://github.com/jimenezrick/vimerl
17" [4]: Oscar Hellström <oscar@oscarh.net> (http://oscar.hellstrom.st)
18" [5]: Ricardo Catalinas Jiménez <jimenezrick@gmail.com>
19
Bram Moolenaarad3b3662013-05-17 18:14:19 +020020" Customization:
21"
Bram Moolenaar203d04d2013-06-06 21:36:40 +020022" To use the old highlighting style, add this to your .vimrc:
Bram Moolenaarad3b3662013-05-17 18:14:19 +020023"
Bram Moolenaar203d04d2013-06-06 21:36:40 +020024" let g:erlang_old_style_highlight = 1
Bram Moolenaarad3b3662013-05-17 18:14:19 +020025"
Bram Moolenaar203d04d2013-06-06 21:36:40 +020026" To highlight further module attributes, add them to
27" ~/.vim/after/syntax/erlang.vim:
Bram Moolenaarad3b3662013-05-17 18:14:19 +020028"
Bram Moolenaar203d04d2013-06-06 21:36:40 +020029" syn keyword erlangAttribute myattr1 myattr2 contained
Bram Moolenaarad3b3662013-05-17 18:14:19 +020030
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
Bram Moolenaar071d4272004-06-13 20:20:40 +000037endif
38
Bram Moolenaar9d98fe92013-08-03 18:35:36 +020039let s:cpo_save = &cpo
40set cpo&vim
41
Bram Moolenaarad3b3662013-05-17 18:14:19 +020042" Case sensitive
Bram Moolenaar071d4272004-06-13 20:20:40 +000043syn case match
44
Bram Moolenaarad3b3662013-05-17 18:14:19 +020045if version >= 600
46 setlocal iskeyword+=$,@-@
Bram Moolenaar071d4272004-06-13 20:20:40 +000047endif
Bram Moolenaarad3b3662013-05-17 18:14:19 +020048
49" Comments
Bram Moolenaar203d04d2013-06-06 21:36:40 +020050syn 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 '^#!.*'
Bram Moolenaarad3b3662013-05-17 18:14:19 +020055
56" Numbers (minimum base is 2, maximum is 36.)
Bram Moolenaar203d04d2013-06-06 21:36:40 +020057syn match erlangNumberInteger '\<\d\+\>'
58syn match erlangNumberInteger '\<\%([2-9]\|[12]\d\|3[0-6]\)\+#[[:alnum:]]\+\>'
59syn match erlangNumberFloat '\<\d\+\.\d\+\%([eE][+-]\=\d\+\)\=\>'
Bram Moolenaarad3b3662013-05-17 18:14:19 +020060
61" Strings, atoms, characters
Bram Moolenaar203d04d2013-06-06 21:36:40 +020062syn 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\+}\|\^.\|.\)\)'
Bram Moolenaarad3b3662013-05-17 18:14:19 +020067
Bram Moolenaar203d04d2013-06-06 21:36:40 +020068" 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 '->'
Bram Moolenaarad3b3662013-05-17 18:14:19 +020074
Bram Moolenaar203d04d2013-06-06 21:36:40 +020075" 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
Bram Moolenaarad3b3662013-05-17 18:14:19 +020082
Bram Moolenaar203d04d2013-06-06 21:36:40 +020083" 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
Bram Moolenaarad3b3662013-05-17 18:14:19 +020091
92" Constants and Directives
Bram Moolenaar9d98fe92013-08-03 18:35:36 +020093syn 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
Bram Moolenaarad3b3662013-05-17 18:14:19 +0200100
101" Keywords
Bram Moolenaar203d04d2013-06-06 21:36:40 +0200102syn keyword erlangKeyword after begin case catch cond end fun if let of query
103syn keyword erlangKeyword receive when try
Bram Moolenaarad3b3662013-05-17 18:14:19 +0200104
Bram Moolenaar203d04d2013-06-06 21:36:40 +0200105" 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
Bram Moolenaarad3b3662013-05-17 18:14:19 +0200136
137" Sync at the beginning of functions: if this is not used, multiline string
Bram Moolenaar203d04d2013-06-06 21:36:40 +0200138" 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).
Bram Moolenaarad3b3662013-05-17 18:14:19 +0200141syn sync match erlangSync grouphere NONE "^[a-z]\s*("
Bram Moolenaar203d04d2013-06-06 21:36:40 +0200142let b:erlang_syntax_synced = 1
Bram Moolenaarad3b3662013-05-17 18:14:19 +0200143
Bram Moolenaar203d04d2013-06-06 21:36:40 +0200144" Define the default highlighting. See ":help group-name" for the groups and
145" their colors.
146
Bram Moolenaar9d98fe92013-08-03 18:35:36 +0200147let s:old_style = (exists("g:erlang_old_style_highlight") &&
148 \g:erlang_old_style_highlight == 1)
Bram Moolenaar203d04d2013-06-06 21:36:40 +0200149
Bram Moolenaarad3b3662013-05-17 18:14:19 +0200150" 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
Bram Moolenaar203d04d2013-06-06 21:36:40 +0200152if version >= 508 || !exists("did_erlang_inits")
Bram Moolenaarad3b3662013-05-17 18:14:19 +0200153 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
Bram Moolenaar203d04d2013-06-06 21:36:40 +0200160 " Comments
Bram Moolenaarad3b3662013-05-17 18:14:19 +0200161 HiLink erlangComment Comment
162 HiLink erlangCommentAnnotation Special
163 HiLink erlangTodo Todo
Bram Moolenaar203d04d2013-06-06 21:36:40 +0200164 HiLink erlangShebang Comment
Bram Moolenaarad3b3662013-05-17 18:14:19 +0200165
Bram Moolenaar203d04d2013-06-06 21:36:40 +0200166 " Numbers
Bram Moolenaarad3b3662013-05-17 18:14:19 +0200167 HiLink erlangNumberInteger Number
168 HiLink erlangNumberFloat Float
Bram Moolenaarad3b3662013-05-17 18:14:19 +0200169
Bram Moolenaar203d04d2013-06-06 21:36:40 +0200170 " 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
Bram Moolenaarad3b3662013-05-17 18:14:19 +0200181 HiLink erlangModifier Special
182
Bram Moolenaar203d04d2013-06-06 21:36:40 +0200183 " 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)
Bram Moolenaarad3b3662013-05-17 18:14:19 +0200245 HiLink erlangBIF Function
246
Bram Moolenaar203d04d2013-06-06 21:36:40 +0200247 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
Bram Moolenaarad3b3662013-05-17 18:14:19 +0200256
257 delcommand HiLink
258endif
259
Bram Moolenaarad3b3662013-05-17 18:14:19 +0200260let b:current_syntax = "erlang"
261
Bram Moolenaar9d98fe92013-08-03 18:35:36 +0200262let &cpo = s:cpo_save
263unlet s:cpo_save
264
Bram Moolenaarad3b3662013-05-17 18:14:19 +0200265" vim: sw=2 et