make.vim (9191B)
1 " Vim syntax file 2 " Language: Makefile 3 " Maintainer: This runtime file is looking for a new maintainer. 4 " Previous Maintainer: Claudio Fleiner <claudio@fleiner.com>, Roland Hieber <https://github.com/rohieb> 5 " URL: https://github.com/vim/vim/blob/master/runtime/syntax/make.vim 6 " Last Change: 2022 Nov 06 7 " 2025 Apr 15 by Vim project: rework Make flavor detection (#17089) 8 " 2025 Oct 12 by Vim project: update makeDefine highlighting (#18403) 9 " 2025 Oct 25 by Vim project: update makeTargetinDefine highlighting (#18570) 10 " 2025 Dec 23 by Vim project: fix too greedy match (#18938) 11 " 2025 Dec 23 by Vim project: wrong highlight with paranthesis inside quotes (#18818) 12 13 " quit when a syntax file was already loaded 14 if exists("b:current_syntax") 15 finish 16 endif 17 18 let s:cpo_save = &cpo 19 set cpo&vim 20 21 " enable GNU extension when b:make_flavor is not set—detection failed or Makefile is POSIX-compliant 22 let s:make_flavor = 'gnu' 23 24 " some special characters 25 syn match makeSpecial "^\s*[@+-]\+" 26 syn match makeNextLine "\\\n\s*" 27 28 " catch unmatched define/endef keywords. endef only matches it is by itself on a line, possibly followed by a commend 29 syn region makeDefine start="^\s*define\s" end="^\s*endef\s*\(#.*\)\?$" 30 \ contains=makeStatement,makeIdent,makePreCondit,makeDefine,makeComment,makeTargetinDefine 31 32 if get(b:, 'make_flavor', s:make_flavor) == 'microsoft' 33 " Microsoft Makefile specials 34 syn case ignore 35 syn match makeInclude "^!\s*include\s.*$" 36 syn match makePreCondit "^!\s*\(cmdswitches\|error\|message\|include\|if\|ifdef\|ifndef\|else\|else\s*if\|else\s*ifdef\|else\s*ifndef\|endif\|undef\)\>" 37 syn case match 38 endif 39 40 " identifiers; treat $$X like $X inside makeDefine 41 syn match makeIdent "\$\$\w*" 42 syn match makeIdent "\$\$\$\$\w*" containedin=makeDefine 43 syn match makeIdent "\$[^({]" 44 syn match makeIdent "\$\$[^({]" containedin=makeDefine 45 if get(b:, 'make_flavor', s:make_flavor) == 'microsoft' 46 syn region makeIdent start="\$(" end=")" contains=makeStatement,makeIdent,makeDString,makeSString 47 syn region makeIdent start="\${" end="}" contains=makeStatement,makeIdent,makeDString,makeSString 48 syn region makeIdent start="\$\$(" end=")" containedin=makeDefine contains=makeStatement,makeIdent,makeDString,makeSString 49 syn region makeIdent start="\$\${" end="}" containedin=makeDefine contains=makeStatement,makeIdent,makeDString,makeSString 50 else 51 syn region makeIdent start="\$(" skip="\\)\|\\\\" end=")" contains=makeStatement,makeIdent,makeDString,makeSString 52 syn region makeIdent start="\${" skip="\\}\|\\\\" end="}" contains=makeStatement,makeIdent,makeDString,makeSString 53 syn region makeIdent start="\$\$(" skip="\\)\|\\\\" end=")" containedin=makeDefine contains=makeStatement,makeIdent,makeDString,makeSString 54 syn region makeIdent start="\$\${" skip="\\}\|\\\\" end="}" containedin=makeDefine contains=makeStatement,makeIdent,makeDString,makeSString 55 endif 56 syn match makeIdent "^ *[^:#= \t]*\s*[:+?!*]="me=e-2 57 syn match makeIdent "^ *[^:#= \t]*\s*::="me=e-3 58 syn match makeIdent "^ *[^:#= \t]*\s*="me=e-1 59 syn match makeIdent "%" 60 61 " Makefile.in variables 62 syn match makeConfig "@[A-Za-z0-9_]\+@" 63 64 " make targets 65 syn match makeImplicit "^\.[A-Za-z0-9_./\t -]\+\s*:$"me=e-1 66 syn match makeImplicit "^\.[A-Za-z0-9_./\t -]\+\s*:[^=]"me=e-2 67 68 syn region makeTargetinDefine transparent matchgroup=makeTargetinDefine 69 \ start="^[~A-Za-z0-9_./$(){}%-][A-Za-z0-9_./\t ${}()%-]*&\?:\?:\{1,2}[^:=]"rs=e-1 70 \ end="[^\\]$" 71 \ keepend 72 syn match makeTargetinDefine "^[~A-Za-z0-9_./$(){}%*@-][A-Za-z0-9_./\t $(){}%*@-]*&\?::\=\s*$" 73 \ contains=makeIdent,makeSpecTarget,makeComment 74 75 syn region makeTarget transparent matchgroup=makeTarget 76 \ start="^[~A-Za-z0-9_./$(){}%-][A-Za-z0-9_./\t ${}()%-]*&\?:\?:\{1,2}[^:=]"rs=e-1 77 \ end="[^\\]$" 78 \ keepend contains=makeIdent,makeSpecTarget,makeNextLine,makeComment,makeDString 79 \ skipnl nextGroup=makeCommands 80 syn match makeTarget "^[~A-Za-z0-9_./$(){}%*@-][A-Za-z0-9_./\t $(){}%*@-]*&\?::\=\s*$" 81 \ contains=makeIdent,makeSpecTarget,makeComment 82 \ skipnl nextgroup=makeCommands,makeCommandError 83 84 syn region makeSpecTarget transparent matchgroup=makeSpecTarget 85 \ start="^\.\(SUFFIXES\|PHONY\|DEFAULT\|PRECIOUS\|IGNORE\|SILENT\|NOTPARALLEL\|POSIX\)\>\s*:\{1,2}[^:=]"rs=e-1 86 \ end="[^\\]$" keepend 87 \ contains=makeIdent,makeSpecTarget,makeNextLine,makeComment skipnl nextGroup=makeCommands 88 syn match makeSpecTarget "^\.\(SUFFIXES\|PHONY\|DEFAULT\|PRECIOUS\|IGNORE\|SILENT\|NOTPARALLEL\|POSIX\)\>\s*::\=\s*$" 89 \ contains=makeIdent,makeComment 90 \ skipnl nextgroup=makeCommands,makeCommandError 91 92 if get(b:, 'make_flavor', s:make_flavor) == 'bsd' 93 syn region makeSpecTarget transparent matchgroup=makeSpecTarget 94 \ start="^\.DELETE_ON_ERROR\>\s*:\{1,2}[^:=]"rs=e-1 95 \ end="[^\\]$" keepend 96 \ contains=makeIdent,makeSpecTarget,makeNextLine,makeComment skipnl nextGroup=makeCommands 97 syn match makeSpecTarget "^\.DELETE_ON_ERROR\>\s*::\=\s*$" 98 \ contains=makeIdent,makeComment 99 \ skipnl nextgroup=makeCommands,makeCommandError 100 elseif get(b:, 'make_flavor', s:make_flavor) == 'gnu' 101 syn region makeSpecTarget transparent matchgroup=makeSpecTarget 102 \ start="^\.\(EXPORT_ALL_VARIABLES\|DELETE_ON_ERROR\|INTERMEDIATE\|KEEP_STATE\|LIBPATTERNS\|ONESHELL\|SECONDARY\)\>\s*:\{1,2}[^:=]"rs=e-1 103 \ end="[^\\]$" keepend 104 \ contains=makeIdent,makeSpecTarget,makeNextLine,makeComment skipnl nextGroup=makeCommands 105 syn match makeSpecTarget "^\.\(EXPORT_ALL_VARIABLES\|DELETE_ON_ERROR\|INTERMEDIATE\|KEEP_STATE\|LIBPATTERNS\|ONESHELL\|SECONDARY\)\>\s*::\=\s*$" 106 \ contains=makeIdent,makeComment 107 \ skipnl nextgroup=makeCommands,makeCommandError 108 endif 109 110 syn match makeCommandError "^\s\+\S.*" contained 111 syn region makeCommands contained start=";"hs=s+1 start="^\t" 112 \ end="^[^\t#]"me=e-1,re=e-1 end="^$" 113 \ contains=makeCmdNextLine,makeSpecial,makeComment,makeIdent,makePreCondit,makeDefine,makeDString,makeSString 114 \ nextgroup=makeCommandError 115 syn match makeCmdNextLine "\\\n."he=e-1 contained 116 117 " some directives 118 syn match makeInclude "^ *[-s]\=include\s.*$" 119 syn match makeExport "^ *\(export\|unexport\)\>" 120 if get(b:, 'make_flavor', s:make_flavor) == 'gnu' 121 " Statements / Functions (GNU make) 122 syn match makePreCondit "^ *\(ifn\=\(eq\|def\)\>\|else\(\s\+ifn\=\(eq\|def\)\)\=\>\|endif\>\)" 123 syn match makeStatement "^ *vpath\>" 124 syn match makeOverride "^ *override\>" 125 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 126 endif 127 128 " Comment 129 if !exists("make_no_comments") 130 if get(b:, 'make_flavor', s:make_flavor) == 'microsoft' 131 syn match makeComment "#.*" contains=@Spell,makeTodo 132 else 133 syn region makeComment start="#" end="^$" end="[^\\]$" keepend contains=@Spell,makeTodo 134 syn match makeComment "#$" contains=@Spell 135 endif 136 endif 137 syn keyword makeTodo TODO FIXME XXX contained 138 139 " match escaped quotes and any other escaped character 140 " except for $, as a backslash in front of a $ does 141 " not make it a standard character, but instead it will 142 " still act as the beginning of a variable 143 " The escaped char is not highlightet currently 144 syn match makeEscapedChar "\\[^$]" 145 146 147 syn region makeDString start=+\(\\\)\@<!"+ skip=+\\.+ end=+"+ contained contains=makeIdent 148 syn region makeSString start=+\(\\\)\@<!'+ skip=+\\.+ end=+'+ contained contains=makeIdent 149 syn region makeBString start=+\(\\\)\@<!`+ skip=+\\.+ end=+`+ contains=makeIdent,makeSString,makeDString,makeNextLine 150 151 " Syncing 152 syn sync minlines=20 maxlines=200 153 154 " Sync on Make command block region: When searching backwards hits a line that 155 " can't be a command or a comment, use makeCommands if it looks like a target, 156 " NONE otherwise. 157 syn sync match makeCommandSync groupthere NONE "^[^\t#]" 158 syn sync match makeCommandSync groupthere makeCommands "^[A-Za-z0-9_./$()%-][A-Za-z0-9_./\t $()%-]*:\{1,2}[^:=]" 159 syn sync match makeCommandSync groupthere makeCommands "^[A-Za-z0-9_./$()%-][A-Za-z0-9_./\t $()%-]*:\{1,2}\s*$" 160 161 " Define the default highlighting. 162 " Only when an item doesn't have highlighting yet 163 164 hi def link makeNextLine makeSpecial 165 hi def link makeCmdNextLine makeSpecial 166 hi link makeOverride makeStatement 167 hi link makeExport makeStatement 168 169 hi def link makeSpecTarget Statement 170 if !exists("make_no_commands") 171 hi def link makeCommands Number 172 endif 173 hi def link makeImplicit Function 174 hi def link makeTarget Function 175 hi def link makeTargetinDefine Function 176 hi def link makeInclude Include 177 hi def link makePreCondit PreCondit 178 hi def link makeStatement Statement 179 hi def link makeIdent Identifier 180 hi def link makeSpecial Special 181 hi def link makeComment Comment 182 hi def link makeDString String 183 hi def link makeSString String 184 hi def link makeBString Function 185 hi def link makeError Error 186 hi def link makeTodo Todo 187 hi def link makeDefine Define 188 hi def link makeCommandError Error 189 hi def link makeConfig PreCondit 190 191 let b:current_syntax = "make" 192 193 let &cpo = s:cpo_save 194 unlet s:cpo_save 195 " vim: ts=8