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