From 41ee98c3c5342867cb99dfcddbe8d53caeda22db Mon Sep 17 00:00:00 2001 From: zeertzjq Date: Wed, 9 Jul 2025 18:23:14 +0200 Subject: [PATCH] runtime(filetype): fix incorrect pattern and break early - Using `\n` is incorrect, as result of getline() does not contain line breaks and only uses `\n` for NUL bytes. - Return when b:asmsyntax is set, like many other filetypes. closes: #17706 Signed-off-by: zeertzjq Signed-off-by: Christian Brabandt --- runtime/autoload/dist/ft.vim | 45 +++++++++++++++++++----------------- 1 file changed, 24 insertions(+), 21 deletions(-) diff --git a/runtime/autoload/dist/ft.vim b/runtime/autoload/dist/ft.vim index ff1dc037d2..380b97bf41 100644 --- a/runtime/autoload/dist/ft.vim +++ b/runtime/autoload/dist/ft.vim @@ -3,7 +3,7 @@ vim9script # Vim functions for file type detection # # Maintainer: The Vim Project -# Last Change: 2025 Jul 08 +# Last Change: 2025 Jul 09 # Former Maintainer: Bram Moolenaar # These functions are moved here from runtime/filetype.vim to make startup @@ -61,27 +61,30 @@ export def FTasmsyntax() var match = matchstr(head, '\sasmsyntax=\zs[a-zA-Z0-9]\+\ze\s') if match != '' b:asmsyntax = match - else - # Use heuristics - var is_slash_star_encountered = false - var i = 1 - const n = min([50, line("$")]) - while i <= n - const line = getline(i) - if line =~ '\%(^\|\n\)/\*' - is_slash_star_encountered = true - endif - if line =~# '^; Listing generated by Microsoft' || line =~? '\%(^\|\n\)\%(\%(CONST\|_BSS\|_DATA\|_TEXT\)\s\+SEGMENT\>\)\|\s*\.[2-6]86P\?\>\|\s*\.XMM\>' - b:asmsyntax = "masm" - elseif line =~ 'Texas Instruments Incorporated' || (line =~ '\%(^\|\n\)\*' && !is_slash_star_encountered) - # tiasm uses `* commment`, but detection is unreliable if '/*' is seen - b:asmsyntax = "tiasm" - elseif ((line =~? '\.title\>\|\.ident\>\|\.macro\>\|\.subtitle\>\|\.library\>')) - b:asmsyntax = "vmasm" - endif - i += 1 - endwhile + return endif + # Use heuristics + var is_slash_star_encountered = false + var i = 1 + const n = min([50, line("$")]) + while i <= n + const line = getline(i) + if line =~ '^/\*' + is_slash_star_encountered = true + endif + if line =~# '^; Listing generated by Microsoft' || line =~? '^\%(\%(CONST\|_BSS\|_DATA\|_TEXT\)\s\+SEGMENT\>\)\|\s*\.[2-6]86P\?\>\|\s*\.XMM\>' + b:asmsyntax = "masm" + return + elseif line =~ 'Texas Instruments Incorporated' || (line =~ '^\*' && !is_slash_star_encountered) + # tiasm uses `* commment`, but detection is unreliable if '/*' is seen + b:asmsyntax = "tiasm" + return + elseif ((line =~? '\.title\>\|\.ident\>\|\.macro\>\|\.subtitle\>\|\.library\>')) + b:asmsyntax = "vmasm" + return + endif + i += 1 + endwhile enddef var ft_visual_basic_content = '\c^\s*\%(Attribute\s\+VB_Name\|Begin\s\+\%(VB\.\|{\%(\x\+-\)\+\x\+}\)\)'