1" Vim syntax file 2" Language: awk, nawk, gawk, mawk 3" Maintainer: Doug Kearns <[email protected]> 4" Previous Maintainer: Antonio Colombo <[email protected]> 5" Last Change: 2020 Aug 18 6 7" AWK ref. is: Alfred V. Aho, Brian W. Kernighan, Peter J. Weinberger 8" The AWK Programming Language, Addison-Wesley, 1988 9 10" GAWK ref. is: Arnold D. Robbins 11" Effective AWK Programming, Third Edition, O'Reilly, 2001 12" Effective AWK Programming, Fourth Edition, O'Reilly, 2015 13" (up-to-date version available with the gawk source distribution) 14 15" MAWK is a "new awk" meaning it implements AWK ref. 16" mawk conforms to the Posix 1003.2 (draft 11.3) 17" definition of the AWK language which contains a few features 18" not described in the AWK book, and mawk provides a small number of extensions. 19 20" TODO: 21" Dig into the commented out syntax expressions below. 22 23" Quit when a syntax file was already loaded 24if exists("b:current_syntax") 25 finish 26endif 27 28let s:cpo_save = &cpo 29set cpo&vim 30 31syn iskeyword @,48-57,_,192-255,@-@ 32 33" A bunch of useful Awk keywords 34" AWK ref. p. 188 35syn keyword awkStatement break continue delete exit 36syn keyword awkStatement function getline next 37syn keyword awkStatement print printf return 38" GAWK ref. Chapter 7-9 39syn keyword awkStatement case default switch nextfile 40syn keyword awkStatement func 41" GAWK ref. Chapter 2.7, Including Other Files into Your Program 42" GAWK ref. Chapter 2.8, Loading Dynamic Extensions into Your Program 43" GAWK ref. Chapter 15, Namespaces 44" Directives 45syn keyword awkStatement @include @load @namespace 46" 47" GAWK ref. Chapter 9, Functions 48" Numeric Functions 49syn keyword awkFunction atan2 cos exp int log rand sin sqrt srand 50" String Manipulation Functions 51syn keyword awkFunction asort asorti gensub gsub index length match 52syn keyword awkFunction patsplit split sprintf strtonum sub substr 53syn keyword awkFunction tolower toupper 54" Input Output Functions 55syn keyword awkFunction close fflush system 56" Time Functions 57syn keyword awkFunction mktime strftime systime 58" Bit Manipulation Functions 59syn keyword awkFunction and compl lshift or rshift xor 60" Getting Type Information Functions 61syn keyword awkFunction isarray typeof 62" String-Translation Functions 63syn keyword awkFunction bindtextdomain dcgettext dcngetext 64 65syn keyword awkConditional if else 66syn keyword awkRepeat while for do 67 68syn keyword awkTodo contained TODO 69 70syn keyword awkPatterns BEGIN END BEGINFILE ENDFILE 71 72" GAWK ref. Chapter 7 73" Built-in Variables That Control awk 74syn keyword awkVariables BINMODE CONVFMT FIELDWIDTHS FPAT FS 75syn keyword awkVariables IGNORECASE LINT OFMT OFS ORS PREC 76syn keyword awkVariables ROUNDMODE RS SUBSEP TEXTDOMAIN 77" Built-in Variables That Convey Information 78syn keyword awkVariables ARGC ARGV ARGIND ENVIRON ERRNO FILENAME 79syn keyword awkVariables FNR NF FUNCTAB NR PROCINFO RLENGTH RSTART 80syn keyword awkVariables RT SYMTAB 81 82" Arithmetic operators: +, and - take care of ++, and -- 83syn match awkOperator "+\|-\|\*\|/\|%\|=" 84syn match awkOperator "+=\|-=\|\*=\|/=\|%=" 85syn match awkOperator "\^\|\^=" 86 87" Octal format character. 88syn match awkSpecialCharacter display contained "\\[0-7]\{1,3\}" 89" Hex format character. 90syn match awkSpecialCharacter display contained "\\x[0-9A-Fa-f]\+" 91 92syn match awkFieldVars "\$\d\+" 93 94" catch errors caused by wrong parenthesis 95syn region awkParen transparent start="(" end=")" contains=ALLBUT,awkParenError,awkSpecialCharacter,awkArrayElement,awkArrayArray,awkTodo,awkRegExp,awkBrktRegExp,awkBrackets,awkCharClass,awkComment 96syn match awkParenError display ")" 97"syn match awkInParen display contained "[{}]" 98 99" 64 lines for complex &&'s, and ||'s in a big "if" 100syn sync ccomment awkParen maxlines=64 101 102" Search strings & Regular Expressions therein. 103syn region awkSearch oneline start="^[ \t]*/"ms=e start="\(,\|!\=\~\)[ \t]*/"ms=e skip="\\\\\|\\/" end="/" contains=awkBrackets,awkRegExp,awkSpecialCharacter 104syn region awkBrackets contained start="\[\^\]\="ms=s+2 start="\[[^\^]"ms=s+1 end="\]"me=e-1 contains=awkBrktRegExp,awkCharClass 105syn region awkSearch oneline start="[ \t]*/"hs=e skip="\\\\\|\\/" end="/" contains=awkBrackets,awkRegExp,awkSpecialCharacter 106 107syn match awkCharClass contained "\[:[^:\]]*:\]" 108syn match awkBrktRegExp contained "\\.\|.\-[^]]" 109syn match awkRegExp contained "/\^"ms=s+1 110syn match awkRegExp contained "\$/"me=e-1 111syn match awkRegExp contained "[?.*{}|+]" 112 113" String and Character constants 114" Highlight special characters (those which have a backslash) differently 115syn region awkString start=+"+ skip=+\\\\\|\\"+ end=+"+ contains=@Spell,awkSpecialCharacter,awkSpecialPrintf 116syn match awkSpecialCharacter contained "\\." 117 118" Some of these combinations may seem weird, but they work. 119syn match awkSpecialPrintf contained "%[-+ #]*\d*\.\=\d*[cdefgiosuxEGX%]" 120 121" Numbers, allowing signs (both -, and +) 122" Integer number. 123syn match awkNumber display "[+-]\=\<\d\+\>" 124" Floating point number. 125syn match awkFloat display "[+-]\=\<\d\+\.\d+\>" 126" Floating point number, starting with a dot. 127syn match awkFloat display "[+-]\=\<.\d+\>" 128syn case ignore 129"floating point number, with dot, optional exponent 130syn match awkFloat display "\<\d\+\.\d*\(e[-+]\=\d\+\)\=\>" 131"floating point number, starting with a dot, optional exponent 132syn match awkFloat display "\.\d\+\(e[-+]\=\d\+\)\=\>" 133"floating point number, without dot, with exponent 134syn match awkFloat display "\<\d\+e[-+]\=\d\+\>" 135syn case match 136 137"syn match awkIdentifier "\<[a-zA-Z_][a-zA-Z0-9_]*\>" 138 139" Comparison expressions. 140syn match awkExpression "==\|>=\|=>\|<=\|=<\|\!=" 141syn match awkExpression "\~\|\!\~" 142syn match awkExpression "?\|:" 143syn keyword awkExpression in 144 145" Boolean Logic (OR, AND, NOT) 146syn match awkBoolLogic "||\|&&\|\!" 147 148" This is overridden by less-than & greater-than. 149" Put this above those to override them. 150" Put this in a 'match "\<printf\=\>.*;\="' to make it not override 151" less/greater than (most of the time), but it won't work yet because 152" keywords always have precedence over match & region. 153" File I/O: (print foo, bar > "filename") & for nawk (getline < "filename") 154"syn match awkFileIO contained ">" 155"syn match awkFileIO contained "<" 156 157" Expression separators: ';' and ',' 158syn match awkSemicolon ";" 159syn match awkComma "," 160 161syn match awkComment "#.*" contains=@Spell,awkTodo 162 163syn match awkLineSkip "\\$" 164 165" Highlight array element's (recursive arrays allowed). 166" Keeps nested array names' separate from normal array elements. 167" Keeps numbers separate from normal array elements (variables). 168syn match awkArrayArray contained "[^][, \t]\+\["me=e-1 169syn match awkArrayElement contained "[^][, \t]\+" 170syn region awkArray transparent start="\[" end="\]" contains=awkArray,awkArrayElement,awkArrayArray,awkNumber,awkFloat 171 172" 10 should be enough. 173" (for the few instances where it would be more than "oneline") 174syn sync ccomment awkArray maxlines=10 175 176" Define the default highlighting. 177hi def link awkConditional Conditional 178hi def link awkFunction Function 179hi def link awkRepeat Repeat 180hi def link awkStatement Statement 181hi def link awkString String 182hi def link awkSpecialPrintf Special 183hi def link awkSpecialCharacter Special 184hi def link awkSearch String 185hi def link awkBrackets awkRegExp 186hi def link awkBrktRegExp awkNestRegExp 187hi def link awkCharClass awkNestRegExp 188hi def link awkNestRegExp Keyword 189hi def link awkRegExp Special 190hi def link awkNumber Number 191hi def link awkFloat Float 192hi def link awkFileIO Special 193hi def link awkOperator Special 194hi def link awkExpression Special 195hi def link awkBoolLogic Special 196hi def link awkPatterns Special 197hi def link awkVariables Special 198hi def link awkFieldVars Special 199hi def link awkLineSkip Special 200hi def link awkSemicolon Special 201hi def link awkComma Special 202hi def link awkIdentifier Identifier 203hi def link awkComment Comment 204hi def link awkTodo Todo 205" Change this if you want nested array names to be highlighted. 206hi def link awkArrayArray awkArray 207hi def link awkArrayElement Special 208hi def link awkParenError awkError 209hi def link awkInParen awkError 210hi def link awkError Error 211 212let b:current_syntax = "awk" 213 214let &cpo = s:cpo_save 215unlet s:cpo_save 216 217" vim: ts=8 218