From 08fa71fd274530be23b6ae6b10222afee0b57522 Mon Sep 17 00:00:00 2001 From: zeertzjq Date: Wed, 23 Aug 2023 19:32:11 +0800 Subject: vim-patch:9.0.1773: cannot distinguish Forth and Fortran *.f files (#24841) Problem: cannot distinguish Forth and Fortran *.f files Solution: Add Filetype detection Code Also add *.4th as a Forth filetype closes: vim/vim#12251 https://github.com/vim/vim/commit/19a3bc3addf9b4aa8150a01b11b4249c67d15d3b Don't remove filetype files from Vim patches: - filetype.vim, script.vim, ft.vim usually contain useful changes - script.vim and ft.vim don't even have their paths spelled correctly Co-authored-by: Doug Kearns --- runtime/lua/vim/filetype.lua | 5 +++-- runtime/lua/vim/filetype/detect.lua | 40 ++++++++++++++++++++++++++++++++----- 2 files changed, 38 insertions(+), 7 deletions(-) (limited to 'runtime/lua/vim') diff --git a/runtime/lua/vim/filetype.lua b/runtime/lua/vim/filetype.lua index ffb284cca7..c310eb3e42 100644 --- a/runtime/lua/vim/filetype.lua +++ b/runtime/lua/vim/filetype.lua @@ -398,6 +398,7 @@ local extension = { EXW = detect.euphoria, ex = detect.ex, exp = 'expect', + f = detect.f, factor = 'factor', fal = 'falcon', fan = 'fan', @@ -410,8 +411,9 @@ local extension = { fish = 'fish', focexec = 'focexec', fex = 'focexec', - fth = 'forth', ft = 'forth', + fth = 'forth', + ['4th'] = 'forth', FOR = 'fortran', f77 = 'fortran', f03 = 'fortran', @@ -427,7 +429,6 @@ local extension = { F77 = 'fortran', f95 = 'fortran', FPP = 'fortran', - f = 'fortran', F = 'fortran', F08 = 'fortran', f08 = 'fortran', diff --git a/runtime/lua/vim/filetype/detect.lua b/runtime/lua/vim/filetype/detect.lua index 59b50f2288..4a7a1cbefe 100644 --- a/runtime/lua/vim/filetype/detect.lua +++ b/runtime/lua/vim/filetype/detect.lua @@ -473,6 +473,38 @@ function M.ex(_, bufnr) end end +--- @param bufnr integer +--- @return boolean +local function is_forth(bufnr) + local first_line = nextnonblank(bufnr, 1) + + -- SwiftForth block comment (line is usually filled with '-' or '=') or + -- OPTIONAL (sometimes precedes the header comment) + if first_line and findany(first_line:lower(), { '^%{%s', '^%{$', '^optional%s' }) then + return true + end + + for _, line in ipairs(getlines(bufnr, 1, 100)) do + -- Forth comments and colon definitions + if line:find('^[:(\\] ') then + return true + end + end + return false +end + +-- Distinguish between Forth and Fortran +--- @type vim.filetype.mapfn +function M.f(_, bufnr) + if vim.g.filetype_f then + return vim.g.filetype_f + end + if is_forth(bufnr) then + return 'forth' + end + return 'fortran' +end + -- This function checks the first 15 lines for appearance of 'FoamFile' -- and then 'object' in a following line. -- In that case, it's probably an OpenFOAM file @@ -518,16 +550,14 @@ function M.fvwm_v2(path, _) end end --- Distinguish between Forth and F#. +-- Distinguish between Forth and F# --- @type vim.filetype.mapfn function M.fs(_, bufnr) if vim.g.filetype_fs then return vim.g.filetype_fs end - for _, line in ipairs(getlines(bufnr, 1, 100)) do - if line:find('^[:(\\] ') then - return 'forth' - end + if is_forth(bufnr) then + return 'forth' end return 'fsharp' end -- cgit