diff options
Diffstat (limited to 'syntax/gowork.vim')
-rw-r--r-- | syntax/gowork.vim | 100 |
1 files changed, 100 insertions, 0 deletions
diff --git a/syntax/gowork.vim b/syntax/gowork.vim new file mode 100644 index 00000000..eb641df2 --- /dev/null +++ b/syntax/gowork.vim @@ -0,0 +1,100 @@ +if polyglot#init#is_disabled(expand('<sfile>:p'), 'go', 'syntax/gowork.vim') + finish +endif + +" gowork.vim: Vim syntax file for go.work file +" +" Quit when a (custom) syntax file was already loaded +if exists("b:current_syntax") + finish +endif + +syntax case match + +" Reference documentation: +" https://go.dev/ref/mod#workspaces + +" match keywords +syntax keyword goworkGo go contained +syntax keyword goworkUse use +syntax keyword goworkExclude exclude +syntax keyword goworkReplace replace +syntax keyword goworkRetract retract + +" require, exclude, replace, and go can be also grouped into block +syntax region goworkUse start='require (' end=')' transparent contains=goworkUse,goworkPath +syntax region goworkReplace start='replace (' end=')' transparent contains=goworkReplace,goworkVersion +syntax match goworkGo '^go .*$' transparent contains=goworkGo,goworkGoVersion + +" set highlights +highlight default link goworkGo Keyword +highlight default link goworkUse Keyword +highlight default link goworkReplace Keyword + +" comments are always in form of // ... +syntax region goworkComment start="//" end="$" contains=@Spell +highlight default link goworkComment Comment + +" make sure quoted import paths are higlighted +syntax region goworkString start=+"+ skip=+\\\\\|\\"+ end=+"+ +highlight default link goworkString String + +" replace operator is in the form of '=>' +syntax match goworkReplaceOperator "\v\=\>" +highlight default link goworkReplaceOperator Operator + +" match go versions +syntax match goworkGoVersion "1\.\d\+" contained +highlight default link goworkGoVersion Identifier + + +" match paths in use directives +syntax match goworkPath "\f\+" + +highlight default link goworkPath Identifier +" highlight versions: +" * vX.Y.Z-pre +" * vX.Y.Z +" * vX.0.0-yyyyymmddhhmmss-abcdefabcdef +" * vX.Y.Z-pre.0.yyyymmddhhmmss-abcdefabcdef +" * vX.Y.(Z+1)-0.yyyymmddhhss-abcdefabcdef +" see https://godoc.org/golang.org/x/tools/internal/semver for more +" information about how semantic versions are parsed and +" https://golang.org/cmd/go/ for how pseudo-versions and +incompatible +" are applied. + + +" match vX.Y.Z and their prereleases +syntax match goworkVersion "v\d\+\.\d\+\.\d\+\%(-\%([0-9A-Za-z-]\+\)\%(\.[0-9A-Za-z-]\+\)*\)\?\%(+\%([0-9A-Za-z-]\+\)\(\.[0-9A-Za-z-]\+\)*\)\?" +" ^--- version ---^^------------ pre-release ---------------------^^--------------- metadata ---------------------^ +" ^--------------------------------------- semantic version -------------------------------------------------------^ + +" match pseudo versions +" without a major version before the commit (e.g. vX.0.0-yyyymmddhhmmss-abcdefabcdef) +syntax match goworkVersion "v\d\+\.0\.0-\d\{14\}-\x\+" +" when most recent version before target is a pre-release +syntax match goworkVersion "v\d\+\.\d\+\.\d\+-\%([0-9A-Za-z-]\+\)\%(\.[0-9A-Za-z-]\+\)*\%(+\%([0-9A-Za-z-]\+\)\(\.[0-9A-Za-z-]\+\)*\)\?\.0\.\d\{14}-\x\+" +" ^--- version ---^^--- ------ pre-release -----------------^^--------------- metadata ---------------------^ +" ^------------------------------------- semantic version --------------------------------------------------^ +" most recent version before the target is X.Y.Z +syntax match goworkVersion "v\d\+\.\d\+\.\d\+\%(+\%([0-9A-Za-z-]\+\)\(\.[0-9A-Za-z-]\+\)*\)\?-0\.\d\{14}-\x\+" +" ^--- version ---^^--------------- metadata ---------------------^ + +" match incompatible vX.Y.Z and their prereleases +syntax match goworkVersion "v[2-9]\{1}\d*\.\d\+\.\d\+\%(-\%([0-9A-Za-z-]\+\)\%(\.[0-9A-Za-z-]\+\)*\)\?\%(+\%([0-9A-Za-z-]\+\)\(\.[0-9A-Za-z-]\+\)*\)\?+incompatible" +" ^------- version -------^^------------- pre-release ---------------------^^--------------- metadata ---------------------^ +" ^------------------------------------------- semantic version -----------------------------------------------------------^ + +" match incompatible pseudo versions +" incompatible without a major version before the commit (e.g. vX.0.0-yyyymmddhhmmss-abcdefabcdef) +syntax match goworkVersion "v[2-9]\{1}\d*\.0\.0-\d\{14\}-\x\++incompatible" +" when most recent version before target is a pre-release +syntax match goworkVersion "v[2-9]\{1}\d*\.\d\+\.\d\+-\%([0-9A-Za-z-]\+\)\%(\.[0-9A-Za-z-]\+\)*\%(+\%([0-9A-Za-z-]\+\)\(\.[0-9A-Za-z-]\+\)*\)\?\.0\.\d\{14}-\x\++incompatible" +" ^------- version -------^^---------- pre-release -----------------^^--------------- metadata ---------------------^ +" ^---------------------------------------- semantic version ------------------------------------------------------^ +" most recent version before the target is X.Y.Z +syntax match goworkVersion "v[2-9]\{1}\d*\.\d\+\.\d\+\%(+\%([0-9A-Za-z-]\+\)\%(\.[0-9A-Za-z-]\+\)*\)\?-0\.\d\{14}-\x\++incompatible" +" ^------- version -------^^---------------- metadata ---------------------^ +highlight default link goworkVersion Identifier + +let b:current_syntax = "gowork" |