From 0bb2f5cc08012175cf9915ce6309b2691e7ae44c Mon Sep 17 00:00:00 2001
From: Barrett Ruth
Date: Mon, 13 Jul 2026 14:36:36 -0500
Subject: [PATCH] fix(ftplugin): source inherited Lua ftplugins
Problem:
Vimscript ftplugins that inherit a base ftplugin often use explicit
`runtime! ftplugin/foo.vim` patterns. This skips corresponding Lua
ftplugins, unlike top-level ftplugin loading.
Solution:
Use the existing `{vim,lua}` patterns for bang runtime imports while
preserving each call's current lookup breadth.
---
runtime/ftplugin/ant.vim | 2 +-
runtime/ftplugin/aspvbs.vim | 2 +-
runtime/ftplugin/automake.vim | 2 +-
runtime/ftplugin/bash.vim | 2 +-
runtime/ftplugin/bicep-params.vim | 2 +-
runtime/ftplugin/brighterscript.vim | 2 +-
runtime/ftplugin/btm.vim | 2 +-
runtime/ftplugin/ch.vim | 2 +-
runtime/ftplugin/config.vim | 2 +-
runtime/ftplugin/confini.vim | 2 +-
runtime/ftplugin/cuda.vim | 2 +-
runtime/ftplugin/dnsmasq.vim | 2 +-
runtime/ftplugin/docbk.vim | 4 ++--
runtime/ftplugin/eruby.vim | 6 +++---
runtime/ftplugin/expect.vim | 2 +-
runtime/ftplugin/fpcmake.vim | 2 +-
runtime/ftplugin/freebasic.vim | 2 +-
runtime/ftplugin/ghostty.vim | 2 +-
runtime/ftplugin/gitsendemail.vim | 2 +-
runtime/ftplugin/groff.vim | 2 +-
runtime/ftplugin/haml.vim | 4 ++--
runtime/ftplugin/hcl.vim | 2 +-
runtime/ftplugin/htmlangular.vim | 2 +-
runtime/ftplugin/htmldjango.vim | 4 ++--
runtime/ftplugin/javascriptreact.vim | 2 +-
runtime/ftplugin/jsonc.vim | 2 +-
runtime/ftplugin/jsp.vim | 4 ++--
runtime/ftplugin/kwt.vim | 2 +-
runtime/ftplugin/leex.vim | 2 +-
runtime/ftplugin/liquid.vim | 4 ++--
runtime/ftplugin/livebook.vim | 2 +-
runtime/ftplugin/m3build.vim | 2 +-
runtime/ftplugin/markdown.vim | 2 +-
runtime/ftplugin/objc.vim | 2 +-
runtime/ftplugin/objcpp.vim | 2 +-
runtime/ftplugin/php.vim | 2 +-
runtime/ftplugin/pyrex.vim | 2 +-
runtime/ftplugin/qb64.vim | 2 +-
runtime/ftplugin/query.lua | 2 +-
runtime/ftplugin/rmd.vim | 2 +-
runtime/ftplugin/rnoweb.vim | 2 +-
runtime/ftplugin/sbt.vim | 2 +-
runtime/ftplugin/scheme.vim | 2 +-
runtime/ftplugin/scss.vim | 2 +-
runtime/ftplugin/sgml.vim | 2 +-
runtime/ftplugin/sshdconfig.vim | 2 +-
runtime/ftplugin/stylus.vim | 2 +-
runtime/ftplugin/svg.vim | 2 +-
runtime/ftplugin/swiftgyb.vim | 2 +-
runtime/ftplugin/sysml.vim | 2 +-
runtime/ftplugin/systemd.vim | 2 +-
runtime/ftplugin/systemverilog.vim | 2 +-
runtime/ftplugin/tcsh.vim | 2 +-
runtime/ftplugin/tt2html.vim | 2 +-
runtime/ftplugin/typescriptreact.vim | 2 +-
runtime/ftplugin/xhtml.vim | 4 ++--
runtime/ftplugin/xs.vim | 2 +-
runtime/ftplugin/xsd.vim | 2 +-
runtime/ftplugin/xslt.vim | 2 +-
test/functional/editor/runtime_spec.lua | 12 ++++++++++++
60 files changed, 79 insertions(+), 67 deletions(-)
diff --git a/runtime/ftplugin/ant.vim b/runtime/ftplugin/ant.vim
index 65e01a1a76..0678e739d9 100644
--- a/runtime/ftplugin/ant.vim
+++ b/runtime/ftplugin/ant.vim
@@ -23,7 +23,7 @@ else
let s:browsefilter .= "All Files (*)\t*\n"
endif
-runtime! ftplugin/xml.vim ftplugin/xml_*.vim ftplugin/xml/*.vim
+runtime! ftplugin/xml[.]{vim,lua} ftplugin/xml_*.{vim,lua} ftplugin/xml/*.{vim,lua}
let b:did_ftplugin = 1
" Override our defaults if these were set by an included ftplugin.
diff --git a/runtime/ftplugin/aspvbs.vim b/runtime/ftplugin/aspvbs.vim
index 6979bb8f84..7d0b08f4e0 100644
--- a/runtime/ftplugin/aspvbs.vim
+++ b/runtime/ftplugin/aspvbs.vim
@@ -24,7 +24,7 @@ else
endif
let s:match_words = ""
-runtime! ftplugin/html.vim ftplugin/html_*.vim ftplugin/html/*.vim
+runtime! ftplugin/html[.]{vim,lua} ftplugin/html_*.{vim,lua} ftplugin/html/*.{vim,lua}
let b:did_ftplugin = 1
" Override our defaults if these were set by an included ftplugin.
diff --git a/runtime/ftplugin/automake.vim b/runtime/ftplugin/automake.vim
index 9f981a7a83..fabcb59a2f 100644
--- a/runtime/ftplugin/automake.vim
+++ b/runtime/ftplugin/automake.vim
@@ -10,7 +10,7 @@ endif
let s:cpo_save = &cpo
set cpo&vim
-runtime! ftplugin/make.vim ftplugin/make_*.vim ftplugin/make/*.vim
+runtime! ftplugin/make[.]{vim,lua} ftplugin/make_*.{vim,lua} ftplugin/make/*.{vim,lua}
let &cpo = s:cpo_save
unlet s:cpo_save
diff --git a/runtime/ftplugin/bash.vim b/runtime/ftplugin/bash.vim
index 7be1eca2a9..25c28d8f4b 100644
--- a/runtime/ftplugin/bash.vim
+++ b/runtime/ftplugin/bash.vim
@@ -15,6 +15,6 @@ unlet! b:is_sh
unlet! b:is_kornshell
let b:is_bash = 1
-runtime! ftplugin/sh.vim ftplugin/sh_*.vim ftplugin/sh/*.vim
+runtime! ftplugin/sh[.]{vim,lua} ftplugin/sh_*.{vim,lua} ftplugin/sh/*.{vim,lua}
" vim: ts=8
diff --git a/runtime/ftplugin/bicep-params.vim b/runtime/ftplugin/bicep-params.vim
index 7cc2d85126..b132517a5f 100644
--- a/runtime/ftplugin/bicep-params.vim
+++ b/runtime/ftplugin/bicep-params.vim
@@ -1,3 +1,3 @@
" Placeholder for maximum compatibility. While bicepparam files are treated as distinct filetypes,
" they are should share the same ftplugin settings as bicep files.
-runtime! ftplugin/bicep.vim
+runtime! ftplugin/bicep[.]{vim,lua}
diff --git a/runtime/ftplugin/brighterscript.vim b/runtime/ftplugin/brighterscript.vim
index 4fe585aec7..86bdb488b2 100644
--- a/runtime/ftplugin/brighterscript.vim
+++ b/runtime/ftplugin/brighterscript.vim
@@ -8,4 +8,4 @@ if exists('b:did_ftplugin')
endif
let b:did_ftplugin = 1
-runtime! ftplugin/brightscript.vim
+runtime! ftplugin/brightscript[.]{vim,lua}
diff --git a/runtime/ftplugin/btm.vim b/runtime/ftplugin/btm.vim
index 1c2c68599d..7fc51e3051 100644
--- a/runtime/ftplugin/btm.vim
+++ b/runtime/ftplugin/btm.vim
@@ -10,4 +10,4 @@ if exists("b:did_ftplugin")
endif
" Behaves just like dosbatch
-runtime! ftplugin/dosbatch.vim ftplugin/dosbatch_*.vim ftplugin/dosbatch/*.vim
+runtime! ftplugin/dosbatch[.]{vim,lua} ftplugin/dosbatch_*.{vim,lua} ftplugin/dosbatch/*.{vim,lua}
diff --git a/runtime/ftplugin/ch.vim b/runtime/ftplugin/ch.vim
index ed09003b1c..04ed657917 100644
--- a/runtime/ftplugin/ch.vim
+++ b/runtime/ftplugin/ch.vim
@@ -14,4 +14,4 @@ if exists("b:did_ftplugin")
endif
" Behaves just like C
-runtime! ftplugin/c.vim ftplugin/c_*.vim ftplugin/c/*.vim
+runtime! ftplugin/c[.]{vim,lua} ftplugin/c_*.{vim,lua} ftplugin/c/*.{vim,lua}
diff --git a/runtime/ftplugin/config.vim b/runtime/ftplugin/config.vim
index 595fc657b9..db19fed923 100644
--- a/runtime/ftplugin/config.vim
+++ b/runtime/ftplugin/config.vim
@@ -24,7 +24,7 @@ else
endif
let s:match_words = ""
-runtime! ftplugin/sh.vim ftplugin/sh_*.vim ftplugin/sh/*.vim
+runtime! ftplugin/sh[.]{vim,lua} ftplugin/sh_*.{vim,lua} ftplugin/sh/*.{vim,lua}
let b:did_ftplugin = 1
" Override our defaults if these were set by an included ftplugin.
diff --git a/runtime/ftplugin/confini.vim b/runtime/ftplugin/confini.vim
index 310e046353..756a854965 100644
--- a/runtime/ftplugin/confini.vim
+++ b/runtime/ftplugin/confini.vim
@@ -7,4 +7,4 @@ if exists("b:did_ftplugin")
endif
" Use the cfg plugin, it's similar enough.
-runtime! ftplugin/cfg.vim
+runtime! ftplugin/cfg[.]{vim,lua}
diff --git a/runtime/ftplugin/cuda.vim b/runtime/ftplugin/cuda.vim
index 91d722b649..d645c36802 100644
--- a/runtime/ftplugin/cuda.vim
+++ b/runtime/ftplugin/cuda.vim
@@ -8,4 +8,4 @@ if exists('b:did_ftplugin')
endif
" Behaves mostly just like C++
-runtime! ftplugin/cpp.vim
+runtime! ftplugin/cpp[.]{vim,lua}
diff --git a/runtime/ftplugin/dnsmasq.vim b/runtime/ftplugin/dnsmasq.vim
index bf93bf9300..7db0be4ab4 100644
--- a/runtime/ftplugin/dnsmasq.vim
+++ b/runtime/ftplugin/dnsmasq.vim
@@ -8,4 +8,4 @@ if exists('b:did_ftplugin')
endif
" Behaves mostly just like cfg
-runtime! ftplugin/cfg.vim
+runtime! ftplugin/cfg[.]{vim,lua}
diff --git a/runtime/ftplugin/docbk.vim b/runtime/ftplugin/docbk.vim
index cbceb6b305..53ffa42fd9 100644
--- a/runtime/ftplugin/docbk.vim
+++ b/runtime/ftplugin/docbk.vim
@@ -16,9 +16,9 @@ if !exists('b:docbk_type')
endif
if b:docbk_type == 'sgml'
- runtime! ftplugin/sgml.vim ftplugin/sgml_*.vim ftplugin/sgml/*.vim
+ runtime! ftplugin/sgml[.]{vim,lua} ftplugin/sgml_*.{vim,lua} ftplugin/sgml/*.{vim,lua}
else
- runtime! ftplugin/xml.vim ftplugin/xml_*.vim ftplugin/xml/*.vim
+ runtime! ftplugin/xml[.]{vim,lua} ftplugin/xml_*.{vim,lua} ftplugin/xml/*.{vim,lua}
endif
let b:undo_ftplugin = "unlet! b:docbk_type"
diff --git a/runtime/ftplugin/eruby.vim b/runtime/ftplugin/eruby.vim
index b7a24c68c1..577bf0ff6a 100644
--- a/runtime/ftplugin/eruby.vim
+++ b/runtime/ftplugin/eruby.vim
@@ -52,9 +52,9 @@ elseif !exists("b:eruby_subtype")
endif
if exists("b:eruby_subtype") && b:eruby_subtype != '' && b:eruby_subtype !=? 'eruby'
- exe "runtime! ftplugin/".b:eruby_subtype.".vim ftplugin/".b:eruby_subtype."_*.vim ftplugin/".b:eruby_subtype."/*.vim"
+ exe "runtime! ftplugin/".b:eruby_subtype."[.]{vim,lua} ftplugin/".b:eruby_subtype."_*.{vim,lua} ftplugin/".b:eruby_subtype."/*.{vim,lua}"
else
- runtime! ftplugin/html.vim ftplugin/html_*.vim ftplugin/html/*.vim
+ runtime! ftplugin/html[.]{vim,lua} ftplugin/html_*.{vim,lua} ftplugin/html/*.{vim,lua}
endif
unlet! b:did_ftplugin
@@ -87,7 +87,7 @@ let s:include = &l:include
let s:path = &l:path
let s:suffixesadd = &l:suffixesadd
-runtime! ftplugin/ruby.vim ftplugin/ruby_*.vim ftplugin/ruby/*.vim
+runtime! ftplugin/ruby[.]{vim,lua} ftplugin/ruby_*.{vim,lua} ftplugin/ruby/*.{vim,lua}
let b:did_ftplugin = 1
" Combine the new set of values with those previously included.
diff --git a/runtime/ftplugin/expect.vim b/runtime/ftplugin/expect.vim
index b4db154999..7890560280 100644
--- a/runtime/ftplugin/expect.vim
+++ b/runtime/ftplugin/expect.vim
@@ -8,7 +8,7 @@ if exists("b:did_ftplugin")
endif
" Syntax is similar to Tcl
-runtime! ftplugin/tcl.vim
+runtime! ftplugin/tcl[.]{vim,lua}
let s:cpo_save = &cpo
set cpo&vim
diff --git a/runtime/ftplugin/fpcmake.vim b/runtime/ftplugin/fpcmake.vim
index e365ba7801..021dbdf281 100644
--- a/runtime/ftplugin/fpcmake.vim
+++ b/runtime/ftplugin/fpcmake.vim
@@ -10,7 +10,7 @@ endif
let s:cpo_save = &cpo
set cpo&vim
-runtime! ftplugin/make.vim
+runtime! ftplugin/make[.]{vim,lua}
if (has("gui_win32") || has("gui_gtk")) && !exists("b:browsefilter")
let b:browsefilter = "Free Pascal Makefile Definition Files (*.fpc)\t*.fpc\n"
diff --git a/runtime/ftplugin/freebasic.vim b/runtime/ftplugin/freebasic.vim
index 8eadb44c21..589855f891 100644
--- a/runtime/ftplugin/freebasic.vim
+++ b/runtime/ftplugin/freebasic.vim
@@ -11,7 +11,7 @@ endif
let s:cpo_save = &cpo
set cpo&vim
-runtime! ftplugin/basic.vim
+runtime! ftplugin/basic[.]{vim,lua}
let s:dialect = freebasic#GetDialect()
diff --git a/runtime/ftplugin/ghostty.vim b/runtime/ftplugin/ghostty.vim
index 479fd610bd..d54847f018 100644
--- a/runtime/ftplugin/ghostty.vim
+++ b/runtime/ftplugin/ghostty.vim
@@ -7,4 +7,4 @@ if exists("b:did_ftplugin")
endif
" Use the cfg plugin, it's similar enough.
-runtime! ftplugin/cfg.vim
+runtime! ftplugin/cfg[.]{vim,lua}
diff --git a/runtime/ftplugin/gitsendemail.vim b/runtime/ftplugin/gitsendemail.vim
index 8fb436e181..025c061298 100644
--- a/runtime/ftplugin/gitsendemail.vim
+++ b/runtime/ftplugin/gitsendemail.vim
@@ -3,4 +3,4 @@
" Maintainer: Tim Pope
" Last Change: 2009 Dec 24
-runtime! ftplugin/mail.vim
+runtime! ftplugin/mail[.]{vim,lua}
diff --git a/runtime/ftplugin/groff.vim b/runtime/ftplugin/groff.vim
index f628525411..f30f63c29e 100644
--- a/runtime/ftplugin/groff.vim
+++ b/runtime/ftplugin/groff.vim
@@ -10,7 +10,7 @@ endif
let b:nroff_is_groff = 1
-runtime! ftplugin/nroff.vim
+runtime! ftplugin/nroff[.]{vim,lua}
setlocal commentstring=\\#\ %s
setlocal comments=:\\#,:.\\\",:\\\",:'\\\",:'''
diff --git a/runtime/ftplugin/haml.vim b/runtime/ftplugin/haml.vim
index 910d9c78b3..dcbc6823dc 100644
--- a/runtime/ftplugin/haml.vim
+++ b/runtime/ftplugin/haml.vim
@@ -21,7 +21,7 @@ else
endif
let s:match_words = ""
-runtime! ftplugin/html.vim ftplugin/html_*.vim ftplugin/html/*.vim
+runtime! ftplugin/html[.]{vim,lua} ftplugin/html_*.{vim,lua} ftplugin/html/*.{vim,lua}
unlet! b:did_ftplugin
set matchpairs-=<:>
@@ -39,7 +39,7 @@ if exists("b:match_words")
unlet b:match_words
endif
-runtime! ftplugin/ruby.vim ftplugin/ruby_*.vim ftplugin/ruby/*.vim
+runtime! ftplugin/ruby[.]{vim,lua} ftplugin/ruby_*.{vim,lua} ftplugin/ruby/*.{vim,lua}
let b:did_ftplugin = 1
let &l:define .= empty(&l:define ? '' : '\|') . '^\s*\%(%\w*\)\=\%(\.[[:alnum:]_-]\+\)*#'
diff --git a/runtime/ftplugin/hcl.vim b/runtime/ftplugin/hcl.vim
index 57578c0e17..b1282d09e0 100644
--- a/runtime/ftplugin/hcl.vim
+++ b/runtime/ftplugin/hcl.vim
@@ -7,4 +7,4 @@ if exists('b:did_ftplugin')
finish
endif
-runtime! ftplugin/terraform.vim
+runtime! ftplugin/terraform[.]{vim,lua}
diff --git a/runtime/ftplugin/htmlangular.vim b/runtime/ftplugin/htmlangular.vim
index b114372442..b9cd9d5d8c 100644
--- a/runtime/ftplugin/htmlangular.vim
+++ b/runtime/ftplugin/htmlangular.vim
@@ -9,4 +9,4 @@ if exists("b:did_ftplugin")
endif
" source the HTML ftplugin
-runtime! ftplugin/html.vim
+runtime! ftplugin/html[.]{vim,lua}
diff --git a/runtime/ftplugin/htmldjango.vim b/runtime/ftplugin/htmldjango.vim
index 40e9429f36..40a8bd7afa 100644
--- a/runtime/ftplugin/htmldjango.vim
+++ b/runtime/ftplugin/htmldjango.vim
@@ -9,5 +9,5 @@ if exists("b:did_ftplugin")
endif
" Use HTML and Django template ftplugins.
-runtime! ftplugin/html.vim
-runtime! ftplugin/django.vim
+runtime! ftplugin/html[.]{vim,lua}
+runtime! ftplugin/django[.]{vim,lua}
diff --git a/runtime/ftplugin/javascriptreact.vim b/runtime/ftplugin/javascriptreact.vim
index b9c39d5e68..d8f130b4c4 100644
--- a/runtime/ftplugin/javascriptreact.vim
+++ b/runtime/ftplugin/javascriptreact.vim
@@ -4,4 +4,4 @@
" Last Change: 2020 Aug 19
" Placeholder for backwards compatilibity: .jsx used to stand for JavaScript.
-runtime! ftplugin/javascript.vim
+runtime! ftplugin/javascript[.]{vim,lua}
diff --git a/runtime/ftplugin/jsonc.vim b/runtime/ftplugin/jsonc.vim
index ec3268492c..4299475e1e 100644
--- a/runtime/ftplugin/jsonc.vim
+++ b/runtime/ftplugin/jsonc.vim
@@ -7,7 +7,7 @@
" Last Change: 2021 Nov 22
" 2024 May 23 by Riley Bruins ('commentstring')
-runtime! ftplugin/json.vim
+runtime! ftplugin/json[.]{vim,lua}
if exists('b:did_ftplugin_jsonc')
finish
diff --git a/runtime/ftplugin/jsp.vim b/runtime/ftplugin/jsp.vim
index cc7023279a..d5bb62bad6 100644
--- a/runtime/ftplugin/jsp.vim
+++ b/runtime/ftplugin/jsp.vim
@@ -25,7 +25,7 @@ else
endif
let s:match_words = ""
-runtime! ftplugin/html.vim ftplugin/html_*.vim ftplugin/html/*.vim
+runtime! ftplugin/html[.]{vim,lua} ftplugin/html_*.{vim,lua} ftplugin/html/*.{vim,lua}
unlet b:did_ftplugin
" Override our defaults if these were set by an included ftplugin.
@@ -42,7 +42,7 @@ if exists("b:match_words")
unlet b:match_words
endif
-runtime! ftplugin/java.vim ftplugin/java_*.vim ftplugin/java/*.vim
+runtime! ftplugin/java[.]{vim,lua} ftplugin/java_*.{vim,lua} ftplugin/java/*.{vim,lua}
let b:did_ftplugin = 1
" Combine the new set of values with those previously included.
diff --git a/runtime/ftplugin/kwt.vim b/runtime/ftplugin/kwt.vim
index b37c7fa3a3..e80c88606d 100644
--- a/runtime/ftplugin/kwt.vim
+++ b/runtime/ftplugin/kwt.vim
@@ -5,7 +5,7 @@
" 2024 Jan 14 by Vim Project (browsefilter)
" Behaves almost like C++
-runtime! ftplugin/cpp.vim ftplugin/cpp_*.vim ftplugin/cpp/*.vim
+runtime! ftplugin/cpp[.]{vim,lua} ftplugin/cpp_*.{vim,lua} ftplugin/cpp/*.{vim,lua}
let s:cpo_save = &cpo
set cpo&vim
diff --git a/runtime/ftplugin/leex.vim b/runtime/ftplugin/leex.vim
index 1d5ce06ff2..6d9d627e62 100644
--- a/runtime/ftplugin/leex.vim
+++ b/runtime/ftplugin/leex.vim
@@ -11,4 +11,4 @@ if exists('b:did_ftplugin')
finish
endif
-runtime! ftplugin/erlang.vim
+runtime! ftplugin/erlang[.]{vim,lua}
diff --git a/runtime/ftplugin/liquid.vim b/runtime/ftplugin/liquid.vim
index dbd8abe457..4ad8ccf151 100644
--- a/runtime/ftplugin/liquid.vim
+++ b/runtime/ftplugin/liquid.vim
@@ -27,9 +27,9 @@ if !exists('b:liquid_subtype')
endif
if exists('b:liquid_subtype') && b:liquid_subtype != ''
- exe 'runtime! ftplugin/'.b:liquid_subtype.'.vim ftplugin/'.b:liquid_subtype.'_*.vim ftplugin/'.b:liquid_subtype.'/*.vim'
+ exe 'runtime! ftplugin/'.b:liquid_subtype.'[.]{vim,lua} ftplugin/'.b:liquid_subtype.'_*.{vim,lua} ftplugin/'.b:liquid_subtype.'/*.{vim,lua}'
else
- runtime! ftplugin/html.vim ftplugin/html_*.vim ftplugin/html/*.vim
+ runtime! ftplugin/html[.]{vim,lua} ftplugin/html_*.{vim,lua} ftplugin/html/*.{vim,lua}
endif
let b:did_ftplugin = 1
diff --git a/runtime/ftplugin/livebook.vim b/runtime/ftplugin/livebook.vim
index c97d210412..37ea81cba3 100644
--- a/runtime/ftplugin/livebook.vim
+++ b/runtime/ftplugin/livebook.vim
@@ -6,4 +6,4 @@ if exists("b:did_ftplugin")
finish
endif
-runtime! ftplugin/markdown.vim ftplugin/markdown_*.vim ftplugin/markdown/*.vim
+runtime! ftplugin/markdown[.]{vim,lua} ftplugin/markdown_*.{vim,lua} ftplugin/markdown/*.{vim,lua}
diff --git a/runtime/ftplugin/m3build.vim b/runtime/ftplugin/m3build.vim
index 71960cec6d..fd95352d99 100644
--- a/runtime/ftplugin/m3build.vim
+++ b/runtime/ftplugin/m3build.vim
@@ -10,7 +10,7 @@ endif
let s:cpo_save = &cpo
set cpo&vim
-runtime! ftplugin/m3quake.vim
+runtime! ftplugin/m3quake[.]{vim,lua}
if (has("gui_win32") || has("gui_gtk")) && exists("b:m3quake_set_browsefilter")
let b:browsefilter = "Modula-3 Makefile (m3makefile, m3overrides)\tm3makefile;m3overrides\n"
diff --git a/runtime/ftplugin/markdown.vim b/runtime/ftplugin/markdown.vim
index c8f9d57fd5..ad5b8b7cc9 100644
--- a/runtime/ftplugin/markdown.vim
+++ b/runtime/ftplugin/markdown.vim
@@ -9,7 +9,7 @@ if exists("b:did_ftplugin")
finish
endif
-runtime! ftplugin/html.vim ftplugin/html_*.vim ftplugin/html/*.vim
+runtime! ftplugin/html[.]{vim,lua} ftplugin/html_*.{vim,lua} ftplugin/html/*.{vim,lua}
let s:keepcpo= &cpo
set cpo&vim
diff --git a/runtime/ftplugin/objc.vim b/runtime/ftplugin/objc.vim
index d129b33c1c..32ba4afcd6 100644
--- a/runtime/ftplugin/objc.vim
+++ b/runtime/ftplugin/objc.vim
@@ -10,4 +10,4 @@ if exists("b:did_ftplugin")
endif
" Behaves just like C
-runtime! ftplugin/c.vim ftplugin/c_*.vim ftplugin/c/*.vim
+runtime! ftplugin/c[.]{vim,lua} ftplugin/c_*.{vim,lua} ftplugin/c/*.{vim,lua}
diff --git a/runtime/ftplugin/objcpp.vim b/runtime/ftplugin/objcpp.vim
index ffba685c7d..eb763d6423 100644
--- a/runtime/ftplugin/objcpp.vim
+++ b/runtime/ftplugin/objcpp.vim
@@ -1 +1 @@
-runtime! ftplugin/objc.vim
+runtime! ftplugin/objc[.]{vim,lua}
diff --git a/runtime/ftplugin/php.vim b/runtime/ftplugin/php.vim
index e124961ba1..b984ad4a9f 100644
--- a/runtime/ftplugin/php.vim
+++ b/runtime/ftplugin/php.vim
@@ -24,7 +24,7 @@ else
endif
let s:match_words = ""
-runtime! ftplugin/html.vim ftplugin/html_*.vim ftplugin/html/*.vim
+runtime! ftplugin/html[.]{vim,lua} ftplugin/html_*.{vim,lua} ftplugin/html/*.{vim,lua}
let b:did_ftplugin = 1
" Override our defaults if these were set by an included ftplugin.
diff --git a/runtime/ftplugin/pyrex.vim b/runtime/ftplugin/pyrex.vim
index ec254761ec..446c38892f 100644
--- a/runtime/ftplugin/pyrex.vim
+++ b/runtime/ftplugin/pyrex.vim
@@ -13,7 +13,7 @@ let s:keepcpo= &cpo
set cpo&vim
" Behaves just like Python
-runtime! ftplugin/python.vim ftplugin/python_*.vim ftplugin/python/*.vim
+runtime! ftplugin/python[.]{vim,lua} ftplugin/python_*.{vim,lua} ftplugin/python/*.{vim,lua}
if (has("gui_win32") || has("gui_gtk")) && !exists("b:browsefilter")
let b:browsefilter = "Pyrex files (*.pyx, *.pxd)\t*.pyx;*.pxd\n" .
diff --git a/runtime/ftplugin/qb64.vim b/runtime/ftplugin/qb64.vim
index 0fa36fc3d2..db909e7946 100644
--- a/runtime/ftplugin/qb64.vim
+++ b/runtime/ftplugin/qb64.vim
@@ -9,7 +9,7 @@ endif
let s:cpo_save = &cpo
set cpo&vim
-runtime! ftplugin/basic.vim
+runtime! ftplugin/basic[.]{vim,lua}
let s:not_end = '\%(end\s\+\)\@
diff --git a/runtime/ftplugin/rnoweb.vim b/runtime/ftplugin/rnoweb.vim
index 8dfdf1e80f..f798df3694 100644
--- a/runtime/ftplugin/rnoweb.vim
+++ b/runtime/ftplugin/rnoweb.vim
@@ -13,7 +13,7 @@ endif
let s:cpo_save = &cpo
set cpo&vim
-runtime! ftplugin/tex.vim
+runtime! ftplugin/tex[.]{vim,lua}
" Don't load another plugin for this buffer
let b:did_ftplugin = 1
diff --git a/runtime/ftplugin/sbt.vim b/runtime/ftplugin/sbt.vim
index bf2c7a657a..9247fd58b2 100644
--- a/runtime/ftplugin/sbt.vim
+++ b/runtime/ftplugin/sbt.vim
@@ -9,6 +9,6 @@ if exists('b:did_ftplugin') || &cp
finish
endif
-runtime! ftplugin/scala.vim
+runtime! ftplugin/scala[.]{vim,lua}
let b:did_ftplugin = 1
diff --git a/runtime/ftplugin/scheme.vim b/runtime/ftplugin/scheme.vim
index 63e578199d..b549f76ca3 100644
--- a/runtime/ftplugin/scheme.vim
+++ b/runtime/ftplugin/scheme.vim
@@ -52,7 +52,7 @@ let b:undo_ftplugin = b:undo_ftplugin . ' lispwords<'
let b:did_scheme_ftplugin = 1
if exists('b:is_chicken') || exists('g:is_chicken')
- runtime! ftplugin/chicken.vim
+ runtime! ftplugin/chicken[.]{vim,lua}
endif
unlet b:did_scheme_ftplugin
diff --git a/runtime/ftplugin/scss.vim b/runtime/ftplugin/scss.vim
index 287d298f4a..3b38ca34a8 100644
--- a/runtime/ftplugin/scss.vim
+++ b/runtime/ftplugin/scss.vim
@@ -7,7 +7,7 @@ if exists("b:did_ftplugin")
finish
endif
-runtime! ftplugin/sass.vim
+runtime! ftplugin/sass[.]{vim,lua}
setlocal comments=s1:/*,mb:*,ex:*/,://
" vim:set sw=2:
diff --git a/runtime/ftplugin/sgml.vim b/runtime/ftplugin/sgml.vim
index b6dbf1a0d1..8bfd1ec735 100644
--- a/runtime/ftplugin/sgml.vim
+++ b/runtime/ftplugin/sgml.vim
@@ -23,7 +23,7 @@ else
let s:browsefilter .= "All Files (*)\t*\n"
endif
-runtime! ftplugin/xml.vim ftplugin/xml_*.vim ftplugin/xml/*.vim
+runtime! ftplugin/xml[.]{vim,lua} ftplugin/xml_*.{vim,lua} ftplugin/xml/*.{vim,lua}
let b:did_ftplugin = 1
" Override our defaults if these were set by an included ftplugin.
diff --git a/runtime/ftplugin/sshdconfig.vim b/runtime/ftplugin/sshdconfig.vim
index 3d394549bc..d10bfbb260 100644
--- a/runtime/ftplugin/sshdconfig.vim
+++ b/runtime/ftplugin/sshdconfig.vim
@@ -7,4 +7,4 @@ if exists("b:did_ftplugin")
finish
endif
-runtime! ftplugin/conf.vim
+runtime! ftplugin/conf[.]{vim,lua}
diff --git a/runtime/ftplugin/stylus.vim b/runtime/ftplugin/stylus.vim
index 1c5f14eebe..d1b1c943ec 100644
--- a/runtime/ftplugin/stylus.vim
+++ b/runtime/ftplugin/stylus.vim
@@ -15,7 +15,7 @@ set cpo-=C
let s:undo_ftplugin = ""
let s:browsefilter = "All Files (*.*)\t*.*\n"
-runtime! ftplugin/html.vim ftplugin/html_*.vim ftplugin/html/*.vim
+runtime! ftplugin/html[.]{vim,lua} ftplugin/html_*.{vim,lua} ftplugin/html/*.{vim,lua}
unlet! b:did_ftplugin
" Override our defaults if these were set by an included ftplugin.
diff --git a/runtime/ftplugin/svg.vim b/runtime/ftplugin/svg.vim
index 4ee9e4b77b..b001ff48b6 100644
--- a/runtime/ftplugin/svg.vim
+++ b/runtime/ftplugin/svg.vim
@@ -23,7 +23,7 @@ else
let s:browsefilter .= "All Files (*)\t*\n"
endif
-runtime! ftplugin/xml.vim ftplugin/xml_*.vim ftplugin/xml/*.vim
+runtime! ftplugin/xml[.]{vim,lua} ftplugin/xml_*.{vim,lua} ftplugin/xml/*.{vim,lua}
let b:did_ftplugin = 1
" Override our defaults if these were set by an included ftplugin.
diff --git a/runtime/ftplugin/swiftgyb.vim b/runtime/ftplugin/swiftgyb.vim
index 8e8fc2b791..c1552c14f7 100644
--- a/runtime/ftplugin/swiftgyb.vim
+++ b/runtime/ftplugin/swiftgyb.vim
@@ -8,4 +8,4 @@
"
" Vim maintainer: Emir SARI
-runtime! ftplugin/swift.vim
+runtime! ftplugin/swift[.]{vim,lua}
diff --git a/runtime/ftplugin/sysml.vim b/runtime/ftplugin/sysml.vim
index d4cdb31811..2711fe31cc 100644
--- a/runtime/ftplugin/sysml.vim
+++ b/runtime/ftplugin/sysml.vim
@@ -9,4 +9,4 @@ if exists("b:did_ftplugin")
endif
" Behaves mostly just like KerML, only differs by keywords
-runtime! ftplugin/kerml.vim
+runtime! ftplugin/kerml[.]{vim,lua}
diff --git a/runtime/ftplugin/systemd.vim b/runtime/ftplugin/systemd.vim
index 1b1d242029..66a8f20e44 100644
--- a/runtime/ftplugin/systemd.vim
+++ b/runtime/ftplugin/systemd.vim
@@ -7,7 +7,7 @@ if exists("b:did_ftplugin")
finish
endif
" Looks a lot like dosini files.
-runtime! ftplugin/dosini.vim
+runtime! ftplugin/dosini[.]{vim,lua}
if has('unix') && executable('less') && exists(':terminal') == 2
command! -buffer -nargs=1 SystemdKeywordPrg silent exe 'term ++close ' KeywordLookup_systemd()
diff --git a/runtime/ftplugin/systemverilog.vim b/runtime/ftplugin/systemverilog.vim
index 145e115426..b0c7e2ec6b 100644
--- a/runtime/ftplugin/systemverilog.vim
+++ b/runtime/ftplugin/systemverilog.vim
@@ -9,7 +9,7 @@ if exists("b:did_ftplugin")
endif
" Behaves just like Verilog
-runtime! ftplugin/verilog.vim
+runtime! ftplugin/verilog[.]{vim,lua}
let s:cpo_save = &cpo
set cpo&vim
diff --git a/runtime/ftplugin/tcsh.vim b/runtime/ftplugin/tcsh.vim
index 74095aabe2..15b10ba811 100644
--- a/runtime/ftplugin/tcsh.vim
+++ b/runtime/ftplugin/tcsh.vim
@@ -20,7 +20,7 @@ else
let s:browsefilter ..= "All Files (*)\t*\n"
endif
-runtime! ftplugin/csh.vim ftplugin/csh_*.vim ftplugin/csh/*.vim
+runtime! ftplugin/csh[.]{vim,lua} ftplugin/csh_*.{vim,lua} ftplugin/csh/*.{vim,lua}
let b:did_ftplugin = 1
" Override our defaults if these were set by an included ftplugin.
diff --git a/runtime/ftplugin/tt2html.vim b/runtime/ftplugin/tt2html.vim
index 195a232e07..7914c44f4f 100644
--- a/runtime/ftplugin/tt2html.vim
+++ b/runtime/ftplugin/tt2html.vim
@@ -12,4 +12,4 @@ if exists("b:did_ftplugin")
endif
" Just use the HTML plugin for now.
-runtime! ftplugin/html.vim ftplugin/html_*.vim ftplugin/html/*.vim
+runtime! ftplugin/html[.]{vim,lua} ftplugin/html_*.{vim,lua} ftplugin/html/*.{vim,lua}
diff --git a/runtime/ftplugin/typescriptreact.vim b/runtime/ftplugin/typescriptreact.vim
index 3bd6001a18..d5373bd705 100644
--- a/runtime/ftplugin/typescriptreact.vim
+++ b/runtime/ftplugin/typescriptreact.vim
@@ -6,7 +6,7 @@
let s:match_words = ""
let s:undo_ftplugin = ""
-runtime! ftplugin/typescript.vim
+runtime! ftplugin/typescript[.]{vim,lua}
let s:cpo_save = &cpo
set cpo-=C
diff --git a/runtime/ftplugin/xhtml.vim b/runtime/ftplugin/xhtml.vim
index 8a45ba76b1..1db99cf269 100644
--- a/runtime/ftplugin/xhtml.vim
+++ b/runtime/ftplugin/xhtml.vim
@@ -25,7 +25,7 @@ else
endif
let s:match_words = ""
-runtime! ftplugin/xml.vim ftplugin/xml_*.vim ftplugin/xml/*.vim
+runtime! ftplugin/xml[.]{vim,lua} ftplugin/xml_*.{vim,lua} ftplugin/xml/*.{vim,lua}
unlet b:did_ftplugin
" Override our defaults if these were set by an included ftplugin.
@@ -42,7 +42,7 @@ if exists("b:match_words")
unlet b:match_words
endif
-runtime! ftplugin/html.vim ftplugin/html_*.vim ftplugin/html/*.vim
+runtime! ftplugin/html[.]{vim,lua} ftplugin/html_*.{vim,lua} ftplugin/html/*.{vim,lua}
let b:did_ftplugin = 1
" Combine the new set of values with those previously included.
diff --git a/runtime/ftplugin/xs.vim b/runtime/ftplugin/xs.vim
index d51c411298..49448d208a 100644
--- a/runtime/ftplugin/xs.vim
+++ b/runtime/ftplugin/xs.vim
@@ -12,4 +12,4 @@ if exists("b:did_ftplugin")
endif
" Just use the C plugin for now.
-runtime! ftplugin/c.vim ftplugin/c_*.vim ftplugin/c/*.vim
+runtime! ftplugin/c[.]{vim,lua} ftplugin/c_*.{vim,lua} ftplugin/c/*.{vim,lua}
diff --git a/runtime/ftplugin/xsd.vim b/runtime/ftplugin/xsd.vim
index aaec8a0f7d..eedc1fbdb6 100644
--- a/runtime/ftplugin/xsd.vim
+++ b/runtime/ftplugin/xsd.vim
@@ -23,7 +23,7 @@ else
let s:browsefilter .= "All Files (*)\t*\n"
endif
-runtime! ftplugin/xml.vim ftplugin/xml_*.vim ftplugin/xml/*.vim
+runtime! ftplugin/xml[.]{vim,lua} ftplugin/xml_*.{vim,lua} ftplugin/xml/*.{vim,lua}
let b:did_ftplugin = 1
" Override our defaults if these were set by an included ftplugin.
diff --git a/runtime/ftplugin/xslt.vim b/runtime/ftplugin/xslt.vim
index 70986c9e48..8b42724e31 100644
--- a/runtime/ftplugin/xslt.vim
+++ b/runtime/ftplugin/xslt.vim
@@ -8,7 +8,7 @@ if exists("b:did_ftplugin")
finish
endif
-runtime! ftplugin/xml.vim ftplugin/xml_*.vim ftplugin/xml/*.vim
+runtime! ftplugin/xml[.]{vim,lua} ftplugin/xml_*.{vim,lua} ftplugin/xml/*.{vim,lua}
let b:did_ftplugin = 1
diff --git a/test/functional/editor/runtime_spec.lua b/test/functional/editor/runtime_spec.lua
index c3c2055f45..a3a34df544 100644
--- a/test/functional/editor/runtime_spec.lua
+++ b/test/functional/editor/runtime_spec.lua
@@ -235,6 +235,18 @@ describe('runtime:', function()
exec('setfiletype new-ft')
eq('ABCDEFabcdef', eval('g:seq'))
end)
+
+ it('inherited Vimscript ftplugins load bundled Lua ftplugins', function()
+ exec('setfiletype objc')
+ eq(1, eval([[b:undo_ftplugin =~# 'path<']]))
+ end)
+
+ it('inherited Vimscript ftplugins load user Lua ftplugins', function()
+ mkdir_p(ftplugin_folder)
+ write_file(('%s/mail.lua'):format(ftplugin_folder), [[vim.b.mail_lua = 1]])
+ exec('setfiletype gitsendemail')
+ eq(1, eval([[get(b:, 'mail_lua', 0)]]))
+ end)
end)
describe('indent', function()