xref: /vim-8.2.3635/runtime/syntax/make.vim (revision 5d684456)
1" Vim syntax file
2" Language:	Makefile
3" Maintainer:	Roland Hieber <[email protected]>
4" Previous Maintainer:	Claudio Fleiner <[email protected]>
5" URL:		https://github.com/vim/vim/syntax/make.vim
6" Last Change:	2019 Apr 02
7
8" quit when a syntax file was already loaded
9if exists("b:current_syntax")
10  finish
11endif
12
13let s:cpo_save = &cpo
14set cpo&vim
15
16
17" some special characters
18syn match makeSpecial	"^\s*[@+-]\+"
19syn match makeNextLine	"\\\n\s*"
20
21" some directives
22syn match makePreCondit	"^ *\(ifn\=\(eq\|def\)\>\|else\(\s\+ifn\=\(eq\|def\)\)\=\>\|endif\>\)"
23syn match makeInclude	"^ *[-s]\=include"
24syn match makeStatement	"^ *vpath"
25syn match makeExport    "^ *\(export\|unexport\)\>"
26syn match makeOverride	"^ *override"
27hi link makeOverride makeStatement
28hi link makeExport makeStatement
29
30" catch unmatched define/endef keywords.  endef only matches it is by itself on a line, possibly followed by a commend
31syn region makeDefine start="^\s*define\s" end="^\s*endef\s*\(#.*\)\?$" contains=makeStatement,makeIdent,makePreCondit,makeDefine
32
33" Microsoft Makefile specials
34syn case ignore
35syn match makeInclude	"^!\s*include"
36syn match makePreCondit "^!\s*\(cmdswitches\|error\|message\|include\|if\|ifdef\|ifndef\|else\|else\s*if\|else\s*ifdef\|else\s*ifndef\|endif\|undef\)\>"
37syn case match
38
39" identifiers
40syn region makeIdent	start="\$(" skip="\\)\|\\\\" end=")" contains=makeStatement,makeIdent,makeSString,makeDString
41syn region makeIdent	start="\${" skip="\\}\|\\\\" end="}" contains=makeStatement,makeIdent,makeSString,makeDString
42syn match makeIdent	"\$\$\w*"
43syn match makeIdent	"\$[^({]"
44syn match makeIdent	"^ *[^:#= \t]*\s*[:+?!*]="me=e-2
45syn match makeIdent	"^ *[^:#= \t]*\s*="me=e-1
46syn match makeIdent	"%"
47
48" Makefile.in variables
49syn match makeConfig "@[A-Za-z0-9_]\+@"
50
51" make targets
52" syn match makeSpecTarget	"^\.\(SUFFIXES\|PHONY\|DEFAULT\|PRECIOUS\|IGNORE\|SILENT\|EXPORT_ALL_VARIABLES\|KEEP_STATE\|LIBPATTERNS\|NOTPARALLEL\|DELETE_ON_ERROR\|INTERMEDIATE\|POSIX\|SECONDARY\)\>"
53syn match makeImplicit		"^\.[A-Za-z0-9_./\t -]\+\s*:$"me=e-1 nextgroup=makeSource
54syn match makeImplicit		"^\.[A-Za-z0-9_./\t -]\+\s*:[^=]"me=e-2 nextgroup=makeSource
55
56syn region makeTarget   transparent matchgroup=makeTarget start="^[~A-Za-z0-9_./$()%-][A-Za-z0-9_./\t $()%-]*:\{1,2}[^:=]"rs=e-1 end=";"re=e-1,me=e-1 end="[^\\]$" keepend contains=makeIdent,makeSpecTarget,makeNextLine,makeComment skipnl nextGroup=makeCommands
57syn match makeTarget		"^[~A-Za-z0-9_./$()%*@-][A-Za-z0-9_./\t $()%*@-]*::\=\s*$" contains=makeIdent,makeSpecTarget,makeComment skipnl nextgroup=makeCommands,makeCommandError
58
59syn region makeSpecTarget	transparent matchgroup=makeSpecTarget start="^\.\(SUFFIXES\|PHONY\|DEFAULT\|PRECIOUS\|IGNORE\|SILENT\|EXPORT_ALL_VARIABLES\|KEEP_STATE\|LIBPATTERNS\|NOTPARALLEL\|DELETE_ON_ERROR\|INTERMEDIATE\|POSIX\|SECONDARY\)\>\s*:\{1,2}[^:=]"rs=e-1 end="[^\\]$" keepend contains=makeIdent,makeSpecTarget,makeNextLine,makeComment skipnl nextGroup=makeCommands
60syn match makeSpecTarget		"^\.\(SUFFIXES\|PHONY\|DEFAULT\|PRECIOUS\|IGNORE\|SILENT\|EXPORT_ALL_VARIABLES\|KEEP_STATE\|LIBPATTERNS\|NOTPARALLEL\|DELETE_ON_ERROR\|INTERMEDIATE\|POSIX\|SECONDARY\)\>\s*::\=\s*$" contains=makeIdent,makeComment skipnl nextgroup=makeCommands,makeCommandError
61
62syn match makeCommandError "^\s\+\S.*" contained
63syn region makeCommands start=";"hs=s+1 start="^\t" end="^[^\t#]"me=e-1,re=e-1 end="^$" contained contains=makeCmdNextLine,makeSpecial,makeComment,makeIdent,makePreCondit,makeDefine,makeDString,makeSString nextgroup=makeCommandError
64syn match makeCmdNextLine	"\\\n."he=e-1 contained
65
66
67" Statements / Functions (GNU make)
68syn match makeStatement contained "(\(abspath\|addprefix\|addsuffix\|and\|basename\|call\|dir\|error\|eval\|file\|filter-out\|filter\|findstring\|firstword\|flavor\|foreach\|guile\|if\|info\|join\|lastword\|notdir\|or\|origin\|patsubst\|realpath\|shell\|sort\|strip\|subst\|suffix\|value\|warning\|wildcard\|word\|wordlist\|words\)\>"ms=s+1
69
70" Comment
71if exists("make_microsoft")
72   syn match  makeComment "#.*" contains=@Spell,makeTodo
73elseif !exists("make_no_comments")
74   syn region  makeComment	start="#" end="^$" end="[^\\]$" keepend contains=@Spell,makeTodo
75   syn match   makeComment	"#$" contains=@Spell
76endif
77syn keyword makeTodo TODO FIXME XXX contained
78
79" match escaped quotes and any other escaped character
80" except for $, as a backslash in front of a $ does
81" not make it a standard character, but instead it will
82" still act as the beginning of a variable
83" The escaped char is not highlightet currently
84syn match makeEscapedChar	"\\[^$]"
85
86
87syn region  makeDString start=+\(\\\)\@<!"+  skip=+\\.+  end=+"+  contains=makeIdent
88syn region  makeSString start=+\(\\\)\@<!'+  skip=+\\.+  end=+'+  contains=makeIdent
89syn region  makeBString start=+\(\\\)\@<!`+  skip=+\\.+  end=+`+  contains=makeIdent,makeSString,makeDString,makeNextLine
90
91" Syncing
92syn sync minlines=20 maxlines=200
93
94" Sync on Make command block region: When searching backwards hits a line that
95" can't be a command or a comment, use makeCommands if it looks like a target,
96" NONE otherwise.
97syn sync match makeCommandSync groupthere NONE "^[^\t#]"
98syn sync match makeCommandSync groupthere makeCommands "^[A-Za-z0-9_./$()%-][A-Za-z0-9_./\t $()%-]*:\{1,2}[^:=]"
99syn sync match makeCommandSync groupthere makeCommands "^[A-Za-z0-9_./$()%-][A-Za-z0-9_./\t $()%-]*:\{1,2}\s*$"
100
101" Define the default highlighting.
102" Only when an item doesn't have highlighting yet
103
104hi def link makeNextLine	makeSpecial
105hi def link makeCmdNextLine	makeSpecial
106hi def link makeSpecTarget	Statement
107if !exists("make_no_commands")
108hi def link makeCommands	Number
109endif
110hi def link makeImplicit	Function
111hi def link makeTarget		Function
112hi def link makeInclude		Include
113hi def link makePreCondit	PreCondit
114hi def link makeStatement	Statement
115hi def link makeIdent		Identifier
116hi def link makeSpecial		Special
117hi def link makeComment		Comment
118hi def link makeDString		String
119hi def link makeSString		String
120hi def link makeBString		Function
121hi def link makeError		Error
122hi def link makeTodo		Todo
123hi def link makeDefine		Define
124hi def link makeCommandError	Error
125hi def link makeConfig		PreCondit
126
127let b:current_syntax = "make"
128
129let &cpo = s:cpo_save
130unlet s:cpo_save
131" vim: ts=8
132