diff options
author | Dan Reif <dan.reif@collectivehealth.com> | 2018-04-30 12:00:42 -0700 |
---|---|---|
committer | Dan Reif <dan.reif@collectivehealth.com> | 2018-04-30 12:00:42 -0700 |
commit | 3e0c887365bc1ebd55b91dd69ab73f2dee1f00ed (patch) | |
tree | ce76003a08274cb805df101a44be8d37af1a4c4b /syntax/haproxy.vim | |
parent | b4d7993e7ea554153025c5072749f415e69e0323 (diff) | |
download | vim-polyglot-3e0c887365bc1ebd55b91dd69ab73f2dee1f00ed.tar.gz vim-polyglot-3e0c887365bc1ebd55b91dd69ab73f2dee1f00ed.zip |
Update (periodic rebuild)
I originally meant to run this before adding haproxy, but accidentally
pushed that into my branch. If you'd like to see that content, it's at
https://github.com/CH-DanReif/vim-polyglot/commit/414ad25c3ad1ab9c4b6a99fe4f08d6c30b7e0f57.
Diffstat (limited to 'syntax/haproxy.vim')
-rw-r--r-- | syntax/haproxy.vim | 360 |
1 files changed, 360 insertions, 0 deletions
diff --git a/syntax/haproxy.vim b/syntax/haproxy.vim new file mode 100644 index 00000000..54c54c3c --- /dev/null +++ b/syntax/haproxy.vim @@ -0,0 +1,360 @@ +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 <args> +else + command -nargs=+ HiLink hi def link <args> +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 |