if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'haproxy') == -1 " Vim syntax file " Language: HAproxy " Maintainer: Dan Reif " Last Change: Mar 2, 2018 " Version: 0.5 " URL: https://github.com/CH-DanReif/haproxy.vim " For version 5.x: Clear all syntax items " For version 6.x: Quit when a syntax file was already loaded if version < 600 syntax clear elseif exists("b:current_syntax") finish endif if version >= 600 setlocal iskeyword=_,-,a-z,A-Z,48-57 else set iskeyword=_,-,a-z,A-Z,48-57 endif " Escaped chars syn match hapEscape +\\\(\\\| \|n\|r\|t\|#\|x\x\x\)+ " Match whitespace at the end of a line syn match hapNothingErr /\s\+\ze\(#.*\)\?$/ contained nextgroup=hapGreedyComment " Match anything other than whitespace; flag as error if found. 'contained' " because comments are valid where otherwise only hapNothing is. syn match hapNothingErr /\s*\zs[^# \t][^#]*/ contained nextgroup=hapGreedyComment " Comments syn match hapComment /\(^\|\s\)#.*$/ contains=hapTodo " `acl foo path_reg hi[#]mom` is an error because [ is unclosed. (!!!) syn match hapGreedyComment /#.*$/ contained containedin=hapAclRemainder contains=hapTodo syn keyword hapTodo TODO FIXME XXX contained " `daemon#hi mom` is perfectly valid. :/ syn cluster hapNothing contains=hapNothingErr,hapGreedyComment " Case-insensitive matching syn case ignore " Sections syn match hapSection /^\s*\(global\|defaults\)/ syn match hapSection /^\s*\(backend\|frontend\|listen\|ruleset\|userlist\)/ skipwhite nextgroup=hapSectLabel syn match hapSectLabel /\S\+/ skipwhite nextgroup=hapIp1 contained syn match hapIp1 /\(\d\{1,3}\.\d\{1,3}\.\d\{1,3}\.\d\{1,3}\)\?:\d\{1,5}/ nextgroup=hapIp2 contained syn match hapIp2 /,\(\d\{1,3}\.\d\{1,3}\.\d\{1,3}\.\d\{1,3}\)\?:\d\{1,5}/hs=s+1 nextgroup=hapIp2 contained " Timeouts. We try to hint towards the use of 'ms' and 's' when " g:haproxy_guess_ms_sec is set. We consider the lack of either 'ms' or 's' " as an error when haproxy_enforce_ms_sec is set. (HAproxy's default is 'ms', " but that arguably leads to ambiguity in the config.) if get(g:, 'haproxy_guess_ms_sec', 1) " Timeouts and such specified in ms, where seconds are *allowed*, but are " probably a mistake. syn match hapNumberMS /\d\+m\?s/ contained transparent syn match hapError /\d\+\zss\ze/ contained containedin=hapNumberMS endif if get(g:, 'haproxy_enforce_ms_sec', 1) syn match hapNumberMS /\d\+\(m\?s\)\?/ contained transparent syn match hapError /\d\+\(m\?s\)\@!\(\D\|$\)/ contained containedin=hapNumberMS syn match hapNumberMS /\d\+m\?s/ contained else syn match hapNumberMS /\d\+m\?s/ contained endif if get(g:, 'haproxy_guess_ms_sec', 1) " Timeouts generally specified in whole seconds, where we want to highlight " errant 'm's. syn match hapNumberSec /\d\+m\?s/ contained transparent syn match hapError /\d\+\zsm\zes/ contained containedin=hapNumberSec endif if get(g:, 'haproxy_enforce_ms_sec', 1) syn match hapNumberSec /\d\+\(m\?s\)\?/ contained transparent syn match hapError /\d\+\(m\?s\)\@!\(\D\|$\)/ contained containedin=hapNumberSec syn match hapNumberSec /\d\+m\?s/ contained else syn match hapNumberSec /\d\+m\?s/ contained endif " Other numbers, no 'ms'. syn match hapNumber /[0-9]\+/ contained " Timeout types syn keyword hapTimeoutType connect client server contained skipwhite nextgroup=hapNumberMS " URIs syn match hapAbsURI /\/\S*/ contained syn match hapURI /\S*/ contained " File paths (always absolute, and never just '/' unless you're insane) syn match hapFilePath /\/\S\+/ contained " SSL configuration keywords syn match hapSSLCiphersAll /\s\+\zs.*/ contained transparent syn match hapSSLCiphersError /.\+/ contained containedin=hapSSLCiphersAll syn match hapSSLCiphers /\([-+!]\?[A-Z0-9-]\+[:+]\)*[-+!]\?[A-Z0-9-]\+/ contained containedin=hapSSLCiphersAll " " ACLs " " This comes first, lest it gobble up everything else. syn match hapAclName /\S\+/ contained skipwhite nextgroup=hapAclCriterion syn match hapAclCriterion /FALSE\|HTTP\|HTTP_1\.0\|HTTP_1\.1\|HTTP_CONTENT\|HTTP_URL_ABS\|HTTP_URL_SLASH\|HTTP_URL_STAR\|LOCALHOST\|METH_CONNECT\|METH_GET\|METH_HEAD\|METH_OPTIONS\|METH_POST\|METH_TRACE\|RDP_COOKIE\|REQ_CONTENT\|TRUE\|WAIT_END\|\(req_rdp_cookie\|s\?cook\|s\?hdr\|http_auth_group\|urlp\)\(_\(beg\|dir\|dom\|end\|len\|reg\|sub\|cnt\)\)\?([^)]*)\|\(req_ssl_[a-z]\+\|base\|method\|path\|req_ver\|resp_ver\|url\)\(_\(beg\|dir\|dom\|end\|len\|reg\|sub\|cnt\)\)\?/ contained skipwhite nextgroup=hapAclConverterOrNothing " This one's a bit tricky. Match zero or more converters, and then *require* the " space afterwards. Strictly speaking, deviates from the BNF, but only in " pathological cases ('acl lolwat TRUE,upper'). syn match hapAclConverterOrNothing /\(,\(\(base64\|bool\|cpl\|debug\|even\|hex\|lower\|neg\|not\|odd\|upper\|url_dec\)\|\(add\|and\|bytes\|crc32\|da-csv-conv\|div\|djb2\|field\|http_date\|in_table\|ipmask\|json\|language\|ltime\|map\|mod\|mul\|or\|regsub\|capture-req\|capture-res\|sdbm\|sub\|table_[a-z0-9_]\+\|utime\|word\|wt6\|xor\)([^)]*)\)\)*\s\+/ contained nextgroup=hapAclFlag,hapAclFlagWithParameter,hapAclOperator syn match hapAclFlag /-[-in]/ contained skipwhite nextgroup=hapAclFlag,hapAclFlagWithParameter,hapAclOperator syn match hapAclFlagWithParameter /-[fmMu]/ contained skipwhite nextgroup=hapAclFlagParameter syn match hapAclFlagParameter /\S\+/ contained skipwhite nextgroup=hapAclFlag,hapAclFlagWithParameter,hapAclOperator syn match hapAclOperator /eq\|ge\|gt\|le\|lt/ contained skipwhite syn match hapAclRemainder /.*/ contained transparent " Generic tune.ssl syn match hapParam /tune\.ssl\.[a-z0-9-]\+/ " tune.ssl where we know what follows syn match hapParam /tune\.ssl\.default-dh-param/ skipwhite nextgroup=hapNumber syn keyword hapSSLServerVerify none required contained skipwhite nextgroup=@hapNothing " Keywords deprecated for at least a decade. Kill 'em. syn keyword hapError cliexp srvexp " Parameters syn keyword hapParam timeout skipwhite nextgroup=hapTimeoutType syn keyword hapParam chroot pidfile skipwhite nextgroup=hapFilePath syn keyword hapParam clitimeout skipwhite nextgroup=hapNumberMS syn keyword hapParam contimeout skipwhite nextgroup=hapNumberMS syn keyword hapParam daemon debug disabled skipwhite nextgroup=@hapNothing syn keyword hapParam enabled skipwhite nextgroup=@hapNothing syn keyword hapParam fullconn maxconn skipwhite nextgroup=hapNumber syn keyword hapParam gid skipwhite nextgroup=hapNumber syn keyword hapParam group syn keyword hapParam grace skipwhite nextgroup=hapNumberMS syn keyword hapParam monitor-uri skipwhite nextgroup=hapAbsURI syn keyword hapParam nbproc skipwhite nextgroup=hapNumber syn keyword hapParam noepoll nopoll skipwhite nextgroup=@hapNothing syn keyword hapParam quiet skipwhite nextgroup=@hapNothing syn keyword hapParam redispatch retries skipwhite nextgroup=hapNumber " 'add' takes exactly one string, not regexes syn keyword hapParam reqadd reqiadd skipwhite nextgroup=hapOneStringIfUnless syn keyword hapParam rspadd rspiadd skipwhite nextgroup=hapOneStringIfUnless " All of these take exactly one regexp syn match hapParam /reqi\?\(allow\|del\)/ skipwhite nextgroup=hapOneRegexpIfUnless syn match hapParam /reqi\?\(deny\|pass\)/ skipwhite nextgroup=hapOneRegexpIfUnless syn match hapParam /reqi\?\(tarpit\)/ skipwhite nextgroup=hapOneRegexpIfUnless syn match hapParam /rspi\?\(del\|deny\)/ skipwhite nextgroup=hapOneRegexpIfUnless " 'rep' is unique in taking two regexes (one search, one replace) syn keyword hapParam reqrep reqirep skipwhite nextgroup=hapRegSearchReplIfUnless syn keyword hapParam rsprep rspirep skipwhite nextgroup=hapRegSearchReplIfUnless syn keyword hapParam reqsetbe reqisetbe skipwhite nextgroup=hapRegexpBE syn keyword hapParam server source syn keyword hapParam srvtimeout skipwhite nextgroup=hapNumberMS syn keyword hapParam uid ulimit-n skipwhite nextgroup=hapNumber syn keyword hapParam user syn keyword hapParam acl skipwhite nextgroup=hapAclName syn keyword hapParam errorloc skipwhite nextgroup=hapStatusURI syn keyword hapParam errorloc302 errorloc303 skipwhite nextgroup=hapStatusURI syn keyword hapParam default_backend skipwhite nextgroup=hapSectLabel syn keyword hapParam use_backend skipwhite nextgroup=hapSectLabel syn keyword hapParam appsession skipwhite nextgroup=hapAppSess syn keyword hapParam bind skipwhite nextgroup=hapIp1 syn keyword hapParam balance skipwhite nextgroup=hapBalance syn keyword hapParam cookie skipwhite nextgroup=hapCookieNam syn keyword hapParam capture skipwhite nextgroup=hapCapture syn keyword hapParam dispatch skipwhite nextgroup=hapIpPort syn keyword hapParam source skipwhite nextgroup=hapIpPort syn keyword hapParam mode skipwhite nextgroup=hapMode syn keyword hapParam monitor-net skipwhite nextgroup=hapIPv4Mask syn keyword hapParam option skipwhite nextgroup=hapOption syn keyword hapParam stats skipwhite nextgroup=hapStats syn keyword hapParam server skipwhite nextgroup=hapServerN syn keyword hapParam source skipwhite nextgroup=hapServerEOL syn keyword hapParam log skipwhite nextgroup=hapGLog,hapLogIp,hapFilePath syn keyword hapParam ca-base skipwhite nextgroup=hapFilePath syn keyword hapParam crt-base skipwhite nextgroup=hapFilePath syn keyword hapParam ssl-default-bind-ciphers skipwhite nextgroup=hapSSLCiphersAll syn keyword hapParam ssl-default-bind-options skipwhite nextgroup=hapGLog,hapLogIp syn keyword hapParam ssl-server-verify skipwhite nextgroup=hapSSLServerVerify syn keyword hapParam errorfile skipwhite nextgroup=hapStatusPath syn keyword hapParam http-request skipwhite nextgroup=hapHttpRequestVerb " Transparent is a Vim keyword, so we need a regexp to match it syn match hapParam /transparent/ " Options and additional parameters syn keyword hapAppSess len timeout contained syn keyword hapBalance roundrobin source contained syn keyword hapLen len contained syn keyword hapGLog global contained syn keyword hapMode http tcp health contained syn keyword hapOption abortonclose allbackups checkcache clitcpka dontlognull contained syn keyword hapOption forceclose forwardfor http-server-close contained syn keyword hapOption httpchk httpclose httplog keepalive logasap contained syn keyword hapOption persist srvtcpka ssl-hello-chk contained syn keyword hapOption tcplog tcpka tcpsplice contained syn keyword hapOption except contained skipwhite nextgroup=hapIPv4Mask " Transparent is a Vim keyword, so we need a regexp to match it syn match hapOption /transparent/ contained syn keyword hapStats realm auth scope enable contained syn keyword hapStats uri contained skipwhite nextgroup=hapAbsURI syn keyword hapStats socket contained skipwhite nextgroup=hapFilePath syn keyword hapStats timeout contained skipwhite nextgroup=hapNumberMS syn keyword hapLogFac kern user mail daemon auth syslog lpr news contained skipwhite nextgroup=hapLogLvl syn keyword hapLogFac uucp cron auth2 ftp ntp audit alert cron2 contained skipwhite nextgroup=hapLogLvl syn keyword hapLogFac local0 local1 local2 local3 local4 local5 local6 local7 contained skipwhite nextgroup=hapLogLvl syn keyword hapLogLvl emerg alert crit err warning notice info debug contained syn keyword hapCookieKey rewrite insert nocache postonly indirect prefix contained skipwhite nextgroup=hapCookieKey syn keyword hapCapture cookie contained skipwhite nextgroup=hapNameLen syn keyword hapCapture request response contained skipwhite nextgroup=hapHeader syn keyword hapHeader header contained skipwhite nextgroup=hapNameLen syn keyword hapSrvKey backup cookie check inter rise fall port contained syn keyword hapSrvKey source minconn maxconn weight usesrc contained syn match hapStatus /\d\{3}/ contained syn match hapStatusPath /\d\{3}/ contained skipwhite nextgroup=hapFilePath syn match hapStatusURI /\d\{3}/ contained skipwhite nextgroup=hapURI syn match hapIPv4Mask /\d\{1,3}\.\d\{1,3}\.\d\{1,3}\.\d\{1,3}\(\/\d\{1,2}\)\?/ contained syn match hapLogIp /\d\{1,3}\.\d\{1,3}\.\d\{1,3}\.\d\{1,3}/ contained skipwhite nextgroup=hapLogFac syn match hapIpPort /\d\{1,3}\.\d\{1,3}\.\d\{1,3}\.\d\{1,3}:\d\{1,5}/ contained syn match hapServerAd /\d\{1,3}\.\d\{1,3}\.\d\{1,3}\.\d\{1,3}\(:[+-]\?\d\{1,5}\)\?/ contained skipwhite nextgroup=hapSrvEOL syn match hapNameLen /\S\+/ contained skipwhite nextgroup=hapLen syn match hapCookieNam /\S\+/ contained skipwhite nextgroup=hapCookieKey syn match hapServerN /\S\+/ contained skipwhite nextgroup=hapServerAd syn region hapSrvEOL start=/\S/ end=/$/ contains=hapSrvKey contained " Brutally stolen from https://github.com/vim-perl/vim-perl: syn match hapPerlSpecialMatch "\\\%(\o\{1,3}\|x\%({\x\+}\|\x\{1,2}\)\|c.\|[^cx]\)" contained extend syn match hapPerlSpecialMatch "\\." extend contained contains=NONE syn match hapPerlSpecialMatch "\\\\" contained syn match hapPerlSpecialMatch "\\[1-9]" contained extend syn match hapPerlSpecialMatch "\\g\%(\d\+\|{\%(-\=\d\+\|\h\w*\)}\)" contained syn match hapPerlSpecialMatch "\\k\%(<\h\w*>\|'\h\w*'\)" contained syn match hapPerlSpecialMatch "{\d\+\%(,\%(\d\+\)\=\)\=}" contained syn match hapPerlSpecialMatch "\[[]-]\=[^\[\]]*[]-]\=\]" contained extend syn match hapPerlSpecialMatch "[+*()?.]" contained syn match hapPerlSpecialMatch "(?[#:=!]" contained syn match hapPerlSpecialMatch "(?[impsx]*\%(-[imsx]\+\)\=)" contained syn match hapPerlSpecialMatch "(?\%([-+]\=\d\+\|R\))" contained syn match hapPerlSpecialMatch "(?\%(&\|P[>=]\)\h\w*)" contained syn region hapOneRegexpIfUnless contained start=/\S/ end=/\(\ze\s\|$\)/ skip=/\\ / contains=hapPerlSpecialMatch nextgroup=hapIfUnless,@hapNothing skipwhite syn region hapRegSearchReplIfUnless contained start=/\S/ end=/\(\s\|$\)/ skip=/\\ / contains=hapPerlSpecialMatch nextgroup=hapRegReplIfUnless skipwhite syn region hapRegReplIfUnless contained start=/\S/ end=/$/ contains=hapComment,hapEscape,hapPerlSpecialMatch nextgroup=hapIfUnless skipwhite syn region hapRegexpBE contained start=/\S/ end=/\(\s\|$\)/ skip=/\\ / contains=hapPerlSpecialMatch nextgroup=hapSectLabel skipwhite " " http-request " " http-request verbs that don't allow parameters syn keyword hapHttpRequestVerb allow tarpit silent-drop contained skipwhite nextgroup=hapHttpIfUnless " http-request verbs with optional parameters syn keyword hapHttpRequestVerb auth deny contained skipwhite nextgroup=hapHttpIfUnless,hapHttpRequestParam " http-request verbs with required parameters syn keyword hapHttpRequestVerb redirect add-header set-header capture contained skipwhite nextgroup=hapHttpRequestParam syn keyword hapHttpRequestVerb del-header set-nice set-log-level replace-header contained skipwhite nextgroup=hapHttpRequestParam syn keyword hapHttpRequestVerb replace-value set-method set-path set-query contained skipwhite nextgroup=hapHttpRequestParam syn keyword hapHttpRequestVerb set-uri set-tos set-mark contained skipwhite nextgroup=hapHttpRequestParam " http-request verbs with both parenthetical arguments and required parameters syn match hapHttpRequestVerb /\(add-acl\|del-acl\|del-map\|set-map\)([^)]*)/ contained skipwhite nextgroup=hapHttpRequestParam syn match hapHttpRequestVerb /\(set-var\|unset-var\)([^)]*)/ contained skipwhite nextgroup=hapHttpRequestParam syn match hapHttpRequestVerb /\(sc-inc-gpc0\|sc-set-gpt0\)([^)]*)/ contained skipwhite nextgroup=hapHttpRequestParam " http-request verbs with parenthetical arguments, but without parameters syn match hapHttpRequestVerb /\(unset-var\|sc-inc-gpc0\)([^)]*)/ contained skipwhite nextgroup=hapHttpIfUnless " Listed first because we want to match this rather than hapHttpRequestParam, " which can be just about anything (including these two keywords). 'keyword' " is actually higher priority inside the highlighter, but we'll play it extra " safe by doing this ordering trick, too. syn keyword hapIfUnless if unless contained skipwhite nextgroup=hapIfUnlessCond " A little bit of fancy footwork here, because we want to match the log-format " parameters inside of the string separately. syn match hapHttpRequestParam /|S\+/ contained skipwhite nextgroup=hapIfUnless,hapHttpRequestParam transparent syn match hapHttpLogFormatStr /%\[[^][]\+\]/ contained containedin=hapHttpRequestParam syn match hapHttpLogFormatErr /%\(\[[^][]\+\]\)\@!.*/ contained containedin=hapHttpRequestParam syn match hapHttpRequestParamLiteral /[^%]\+/ contained containedin=hapHttpRequestParam " Define the default highlighting. " For version 5.7 and earlier: only when not done already " For version 5.8 and later: only when an item doesn't have highlighting yet if version < 508 command -nargs=+ HiLink hi link else command -nargs=+ HiLink hi def link endif HiLink hapError Error HiLink hapNothingErr hapError HiLink hapEscape SpecialChar HiLink hapComment Comment HiLink hapGreedyComment Comment HiLink hapTodo Todo HiLink hapSection Underlined HiLink hapSectLabel Identifier HiLink hapParam Keyword HiLink hapSSLCiphers String HiLink hapSSLCiphersError Error HiLink hapTimeoutType hapParam HiLink hapOneRegexpIfUnless String HiLink hapTwoRegexpsIfUnless hapRegexp HiLink hapRegReplIfUnless hapRegexp HiLink hapRegexpBE hapRegexp HiLink hapPerlSpecialMatch Special HiLink hapFilePath String HiLink hapURI String HiLink hapAbsURI hapURI HiLink hapIp1 Number HiLink hapIp2 hapIp1 HiLink hapLogIp hapIp1 HiLink hapIpPort hapIp1 HiLink hapIPv4Mask hapIp1 HiLink hapServerAd hapIp1 HiLink hapStatus Number HiLink hapStatusPath hapStatus HiLink hapStatusURI hapStatus HiLink hapNumber Number HiLink hapNumberMS hapNumber HiLink hapNumberSec hapNumber HiLink hapAclName Identifier HiLink hapAclCriterion String HiLink hapAclConverterOrNothing Special HiLink hapAclFlag Special HiLink hapAclFlagWithParameter Special HiLink hapAclFlagParameter String HiLink hapAclOperator Operator HiLink hapAclPattern String HiLink hapHttpRequestVerb Operator HiLink hapIfUnless Operator HiLink hapHttpRequestParamLiteral String HiLink hapHttpLogFormatStr Special HiLink hapHttpLogFormatErr Error HiLink hapOption Operator HiLink hapAppSess hapOption HiLink hapBalance hapOption HiLink hapCapture hapOption HiLink hapCookieKey hapOption HiLink hapHeader hapOption HiLink hapGLog hapOption HiLink hapLogFac hapOption HiLink hapLogLvl hapOption HiLink hapMode hapOption HiLink hapStats hapOption HiLink hapLen hapOption HiLink hapSrvKey hapOption delcommand HiLink let b:current_syntax = "haproxy" " vim: ts=8 endif