Skip to content

Commit 2fe2f8c

Browse files
committed
syntax: add syntax for go.work files
Closes #3373
1 parent 05f97b7 commit 2fe2f8c

File tree

2 files changed

+98
-0
lines changed

2 files changed

+98
-0
lines changed

ftdetect/gofiletype.vim

+2
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@ au BufRead,BufNewFile *.go setfiletype go
99
au BufRead,BufNewFile *.s setfiletype asm
1010
au BufRead,BufNewFile *.tmpl set filetype=gohtmltmpl
1111
au BufRead,BufNewFile go.sum set filetype=gosum
12+
au BufRead,BufNewFile go.work.sum set filetype=gosum
13+
au BufRead,BufNewFile go.work set filetype=gowork
1214

1315
" remove the autocommands for modsim3, and lprolog files so that their
1416
" highlight groups, syntax, etc. will not be loaded. *.MOD is included, so

syntax/gowork.vim

+96
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,96 @@
1+
" gowork.vim: Vim syntax file for go.work file
2+
"
3+
" Quit when a (custom) syntax file was already loaded
4+
if exists("b:current_syntax")
5+
finish
6+
endif
7+
8+
syntax case match
9+
10+
" Reference documentation:
11+
" https://go.dev/ref/mod#workspaces
12+
13+
" match keywords
14+
syntax keyword goworkGo go contained
15+
syntax keyword goworkUse use
16+
syntax keyword goworkExclude exclude
17+
syntax keyword goworkReplace replace
18+
syntax keyword goworkRetract retract
19+
20+
" require, exclude, replace, and go can be also grouped into block
21+
syntax region goworkUse start='require (' end=')' transparent contains=goworkUse,goworkPath
22+
syntax region goworkReplace start='replace (' end=')' transparent contains=goworkReplace,goworkVersion
23+
syntax match goworkGo '^go .*$' transparent contains=goworkGo,goworkGoVersion
24+
25+
" set highlights
26+
highlight default link goworkGo Keyword
27+
highlight default link goworkUse Keyword
28+
highlight default link goworkReplace Keyword
29+
30+
" comments are always in form of // ...
31+
syntax region goworkComment start="//" end="$" contains=@Spell
32+
highlight default link goworkComment Comment
33+
34+
" make sure quoted import paths are higlighted
35+
syntax region goworkString start=+"+ skip=+\\\\\|\\"+ end=+"+
36+
highlight default link goworkString String
37+
38+
" replace operator is in the form of '=>'
39+
syntax match goworkReplaceOperator "\v\=\>"
40+
highlight default link goworkReplaceOperator Operator
41+
42+
" match go versions
43+
syntax match goworkGoVersion "1\.\d\+" contained
44+
highlight default link goworkGoVersion Identifier
45+
46+
47+
" match paths in use directives
48+
syntax match goworkPath "\f\+"
49+
50+
highlight default link goworkPath Identifier
51+
" highlight versions:
52+
" * vX.Y.Z-pre
53+
" * vX.Y.Z
54+
" * vX.0.0-yyyyymmddhhmmss-abcdefabcdef
55+
" * vX.Y.Z-pre.0.yyyymmddhhmmss-abcdefabcdef
56+
" * vX.Y.(Z+1)-0.yyyymmddhhss-abcdefabcdef
57+
" see https://godoc.org/golang.org/x/tools/internal/semver for more
58+
" information about how semantic versions are parsed and
59+
" https://golang.org/cmd/go/ for how pseudo-versions and +incompatible
60+
" are applied.
61+
62+
63+
" match vX.Y.Z and their prereleases
64+
syntax match goworkVersion "v\d\+\.\d\+\.\d\+\%(-\%([0-9A-Za-z-]\+\)\%(\.[0-9A-Za-z-]\+\)*\)\?\%(+\%([0-9A-Za-z-]\+\)\(\.[0-9A-Za-z-]\+\)*\)\?"
65+
" ^--- version ---^^------------ pre-release ---------------------^^--------------- metadata ---------------------^
66+
" ^--------------------------------------- semantic version -------------------------------------------------------^
67+
68+
" match pseudo versions
69+
" without a major version before the commit (e.g. vX.0.0-yyyymmddhhmmss-abcdefabcdef)
70+
syntax match goworkVersion "v\d\+\.0\.0-\d\{14\}-\x\+"
71+
" when most recent version before target is a pre-release
72+
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\+"
73+
" ^--- version ---^^--- ------ pre-release -----------------^^--------------- metadata ---------------------^
74+
" ^------------------------------------- semantic version --------------------------------------------------^
75+
" most recent version before the target is X.Y.Z
76+
syntax match goworkVersion "v\d\+\.\d\+\.\d\+\%(+\%([0-9A-Za-z-]\+\)\(\.[0-9A-Za-z-]\+\)*\)\?-0\.\d\{14}-\x\+"
77+
" ^--- version ---^^--------------- metadata ---------------------^
78+
79+
" match incompatible vX.Y.Z and their prereleases
80+
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"
81+
" ^------- version -------^^------------- pre-release ---------------------^^--------------- metadata ---------------------^
82+
" ^------------------------------------------- semantic version -----------------------------------------------------------^
83+
84+
" match incompatible pseudo versions
85+
" incompatible without a major version before the commit (e.g. vX.0.0-yyyymmddhhmmss-abcdefabcdef)
86+
syntax match goworkVersion "v[2-9]\{1}\d*\.0\.0-\d\{14\}-\x\++incompatible"
87+
" when most recent version before target is a pre-release
88+
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"
89+
" ^------- version -------^^---------- pre-release -----------------^^--------------- metadata ---------------------^
90+
" ^---------------------------------------- semantic version ------------------------------------------------------^
91+
" most recent version before the target is X.Y.Z
92+
syntax match goworkVersion "v[2-9]\{1}\d*\.\d\+\.\d\+\%(+\%([0-9A-Za-z-]\+\)\%(\.[0-9A-Za-z-]\+\)*\)\?-0\.\d\{14}-\x\++incompatible"
93+
" ^------- version -------^^---------------- metadata ---------------------^
94+
highlight default link goworkVersion Identifier
95+
96+
let b:current_syntax = "gowork"

0 commit comments

Comments
 (0)