blob: 5eb61440ccf59646800d7347729ffeb37b59c7c8 [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 Moolenaar203d04d2013-06-06 21:36:40 +02004" Last Update: 2013-Jun-01
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 Moolenaarad3b3662013-05-17 18:14:19 +020039" Case sensitive
Bram Moolenaar071d4272004-06-13 20:20:40 +000040syn case match
41
Bram Moolenaarad3b3662013-05-17 18:14:19 +020042if version >= 600
43 setlocal iskeyword+=$,@-@
Bram Moolenaar071d4272004-06-13 20:20:40 +000044endif
Bram Moolenaarad3b3662013-05-17 18:14:19 +020045
46" Comments
Bram Moolenaar203d04d2013-06-06 21:36:40 +020047syn match erlangComment '%.*$' contains=erlangCommentAnnotation,erlangTodo
48syn match erlangCommentAnnotation ' \@<=@\%(clear\|docfile\|end\|headerfile\|todo\|TODO\|type\|author\|copyright\|doc\|reference\|see\|since\|title\|version\|deprecated\|hidden\|private\|equiv\|spec\|throws\)' contained
49syn match erlangCommentAnnotation /`[^']*'/ contained
50syn keyword erlangTodo TODO FIXME XXX contained
51syn match erlangShebang '^#!.*'
Bram Moolenaarad3b3662013-05-17 18:14:19 +020052
53" Numbers (minimum base is 2, maximum is 36.)
Bram Moolenaar203d04d2013-06-06 21:36:40 +020054syn match erlangNumberInteger '\<\d\+\>'
55syn match erlangNumberInteger '\<\%([2-9]\|[12]\d\|3[0-6]\)\+#[[:alnum:]]\+\>'
56syn match erlangNumberFloat '\<\d\+\.\d\+\%([eE][+-]\=\d\+\)\=\>'
Bram Moolenaarad3b3662013-05-17 18:14:19 +020057
58" Strings, atoms, characters
Bram Moolenaar203d04d2013-06-06 21:36:40 +020059syn region erlangString start=/"/ end=/"/ contains=erlangStringModifier
60syn region erlangQuotedAtom start=/'/ end=/'/ contains=erlangQuotedAtomModifier
61syn match erlangStringModifier '\~\a\|\\\%(\o\{1,3}\|x\x\x\|x{\x\+}\|\^.\|.\)' contained
62syn match erlangQuotedAtomModifier '\~\a\|\\\%(\o\{1,3}\|x\x\x\|x{\x\+}\|\^.\|.\)' contained
63syn match erlangModifier '\$\%([^\\]\|\\\%(\o\{1,3}\|x\x\x\|x{\x\+}\|\^.\|.\)\)'
Bram Moolenaarad3b3662013-05-17 18:14:19 +020064
Bram Moolenaar203d04d2013-06-06 21:36:40 +020065" Operators, separators
66syn match erlangOperator '==\|=:=\|/=\|=/=\|<\|=<\|>\|>=\|++\|--\|=\|!\|<-\|+\|-\|\*\|\/'
67syn keyword erlangOperator div rem or xor bor bxor bsl bsr and band not bnot andalso orelse
68syn match erlangBracket '{\|}\|\[\|]\||\|||'
69syn match erlangPipe '|'
70syn match erlangRightArrow '->'
Bram Moolenaarad3b3662013-05-17 18:14:19 +020071
Bram Moolenaar203d04d2013-06-06 21:36:40 +020072" Atoms, function calls (order is important)
73syn match erlangAtom '\<\l[[:alnum:]_@]*' contains=erlangBoolean
74syn keyword erlangBoolean true false contained
75syn match erlangLocalFuncCall '\<\a[[:alnum:]_@]*\>\%(\%(\s\|\n\|%.*\n\)*(\)\@=' contains=erlangBIF
76syn match erlangLocalFuncRef '\<\a[[:alnum:]_@]*\>\%(\%(\s\|\n\|%.*\n\)*/\)\@='
77syn 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
78syn 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 +020079
Bram Moolenaar203d04d2013-06-06 21:36:40 +020080" Variables, macros, records
81syn match erlangVariable '\<[A-Z_][[:alnum:]_@]*'
82syn match erlangMacro '??\=[[:alnum:]_@]\+'
83syn match erlangMacro '\%(-define(\)\@<=[[:alnum:]_@]\+'
84syn match erlangRecord '#\s*\l[[:alnum:]_@]*'
85
86" Bitstrings
87syn 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 +020088
89" Constants and Directives
Bram Moolenaar203d04d2013-06-06 21:36:40 +020090syn match erlangUnknownAttribute '-\%(\s\|\n\|%.*\n\)*\l[[:alnum:]_@]*' contains=erlangComment
91syn match erlangAttribute '-\%(\s\|\n\|%.*\n\)*\%(behaviou\=r\|compile\|export\|file\|import\|module\|author\|copyright\|doc\|vsn\|on_load\|export_type\)' contains=erlangComment
92syn match erlangInclude '-\%(\s\|\n\|%.*\n\)*\%(include\|include_lib\)\>' contains=erlangComment
93syn match erlangRecordDef '-\%(\s\|\n\|%.*\n\)*record\>' contains=erlangComment
94syn match erlangDefine '-\%(\s\|\n\|%.*\n\)*\%(define\|undef\)\>' contains=erlangComment
95syn match erlangPreCondit '-\%(\s\|\n\|%.*\n\)*\%(ifdef\|ifndef\|else\|endif\)\>' contains=erlangComment
96syn match erlangType '-\%(\s\|\n\|%.*\n\)*\%(spec\|type\|opaque\|callback\)\>' contains=erlangComment
Bram Moolenaarad3b3662013-05-17 18:14:19 +020097
98" Keywords
Bram Moolenaar203d04d2013-06-06 21:36:40 +020099syn keyword erlangKeyword after begin case catch cond end fun if let of query
100syn keyword erlangKeyword receive when try
Bram Moolenaarad3b3662013-05-17 18:14:19 +0200101
Bram Moolenaar203d04d2013-06-06 21:36:40 +0200102" Build-in-functions (BIFs)
103syn keyword erlangBIF abs alive apply atom_to_binary atom_to_list contained
104syn keyword erlangBIF binary_part binary_to_atom contained
105syn keyword erlangBIF binary_to_existing_atom binary_to_float contained
106syn keyword erlangBIF binary_to_integer bitstring_to_list contained
107syn keyword erlangBIF binary_to_list binary_to_term bit_size contained
108syn keyword erlangBIF byte_size check_old_code check_process_code contained
109syn keyword erlangBIF concat_binary date delete_module demonitor contained
110syn keyword erlangBIF disconnect_node element erase error exit contained
111syn keyword erlangBIF float float_to_binary float_to_list contained
112syn keyword erlangBIF garbage_collect get get_keys group_leader contained
113syn keyword erlangBIF halt hd integer_to_binary integer_to_list contained
114syn keyword erlangBIF iolist_to_binary iolist_size is_alive contained
115syn keyword erlangBIF is_atom is_binary is_bitstring is_boolean contained
116syn keyword erlangBIF is_float is_function is_integer is_list contained
117syn keyword erlangBIF is_number is_pid is_port is_process_alive contained
118syn keyword erlangBIF is_record is_reference is_tuple length link contained
119syn keyword erlangBIF list_to_atom list_to_binary contained
120syn keyword erlangBIF list_to_bitstring list_to_existing_atom contained
121syn keyword erlangBIF list_to_float list_to_integer list_to_pid contained
122syn keyword erlangBIF list_to_tuple load_module make_ref max min contained
123syn keyword erlangBIF module_loaded monitor monitor_node node contained
124syn keyword erlangBIF nodes now open_port pid_to_list port_close contained
125syn keyword erlangBIF port_command port_connect pre_loaded contained
126syn keyword erlangBIF process_flag process_flag process_info contained
127syn keyword erlangBIF process purge_module put register registered contained
128syn keyword erlangBIF round self setelement size spawn spawn_link contained
129syn keyword erlangBIF spawn_monitor spawn_opt split_binary contained
130syn keyword erlangBIF statistics term_to_binary throw time tl contained
131syn keyword erlangBIF trunc tuple_size tuple_to_list unlink contained
132syn keyword erlangBIF unregister whereis contained
Bram Moolenaarad3b3662013-05-17 18:14:19 +0200133
134" Sync at the beginning of functions: if this is not used, multiline string
Bram Moolenaar203d04d2013-06-06 21:36:40 +0200135" are not always recognized, and the indentation script cannot use the
136" "searchpair" (because it would not always skip strings and comments when
137" looking for keywords and opening parens/brackets).
Bram Moolenaarad3b3662013-05-17 18:14:19 +0200138syn sync match erlangSync grouphere NONE "^[a-z]\s*("
Bram Moolenaar203d04d2013-06-06 21:36:40 +0200139let b:erlang_syntax_synced = 1
Bram Moolenaarad3b3662013-05-17 18:14:19 +0200140
Bram Moolenaar203d04d2013-06-06 21:36:40 +0200141" Define the default highlighting. See ":help group-name" for the groups and
142" their colors.
143
144let s:old_style = (exists("g:erlang_old_style_highlight") && g:erlang_old_style_highlight == 1)
145
Bram Moolenaarad3b3662013-05-17 18:14:19 +0200146" For version 5.7 and earlier: only when not done already
147" For version 5.8 and later: only when an item doesn't have highlighting yet
Bram Moolenaar203d04d2013-06-06 21:36:40 +0200148if version >= 508 || !exists("did_erlang_inits")
Bram Moolenaarad3b3662013-05-17 18:14:19 +0200149 if version < 508
150 let did_erlang_inits = 1
151 command -nargs=+ HiLink hi link <args>
152 else
153 command -nargs=+ HiLink hi def link <args>
154 endif
155
Bram Moolenaar203d04d2013-06-06 21:36:40 +0200156 " Comments
Bram Moolenaarad3b3662013-05-17 18:14:19 +0200157 HiLink erlangComment Comment
158 HiLink erlangCommentAnnotation Special
159 HiLink erlangTodo Todo
Bram Moolenaar203d04d2013-06-06 21:36:40 +0200160 HiLink erlangShebang Comment
Bram Moolenaarad3b3662013-05-17 18:14:19 +0200161
Bram Moolenaar203d04d2013-06-06 21:36:40 +0200162 " Numbers
Bram Moolenaarad3b3662013-05-17 18:14:19 +0200163 HiLink erlangNumberInteger Number
164 HiLink erlangNumberFloat Float
Bram Moolenaarad3b3662013-05-17 18:14:19 +0200165
Bram Moolenaar203d04d2013-06-06 21:36:40 +0200166 " Strings, atoms, characters
167 HiLink erlangString String
168
169 if s:old_style
170 HiLink erlangQuotedAtom Type
171 else
172 HiLink erlangQuotedAtom String
173 endif
174
175 HiLink erlangStringModifier Special
176 HiLink erlangQuotedAtomModifier Special
Bram Moolenaarad3b3662013-05-17 18:14:19 +0200177 HiLink erlangModifier Special
178
Bram Moolenaar203d04d2013-06-06 21:36:40 +0200179 " Operators, separators
180 HiLink erlangOperator Operator
181 HiLink erlangRightArrow Operator
182 if s:old_style
183 HiLink erlangBracket Normal
184 HiLink erlangPipe Normal
185 else
186 HiLink erlangBracket Delimiter
187 HiLink erlangPipe Delimiter
188 endif
189
190 " Atoms, functions, variables, macros
191 if s:old_style
192 HiLink erlangAtom Normal
193 HiLink erlangLocalFuncCall Normal
194 HiLink erlangLocalFuncRef Normal
195 HiLink erlangGlobalFuncCall Function
196 HiLink erlangGlobalFuncRef Function
197 HiLink erlangVariable Normal
198 HiLink erlangMacro Normal
199 HiLink erlangRecord Normal
200 else
201 HiLink erlangAtom String
202 HiLink erlangLocalFuncCall Normal
203 HiLink erlangLocalFuncRef Normal
204 HiLink erlangGlobalFuncCall Normal
205 HiLink erlangGlobalFuncRef Normal
206 HiLink erlangVariable Identifier
207 HiLink erlangMacro Macro
208 HiLink erlangRecord Structure
209 endif
210
211 " Bitstrings
212 if !s:old_style
213 HiLink erlangBitType Type
214 endif
215
216 " Constants and Directives
217 if s:old_style
218 HiLink erlangAttribute Type
219 HiLink erlangMacroDef Type
220 HiLink erlangUnknownAttribute Normal
221 HiLink erlangInclude Type
222 HiLink erlangRecordDef Type
223 HiLink erlangDefine Type
224 HiLink erlangPreCondit Type
225 HiLink erlangType Type
226 else
227 HiLink erlangAttribute Keyword
228 HiLink erlangMacroDef Macro
229 HiLink erlangUnknownAttribute Normal
230 HiLink erlangInclude Include
231 HiLink erlangRecordDef Keyword
232 HiLink erlangDefine Define
233 HiLink erlangPreCondit PreCondit
234 HiLink erlangType Type
235 endif
236
237 " Keywords
238 HiLink erlangKeyword Keyword
239
240 " Build-in-functions (BIFs)
Bram Moolenaarad3b3662013-05-17 18:14:19 +0200241 HiLink erlangBIF Function
242
Bram Moolenaar203d04d2013-06-06 21:36:40 +0200243 if s:old_style
244 HiLink erlangBoolean Statement
245 HiLink erlangExtra Statement
246 HiLink erlangSignal Statement
247 else
248 HiLink erlangBoolean Boolean
249 HiLink erlangExtra Statement
250 HiLink erlangSignal Statement
251 endif
Bram Moolenaarad3b3662013-05-17 18:14:19 +0200252
253 delcommand HiLink
254endif
255
Bram Moolenaarad3b3662013-05-17 18:14:19 +0200256let b:current_syntax = "erlang"
257
258" vim: sw=2 et