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