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