blob: 0b256193ab36790995c9a71e66e3db160f131f92 [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 Moolenaar036986f2017-03-16 17:41:02 +01004" Contributor: Adam Rutkowski <hq@mtod.org>
Bram Moolenaarf269eab2022-10-03 18:04:35 +01005" Last Update: 2022-Sep-06
Bram Moolenaar6be7f872012-01-20 21:08:56 +01006" License: Vim license
Bram Moolenaar036986f2017-03-16 17:41:02 +01007" URL: https://github.com/vim-erlang/vim-erlang-runtime
Bram Moolenaar071d4272004-06-13 20:20:40 +00008
Bram Moolenaar203d04d2013-06-06 21:36:40 +02009" 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) <kmarzic@fly.srk.fer.hr>
16" [2]: Csaba Hoch <csaba.hoch@gmail.com>
17" [3]: https://github.com/jimenezrick/vimerl
18" [4]: Oscar Hellström <oscar@oscarh.net> (http://oscar.hellstrom.st)
19" [5]: Ricardo Catalinas Jiménez <jimenezrick@gmail.com>
20
Bram Moolenaarad3b3662013-05-17 18:14:19 +020021" Customization:
22"
Bram Moolenaar203d04d2013-06-06 21:36:40 +020023" To use the old highlighting style, add this to your .vimrc:
Bram Moolenaarad3b3662013-05-17 18:14:19 +020024"
Bram Moolenaar203d04d2013-06-06 21:36:40 +020025" let g:erlang_old_style_highlight = 1
Bram Moolenaarad3b3662013-05-17 18:14:19 +020026"
Bram Moolenaar203d04d2013-06-06 21:36:40 +020027" To highlight further module attributes, add them to
28" ~/.vim/after/syntax/erlang.vim:
Bram Moolenaarad3b3662013-05-17 18:14:19 +020029"
Bram Moolenaar203d04d2013-06-06 21:36:40 +020030" syn keyword erlangAttribute myattr1 myattr2 contained
Bram Moolenaarad3b3662013-05-17 18:14:19 +020031
Bram Moolenaar89bcfda2016-08-30 23:26:57 +020032" quit when a syntax file was already loaded
33if exists("b:current_syntax")
Bram Moolenaarad3b3662013-05-17 18:14:19 +020034 finish
Bram Moolenaar071d4272004-06-13 20:20:40 +000035endif
36
Bram Moolenaar9d98fe92013-08-03 18:35:36 +020037let s:cpo_save = &cpo
38set cpo&vim
39
Bram Moolenaarad3b3662013-05-17 18:14:19 +020040" Case sensitive
Bram Moolenaar071d4272004-06-13 20:20:40 +000041syn case match
42
Bram Moolenaar89bcfda2016-08-30 23:26:57 +020043setlocal iskeyword+=$,@-@
Bram Moolenaarad3b3662013-05-17 18:14:19 +020044
45" Comments
Bram Moolenaar203d04d2013-06-06 21:36:40 +020046syn match erlangComment '%.*$' contains=erlangCommentAnnotation,erlangTodo
Bram Moolenaar1d59aa12020-09-19 18:50:13 +020047syn match erlangCommentAnnotation ' \@<=@\%(clear\|docfile\|end\|headerfile\|todo\|TODO\|type\|author\|copyright\|doc\|reference\|see\|since\|title\|version\|deprecated\|hidden\|param\|private\|equiv\|spec\|throws\)' contained
Bram Moolenaar203d04d2013-06-06 21:36:40 +020048syn match erlangCommentAnnotation /`[^']*'/ contained
49syn keyword erlangTodo TODO FIXME XXX contained
Bram Moolenaarad3b3662013-05-17 18:14:19 +020050
51" Numbers (minimum base is 2, maximum is 36.)
Bram Moolenaar203d04d2013-06-06 21:36:40 +020052syn match erlangNumberInteger '\<\d\+\>'
53syn match erlangNumberInteger '\<\%([2-9]\|[12]\d\|3[0-6]\)\+#[[:alnum:]]\+\>'
54syn match erlangNumberFloat '\<\d\+\.\d\+\%([eE][+-]\=\d\+\)\=\>'
Bram Moolenaarad3b3662013-05-17 18:14:19 +020055
56" Strings, atoms, characters
Bram Moolenaar203d04d2013-06-06 21:36:40 +020057syn region erlangString start=/"/ end=/"/ contains=erlangStringModifier
58syn region erlangQuotedAtom start=/'/ end=/'/ contains=erlangQuotedAtomModifier
Bram Moolenaar036986f2017-03-16 17:41:02 +010059syn 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
Bram Moolenaar203d04d2013-06-06 21:36:40 +020061syn match erlangModifier '\$\%([^\\]\|\\\%(\o\{1,3}\|x\x\x\|x{\x\+}\|\^.\|.\)\)'
Bram Moolenaarad3b3662013-05-17 18:14:19 +020062
Bram Moolenaar203d04d2013-06-06 21:36:40 +020063" Operators, separators
Bram Moolenaarf269eab2022-10-03 18:04:35 +010064syn match erlangOperator '==\|=:=\|/=\|=/=\|<\|=<\|>\|>=\|=>\|:=\|?=\|++\|--\|=\|!\|<-\|+\|-\|\*\|\/'
65syn match erlangEqualsBinary '=<<\%(<\)\@!'
Bram Moolenaar203d04d2013-06-06 21:36:40 +020066syn keyword erlangOperator div rem or xor bor bxor bsl bsr and band not bnot andalso orelse
67syn match erlangBracket '{\|}\|\[\|]\||\|||'
68syn match erlangPipe '|'
69syn match erlangRightArrow '->'
Bram Moolenaarad3b3662013-05-17 18:14:19 +020070
Bram Moolenaar203d04d2013-06-06 21:36:40 +020071" Atoms, function calls (order is important)
72syn match erlangAtom '\<\l[[:alnum:]_@]*' contains=erlangBoolean
73syn keyword erlangBoolean true false contained
74syn match erlangLocalFuncCall '\<\a[[:alnum:]_@]*\>\%(\%(\s\|\n\|%.*\n\)*(\)\@=' contains=erlangBIF
75syn match erlangLocalFuncRef '\<\a[[:alnum:]_@]*\>\%(\%(\s\|\n\|%.*\n\)*/\)\@='
Bram Moolenaar036986f2017-03-16 17:41:02 +010076syn 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
77syn 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
Bram Moolenaarad3b3662013-05-17 18:14:19 +020078
Bram Moolenaar036986f2017-03-16 17:41:02 +010079" Variables, macros, records, maps
Bram Moolenaarf269eab2022-10-03 18:04:35 +010080syn match erlangVariable '\<[A-Z][[:alnum:]_@]*'
81syn match erlangAnonymousVariable '\<_[[:alnum:]_@]*'
Bram Moolenaar203d04d2013-06-06 21:36:40 +020082syn match erlangMacro '??\=[[:alnum:]_@]\+'
83syn match erlangMacro '\%(-define(\)\@<=[[:alnum:]_@]\+'
Bram Moolenaar5ef1c6a2019-11-10 22:09:11 +010084syn region erlangQuotedMacro start=/??\=\s*'/ end=/'/ contains=erlangQuotedAtomModifier
Bram Moolenaar036986f2017-03-16 17:41:02 +010085syn match erlangMap '#'
Bram Moolenaar203d04d2013-06-06 21:36:40 +020086syn match erlangRecord '#\s*\l[[:alnum:]_@]*'
Bram Moolenaar036986f2017-03-16 17:41:02 +010087syn region erlangQuotedRecord start=/#\s*'/ end=/'/ contains=erlangQuotedAtomModifier
88
89" Shebang (this line has to be after the ErlangMap)
90syn match erlangShebang '^#!.*'
Bram Moolenaar203d04d2013-06-06 21:36:40 +020091
92" Bitstrings
93syn 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 +020094
95" Constants and Directives
Bram Moolenaar9d98fe92013-08-03 18:35:36 +020096syn match erlangUnknownAttribute '^\s*-\%(\s\|\n\|%.*\n\)*\l[[:alnum:]_@]*' contains=erlangComment
Bram Moolenaarf269eab2022-10-03 18:04:35 +010097syn match erlangAttribute '^\s*-\%(\s\|\n\|%.*\n\)*\%(behaviou\=r\|compile\|export\(_type\)\=\|file\|import\|module\|author\|copyright\|doc\|vsn\|on_load\|optional_callbacks\|feature\)\>' contains=erlangComment
Bram Moolenaar9d98fe92013-08-03 18:35:36 +020098syn match erlangInclude '^\s*-\%(\s\|\n\|%.*\n\)*\%(include\|include_lib\)\>' contains=erlangComment
99syn match erlangRecordDef '^\s*-\%(\s\|\n\|%.*\n\)*record\>' contains=erlangComment
100syn match erlangDefine '^\s*-\%(\s\|\n\|%.*\n\)*\%(define\|undef\)\>' contains=erlangComment
101syn match erlangPreCondit '^\s*-\%(\s\|\n\|%.*\n\)*\%(ifdef\|ifndef\|else\|endif\)\>' contains=erlangComment
102syn match erlangType '^\s*-\%(\s\|\n\|%.*\n\)*\%(spec\|type\|opaque\|callback\)\>' contains=erlangComment
Bram Moolenaarad3b3662013-05-17 18:14:19 +0200103
104" Keywords
Bram Moolenaarf269eab2022-10-03 18:04:35 +0100105syn keyword erlangKeyword after begin case catch cond end fun if let of else
106syn keyword erlangKeyword receive when try maybe
Bram Moolenaarad3b3662013-05-17 18:14:19 +0200107
Bram Moolenaar203d04d2013-06-06 21:36:40 +0200108" Build-in-functions (BIFs)
109syn keyword erlangBIF abs alive apply atom_to_binary atom_to_list contained
110syn keyword erlangBIF binary_part binary_to_atom contained
111syn keyword erlangBIF binary_to_existing_atom binary_to_float contained
112syn keyword erlangBIF binary_to_integer bitstring_to_list contained
113syn keyword erlangBIF binary_to_list binary_to_term bit_size contained
114syn keyword erlangBIF byte_size check_old_code check_process_code contained
115syn keyword erlangBIF concat_binary date delete_module demonitor contained
116syn keyword erlangBIF disconnect_node element erase error exit contained
117syn keyword erlangBIF float float_to_binary float_to_list contained
118syn keyword erlangBIF garbage_collect get get_keys group_leader contained
119syn keyword erlangBIF halt hd integer_to_binary integer_to_list contained
120syn keyword erlangBIF iolist_to_binary iolist_size is_alive contained
121syn keyword erlangBIF is_atom is_binary is_bitstring is_boolean contained
Bram Moolenaar5ef1c6a2019-11-10 22:09:11 +0100122syn keyword erlangBIF is_float is_function is_integer is_list is_map is_map_key contained
Bram Moolenaar203d04d2013-06-06 21:36:40 +0200123syn keyword erlangBIF is_number is_pid is_port is_process_alive contained
124syn keyword erlangBIF is_record is_reference is_tuple length link contained
125syn keyword erlangBIF list_to_atom list_to_binary contained
126syn keyword erlangBIF list_to_bitstring list_to_existing_atom contained
127syn keyword erlangBIF list_to_float list_to_integer list_to_pid contained
Bram Moolenaar5ef1c6a2019-11-10 22:09:11 +0100128syn keyword erlangBIF list_to_tuple load_module make_ref map_size max contained
129syn keyword erlangBIF min module_loaded monitor monitor_node node contained
Bram Moolenaar203d04d2013-06-06 21:36:40 +0200130syn keyword erlangBIF nodes now open_port pid_to_list port_close contained
131syn keyword erlangBIF port_command port_connect pre_loaded contained
132syn keyword erlangBIF process_flag process_flag process_info contained
133syn keyword erlangBIF process purge_module put register registered contained
134syn keyword erlangBIF round self setelement size spawn spawn_link contained
135syn keyword erlangBIF spawn_monitor spawn_opt split_binary contained
136syn keyword erlangBIF statistics term_to_binary throw time tl contained
137syn keyword erlangBIF trunc tuple_size tuple_to_list unlink contained
138syn keyword erlangBIF unregister whereis contained
Bram Moolenaarad3b3662013-05-17 18:14:19 +0200139
140" Sync at the beginning of functions: if this is not used, multiline string
Bram Moolenaar203d04d2013-06-06 21:36:40 +0200141" are not always recognized, and the indentation script cannot use the
142" "searchpair" (because it would not always skip strings and comments when
143" looking for keywords and opening parens/brackets).
Bram Moolenaarad3b3662013-05-17 18:14:19 +0200144syn sync match erlangSync grouphere NONE "^[a-z]\s*("
Bram Moolenaar203d04d2013-06-06 21:36:40 +0200145let b:erlang_syntax_synced = 1
Bram Moolenaarad3b3662013-05-17 18:14:19 +0200146
Bram Moolenaar203d04d2013-06-06 21:36:40 +0200147" Define the default highlighting. See ":help group-name" for the groups and
148" their colors.
149
Bram Moolenaar9d98fe92013-08-03 18:35:36 +0200150let s:old_style = (exists("g:erlang_old_style_highlight") &&
151 \g:erlang_old_style_highlight == 1)
Bram Moolenaar203d04d2013-06-06 21:36:40 +0200152
Bram Moolenaarad3b3662013-05-17 18:14:19 +0200153
Bram Moolenaar89bcfda2016-08-30 23:26:57 +0200154" Comments
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200155hi def link erlangComment Comment
156hi def link erlangCommentAnnotation Special
157hi def link erlangTodo Todo
158hi def link erlangShebang Comment
Bram Moolenaarad3b3662013-05-17 18:14:19 +0200159
Bram Moolenaar89bcfda2016-08-30 23:26:57 +0200160" Numbers
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200161hi def link erlangNumberInteger Number
162hi def link erlangNumberFloat Float
Bram Moolenaarad3b3662013-05-17 18:14:19 +0200163
Bram Moolenaar89bcfda2016-08-30 23:26:57 +0200164" Strings, atoms, characters
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200165hi def link erlangString String
Bram Moolenaar203d04d2013-06-06 21:36:40 +0200166
Bram Moolenaar89bcfda2016-08-30 23:26:57 +0200167if s:old_style
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200168hi def link erlangQuotedAtom Type
Bram Moolenaar89bcfda2016-08-30 23:26:57 +0200169else
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200170hi def link erlangQuotedAtom String
Bram Moolenaarad3b3662013-05-17 18:14:19 +0200171endif
172
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200173hi def link erlangStringModifier Special
174hi def link erlangQuotedAtomModifier Special
175hi def link erlangModifier Special
Bram Moolenaar89bcfda2016-08-30 23:26:57 +0200176
177" Operators, separators
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200178hi def link erlangOperator Operator
Bram Moolenaarf269eab2022-10-03 18:04:35 +0100179hi def link erlangEqualsBinary ErrorMsg
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200180hi def link erlangRightArrow Operator
Bram Moolenaar89bcfda2016-08-30 23:26:57 +0200181if s:old_style
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200182hi def link erlangBracket Normal
183hi def link erlangPipe Normal
Bram Moolenaar89bcfda2016-08-30 23:26:57 +0200184else
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200185hi def link erlangBracket Delimiter
186hi def link erlangPipe Delimiter
Bram Moolenaar89bcfda2016-08-30 23:26:57 +0200187endif
188
189" Atoms, functions, variables, macros
190if s:old_style
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200191hi def link erlangAtom Normal
192hi def link erlangLocalFuncCall Normal
193hi def link erlangLocalFuncRef Normal
194hi def link erlangGlobalFuncCall Function
195hi def link erlangGlobalFuncRef Function
196hi def link erlangVariable Normal
Bram Moolenaarf269eab2022-10-03 18:04:35 +0100197hi def link erlangAnonymousVariable erlangVariable
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200198hi def link erlangMacro Normal
Bram Moolenaar5ef1c6a2019-11-10 22:09:11 +0100199hi def link erlangQuotedMacro Normal
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200200hi def link erlangRecord Normal
Bram Moolenaar036986f2017-03-16 17:41:02 +0100201hi def link erlangQuotedRecord Normal
202hi def link erlangMap Normal
Bram Moolenaar89bcfda2016-08-30 23:26:57 +0200203else
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200204hi def link erlangAtom String
205hi def link erlangLocalFuncCall Normal
206hi def link erlangLocalFuncRef Normal
207hi def link erlangGlobalFuncCall Normal
208hi def link erlangGlobalFuncRef Normal
209hi def link erlangVariable Identifier
Bram Moolenaarf269eab2022-10-03 18:04:35 +0100210hi def link erlangAnonymousVariable erlangVariable
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200211hi def link erlangMacro Macro
Bram Moolenaar5ef1c6a2019-11-10 22:09:11 +0100212hi def link erlangQuotedMacro Macro
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200213hi def link erlangRecord Structure
Bram Moolenaar036986f2017-03-16 17:41:02 +0100214hi def link erlangQuotedRecord Structure
215hi def link erlangMap Structure
Bram Moolenaar89bcfda2016-08-30 23:26:57 +0200216endif
217
218" Bitstrings
219if !s:old_style
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200220hi def link erlangBitType Type
Bram Moolenaar89bcfda2016-08-30 23:26:57 +0200221endif
222
223" Constants and Directives
224if s:old_style
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200225hi def link erlangAttribute Type
226hi def link erlangMacroDef Type
227hi def link erlangUnknownAttribute Normal
228hi def link erlangInclude Type
229hi def link erlangRecordDef Type
230hi def link erlangDefine Type
231hi def link erlangPreCondit Type
232hi def link erlangType Type
Bram Moolenaar89bcfda2016-08-30 23:26:57 +0200233else
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200234hi def link erlangAttribute Keyword
235hi def link erlangMacroDef Macro
236hi def link erlangUnknownAttribute Normal
237hi def link erlangInclude Include
238hi def link erlangRecordDef Keyword
239hi def link erlangDefine Define
240hi def link erlangPreCondit PreCondit
241hi def link erlangType Type
Bram Moolenaar89bcfda2016-08-30 23:26:57 +0200242endif
243
244" Keywords
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200245hi def link erlangKeyword Keyword
Bram Moolenaar89bcfda2016-08-30 23:26:57 +0200246
247" Build-in-functions (BIFs)
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200248hi def link erlangBIF Function
Bram Moolenaar89bcfda2016-08-30 23:26:57 +0200249
250if s:old_style
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200251hi def link erlangBoolean Statement
252hi def link erlangExtra Statement
253hi def link erlangSignal Statement
Bram Moolenaar89bcfda2016-08-30 23:26:57 +0200254else
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200255hi def link erlangBoolean Boolean
256hi def link erlangExtra Statement
257hi def link erlangSignal Statement
Bram Moolenaar89bcfda2016-08-30 23:26:57 +0200258endif
259
Bram Moolenaar89bcfda2016-08-30 23:26:57 +0200260
Bram Moolenaarad3b3662013-05-17 18:14:19 +0200261let b:current_syntax = "erlang"
262
Bram Moolenaar9d98fe92013-08-03 18:35:36 +0200263let &cpo = s:cpo_save
264unlet s:cpo_save
265
Bram Moolenaarad3b3662013-05-17 18:14:19 +0200266" vim: sw=2 et