neovim

Neovim text editor
git clone https://git.dasho.dev/neovim.git
Log | Files | Refs | README

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