xref: /vim-8.2.3635/runtime/syntax/erlang.vim (revision 89bcfda6)
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" quit when a syntax file was already loaded
32if exists("b:current_syntax")
33    finish
34endif
35
36let s:cpo_save = &cpo
37set cpo&vim
38
39" Case sensitive
40syn case match
41
42setlocal iskeyword+=$,@-@
43
44" Comments
45syn match erlangComment           '%.*$' contains=erlangCommentAnnotation,erlangTodo
46syn match erlangCommentAnnotation ' \@<=@\%(clear\|docfile\|end\|headerfile\|todo\|TODO\|type\|author\|copyright\|doc\|reference\|see\|since\|title\|version\|deprecated\|hidden\|private\|equiv\|spec\|throws\)' contained
47syn match erlangCommentAnnotation /`[^']*'/ contained
48syn keyword erlangTodo            TODO FIXME XXX contained
49syn match erlangShebang           '^#!.*'
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     '\~\a\|\\\%(\o\{1,3}\|x\x\x\|x{\x\+}\|\^.\|.\)' contained
60syn match erlangQuotedAtomModifier '\~\a\|\\\%(\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
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
77
78" Variables, macros, records
79syn match erlangVariable '\<[A-Z_][[:alnum:]_@]*'
80syn match erlangMacro    '??\=[[:alnum:]_@]\+'
81syn match erlangMacro    '\%(-define(\)\@<=[[:alnum:]_@]\+'
82syn match erlangRecord   '#\s*\l[[:alnum:]_@]*'
83
84" Bitstrings
85syn 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
86
87" Constants and Directives
88syn match erlangUnknownAttribute '^\s*-\%(\s\|\n\|%.*\n\)*\l[[:alnum:]_@]*' contains=erlangComment
89syn match erlangAttribute '^\s*-\%(\s\|\n\|%.*\n\)*\%(behaviou\=r\|compile\|export\(_type\)\=\|file\|import\|module\|author\|copyright\|doc\|vsn\|on_load\)\>' contains=erlangComment
90syn match erlangInclude   '^\s*-\%(\s\|\n\|%.*\n\)*\%(include\|include_lib\)\>' contains=erlangComment
91syn match erlangRecordDef '^\s*-\%(\s\|\n\|%.*\n\)*record\>' contains=erlangComment
92syn match erlangDefine    '^\s*-\%(\s\|\n\|%.*\n\)*\%(define\|undef\)\>' contains=erlangComment
93syn match erlangPreCondit '^\s*-\%(\s\|\n\|%.*\n\)*\%(ifdef\|ifndef\|else\|endif\)\>' contains=erlangComment
94syn match erlangType      '^\s*-\%(\s\|\n\|%.*\n\)*\%(spec\|type\|opaque\|callback\)\>' contains=erlangComment
95
96" Keywords
97syn keyword erlangKeyword after begin case catch cond end fun if let of query
98syn keyword erlangKeyword receive when try
99
100" Build-in-functions (BIFs)
101syn keyword erlangBIF abs alive apply atom_to_binary atom_to_list contained
102syn keyword erlangBIF binary_part binary_to_atom contained
103syn keyword erlangBIF binary_to_existing_atom binary_to_float contained
104syn keyword erlangBIF binary_to_integer bitstring_to_list contained
105syn keyword erlangBIF binary_to_list binary_to_term bit_size contained
106syn keyword erlangBIF byte_size check_old_code check_process_code contained
107syn keyword erlangBIF concat_binary date delete_module demonitor contained
108syn keyword erlangBIF disconnect_node element erase error exit contained
109syn keyword erlangBIF float float_to_binary float_to_list contained
110syn keyword erlangBIF garbage_collect get get_keys group_leader contained
111syn keyword erlangBIF halt hd integer_to_binary integer_to_list contained
112syn keyword erlangBIF iolist_to_binary iolist_size is_alive contained
113syn keyword erlangBIF is_atom is_binary is_bitstring is_boolean contained
114syn keyword erlangBIF is_float is_function is_integer is_list contained
115syn keyword erlangBIF is_number is_pid is_port is_process_alive contained
116syn keyword erlangBIF is_record is_reference is_tuple length link contained
117syn keyword erlangBIF list_to_atom list_to_binary contained
118syn keyword erlangBIF list_to_bitstring list_to_existing_atom contained
119syn keyword erlangBIF list_to_float list_to_integer list_to_pid contained
120syn keyword erlangBIF list_to_tuple load_module make_ref max min contained
121syn keyword erlangBIF module_loaded monitor monitor_node node contained
122syn keyword erlangBIF nodes now open_port pid_to_list port_close contained
123syn keyword erlangBIF port_command port_connect pre_loaded contained
124syn keyword erlangBIF process_flag process_flag process_info contained
125syn keyword erlangBIF process purge_module put register registered contained
126syn keyword erlangBIF round self setelement size spawn spawn_link contained
127syn keyword erlangBIF spawn_monitor spawn_opt split_binary contained
128syn keyword erlangBIF statistics term_to_binary throw time tl contained
129syn keyword erlangBIF trunc tuple_size tuple_to_list unlink contained
130syn keyword erlangBIF unregister whereis contained
131
132" Sync at the beginning of functions: if this is not used, multiline string
133" are not always recognized, and the indentation script cannot use the
134" "searchpair" (because it would not always skip strings and comments when
135" looking for keywords and opening parens/brackets).
136syn sync match erlangSync grouphere NONE "^[a-z]\s*("
137let b:erlang_syntax_synced = 1
138
139" Define the default highlighting. See ":help group-name" for the groups and
140" their colors.
141
142let s:old_style = (exists("g:erlang_old_style_highlight") &&
143                  \g:erlang_old_style_highlight == 1)
144
145" Only when an item doesn't have highlighting yet
146command -nargs=+ HiLink hi def link <args>
147
148" Comments
149HiLink erlangComment Comment
150HiLink erlangCommentAnnotation Special
151HiLink erlangTodo Todo
152HiLink erlangShebang Comment
153
154" Numbers
155HiLink erlangNumberInteger Number
156HiLink erlangNumberFloat Float
157
158" Strings, atoms, characters
159HiLink erlangString String
160
161if s:old_style
162HiLink erlangQuotedAtom Type
163else
164HiLink erlangQuotedAtom String
165endif
166
167HiLink erlangStringModifier Special
168HiLink erlangQuotedAtomModifier Special
169HiLink erlangModifier Special
170
171" Operators, separators
172HiLink erlangOperator Operator
173HiLink erlangRightArrow Operator
174if s:old_style
175HiLink erlangBracket Normal
176HiLink erlangPipe Normal
177else
178HiLink erlangBracket Delimiter
179HiLink erlangPipe Delimiter
180endif
181
182" Atoms, functions, variables, macros
183if s:old_style
184HiLink erlangAtom Normal
185HiLink erlangLocalFuncCall Normal
186HiLink erlangLocalFuncRef Normal
187HiLink erlangGlobalFuncCall Function
188HiLink erlangGlobalFuncRef Function
189HiLink erlangVariable Normal
190HiLink erlangMacro Normal
191HiLink erlangRecord Normal
192else
193HiLink erlangAtom String
194HiLink erlangLocalFuncCall Normal
195HiLink erlangLocalFuncRef Normal
196HiLink erlangGlobalFuncCall Normal
197HiLink erlangGlobalFuncRef Normal
198HiLink erlangVariable Identifier
199HiLink erlangMacro Macro
200HiLink erlangRecord Structure
201endif
202
203" Bitstrings
204if !s:old_style
205HiLink erlangBitType Type
206endif
207
208" Constants and Directives
209if s:old_style
210HiLink erlangAttribute Type
211HiLink erlangMacroDef Type
212HiLink erlangUnknownAttribute Normal
213HiLink erlangInclude Type
214HiLink erlangRecordDef Type
215HiLink erlangDefine Type
216HiLink erlangPreCondit Type
217HiLink erlangType Type
218else
219HiLink erlangAttribute Keyword
220HiLink erlangMacroDef Macro
221HiLink erlangUnknownAttribute Normal
222HiLink erlangInclude Include
223HiLink erlangRecordDef Keyword
224HiLink erlangDefine Define
225HiLink erlangPreCondit PreCondit
226HiLink erlangType Type
227endif
228
229" Keywords
230HiLink erlangKeyword Keyword
231
232" Build-in-functions (BIFs)
233HiLink erlangBIF Function
234
235if s:old_style
236HiLink erlangBoolean Statement
237HiLink erlangExtra Statement
238HiLink erlangSignal Statement
239else
240HiLink erlangBoolean Boolean
241HiLink erlangExtra Statement
242HiLink erlangSignal Statement
243endif
244
245delcommand HiLink
246
247let b:current_syntax = "erlang"
248
249let &cpo = s:cpo_save
250unlet s:cpo_save
251
252" vim: sw=2 et
253