summaryrefslogtreecommitdiff
path: root/mnv/runtime/syntax/make.mnv
diff options
context:
space:
mode:
Diffstat (limited to 'mnv/runtime/syntax/make.mnv')
-rw-r--r--mnv/runtime/syntax/make.mnv195
1 files changed, 195 insertions, 0 deletions
diff --git a/mnv/runtime/syntax/make.mnv b/mnv/runtime/syntax/make.mnv
new file mode 100644
index 0000000000..d5078cc92a
--- /dev/null
+++ b/mnv/runtime/syntax/make.mnv
@@ -0,0 +1,195 @@
+" MNV syntax file
+" Language: Makefile
+" Maintainer: This runtime file is looking for a new maintainer.
+" Previous Maintainer: Claudio Fleiner <claudio@fleiner.com>, Roland Hieber <https://github.com/rohieb>
+" URL: https://github.com/Project-Tick/Project-Tick/blob/master/runtime/syntax/make.mnv
+" Last Change: 2022 Nov 06
+" 2025 Apr 15 by MNV project: rework Make flavor detection (#17089)
+" 2025 Oct 12 by MNV project: update makeDefine highlighting (#18403)
+" 2025 Oct 25 by MNV project: update makeTargetinDefine highlighting (#18570)
+" 2025 Dec 23 by MNV project: fix too greedy match (#18938)
+" 2025 Dec 23 by MNV project: wrong highlight with paranthesis inside quotes (#18818)
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+let s:cpo_save = &cpo
+set cpo&mnv
+
+" enable GNU extension when b:make_flavor is not set—detection failed or Makefile is POSIX-compliant
+let s:make_flavor = 'gnu'
+
+" some special characters
+syn match makeSpecial "^\s*[@+-]\+"
+syn match makeNextLine "\\\n\s*"
+
+" catch unmatched define/endef keywords. endef only matches it is by itself on a line, possibly followed by a commend
+syn region makeDefine start="^\s*define\s" end="^\s*endef\s*\(#.*\)\?$"
+ \ contains=makeStatement,makeIdent,makePreCondit,makeDefine,makeComment,makeTargetinDefine
+
+if get(b:, 'make_flavor', s:make_flavor) == 'microsoft'
+ " Microsoft Makefile specials
+ syn case ignore
+ syn match makeInclude "^!\s*include\s.*$"
+ syn match makePreCondit "^!\s*\(cmdswitches\|error\|message\|include\|if\|ifdef\|ifndef\|else\|else\s*if\|else\s*ifdef\|else\s*ifndef\|endif\|undef\)\>"
+ syn case match
+endif
+
+" identifiers; treat $$X like $X inside makeDefine
+syn match makeIdent "\$\$\w*"
+syn match makeIdent "\$\$\$\$\w*" containedin=makeDefine
+syn match makeIdent "\$[^({]"
+syn match makeIdent "\$\$[^({]" containedin=makeDefine
+if get(b:, 'make_flavor', s:make_flavor) == 'microsoft'
+ syn region makeIdent start="\$(" end=")" contains=makeStatement,makeIdent,makeDString,makeSString
+ syn region makeIdent start="\${" end="}" contains=makeStatement,makeIdent,makeDString,makeSString
+ syn region makeIdent start="\$\$(" end=")" containedin=makeDefine contains=makeStatement,makeIdent,makeDString,makeSString
+ syn region makeIdent start="\$\${" end="}" containedin=makeDefine contains=makeStatement,makeIdent,makeDString,makeSString
+else
+ syn region makeIdent start="\$(" skip="\\)\|\\\\" end=")" contains=makeStatement,makeIdent,makeDString,makeSString
+ syn region makeIdent start="\${" skip="\\}\|\\\\" end="}" contains=makeStatement,makeIdent,makeDString,makeSString
+ syn region makeIdent start="\$\$(" skip="\\)\|\\\\" end=")" containedin=makeDefine contains=makeStatement,makeIdent,makeDString,makeSString
+ syn region makeIdent start="\$\${" skip="\\}\|\\\\" end="}" containedin=makeDefine contains=makeStatement,makeIdent,makeDString,makeSString
+endif
+syn match makeIdent "^ *[^:#= \t]*\s*[:+?!*]="me=e-2
+syn match makeIdent "^ *[^:#= \t]*\s*::="me=e-3
+syn match makeIdent "^ *[^:#= \t]*\s*="me=e-1
+syn match makeIdent "%"
+
+" Makefile.in variables
+syn match makeConfig "@[A-Za-z0-9_]\+@"
+
+" make targets
+syn match makeImplicit "^\.[A-Za-z0-9_./\t -]\+\s*:$"me=e-1
+syn match makeImplicit "^\.[A-Za-z0-9_./\t -]\+\s*:[^=]"me=e-2
+
+syn region makeTargetinDefine transparent matchgroup=makeTargetinDefine
+ \ start="^[~A-Za-z0-9_./$(){}%-][A-Za-z0-9_./\t ${}()%-]*&\?:\?:\{1,2}[^:=]"rs=e-1
+ \ end="[^\\]$"
+ \ keepend
+syn match makeTargetinDefine "^[~A-Za-z0-9_./$(){}%*@-][A-Za-z0-9_./\t $(){}%*@-]*&\?::\=\s*$"
+ \ contains=makeIdent,makeSpecTarget,makeComment
+
+syn region makeTarget transparent matchgroup=makeTarget
+ \ start="^[~A-Za-z0-9_./$(){}%-][A-Za-z0-9_./\t ${}()%-]*&\?:\?:\{1,2}[^:=]"rs=e-1
+ \ end="[^\\]$"
+ \ keepend contains=makeIdent,makeSpecTarget,makeNextLine,makeComment,makeDString
+ \ skipnl nextGroup=makeCommands
+syn match makeTarget "^[~A-Za-z0-9_./$(){}%*@-][A-Za-z0-9_./\t $(){}%*@-]*&\?::\=\s*$"
+ \ contains=makeIdent,makeSpecTarget,makeComment
+ \ skipnl nextgroup=makeCommands,makeCommandError
+
+syn region makeSpecTarget transparent matchgroup=makeSpecTarget
+ \ start="^\.\(SUFFIXES\|PHONY\|DEFAULT\|PRECIOUS\|IGNORE\|SILENT\|NOTPARALLEL\|POSIX\)\>\s*:\{1,2}[^:=]"rs=e-1
+ \ end="[^\\]$" keepend
+ \ contains=makeIdent,makeSpecTarget,makeNextLine,makeComment skipnl nextGroup=makeCommands
+syn match makeSpecTarget "^\.\(SUFFIXES\|PHONY\|DEFAULT\|PRECIOUS\|IGNORE\|SILENT\|NOTPARALLEL\|POSIX\)\>\s*::\=\s*$"
+ \ contains=makeIdent,makeComment
+ \ skipnl nextgroup=makeCommands,makeCommandError
+
+if get(b:, 'make_flavor', s:make_flavor) == 'bsd'
+ syn region makeSpecTarget transparent matchgroup=makeSpecTarget
+ \ start="^\.DELETE_ON_ERROR\>\s*:\{1,2}[^:=]"rs=e-1
+ \ end="[^\\]$" keepend
+ \ contains=makeIdent,makeSpecTarget,makeNextLine,makeComment skipnl nextGroup=makeCommands
+ syn match makeSpecTarget "^\.DELETE_ON_ERROR\>\s*::\=\s*$"
+ \ contains=makeIdent,makeComment
+ \ skipnl nextgroup=makeCommands,makeCommandError
+elseif get(b:, 'make_flavor', s:make_flavor) == 'gnu'
+ syn region makeSpecTarget transparent matchgroup=makeSpecTarget
+ \ start="^\.\(EXPORT_ALL_VARIABLES\|DELETE_ON_ERROR\|INTERMEDIATE\|KEEP_STATE\|LIBPATTERNS\|ONESHELL\|SECONDARY\)\>\s*:\{1,2}[^:=]"rs=e-1
+ \ end="[^\\]$" keepend
+ \ contains=makeIdent,makeSpecTarget,makeNextLine,makeComment skipnl nextGroup=makeCommands
+ syn match makeSpecTarget "^\.\(EXPORT_ALL_VARIABLES\|DELETE_ON_ERROR\|INTERMEDIATE\|KEEP_STATE\|LIBPATTERNS\|ONESHELL\|SECONDARY\)\>\s*::\=\s*$"
+ \ contains=makeIdent,makeComment
+ \ skipnl nextgroup=makeCommands,makeCommandError
+endif
+
+syn match makeCommandError "^\s\+\S.*" contained
+syn region makeCommands contained start=";"hs=s+1 start="^\t"
+ \ end="^[^\t#]"me=e-1,re=e-1 end="^$"
+ \ contains=makeCmdNextLine,makeSpecial,makeComment,makeIdent,makePreCondit,makeDefine,makeDString,makeSString
+ \ nextgroup=makeCommandError
+syn match makeCmdNextLine "\\\n."he=e-1 contained
+
+" some directives
+syn match makeInclude "^ *[-s]\=include\s.*$"
+syn match makeExport "^ *\(export\|unexport\)\>"
+if get(b:, 'make_flavor', s:make_flavor) == 'gnu'
+ " Statements / Functions (GNU make)
+ syn match makePreCondit "^ *\(ifn\=\(eq\|def\)\>\|else\(\s\+ifn\=\(eq\|def\)\)\=\>\|endif\>\)"
+ syn match makeStatement "^ *vpath\>"
+ syn match makeOverride "^ *override\>"
+ syn match makeStatement contained "[({]\(abspath\|addprefix\|addsuffix\|and\|basename\|call\|dir\|error\|eval\|file\|filter-out\|filter\|findstring\|firstword\|flavor\|foreach\|guile\|if\|info\|intcmp\|join\|lastword\|let\|notdir\|or\|origin\|patsubst\|realpath\|shell\|sort\|strip\|subst\|suffix\|value\|warning\|wildcard\|word\|wordlist\|words\)\>"ms=s+1
+endif
+
+" Comment
+if !exists("make_no_comments")
+ if get(b:, 'make_flavor', s:make_flavor) == 'microsoft'
+ syn match makeComment "#.*" contains=@Spell,makeTodo
+ else
+ syn region makeComment start="#" end="^$" end="[^\\]$" keepend contains=@Spell,makeTodo
+ syn match makeComment "#$" contains=@Spell
+ endif
+endif
+syn keyword makeTodo TODO FIXME XXX contained
+
+" match escaped quotes and any other escaped character
+" except for $, as a backslash in front of a $ does
+" not make it a standard character, but instead it will
+" still act as the beginning of a variable
+" The escaped char is not highlightet currently
+syn match makeEscapedChar "\\[^$]"
+
+
+syn region makeDString start=+\(\\\)\@<!"+ skip=+\\.+ end=+"+ contained contains=makeIdent
+syn region makeSString start=+\(\\\)\@<!'+ skip=+\\.+ end=+'+ contained contains=makeIdent
+syn region makeBString start=+\(\\\)\@<!`+ skip=+\\.+ end=+`+ contains=makeIdent,makeSString,makeDString,makeNextLine
+
+" Syncing
+syn sync minlines=20 maxlines=200
+
+" Sync on Make command block region: When searching backwards hits a line that
+" can't be a command or a comment, use makeCommands if it looks like a target,
+" NONE otherwise.
+syn sync match makeCommandSync groupthere NONE "^[^\t#]"
+syn sync match makeCommandSync groupthere makeCommands "^[A-Za-z0-9_./$()%-][A-Za-z0-9_./\t $()%-]*:\{1,2}[^:=]"
+syn sync match makeCommandSync groupthere makeCommands "^[A-Za-z0-9_./$()%-][A-Za-z0-9_./\t $()%-]*:\{1,2}\s*$"
+
+" Define the default highlighting.
+" Only when an item doesn't have highlighting yet
+
+hi def link makeNextLine makeSpecial
+hi def link makeCmdNextLine makeSpecial
+hi link makeOverride makeStatement
+hi link makeExport makeStatement
+
+hi def link makeSpecTarget Statement
+if !exists("make_no_commands")
+hi def link makeCommands Number
+endif
+hi def link makeImplicit Function
+hi def link makeTarget Function
+hi def link makeTargetinDefine Function
+hi def link makeInclude Include
+hi def link makePreCondit PreCondit
+hi def link makeStatement Statement
+hi def link makeIdent Identifier
+hi def link makeSpecial Special
+hi def link makeComment Comment
+hi def link makeDString String
+hi def link makeSString String
+hi def link makeBString Function
+hi def link makeError Error
+hi def link makeTodo Todo
+hi def link makeDefine Define
+hi def link makeCommandError Error
+hi def link makeConfig PreCondit
+
+let b:current_syntax = "make"
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
+" mnv: ts=8