vim-patch:9.1.0616: filetype: Make syntax highlighting off for MS Makefiles (#29874)

Problem:  filetype: Make syntax highlighting off for MS Makefiles
Solution: Try to detect MS Makefiles and adjust syntax rules to it.
          (Ken Takata)

Highlighting of variable expansion in Microsoft Makefile can be broken.
E.g.:
2979cfc262/src/Make_mvc.mak (L1331)

Don't use backslash as escape characters if `make_microsoft` is set.
Also fix that `make_no_comments` was not considered if `make_microsoft`
was set.

Also add description for `make_microsoft` and `make_no_comments` to the
documentation and include a very simple filetype test

closes: vim/vim#15341

eb4b903c9b

Co-authored-by: Ken Takata <kentkt@csc.jp>
This commit is contained in:
zeertzjq 2024-07-27 16:48:29 +08:00 committed by GitHub
parent aa853f362a
commit 60967cd9aa
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
5 changed files with 63 additions and 11 deletions

View File

@ -1806,7 +1806,7 @@ By default mail.vim synchronises syntax to 100 lines before the first
displayed line. If you have a slow machine, and generally deal with emails
with short headers, you can change this to a smaller value: >
:let mail_minlines = 30
:let mail_minlines = 30
MAKE *make.vim* *ft-make-syntax*
@ -1817,6 +1817,16 @@ feature off by using: >
:let make_no_commands = 1
Comments are also highlighted by default. You can turn this off by using: >
:let make_no_comments = 1
Microsoft Makefile handles variable expansion and comments differently
(backslashes are not used for escape). If you see any wrong highlights
because of this, you can try this: >
:let make_microsoft = 1
MAPLE *maple.vim* *ft-maple-syntax*

View File

@ -693,8 +693,8 @@ local extension = {
return not (path:find('html%.m4$') or path:find('fvwm2rc')) and 'm4' or nil
end,
eml = 'mail',
mk = 'make',
mak = 'make',
mk = detect.make,
mak = detect.make,
page = 'mallard',
map = 'map',
mws = 'maple',
@ -2122,7 +2122,7 @@ local pattern = {
['^Containerfile%.'] = starsetf('dockerfile'),
['^Dockerfile%.'] = starsetf('dockerfile'),
['^[jJ]ustfile$'] = 'just',
['[mM]akefile$'] = 'make',
['[mM]akefile$'] = detect.make,
['^[mM]akefile'] = starsetf('make'),
['^[rR]akefile$'] = 'ruby',
['^[rR]akefile'] = starsetf('ruby'),

View File

@ -972,6 +972,24 @@ local function m4(contents)
end
end
--- Check if it is a Microsoft Makefile
--- @type vim.filetype.mapfn
function M.make(_, bufnr)
vim.b.make_microsoft = nil
for _, line in ipairs(getlines(bufnr, 1, 1000)) do
if matchregex(line, [[\c^\s*!\s*\(ifn\=\(def\)\=\|include\|message\|error\)\>]]) then
vim.b.make_microsoft = 1
break
elseif
matchregex(line, [[^ *ifn\=\(eq\|def\)\>]])
or findany(line, { '^ *[-s]?%s', '^ *%w+%s*[!?:+]=' })
then
break
end
end
return 'make'
end
--- @type vim.filetype.mapfn
function M.markdown(_, _)
return vim.g.filetype_md or 'markdown'

View File

@ -28,8 +28,13 @@ syn match makePreCondit "^!\s*\(cmdswitches\|error\|message\|include\|if\|ifdef\
syn case match
" identifiers
syn region makeIdent start="\$(" skip="\\)\|\\\\" end=")" contains=makeStatement,makeIdent
syn region makeIdent start="\${" skip="\\}\|\\\\" end="}" contains=makeStatement,makeIdent
if exists("b:make_microsoft") || exists("make_microsoft")
syn region makeIdent start="\$(" end=")" contains=makeStatement,makeIdent
syn region makeIdent start="\${" end="}" contains=makeStatement,makeIdent
else
syn region makeIdent start="\$(" skip="\\)\|\\\\" end=")" contains=makeStatement,makeIdent
syn region makeIdent start="\${" skip="\\}\|\\\\" end="}" contains=makeStatement,makeIdent
endif
syn match makeIdent "\$\$\w*"
syn match makeIdent "\$[^({]"
syn match makeIdent "^ *[^:#= \t]*\s*[:+?!*]="me=e-2
@ -78,11 +83,13 @@ 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\|join\|lastword\|notdir\|or\|origin\|patsubst\|realpath\|shell\|sort\|strip\|subst\|suffix\|value\|warning\|wildcard\|word\|wordlist\|words\)\>"ms=s+1
" Comment
if exists("make_microsoft")
syn match makeComment "#.*" contains=@Spell,makeTodo
elseif !exists("make_no_comments")
syn region makeComment start="#" end="^$" end="[^\\]$" keepend contains=@Spell,makeTodo
syn match makeComment "#$" contains=@Spell
if !exists("make_no_comments")
if exists("b:make_microsoft") || exists("make_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

View File

@ -2641,4 +2641,21 @@ func Test_pl_file()
filetype off
endfunc
func Test_make_file()
filetype on
" Microsoft Makefile
call writefile(['# Makefile for Windows', '!if "$(VIMDLL)" == "yes"'], 'XMakefile.mak', 'D')
split XMakefile.mak
call assert_equal(1, get(b:, 'make_microsoft', 0))
bwipe!
call writefile(['# get the list of tests', 'include testdir/Make_all.mak'], 'XMakefile.mak', 'D')
split XMakefile.mak
call assert_equal(0, get(b:, 'make_microsoft', 0))
bwipe!
filetype off
endfunc
" vim: shiftwidth=2 sts=2 expandtab