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