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