neovim

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

commit 0bafbe872b2f6cab2a4a6df9213ffc664eeee948
parent 9898327bd7206480ac0b324667ae9fb504941b4a
Author: zeertzjq <zeertzjq@outlook.com>
Date:   Fri,  5 Sep 2025 17:22:24 +0800

vim-patch:9.1.1732: filetype: .inc file detection can be improved (#35635)

Problem:  filetype: .inc file detection can be improved
Solution: Update filetype detection for Pascal and BitBake code
          (Martin Schwan).

Fix the detection of .inc files containing Pascal and BitBake code:

- the concatenated string, merged from three lines, only contains one
  beginning and the pattern "^" would not match as expected. Use a range()
  loop to iterate each line string individually. This way, the pattern "^"
  works for beginning of lines.

- improve BitBake include file detection by also matching forward-slashes
  "/" in variable names and assignment operators with a dot ".=" and "=.".
  Valid examples, which should match, are:

    PREFERRED_PROVIDER_virtual/kernel = "linux-yocto"
    MACHINEOVERRIDES =. "qemuall:"
    BBPATH .= ":${LAYERDIR}"

- parse twenty instead of just three lines, to accommodate for potential
  comments at the beginning of files

closes: vim/vim#18202

https://github.com/vim/vim/commit/9fd1a657d2efae5cff278eb5acaa380623a50cf6

Co-authored-by: Martin Schwan <m.schwan@phytec.de>
Diffstat:
Mruntime/lua/vim/filetype/detect.lua | 38++++++++++++++++++++------------------
Mtest/old/testdir/test_filetype.vim | 15+++++++++++++++
2 files changed, 35 insertions(+), 18 deletions(-)

diff --git a/runtime/lua/vim/filetype/detect.lua b/runtime/lua/vim/filetype/detect.lua @@ -844,28 +844,30 @@ function M.inc(path, bufnr) if vim.g.filetype_inc then return vim.g.filetype_inc end - local lines = table.concat(getlines(bufnr, 1, 3)) - if lines:lower():find('perlscript') then - return 'aspperl' - elseif lines:find('<%%') then - return 'aspvbs' - elseif lines:find('<%?') then - return 'php' + for _, line in ipairs(getlines(bufnr, 1, 20)) do + if line:lower():find('perlscript') then + return 'aspperl' + elseif line:find('<%%') then + return 'aspvbs' + elseif line:find('<%?') then + return 'php' -- Pascal supports // comments but they're vary rarely used for file -- headers so assume POV-Ray - elseif findany(lines, { '^%s{', '^%s%(%*' }) or matchregex(lines, pascal_keywords) then - return 'pascal' - elseif findany(lines, { '^%s*inherit ', '^%s*require ', '^%s*%u[%w_:${}]*%s+%??[?:+]?= ' }) then - return 'bitbake' - else - local syntax = M.asm_syntax(path, bufnr) - if not syntax or syntax == '' then - return 'pov' - end - return syntax, function(b) - vim.b[b].asmsyntax = syntax + elseif findany(line, { '^%s{', '^%s%(%*' }) or matchregex(line, pascal_keywords) then + return 'pascal' + elseif + findany(line, { '^%s*inherit ', '^%s*require ', '^%s*%u[%w_:${}/]*%s+%??[?:+.]?=.? ' }) + then + return 'bitbake' end end + local syntax = M.asm_syntax(path, bufnr) + if not syntax or syntax == '' then + return 'pov' + end + return syntax, function(b) + vim.b[b].asmsyntax = syntax + end end --- @type vim.filetype.mapfn diff --git a/test/old/testdir/test_filetype.vim b/test/old/testdir/test_filetype.vim @@ -2660,6 +2660,21 @@ func Test_inc_file() call assert_equal('bitbake', &filetype) bwipe! + call writefile(['PREFERRED_PROVIDER_virtual/kernel = "linux-yocto"'], 'Xfile.inc') + split Xfile.inc + call assert_equal('bitbake', &filetype) + bwipe! + + call writefile(['MACHINEOVERRIDES =. "qemuall:"'], 'Xfile.inc') + split Xfile.inc + call assert_equal('bitbake', &filetype) + bwipe! + + call writefile(['BBPATH .= ":${LAYERDIR}"'], 'Xfile.inc') + split Xfile.inc + call assert_equal('bitbake', &filetype) + bwipe! + " asm call writefile(['asmsyntax=foo'], 'Xfile.inc') split Xfile.inc