summaryrefslogtreecommitdiff
path: root/mnv/runtime/ftplugin
diff options
context:
space:
mode:
Diffstat (limited to 'mnv/runtime/ftplugin')
-rw-r--r--mnv/runtime/ftplugin/8th.mnv27
-rw-r--r--mnv/runtime/ftplugin/README.txt24
-rw-r--r--mnv/runtime/ftplugin/a2ps.mnv20
-rw-r--r--mnv/runtime/ftplugin/aap.mnv38
-rw-r--r--mnv/runtime/ftplugin/abap.mnv41
-rw-r--r--mnv/runtime/ftplugin/abaqus.mnv124
-rw-r--r--mnv/runtime/ftplugin/abnf.mnv17
-rw-r--r--mnv/runtime/ftplugin/ada.mnv221
-rw-r--r--mnv/runtime/ftplugin/alsaconf.mnv19
-rw-r--r--mnv/runtime/ftplugin/ant.mnv51
-rw-r--r--mnv/runtime/ftplugin/antlr4.mnv14
-rw-r--r--mnv/runtime/ftplugin/apache.mnv16
-rw-r--r--mnv/runtime/ftplugin/arch.mnv19
-rw-r--r--mnv/runtime/ftplugin/arduino.mnv67
-rw-r--r--mnv/runtime/ftplugin/art.mnv18
-rw-r--r--mnv/runtime/ftplugin/asciidoc.mnv68
-rw-r--r--mnv/runtime/ftplugin/asm.mnv25
-rw-r--r--mnv/runtime/ftplugin/aspvbs.mnv67
-rw-r--r--mnv/runtime/ftplugin/astro.mnv192
-rw-r--r--mnv/runtime/ftplugin/asy.mnv14
-rw-r--r--mnv/runtime/ftplugin/autohotkey.mnv16
-rw-r--r--mnv/runtime/ftplugin/automake.mnv16
-rw-r--r--mnv/runtime/ftplugin/autopkgtest.mnv17
-rw-r--r--mnv/runtime/ftplugin/awk.mnv63
-rw-r--r--mnv/runtime/ftplugin/bash.mnv20
-rw-r--r--mnv/runtime/ftplugin/basic.mnv61
-rw-r--r--mnv/runtime/ftplugin/bdf.mnv20
-rw-r--r--mnv/runtime/ftplugin/bicep-params.mnv3
-rw-r--r--mnv/runtime/ftplugin/bicep.mnv14
-rw-r--r--mnv/runtime/ftplugin/bindzone.mnv16
-rw-r--r--mnv/runtime/ftplugin/bitbake.mnv17
-rw-r--r--mnv/runtime/ftplugin/bp.mnv14
-rw-r--r--mnv/runtime/ftplugin/bpftrace.mnv16
-rw-r--r--mnv/runtime/ftplugin/brighterscript.mnv11
-rw-r--r--mnv/runtime/ftplugin/brightscript.mnv13
-rw-r--r--mnv/runtime/ftplugin/bst.mnv15
-rw-r--r--mnv/runtime/ftplugin/btm.mnv13
-rw-r--r--mnv/runtime/ftplugin/bzl.mnv101
-rw-r--r--mnv/runtime/ftplugin/c.mnv93
-rw-r--r--mnv/runtime/ftplugin/c3.mnv14
-rw-r--r--mnv/runtime/ftplugin/cabal.mnv18
-rw-r--r--mnv/runtime/ftplugin/calendar.mnv21
-rw-r--r--mnv/runtime/ftplugin/cdrdaoconf.mnv18
-rw-r--r--mnv/runtime/ftplugin/cedar.mnv13
-rw-r--r--mnv/runtime/ftplugin/cfg.mnv19
-rw-r--r--mnv/runtime/ftplugin/cgdbrc.mnv22
-rw-r--r--mnv/runtime/ftplugin/ch.mnv17
-rw-r--r--mnv/runtime/ftplugin/changelog.mnv313
-rw-r--r--mnv/runtime/ftplugin/chatito.mnv15
-rw-r--r--mnv/runtime/ftplugin/chicken.mnv55
-rw-r--r--mnv/runtime/ftplugin/clojure.mnv85
-rw-r--r--mnv/runtime/ftplugin/cmake.mnv37
-rw-r--r--mnv/runtime/ftplugin/cmakecache.mnv13
-rw-r--r--mnv/runtime/ftplugin/cobol.mnv274
-rw-r--r--mnv/runtime/ftplugin/codeowners.mnv14
-rw-r--r--mnv/runtime/ftplugin/conf.mnv19
-rw-r--r--mnv/runtime/ftplugin/config.mnv49
-rw-r--r--mnv/runtime/ftplugin/confini.mnv10
-rw-r--r--mnv/runtime/ftplugin/context.mnv117
-rw-r--r--mnv/runtime/ftplugin/cook.mnv13
-rw-r--r--mnv/runtime/ftplugin/corn.mnv18
-rw-r--r--mnv/runtime/ftplugin/cpp.mnv22
-rw-r--r--mnv/runtime/ftplugin/crm.mnv19
-rw-r--r--mnv/runtime/ftplugin/crontab.mnv16
-rw-r--r--mnv/runtime/ftplugin/cs.mnv51
-rw-r--r--mnv/runtime/ftplugin/csc.mnv29
-rw-r--r--mnv/runtime/ftplugin/csh.mnv82
-rw-r--r--mnv/runtime/ftplugin/css.mnv26
-rw-r--r--mnv/runtime/ftplugin/csv.mnv23
-rw-r--r--mnv/runtime/ftplugin/cucumber.mnv150
-rw-r--r--mnv/runtime/ftplugin/cuda.mnv11
-rw-r--r--mnv/runtime/ftplugin/cvsrc.mnv19
-rw-r--r--mnv/runtime/ftplugin/dart.mnv15
-rw-r--r--mnv/runtime/ftplugin/dax.mnv16
-rw-r--r--mnv/runtime/ftplugin/deb822sources.mnv16
-rw-r--r--mnv/runtime/ftplugin/debchangelog.mnv394
-rw-r--r--mnv/runtime/ftplugin/debcontrol.mnv73
-rw-r--r--mnv/runtime/ftplugin/debsources.mnv16
-rw-r--r--mnv/runtime/ftplugin/denyhosts.mnv18
-rw-r--r--mnv/runtime/ftplugin/desktop.mnv14
-rw-r--r--mnv/runtime/ftplugin/dictconf.mnv19
-rw-r--r--mnv/runtime/ftplugin/dictdconf.mnv19
-rw-r--r--mnv/runtime/ftplugin/diff.mnv29
-rw-r--r--mnv/runtime/ftplugin/dircolors.mnv19
-rw-r--r--mnv/runtime/ftplugin/dnsmasq.mnv11
-rw-r--r--mnv/runtime/ftplugin/docbk.mnv24
-rw-r--r--mnv/runtime/ftplugin/dockerfile.mnv17
-rw-r--r--mnv/runtime/ftplugin/dosbatch.mnv54
-rw-r--r--mnv/runtime/ftplugin/dosini.mnv20
-rw-r--r--mnv/runtime/ftplugin/dtd.mnv48
-rw-r--r--mnv/runtime/ftplugin/dtrace.mnv41
-rw-r--r--mnv/runtime/ftplugin/dts.mnv17
-rw-r--r--mnv/runtime/ftplugin/dune.mnv24
-rw-r--r--mnv/runtime/ftplugin/editorconfig.mnv15
-rw-r--r--mnv/runtime/ftplugin/eiffel.mnv100
-rw-r--r--mnv/runtime/ftplugin/elinks.mnv19
-rw-r--r--mnv/runtime/ftplugin/elixir.mnv39
-rw-r--r--mnv/runtime/ftplugin/elm.mnv20
-rw-r--r--mnv/runtime/ftplugin/env.mnv19
-rw-r--r--mnv/runtime/ftplugin/erlang.mnv120
-rw-r--r--mnv/runtime/ftplugin/eruby.mnv141
-rw-r--r--mnv/runtime/ftplugin/eterm.mnv20
-rw-r--r--mnv/runtime/ftplugin/expect.mnv28
-rw-r--r--mnv/runtime/ftplugin/exports.mnv14
-rw-r--r--mnv/runtime/ftplugin/falcon.mnv54
-rw-r--r--mnv/runtime/ftplugin/fennel.mnv19
-rw-r--r--mnv/runtime/ftplugin/fetchmail.mnv16
-rw-r--r--mnv/runtime/ftplugin/fga.mnv13
-rw-r--r--mnv/runtime/ftplugin/fish.mnv41
-rw-r--r--mnv/runtime/ftplugin/flexwiki.mnv59
-rw-r--r--mnv/runtime/ftplugin/forth.mnv77
-rw-r--r--mnv/runtime/ftplugin/fortran.mnv155
-rw-r--r--mnv/runtime/ftplugin/fpcmake.mnv29
-rw-r--r--mnv/runtime/ftplugin/framescript.mnv30
-rw-r--r--mnv/runtime/ftplugin/freebasic.mnv85
-rw-r--r--mnv/runtime/ftplugin/fstab.mnv30
-rw-r--r--mnv/runtime/ftplugin/fvwm.mnv14
-rw-r--r--mnv/runtime/ftplugin/gdb.mnv54
-rw-r--r--mnv/runtime/ftplugin/gdscript.mnv65
-rw-r--r--mnv/runtime/ftplugin/gdshader.mnv16
-rw-r--r--mnv/runtime/ftplugin/gel.mnv13
-rw-r--r--mnv/runtime/ftplugin/git.mnv15
-rw-r--r--mnv/runtime/ftplugin/gitattributes.mnv13
-rw-r--r--mnv/runtime/ftplugin/gitcommit.mnv60
-rw-r--r--mnv/runtime/ftplugin/gitconfig.mnv15
-rw-r--r--mnv/runtime/ftplugin/gitignore.mnv13
-rw-r--r--mnv/runtime/ftplugin/gitrebase.mnv45
-rw-r--r--mnv/runtime/ftplugin/gitsendemail.mnv6
-rw-r--r--mnv/runtime/ftplugin/gleam.mnv33
-rw-r--r--mnv/runtime/ftplugin/go.mnv86
-rw-r--r--mnv/runtime/ftplugin/goaccess.mnv14
-rw-r--r--mnv/runtime/ftplugin/gomod.mnv16
-rw-r--r--mnv/runtime/ftplugin/gpg.mnv29
-rw-r--r--mnv/runtime/ftplugin/gprof.mnv36
-rw-r--r--mnv/runtime/ftplugin/graphql.mnv22
-rw-r--r--mnv/runtime/ftplugin/groff.mnv19
-rw-r--r--mnv/runtime/ftplugin/groovy.mnv20
-rw-r--r--mnv/runtime/ftplugin/group.mnv19
-rw-r--r--mnv/runtime/ftplugin/grub.mnv19
-rw-r--r--mnv/runtime/ftplugin/gyp.mnv14
-rw-r--r--mnv/runtime/ftplugin/haml.mnv76
-rw-r--r--mnv/runtime/ftplugin/hamster.mnv67
-rw-r--r--mnv/runtime/ftplugin/hare.mnv51
-rw-r--r--mnv/runtime/ftplugin/haredoc.mnv50
-rw-r--r--mnv/runtime/ftplugin/haskell.mnv32
-rw-r--r--mnv/runtime/ftplugin/hcl.mnv10
-rw-r--r--mnv/runtime/ftplugin/heex.mnv34
-rw-r--r--mnv/runtime/ftplugin/help.mnv47
-rw-r--r--mnv/runtime/ftplugin/hgcommit.mnv20
-rw-r--r--mnv/runtime/ftplugin/hlsplaylist.mnv37
-rw-r--r--mnv/runtime/ftplugin/hog.mnv40
-rw-r--r--mnv/runtime/ftplugin/hostconf.mnv18
-rw-r--r--mnv/runtime/ftplugin/hostsaccess.mnv19
-rw-r--r--mnv/runtime/ftplugin/html.mnv111
-rw-r--r--mnv/runtime/ftplugin/htmlangular.mnv12
-rw-r--r--mnv/runtime/ftplugin/htmldjango.mnv13
-rw-r--r--mnv/runtime/ftplugin/http.mnv13
-rw-r--r--mnv/runtime/ftplugin/hurl.mnv11
-rw-r--r--mnv/runtime/ftplugin/hyprlang.mnv13
-rw-r--r--mnv/runtime/ftplugin/i3config.mnv13
-rw-r--r--mnv/runtime/ftplugin/icon.mnv40
-rw-r--r--mnv/runtime/ftplugin/idris2.mnv34
-rw-r--r--mnv/runtime/ftplugin/indent.mnv22
-rw-r--r--mnv/runtime/ftplugin/initex.mnv40
-rw-r--r--mnv/runtime/ftplugin/ipkg.mnv19
-rw-r--r--mnv/runtime/ftplugin/ishd.mnv45
-rw-r--r--mnv/runtime/ftplugin/j.mnv88
-rw-r--r--mnv/runtime/ftplugin/java.mnv418
-rw-r--r--mnv/runtime/ftplugin/javacc.mnv20
-rw-r--r--mnv/runtime/ftplugin/javascript.mnv80
-rw-r--r--mnv/runtime/ftplugin/javascriptreact.mnv7
-rw-r--r--mnv/runtime/ftplugin/jjdescription.mnv19
-rw-r--r--mnv/runtime/ftplugin/jproperties.mnv15
-rw-r--r--mnv/runtime/ftplugin/jq.mnv23
-rw-r--r--mnv/runtime/ftplugin/json.mnv17
-rw-r--r--mnv/runtime/ftplugin/json5.mnv32
-rw-r--r--mnv/runtime/ftplugin/jsonc.mnv22
-rw-r--r--mnv/runtime/ftplugin/jsonnet.mnv17
-rw-r--r--mnv/runtime/ftplugin/jsp.mnv74
-rw-r--r--mnv/runtime/ftplugin/julia.mnv92
-rw-r--r--mnv/runtime/ftplugin/just.mnv17
-rw-r--r--mnv/runtime/ftplugin/karel.mnv16
-rw-r--r--mnv/runtime/ftplugin/kconfig.mnv23
-rw-r--r--mnv/runtime/ftplugin/kdl.mnv17
-rw-r--r--mnv/runtime/ftplugin/kerml.mnv25
-rw-r--r--mnv/runtime/ftplugin/kitty.mnv13
-rw-r--r--mnv/runtime/ftplugin/kivy.mnv13
-rw-r--r--mnv/runtime/ftplugin/kotlin.mnv37
-rw-r--r--mnv/runtime/ftplugin/kwt.mnv37
-rw-r--r--mnv/runtime/ftplugin/lc.mnv13
-rw-r--r--mnv/runtime/ftplugin/ld.mnv21
-rw-r--r--mnv/runtime/ftplugin/ldapconf.mnv13
-rw-r--r--mnv/runtime/ftplugin/leex.mnv14
-rw-r--r--mnv/runtime/ftplugin/leo.mnv13
-rw-r--r--mnv/runtime/ftplugin/less.mnv20
-rw-r--r--mnv/runtime/ftplugin/lex.mnv14
-rw-r--r--mnv/runtime/ftplugin/lf.mnv22
-rw-r--r--mnv/runtime/ftplugin/lftp.mnv19
-rw-r--r--mnv/runtime/ftplugin/libao.mnv19
-rw-r--r--mnv/runtime/ftplugin/limits.mnv19
-rw-r--r--mnv/runtime/ftplugin/liquid.mnv62
-rw-r--r--mnv/runtime/ftplugin/lisp.mnv25
-rw-r--r--mnv/runtime/ftplugin/livebook.mnv9
-rw-r--r--mnv/runtime/ftplugin/llvm.mnv12
-rw-r--r--mnv/runtime/ftplugin/lnk.mnv14
-rw-r--r--mnv/runtime/ftplugin/lnkmap.mnv16
-rw-r--r--mnv/runtime/ftplugin/logcheck.mnv17
-rw-r--r--mnv/runtime/ftplugin/loginaccess.mnv19
-rw-r--r--mnv/runtime/ftplugin/logindefs.mnv19
-rw-r--r--mnv/runtime/ftplugin/logtalk.dict271
-rw-r--r--mnv/runtime/ftplugin/logtalk.mnv19
-rw-r--r--mnv/runtime/ftplugin/lprolog.mnv55
-rw-r--r--mnv/runtime/ftplugin/lua.mnv190
-rw-r--r--mnv/runtime/ftplugin/luau.mnv14
-rw-r--r--mnv/runtime/ftplugin/lynx.mnv33
-rw-r--r--mnv/runtime/ftplugin/m17ndb.mnv17
-rw-r--r--mnv/runtime/ftplugin/m3build.mnv27
-rw-r--r--mnv/runtime/ftplugin/m3quake.mnv39
-rw-r--r--mnv/runtime/ftplugin/m4.mnv20
-rw-r--r--mnv/runtime/ftplugin/mail.mnv50
-rw-r--r--mnv/runtime/ftplugin/mailaliases.mnv18
-rw-r--r--mnv/runtime/ftplugin/mailcap.mnv19
-rw-r--r--mnv/runtime/ftplugin/make.mnv34
-rw-r--r--mnv/runtime/ftplugin/man.mnv88
-rw-r--r--mnv/runtime/ftplugin/manconf.mnv19
-rw-r--r--mnv/runtime/ftplugin/markdown.mnv93
-rw-r--r--mnv/runtime/ftplugin/masm.mnv34
-rw-r--r--mnv/runtime/ftplugin/matlab.mnv34
-rw-r--r--mnv/runtime/ftplugin/mbsync.mnv13
-rw-r--r--mnv/runtime/ftplugin/mediawiki.mnv49
-rw-r--r--mnv/runtime/ftplugin/mermaid.mnv50
-rw-r--r--mnv/runtime/ftplugin/meson.mnv44
-rw-r--r--mnv/runtime/ftplugin/mf.mnv86
-rw-r--r--mnv/runtime/ftplugin/mlir.mnv10
-rw-r--r--mnv/runtime/ftplugin/mma.mnv17
-rw-r--r--mnv/runtime/ftplugin/mnv.mnv224
-rw-r--r--mnv/runtime/ftplugin/modconf.mnv29
-rw-r--r--mnv/runtime/ftplugin/modula2.mnv55
-rw-r--r--mnv/runtime/ftplugin/modula3.mnv47
-rw-r--r--mnv/runtime/ftplugin/mojo.mnv48
-rw-r--r--mnv/runtime/ftplugin/mp.mnv95
-rw-r--r--mnv/runtime/ftplugin/mplayerconf.mnv20
-rw-r--r--mnv/runtime/ftplugin/mrxvtrc.mnv22
-rw-r--r--mnv/runtime/ftplugin/msmessages.mnv45
-rw-r--r--mnv/runtime/ftplugin/mss.mnv16
-rw-r--r--mnv/runtime/ftplugin/muttrc.mnv31
-rw-r--r--mnv/runtime/ftplugin/mysql.mnv9
-rw-r--r--mnv/runtime/ftplugin/nanorc.mnv19
-rw-r--r--mnv/runtime/ftplugin/neomuttrc.mnv23
-rw-r--r--mnv/runtime/ftplugin/netrc.mnv20
-rw-r--r--mnv/runtime/ftplugin/nginx.mnv9
-rw-r--r--mnv/runtime/ftplugin/nickel.mnv13
-rw-r--r--mnv/runtime/ftplugin/nim.mnv13
-rw-r--r--mnv/runtime/ftplugin/nix.mnv21
-rw-r--r--mnv/runtime/ftplugin/nroff.mnv51
-rw-r--r--mnv/runtime/ftplugin/nsis.mnv43
-rw-r--r--mnv/runtime/ftplugin/nu.mnv17
-rw-r--r--mnv/runtime/ftplugin/objc.mnv13
-rw-r--r--mnv/runtime/ftplugin/objcpp.mnv1
-rw-r--r--mnv/runtime/ftplugin/objdump.mnv14
-rw-r--r--mnv/runtime/ftplugin/obse.mnv71
-rw-r--r--mnv/runtime/ftplugin/ocaml.mnv645
-rw-r--r--mnv/runtime/ftplugin/occam.mnv56
-rw-r--r--mnv/runtime/ftplugin/octave.mnv67
-rw-r--r--mnv/runtime/ftplugin/odin.mnv21
-rw-r--r--mnv/runtime/ftplugin/ondir.mnv18
-rw-r--r--mnv/runtime/ftplugin/opencl.mnv12
-rw-r--r--mnv/runtime/ftplugin/openscad.mnv14
-rw-r--r--mnv/runtime/ftplugin/openvpn.mnv15
-rw-r--r--mnv/runtime/ftplugin/org.mnv39
-rw-r--r--mnv/runtime/ftplugin/pamconf.mnv19
-rw-r--r--mnv/runtime/ftplugin/pascal.mnv55
-rw-r--r--mnv/runtime/ftplugin/passwd.mnv19
-rw-r--r--mnv/runtime/ftplugin/pbtxt.mnv17
-rw-r--r--mnv/runtime/ftplugin/pdf.mnv90
-rw-r--r--mnv/runtime/ftplugin/perl.mnv118
-rw-r--r--mnv/runtime/ftplugin/php.mnv158
-rw-r--r--mnv/runtime/ftplugin/pinfo.mnv19
-rw-r--r--mnv/runtime/ftplugin/pkl.mnv16
-rw-r--r--mnv/runtime/ftplugin/plaintex.mnv37
-rw-r--r--mnv/runtime/ftplugin/plsql.mnv17
-rw-r--r--mnv/runtime/ftplugin/pod.mnv76
-rw-r--r--mnv/runtime/ftplugin/poefilter.mnv13
-rw-r--r--mnv/runtime/ftplugin/poke.mnv36
-rw-r--r--mnv/runtime/ftplugin/postscr.mnv45
-rw-r--r--mnv/runtime/ftplugin/pq.mnv16
-rw-r--r--mnv/runtime/ftplugin/prisma.mnv13
-rw-r--r--mnv/runtime/ftplugin/procmail.mnv21
-rw-r--r--mnv/runtime/ftplugin/prolog.mnv20
-rw-r--r--mnv/runtime/ftplugin/proto.mnv18
-rw-r--r--mnv/runtime/ftplugin/protocols.mnv19
-rw-r--r--mnv/runtime/ftplugin/ps1.mnv64
-rw-r--r--mnv/runtime/ftplugin/ps1xml.mnv40
-rw-r--r--mnv/runtime/ftplugin/ptx.mnv16
-rw-r--r--mnv/runtime/ftplugin/purescript.mnv14
-rw-r--r--mnv/runtime/ftplugin/pymanifest.mnv13
-rw-r--r--mnv/runtime/ftplugin/pyrex.mnv32
-rw-r--r--mnv/runtime/ftplugin/python.mnv200
-rw-r--r--mnv/runtime/ftplugin/qb64.mnv26
-rw-r--r--mnv/runtime/ftplugin/qf.mnv18
-rw-r--r--mnv/runtime/ftplugin/qml.mnv38
-rw-r--r--mnv/runtime/ftplugin/quake.mnv19
-rw-r--r--mnv/runtime/ftplugin/quarto.mnv5
-rw-r--r--mnv/runtime/ftplugin/r.mnv37
-rw-r--r--mnv/runtime/ftplugin/racc.mnv20
-rw-r--r--mnv/runtime/ftplugin/racket.mnv89
-rw-r--r--mnv/runtime/ftplugin/raku.mnv128
-rw-r--r--mnv/runtime/ftplugin/rasi.mnv25
-rw-r--r--mnv/runtime/ftplugin/readline.mnv49
-rw-r--r--mnv/runtime/ftplugin/registry.mnv41
-rw-r--r--mnv/runtime/ftplugin/remind.mnv14
-rw-r--r--mnv/runtime/ftplugin/requirements.mnv47
-rw-r--r--mnv/runtime/ftplugin/rescript.mnv13
-rw-r--r--mnv/runtime/ftplugin/reva.mnv28
-rw-r--r--mnv/runtime/ftplugin/rhelp.mnv35
-rw-r--r--mnv/runtime/ftplugin/rmd.mnv87
-rw-r--r--mnv/runtime/ftplugin/rnc.mnv19
-rw-r--r--mnv/runtime/ftplugin/rnoweb.mnv63
-rw-r--r--mnv/runtime/ftplugin/roc.mnv14
-rw-r--r--mnv/runtime/ftplugin/routeros.mnv34
-rw-r--r--mnv/runtime/ftplugin/rpl.mnv23
-rw-r--r--mnv/runtime/ftplugin/rrst.mnv61
-rw-r--r--mnv/runtime/ftplugin/rst.mnv52
-rw-r--r--mnv/runtime/ftplugin/ruby.mnv461
-rw-r--r--mnv/runtime/ftplugin/rust.mnv243
-rw-r--r--mnv/runtime/ftplugin/samba.mnv14
-rw-r--r--mnv/runtime/ftplugin/sass.mnv42
-rw-r--r--mnv/runtime/ftplugin/sbt.mnv14
-rw-r--r--mnv/runtime/ftplugin/scala.mnv38
-rw-r--r--mnv/runtime/ftplugin/scdoc.mnv23
-rw-r--r--mnv/runtime/ftplugin/scheme.mnv61
-rw-r--r--mnv/runtime/ftplugin/screen.mnv19
-rw-r--r--mnv/runtime/ftplugin/scss.mnv13
-rw-r--r--mnv/runtime/ftplugin/sed.mnv33
-rw-r--r--mnv/runtime/ftplugin/sensors.mnv19
-rw-r--r--mnv/runtime/ftplugin/services.mnv19
-rw-r--r--mnv/runtime/ftplugin/setserial.mnv19
-rw-r--r--mnv/runtime/ftplugin/sexplib.mnv18
-rw-r--r--mnv/runtime/ftplugin/sgml.mnv47
-rw-r--r--mnv/runtime/ftplugin/sh.mnv80
-rw-r--r--mnv/runtime/ftplugin/shaderslang.mnv54
-rw-r--r--mnv/runtime/ftplugin/sieve.mnv23
-rw-r--r--mnv/runtime/ftplugin/skhd.mnv20
-rw-r--r--mnv/runtime/ftplugin/slint.mnv15
-rw-r--r--mnv/runtime/ftplugin/slpconf.mnv20
-rw-r--r--mnv/runtime/ftplugin/slpreg.mnv20
-rw-r--r--mnv/runtime/ftplugin/slpspi.mnv20
-rw-r--r--mnv/runtime/ftplugin/sml.mnv41
-rw-r--r--mnv/runtime/ftplugin/snakemake.mnv13
-rw-r--r--mnv/runtime/ftplugin/solidity.mnv15
-rw-r--r--mnv/runtime/ftplugin/solution.mnv41
-rw-r--r--mnv/runtime/ftplugin/soy.mnv14
-rw-r--r--mnv/runtime/ftplugin/spajson.mnv14
-rw-r--r--mnv/runtime/ftplugin/spec.mnv225
-rw-r--r--mnv/runtime/ftplugin/sql.mnv550
-rw-r--r--mnv/runtime/ftplugin/squirrel.mnv17
-rw-r--r--mnv/runtime/ftplugin/ssa.mnv13
-rw-r--r--mnv/runtime/ftplugin/sshconfig.mnv27
-rw-r--r--mnv/runtime/ftplugin/sshdconfig.mnv10
-rw-r--r--mnv/runtime/ftplugin/stylus.mnv54
-rw-r--r--mnv/runtime/ftplugin/sudoers.mnv27
-rw-r--r--mnv/runtime/ftplugin/svelte.mnv40
-rw-r--r--mnv/runtime/ftplugin/svg.mnv47
-rw-r--r--mnv/runtime/ftplugin/sway.mnv15
-rw-r--r--mnv/runtime/ftplugin/swayconfig.mnv16
-rw-r--r--mnv/runtime/ftplugin/swift.mnv23
-rw-r--r--mnv/runtime/ftplugin/swiftgyb.mnv11
-rw-r--r--mnv/runtime/ftplugin/swig.mnv16
-rw-r--r--mnv/runtime/ftplugin/sysctl.mnv20
-rw-r--r--mnv/runtime/ftplugin/sysml.mnv12
-rw-r--r--mnv/runtime/ftplugin/systemd.mnv30
-rw-r--r--mnv/runtime/ftplugin/systemverilog.mnv45
-rw-r--r--mnv/runtime/ftplugin/tap.mnv27
-rw-r--r--mnv/runtime/ftplugin/tcl.mnv43
-rw-r--r--mnv/runtime/ftplugin/tcsh.mnv43
-rw-r--r--mnv/runtime/ftplugin/tera.mnv37
-rw-r--r--mnv/runtime/ftplugin/terminfo.mnv19
-rw-r--r--mnv/runtime/ftplugin/terraform.mnv14
-rw-r--r--mnv/runtime/ftplugin/tex.mnv46
-rw-r--r--mnv/runtime/ftplugin/text.mnv18
-rw-r--r--mnv/runtime/ftplugin/tf.mnv13
-rw-r--r--mnv/runtime/ftplugin/thrift.mnv17
-rw-r--r--mnv/runtime/ftplugin/tiasm.mnv18
-rw-r--r--mnv/runtime/ftplugin/tidy.mnv36
-rw-r--r--mnv/runtime/ftplugin/tmux.mnv15
-rw-r--r--mnv/runtime/ftplugin/toml.mnv24
-rw-r--r--mnv/runtime/ftplugin/treetop.mnv19
-rw-r--r--mnv/runtime/ftplugin/tt2html.mnv15
-rw-r--r--mnv/runtime/ftplugin/tutor.mnv44
-rw-r--r--mnv/runtime/ftplugin/twig.mnv14
-rw-r--r--mnv/runtime/ftplugin/typescript.mnv45
-rw-r--r--mnv/runtime/ftplugin/typescriptreact.mnv33
-rw-r--r--mnv/runtime/ftplugin/typst.mnv39
-rw-r--r--mnv/runtime/ftplugin/uc.mnv14
-rw-r--r--mnv/runtime/ftplugin/uci.mnv21
-rw-r--r--mnv/runtime/ftplugin/udevconf.mnv19
-rw-r--r--mnv/runtime/ftplugin/udevperm.mnv19
-rw-r--r--mnv/runtime/ftplugin/udevrules.mnv28
-rw-r--r--mnv/runtime/ftplugin/unison.mnv14
-rw-r--r--mnv/runtime/ftplugin/updatedb.mnv19
-rw-r--r--mnv/runtime/ftplugin/urlshortcut.mnv20
-rw-r--r--mnv/runtime/ftplugin/usd.mnv14
-rw-r--r--mnv/runtime/ftplugin/v.mnv15
-rw-r--r--mnv/runtime/ftplugin/vb.mnv75
-rw-r--r--mnv/runtime/ftplugin/vdf.mnv14
-rw-r--r--mnv/runtime/ftplugin/verilog.mnv73
-rw-r--r--mnv/runtime/ftplugin/vhdl.mnv110
-rw-r--r--mnv/runtime/ftplugin/vroom.mnv35
-rw-r--r--mnv/runtime/ftplugin/vue.mnv32
-rw-r--r--mnv/runtime/ftplugin/wat.mnv18
-rw-r--r--mnv/runtime/ftplugin/wget.mnv33
-rw-r--r--mnv/runtime/ftplugin/wget2.mnv33
-rw-r--r--mnv/runtime/ftplugin/wks.mnv14
-rw-r--r--mnv/runtime/ftplugin/xcompose.mnv13
-rw-r--r--mnv/runtime/ftplugin/xdefaults.mnv21
-rw-r--r--mnv/runtime/ftplugin/xf86conf.mnv19
-rw-r--r--mnv/runtime/ftplugin/xhtml.mnv74
-rw-r--r--mnv/runtime/ftplugin/xinetd.mnv20
-rw-r--r--mnv/runtime/ftplugin/xkb.mnv14
-rw-r--r--mnv/runtime/ftplugin/xml.mnv66
-rw-r--r--mnv/runtime/ftplugin/xmodmap.mnv19
-rw-r--r--mnv/runtime/ftplugin/xs.mnv15
-rw-r--r--mnv/runtime/ftplugin/xsd.mnv46
-rw-r--r--mnv/runtime/ftplugin/xslt.mnv18
-rw-r--r--mnv/runtime/ftplugin/yacc.mnv16
-rw-r--r--mnv/runtime/ftplugin/yaml.mnv41
-rw-r--r--mnv/runtime/ftplugin/yara.mnv22
-rw-r--r--mnv/runtime/ftplugin/zathurarc.mnv22
-rw-r--r--mnv/runtime/ftplugin/zig.mnv55
-rw-r--r--mnv/runtime/ftplugin/zimbu.mnv210
-rw-r--r--mnv/runtime/ftplugin/zsh.mnv47
431 files changed, 18348 insertions, 0 deletions
diff --git a/mnv/runtime/ftplugin/8th.mnv b/mnv/runtime/ftplugin/8th.mnv
new file mode 100644
index 0000000000..c1a0b50e7a
--- /dev/null
+++ b/mnv/runtime/ftplugin/8th.mnv
@@ -0,0 +1,27 @@
+" MNV ftplugin file
+" Language: 8th
+" Version: any
+" Last Change: 2021 Sep 20
+" Last Change: 2021/09/20
+" Maintainer: Ron Aaron <ron@aaron-tech.com>
+" URL: https://8th-dev.com/
+" Filetypes: *.8th
+" NOTE: 8th allows any non-whitespace in a name, so you need to do:
+" setlocal iskeyword=!,@,33-35,%,$,38-64,A-Z,91-96,a-z,123-126,128-255
+" This goes with the syntax/8th.mnv file.
+
+" Only do this when not done yet for this buffer
+if exists("b:did_8thplugin")
+ finish
+endif
+
+" Don't load another 8th plugin for this buffer
+let b:did_8thplugin = 1
+
+setlocal ts=2 sts=2 sw=2 et
+setlocal com=s1:/*,mb:*,ex:*/,b:--,be:\\
+setlocal fo=tcrqol
+setlocal matchpairs+=\::;
+setlocal iskeyword=!,@,33-35,%,$,38-64,A-Z,91-96,a-z,123-126,128-255
+setlocal suffixesadd=.8th
+let b:undo_ftplugin = "setlocal ts< sts< sw< et< com< fo< mps< isk< sua<"
diff --git a/mnv/runtime/ftplugin/README.txt b/mnv/runtime/ftplugin/README.txt
new file mode 100644
index 0000000000..e9ec638fc9
--- /dev/null
+++ b/mnv/runtime/ftplugin/README.txt
@@ -0,0 +1,24 @@
+The ftplugin directory is for MNV plugin scripts that are only used for a
+specific filetype.
+
+All files ending in .mnv in this directory and subdirectories will be sourced
+by MNV when it detects the filetype that matches the name of the file or
+subdirectory.
+For example, these are all loaded for the "c" filetype:
+
+ c.mnv
+ c_extra.mnv
+ c/settings.mnv
+
+Note that the "_" in "c_extra.mnv" is required to separate the filetype name
+from the following arbitrary name.
+
+The filetype plugins are only loaded when the ":filetype plugin" command has
+been used.
+
+The default filetype plugin files contain settings that 95% of the users will
+want to use. They do not contain personal preferences, like the value of
+'shiftwidth'.
+
+If you want to do additional settings, or overrule the default filetype
+plugin, you can create your own plugin file. See ":help ftplugin" in MNV.
diff --git a/mnv/runtime/ftplugin/a2ps.mnv b/mnv/runtime/ftplugin/a2ps.mnv
new file mode 100644
index 0000000000..e0bbd68a6c
--- /dev/null
+++ b/mnv/runtime/ftplugin/a2ps.mnv
@@ -0,0 +1,20 @@
+" MNV filetype plugin file
+" Language: a2ps(1) configuration file
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2008-07-09
+
+if exists("b:did_ftplugin")
+ finish
+endif
+let b:did_ftplugin = 1
+
+let s:cpo_save = &cpo
+set cpo&mnv
+
+let b:undo_ftplugin = "setl com< cms< inc< fo<"
+
+setlocal comments=:# commentstring=#\ %s include=^\\s*Include:
+setlocal formatoptions-=t formatoptions+=croql
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/mnv/runtime/ftplugin/aap.mnv b/mnv/runtime/ftplugin/aap.mnv
new file mode 100644
index 0000000000..7235fef9ac
--- /dev/null
+++ b/mnv/runtime/ftplugin/aap.mnv
@@ -0,0 +1,38 @@
+" MNV filetype plugin file
+" Language: Aap recipe
+" Maintainer: The MNV Project <https://github.com/Project-Tick/Project-Tick>
+" Last Change: 2024 Jan 14
+" Former Maintainer: Bram Moolenaar <Bram@mnv.org>
+
+" Only do this when not done yet for this buffer
+if exists("b:did_ftplugin")
+ finish
+endif
+
+" Don't load another plugin for this buffer
+let b:did_ftplugin = 1
+
+" Reset 'formatoptions', 'comments', 'commentstring' and 'expandtab' to undo
+" this plugin.
+let b:undo_ftplugin = "setl fo< com< cms< et<"
+
+" Set 'formatoptions' to break comment lines but not other lines,
+" and insert the comment leader when hitting <CR> or using "o".
+setlocal fo-=t fo+=croql
+
+" Set 'comments' to format dashed lists in comments.
+setlocal comments=s:#\ -,m:#\ \ ,e:#,n:#,fb:-
+setlocal commentstring=#\ %s
+
+" Expand tabs to spaces to avoid trouble.
+setlocal expandtab
+
+if (has("gui_win32") || has("gui_gtk")) && !exists("b:browsefilter")
+ let b:browsefilter = "Aap Recipe Files (*.aap)\t*.aap\n"
+ if has("win32")
+ let b:browsefilter ..= "All Files (*.*)\t*\n"
+ else
+ let b:browsefilter ..= "All Files (*)\t*\n"
+ endif
+ let b:undo_ftplugin ..= " | unlet! b:browsefilter"
+endif
diff --git a/mnv/runtime/ftplugin/abap.mnv b/mnv/runtime/ftplugin/abap.mnv
new file mode 100644
index 0000000000..32dfbf2b19
--- /dev/null
+++ b/mnv/runtime/ftplugin/abap.mnv
@@ -0,0 +1,41 @@
+" MNV filetype plugin file
+" Language: ABAP
+" Author: Steven Oliver <oliver.steven@gmail.com>
+" Copyright: Copyright (c) 2013 Steven Oliver
+" License: You may redistribute this under the same terms as MNV itself
+" Last Change: 2023 Aug 28 by MNV Project (undo_ftplugin)
+" 2024 Jan 14 by MNV Project (browsefilter)
+" 2025 Jun 08 by Riley Bruins <ribru17@gmail.com> ('comments', 'commentstring')
+" --------------------------------------------------------------------------
+
+" Only do this when not done yet for this buffer
+if (exists("b:did_ftplugin"))
+ finish
+endif
+let b:did_ftplugin = 1
+
+let s:cpo_save = &cpo
+set cpo&mnv
+
+setlocal softtabstop=2 shiftwidth=2
+setlocal suffixesadd=.abap
+setlocal commentstring=\"\ %s
+setlocal comments=:\",:*
+
+let b:undo_ftplugin = "setl sts< sua< sw< com< cms<"
+
+" Windows allows you to filter the open file dialog
+if (has("gui_win32") || has("gui_gtk")) && !exists("b:browsefilter")
+ let b:browsefilter = "ABAP Source Files (*.abap)\t*.abap\n"
+ if has("win32")
+ let b:browsefilter ..= "All Files (*.*)\t*\n"
+ else
+ let b:browsefilter ..= "All Files (*)\t*\n"
+ endif
+ let b:undo_ftplugin ..= " | unlet! b:browsefilter"
+endif
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
+
+" mnv: set sw=4 sts=4 et tw=80 :
diff --git a/mnv/runtime/ftplugin/abaqus.mnv b/mnv/runtime/ftplugin/abaqus.mnv
new file mode 100644
index 0000000000..cbbf031109
--- /dev/null
+++ b/mnv/runtime/ftplugin/abaqus.mnv
@@ -0,0 +1,124 @@
+" MNV filetype plugin file
+" Language: Abaqus finite element input file (www.abaqus.com)
+" Maintainer: Carl Osterwisch <costerwi@gmail.com>
+" Last Change: 2022 Oct 08
+" 2024 Jan 14 by MNV Project (browsefilter)
+" 2024 May 23 by Riley Bruins <ribru17@gmail.com> ('commentstring')
+
+" Only do this when not done yet for this buffer
+if exists("b:did_ftplugin") | finish | endif
+
+" Don't load another plugin for this buffer
+let b:did_ftplugin = 1
+
+" Save the compatibility options and temporarily switch to mnv defaults
+let s:cpo_save = &cpoptions
+set cpoptions&mnv
+
+" Set the format of the include file specification for Abaqus
+" Used in :check gf ^wf [i and other commands
+setlocal include=\\<\\cINPUT\\s*=
+
+" Remove characters up to the first = when evaluating filenames
+setlocal includeexpr=substitute(v:fname,'.\\{-}=','','')
+
+" Remove comma from valid filename characters since it is used to
+" separate keyword parameters
+setlocal isfname-=,
+
+" Define format of comment lines (see 'formatoptions' for uses)
+setlocal comments=:**
+setlocal commentstring=**\ %s
+
+" Definitions start with a * and assign a NAME, NSET, or ELSET
+" Used in [d ^wd and other commands
+setlocal define=^\\*\\a.*\\c\\(NAME\\\|NSET\\\|ELSET\\)\\s*=
+
+" Abaqus keywords and identifiers may include a - character
+setlocal iskeyword+=-
+
+let b:undo_ftplugin = "setlocal include< includeexpr< isfname<"
+ \ . " comments< commentstring< define< iskeyword<"
+
+if has("folding")
+ " Fold all lines that do not begin with *
+ setlocal foldexpr=getline(v:lnum)[0]!=\"\*\"
+ setlocal foldmethod=expr
+ let b:undo_ftplugin .= " foldexpr< foldmethod<"
+endif
+
+" Set the file browse filter (currently only supported under Win32 gui)
+if (has("gui_win32") || has("gui_gtk")) && !exists("b:browsefilter")
+ let b:browsefilter = "Abaqus Input Files (*.inp *.inc)\t*.inp;*.inc\n" .
+ \ "Abaqus Results (*.dat)\t*.dat\n" .
+ \ "Abaqus Messages (*.pre, *.msg, *.sta)\t*.pre;*.msg;*.sta\n"
+ if has("win32")
+ let b:browsefilter .= "All Files (*.*)\t*\n"
+ else
+ let b:browsefilter .= "All Files (*)\t*\n"
+ endif
+ let b:undo_ftplugin .= "|unlet! b:browsefilter"
+endif
+
+" Define patterns for the matchit plugin
+if exists("loaded_matchit") && !exists("b:match_words")
+ let b:match_ignorecase = 1
+ let b:match_words =
+ \ '\*part:\*end\s*part,' .
+ \ '\*assembly:\*end\s*assembly,' .
+ \ '\*instance:\*end\s*instance,' .
+ \ '\*step:\*end\s*step'
+ let b:undo_ftplugin .= "|unlet! b:match_ignorecase b:match_words"
+endif
+
+if !exists("no_plugin_maps") && !exists("no_abaqus_maps")
+ " Map [[ and ]] keys to move [count] keywords backward or forward
+ nnoremap <silent><buffer> ]] :call <SID>Abaqus_NextKeyword(1)<CR>
+ nnoremap <silent><buffer> [[ :call <SID>Abaqus_NextKeyword(-1)<CR>
+ function! <SID>Abaqus_NextKeyword(direction)
+ .mark '
+ if a:direction < 0
+ let flags = 'b'
+ else
+ let flags = ''
+ endif
+ let l:count = abs(a:direction) * v:count1
+ while l:count > 0 && search("^\\*\\a", flags)
+ let l:count -= 1
+ endwhile
+ endfunction
+
+ " Map \\ to toggle commenting of the current line or range
+ noremap <silent><buffer> <LocalLeader><LocalLeader>
+ \ :call <SID>Abaqus_ToggleComment()<CR>j
+ function! <SID>Abaqus_ToggleComment() range
+ if strpart(getline(a:firstline), 0, 2) == "**"
+ " Un-comment all lines in range
+ silent execute a:firstline . ',' . a:lastline . 's/^\*\*//'
+ else
+ " Comment all lines in range
+ silent execute a:firstline . ',' . a:lastline . 's/^/**/'
+ endif
+ endfunction
+
+ " Map \s to swap first two comma separated fields
+ noremap <silent><buffer> <LocalLeader>s :call <SID>Abaqus_Swap()<CR>
+ function! <SID>Abaqus_Swap() range
+ silent execute a:firstline . ',' . a:lastline . 's/\([^*,]*\),\([^,]*\)/\2,\1/'
+ endfunction
+
+ let b:undo_ftplugin .= "|unmap <buffer> [[|unmap <buffer> ]]"
+ \ . "|unmap <buffer> <LocalLeader><LocalLeader>"
+ \ . "|unmap <buffer> <LocalLeader>s"
+endif
+
+" Undo must be done in nocompatible mode for <LocalLeader>.
+let b:undo_ftplugin = "let b:cpo_save = &cpoptions|"
+ \ . "set cpoptions&mnv|"
+ \ . b:undo_ftplugin
+ \ . "|let &cpoptions = b:cpo_save"
+ \ . "|unlet b:cpo_save"
+
+" Restore saved compatibility options
+let &cpoptions = s:cpo_save
+unlet s:cpo_save
diff --git a/mnv/runtime/ftplugin/abnf.mnv b/mnv/runtime/ftplugin/abnf.mnv
new file mode 100644
index 0000000000..7c91f23aee
--- /dev/null
+++ b/mnv/runtime/ftplugin/abnf.mnv
@@ -0,0 +1,17 @@
+" Language: abnf
+" Maintainer: A4-Tacks <wdsjxhno1001@163.com>
+" Last Change: 2025-05-02
+" Upstream: https://github.com/A4-Tacks/abnf.mnv
+
+if exists('b:did_ftplugin')
+ finish
+endif
+let b:did_ftplugin = 1
+
+let b:undo_ftplugin = 'setlocal iskeyword< comments< commentstring<'
+
+setlocal iskeyword=@,48-57,_,-,192-255
+setlocal comments=:;;,:;
+setlocal commentstring=;%s
+
+" mnv:ts=8
diff --git a/mnv/runtime/ftplugin/ada.mnv b/mnv/runtime/ftplugin/ada.mnv
new file mode 100644
index 0000000000..85712b55b2
--- /dev/null
+++ b/mnv/runtime/ftplugin/ada.mnv
@@ -0,0 +1,221 @@
+"------------------------------------------------------------------------------
+" Description: Perform Ada specific completion & tagging.
+" Language: Ada (2005)
+" $Id: ada.mnv 887 2008-07-08 14:29:01Z krischik $
+" Maintainer: This runtime file is looking for a new maintainer.
+" Previous Maintainer: Martin Krischik <krischik@users.sourceforge.net>
+" Taylor Venable <taylor@metasyntax.net>
+" Neil Bird <neil@fnxweb.com>
+" $Author: krischik $
+" $Date: 2008-07-08 16:29:01 +0200 (Di, 08 Jul 2008) $
+" Version: 4.6 with patch from David Bürgin
+" $Revision: 887 $
+" $HeadURL: https://gnuada.svn.sourceforge.net/svnroot/gnuada/trunk/tools/mnv/ftplugin/ada.mnv $
+" History: 24.05.2006 MK Unified Headers
+" 26.05.2006 MK ' should not be in iskeyword.
+" 16.07.2006 MK Ada-Mode as mnv-ball
+" 02.10.2006 MK Better folding.
+" 15.10.2006 MK Bram's suggestion for runtime integration
+" 05.11.2006 MK Bram suggested not to use include protection for
+" autoload
+" 05.11.2006 MK Bram suggested to save on spaces
+" 08.07.2007 TV fix default compiler problems.
+" 05.09.2025 do not globally set 'ignorecase'/'smartcase' option
+" set undo_ftplugin
+" mark as unmaintained
+" use buffer-local abbreviation
+" Help Page: ft-ada-plugin
+"------------------------------------------------------------------------------
+" Provides mapping overrides for tag jumping that figure out the current
+" Ada object and tag jump to that, not the 'simple' mnv word.
+" Similarly allows <Ctrl-N> matching of full-length ada entities from tags.
+"------------------------------------------------------------------------------
+
+" Only do this when not done yet for this buffer
+if exists ("b:did_ftplugin") || version < 700
+ finish
+endif
+
+" Don't load another plugin for this buffer
+let b:did_ftplugin = 45
+
+"
+" Temporarily set cpoptions to ensure the script loads OK
+"
+let s:cpoptions = &cpoptions
+set cpoptions-=C
+
+" Section: Comments {{{1
+"
+setlocal comments=O:--,:--\ \
+setlocal commentstring=--\ \ %s
+setlocal complete=.,w,b,u,t,i
+
+" Section: case {{{1
+"
+" setlocal nosmartcase
+" setlocal ignorecase
+
+" Section: formatoptions {{{1
+"
+setlocal formatoptions+=ron
+
+" Section: Tagging {{{1
+"
+if exists ("g:ada_extended_tagging")
+ " Make local tag mappings for this buffer (if not already set)
+ if g:ada_extended_tagging == 'jump'
+ if mapcheck('<C-]>','n') == ''
+ nnoremap <unique> <buffer> <C-]> :call ada#Jump_Tag ('', 'tjump')<cr>
+ endif
+ if mapcheck('g<C-]>','n') == ''
+ nnoremap <unique> <buffer> g<C-]> :call ada#Jump_Tag ('','stjump')<cr>
+ endif
+ elseif g:ada_extended_tagging == 'list'
+ if mapcheck('<C-]>','n') == ''
+ nnoremap <unique> <buffer> <C-]> :call ada#List_Tag ()<cr>
+ endif
+ if mapcheck('g<C-]>','n') == ''
+ nnoremap <unique> <buffer> g<C-]> :call ada#List_Tag ()<cr>
+ endif
+ endif
+endif
+
+" Section: Completion {{{1
+"
+setlocal completefunc=ada#User_Complete
+setlocal omnifunc=adacomplete#Complete
+
+if exists ("g:ada_extended_completion")
+ if mapcheck ('<C-N>','i') == ''
+ inoremap <unique> <buffer> <C-N> <C-R>=ada#Completion("\<lt>C-N>")<cr>
+ endif
+ if mapcheck ('<C-P>','i') == ''
+ inoremap <unique> <buffer> <C-P> <C-R>=ada#Completion("\<lt>C-P>")<cr>
+ endif
+ if mapcheck ('<C-X><C-]>','i') == ''
+ inoremap <unique> <buffer> <C-X><C-]> <C-R>=<SID>ada#Completion("\<lt>C-X>\<lt>C-]>")<cr>
+ endif
+ if mapcheck ('<bs>','i') == ''
+ inoremap <silent> <unique> <buffer> <bs> <C-R>=ada#Insert_Backspace ()<cr>
+ endif
+endif
+
+" Section: Matchit {{{1
+"
+" Only do this when not done yet for this buffer & matchit is used
+"
+if !exists ("b:match_words") &&
+ \ exists ("loaded_matchit")
+ "
+ " The following lines enable the macros/matchit.mnv plugin for
+ " Ada-specific extended matching with the % key.
+ "
+ let s:notend = '\%(\<end\s\+\)\@<!'
+ let b:match_words =
+ \ s:notend . '\<if\>:\<elsif\>:\<else\>:\<end\>\s\+\<if\>,' .
+ \ s:notend . '\<case\>:\<when\>:\<end\>\s\+\<case\>,' .
+ \ '\%(\<while\>.*\|\<for\>.*\|'.s:notend.'\)\<loop\>:\<end\>\s\+\<loop\>,' .
+ \ '\%(\<do\>\|\<begin\>\):\<exception\>:\<end\>\s*\%($\|[;A-Z]\),' .
+ \ s:notend . '\<record\>:\<end\>\s\+\<record\>'
+endif
+
+" Section: Compiler {{{1
+"
+if ! exists("g:ada_default_compiler")
+ if has("vms")
+ let g:ada_default_compiler = 'decada'
+ else
+ let g:ada_default_compiler = 'gnat'
+ endif
+endif
+
+if ! exists("current_compiler") ||
+ \ current_compiler != g:ada_default_compiler
+ execute "compiler " . g:ada_default_compiler
+endif
+
+" Section: Folding {{{1
+"
+if exists("g:ada_folding")
+ if g:ada_folding[0] == 'i'
+ setlocal foldmethod=indent
+ setlocal foldignore=--
+ setlocal foldnestmax=5
+ elseif g:ada_folding[0] == 'g'
+ setlocal foldmethod=expr
+ setlocal foldexpr=ada#Pretty_Print_Folding(v:lnum)
+ elseif g:ada_folding[0] == 's'
+ setlocal foldmethod=syntax
+ endif
+ setlocal tabstop=8
+ setlocal softtabstop=3
+ setlocal shiftwidth=3
+endif
+
+" Section: Abbrev {{{1
+"
+if exists("g:ada_abbrev")
+ iabbrev <buffer> ret return
+ iabbrev <buffer> proc procedure
+ iabbrev <buffer> pack package
+ iabbrev <buffer> func function
+endif
+
+" Section: Commands, Mapping, Menus {{{1
+if !exists(':AdaTagFile')
+ call ada#Map_Popup (
+ \ 'Tag.List',
+ \ 'l',
+ \ 'call ada#List_Tag ()')
+ call ada#Map_Popup (
+ \'Tag.Jump',
+ \'j',
+ \'call ada#Jump_Tag ()')
+ call ada#Map_Menu (
+ \'Tag.Create File',
+ \':AdaTagFile',
+ \'call ada#Create_Tags (''file'')')
+ call ada#Map_Menu (
+ \'Tag.Create Dir',
+ \':AdaTagDir',
+ \'call ada#Create_Tags (''dir'')')
+
+ call ada#Map_Menu (
+ \'Highlight.Toggle Space Errors',
+ \ ':AdaSpaces',
+ \'call ada#Switch_Syntax_Option (''space_errors'')')
+ call ada#Map_Menu (
+ \'Highlight.Toggle Lines Errors',
+ \ ':AdaLines',
+ \'call ada#Switch_Syntax_Option (''line_errors'')')
+ call ada#Map_Menu (
+ \'Highlight.Toggle Rainbow Color',
+ \ ':AdaRainbow',
+ \'call ada#Switch_Syntax_Option (''rainbow_color'')')
+ call ada#Map_Menu (
+ \'Highlight.Toggle Standard Types',
+ \ ':AdaTypes',
+ \'call ada#Switch_Syntax_Option (''standard_types'')')
+endif
+"
+" Section: b:undo_ftplugin {{{1
+let b:undo_ftplugin = "setl fo< comments< tw< commentstring< complete< "
+ \ . "| setl completefunc< omnifunc< ts< sts< sw< fdm< fde< fdi< "
+ \ . "| setl fdm< fde< fdi< fdn< "
+ \ . "| unlet! b:match_words "
+
+" 1}}}
+" Reset cpoptions
+let &cpoptions = s:cpoptions
+unlet s:cpoptions
+
+finish " 1}}}
+
+"------------------------------------------------------------------------------
+" Copyright (C) 2006 Martin Krischik
+"
+" MNV is Charityware - see ":help license" or uganda.txt for licence details.
+"------------------------------------------------------------------------------
+" mnv: textwidth=78 nowrap tabstop=8 shiftwidth=3 softtabstop=3 noexpandtab
+" mnv: foldmethod=marker
diff --git a/mnv/runtime/ftplugin/alsaconf.mnv b/mnv/runtime/ftplugin/alsaconf.mnv
new file mode 100644
index 0000000000..570bb876e4
--- /dev/null
+++ b/mnv/runtime/ftplugin/alsaconf.mnv
@@ -0,0 +1,19 @@
+" MNV filetype plugin file
+" Language: alsaconf(8) configuration file
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2008-07-09
+
+if exists("b:did_ftplugin")
+ finish
+endif
+let b:did_ftplugin = 1
+
+let s:cpo_save = &cpo
+set cpo&mnv
+
+let b:undo_ftplugin = "setl com< cms< fo<"
+
+setlocal comments=:# commentstring=#\ %s formatoptions-=t formatoptions+=croql
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/mnv/runtime/ftplugin/ant.mnv b/mnv/runtime/ftplugin/ant.mnv
new file mode 100644
index 0000000000..80fd70f7fc
--- /dev/null
+++ b/mnv/runtime/ftplugin/ant.mnv
@@ -0,0 +1,51 @@
+" MNV filetype plugin file
+" Language: ant
+"
+" This runtime file is looking for a new maintainer.
+"
+" Former maintainer: Dan Sharp
+" Last Change: 2009 Jan 20
+" 2024 Jan 14 by MNV Project (browsefilter)
+
+if exists("b:did_ftplugin") | finish | endif
+
+" Make sure the continuation lines below do not cause problems in
+" compatibility mode.
+let s:save_cpo = &cpo
+set cpo-=C
+
+" Define some defaults in case the included ftplugins don't set them.
+let s:undo_ftplugin = ""
+let s:browsefilter = "XML Files (*.xml)\t*.xml\n"
+if has("win32")
+ let s:browsefilter .= "All Files (*.*)\t*\n"
+else
+ let s:browsefilter .= "All Files (*)\t*\n"
+endif
+
+runtime! ftplugin/xml.mnv ftplugin/xml_*.mnv ftplugin/xml/*.mnv
+let b:did_ftplugin = 1
+
+" Override our defaults if these were set by an included ftplugin.
+if exists("b:undo_ftplugin")
+ let s:undo_ftplugin = b:undo_ftplugin
+endif
+if exists("b:browsefilter")
+ let s:browsefilter = b:browsefilter
+endif
+
+" Change the :browse e filter to primarily show Ant-related files.
+if (has("gui_win32") || has("gui_gtk")) && !exists("b:browsefilter")
+ let b:browsefilter = "Build Files (build.xml)\tbuild.xml\n" .
+ \ "Java Files (*.java)\t*.java\n" .
+ \ "Properties Files (*.prop*)\t*.prop*\n" .
+ \ "Manifest Files (*.mf)\t*.mf\n" .
+ \ s:browsefilter
+endif
+
+" Undo the stuff we changed.
+let b:undo_ftplugin = "unlet! b:browsefilter | " . s:undo_ftplugin
+
+" Restore the saved compatibility options.
+let &cpo = s:save_cpo
+unlet s:save_cpo
diff --git a/mnv/runtime/ftplugin/antlr4.mnv b/mnv/runtime/ftplugin/antlr4.mnv
new file mode 100644
index 0000000000..a17cc6df38
--- /dev/null
+++ b/mnv/runtime/ftplugin/antlr4.mnv
@@ -0,0 +1,14 @@
+" MNV filetype plugin
+" Language: ANTLR4, ANother Tool for Language Recognition v4 <www.antlr.org>
+" Maintainer: Yinzuo Jiang <jiangyinzuo@foxmail.com>
+" Last Change: 2024 July 09
+
+if exists('b:did_ftplugin')
+ finish
+endif
+let b:did_ftplugin = 1
+
+setlocal comments=sO:*\ -,mO:*\ \ ,exO:*/,s1:/*,mb:*,ex:*/,://
+setlocal commentstring=//\ %s
+
+let b:undo_ftplugin = 'setl com< cms<'
diff --git a/mnv/runtime/ftplugin/apache.mnv b/mnv/runtime/ftplugin/apache.mnv
new file mode 100644
index 0000000000..3896ec8e31
--- /dev/null
+++ b/mnv/runtime/ftplugin/apache.mnv
@@ -0,0 +1,16 @@
+" MNV filetype plugin
+" Language: apache configuration file
+" Maintainer: Per Juchtmans <dubgeiser+mnvNOSPAM@gmail.com>
+" Last Change: 2022 Oct 22
+
+if exists("b:did_ftplugin")
+ finish
+endif
+let b:did_ftplugin = 1
+
+setlocal comments=:#
+setlocal commentstring=#\ %s
+
+let b:undo_ftplugin = "setlocal comments< commentstring<"
+
+" mnv: nowrap sw=2 sts=2 ts=8 noet:
diff --git a/mnv/runtime/ftplugin/arch.mnv b/mnv/runtime/ftplugin/arch.mnv
new file mode 100644
index 0000000000..8827f47090
--- /dev/null
+++ b/mnv/runtime/ftplugin/arch.mnv
@@ -0,0 +1,19 @@
+" MNV filetype plugin file
+" Language: GNU Arch inventory file
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2008-07-09
+
+if exists("b:did_ftplugin")
+ finish
+endif
+let b:did_ftplugin = 1
+
+let s:cpo_save = &cpo
+set cpo&mnv
+
+let b:undo_ftplugin = "setl com< cms< fo<"
+
+setlocal comments=:# commentstring=#\ %s formatoptions-=t formatoptions+=croql
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/mnv/runtime/ftplugin/arduino.mnv b/mnv/runtime/ftplugin/arduino.mnv
new file mode 100644
index 0000000000..e2e0694685
--- /dev/null
+++ b/mnv/runtime/ftplugin/arduino.mnv
@@ -0,0 +1,67 @@
+" MNV filetype plugin file
+" Language: Arduino
+" Maintainer: The MNV Project <https://github.com/Project-Tick/Project-Tick>
+" Ken Takata <https://github.com/k-takata>
+" Last Change: 2024 Apr 12
+" 2024 Jun 02 by Riley Bruins <ribru17@gmail.com> ('commentstring')
+"
+" Most of the part was copied from c.mnv.
+
+" Only do this when not done yet for this buffer
+if exists("b:did_ftplugin")
+ finish
+endif
+
+" Don't load another plugin for this buffer
+let b:did_ftplugin = 1
+
+" Using line continuation here.
+let s:cpo_save = &cpo
+set cpo-=C
+
+let b:undo_ftplugin = "setl fo< com< ofu< cms< def< inc<"
+
+if !exists("g:arduino_recommended_style") || g:arduino_recommended_style != 0
+ " Use the default setting of Arduino IDE.
+ setlocal expandtab tabstop=2 softtabstop=2 shiftwidth=2
+ let b:undo_ftplugin ..= " et< ts< sts< sw<"
+endif
+
+" Set 'formatoptions' to break comment lines but not other lines,
+" and insert the comment leader when hitting <CR> or using "o".
+setlocal fo-=t fo+=croql
+
+" These options have the right value as default, but the user may have
+" overruled that.
+setlocal commentstring=/*\ %s\ */ define& include&
+
+" Set completion with CTRL-X CTRL-O to autoloaded function.
+if exists('&ofu')
+ setlocal ofu=ccomplete#Complete
+endif
+
+" Set 'comments' to format dashed lists in comments.
+" Also include ///, used for Doxygen.
+setlocal comments=sO:*\ -,mO:*\ \ ,exO:*/,s1:/*,mb:*,ex:*/,:///,://
+
+" When the matchit plugin is loaded, this makes the % command skip parens and
+" braces in comments properly.
+if !exists("b:match_words")
+ let b:match_words = '^\s*#\s*if\(\|def\|ndef\)\>:^\s*#\s*elif\>:^\s*#\s*else\>:^\s*#\s*endif\>'
+ let b:match_skip = 's:comment\|string\|character\|special'
+ let b:undo_ftplugin ..= " | unlet! b:match_skip b:match_words"
+endif
+
+" Win32 and GTK can filter files in the browse dialog
+if (has("gui_win32") || has("gui_gtk")) && !exists("b:browsefilter")
+ let b:browsefilter = "Arduino Source Files (*.ino, *.pde)\t*.ino;*.pde\n"
+ if has("win32")
+ let b:browsefilter ..= "All Files (*.*)\t*\n"
+ else
+ let b:browsefilter ..= "All Files (*)\t*\n"
+ endif
+ let b:undo_ftplugin ..= " | unlet! b:browsefilter"
+endif
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/mnv/runtime/ftplugin/art.mnv b/mnv/runtime/ftplugin/art.mnv
new file mode 100644
index 0000000000..e44a659cb2
--- /dev/null
+++ b/mnv/runtime/ftplugin/art.mnv
@@ -0,0 +1,18 @@
+" MNV filetype plugin
+" Language: ART-IM and ART*Enterprise
+" Maintainer: Dorai Sitaram <ds26@gte.com>
+" URL: http://www.ccs.neu.edu/~dorai/mnvplugins/mnvplugins.html
+" Last Change: Apr 2, 2003
+" 2023 Aug 28 by MNV Project (undo_ftplugin)
+
+" Only do this when not done yet for this buffer
+if exists("b:did_ftplugin")
+ finish
+endif
+
+run ftplugin/lisp.mnv
+
+setl lw-=if
+setl lw+=def-art-fun,deffacts,defglobal,defrule,defschema,for,schema,while
+
+let b:undo_ftplugin ..= " | setl lw<"
diff --git a/mnv/runtime/ftplugin/asciidoc.mnv b/mnv/runtime/ftplugin/asciidoc.mnv
new file mode 100644
index 0000000000..4c29c6f34d
--- /dev/null
+++ b/mnv/runtime/ftplugin/asciidoc.mnv
@@ -0,0 +1,68 @@
+" MNV filetype plugin file
+" Original Author: Maxim Kim <habamax@gmail.com>
+" Previous Maintainer: Luca Saccarola <github.e41mv@aleeas.com>
+" Maintainer: This runtime file is looking for a new maintainer.
+" Language: asciidoc
+" Last Change: 2025 Aug 05
+
+if exists("b:did_ftplugin")
+ finish
+endif
+let b:did_ftplugin = 1
+
+if exists('b:undo_ftplugin')
+ let b:undo_ftplugin .= "|setl cms< com< fo< flp< inex< efm< cfu< fde< fdm<"
+else
+ let b:undo_ftplugin = "setl cms< com< fo< flp< inex< efm< cfu< fde< fdm<"
+endif
+
+" gf to open include::file.ext[] and link:file.ext[] files
+setlocal includeexpr=substitute(v:fname,'\\(link:\\\|include::\\)\\(.\\{-}\\)\\[.*','\\2','g')
+
+setlocal comments=
+setlocal commentstring=//\ %s
+
+setlocal formatoptions+=cqn
+setlocal formatlistpat=^\\s*[\\[({]\\?\\([0-9]\\+
+setlocal formatlistpat+=\\\|[a-zA-Z]\\)[\\]:.)}]\\s\\+
+setlocal formatlistpat+=\\\|^\\s*-\\s\\+
+setlocal formatlistpat+=\\\|^\\s*[*]\\+\\s\\+
+setlocal formatlistpat+=\\\|^\\s*[.]\\+\\s\\+
+
+function AsciidocFold()
+ let line = getline(v:lnum)
+
+ if (v:lnum == 1) && (line =~ '^----*$')
+ return ">1"
+ endif
+
+ let nested = get(g:, "asciidoc_foldnested", 1)
+
+ " Regular headers
+ let depth = match(line, '\(^=\+\)\@<=\( .*$\)\@=')
+
+ " Do not fold nested regular headers
+ if depth > 1 && !nested
+ let depth = 1
+ endif
+
+ if depth > 0
+ " fold all sections under title
+ if depth > 1 && !get(g:, "asciidoc_fold_under_title", 1)
+ let depth -= 1
+ endif
+ " check syntax, it should be asciidocTitle or asciidocH
+ let syncode = synstack(v:lnum, 1)
+ if len(syncode) > 0 && synIDattr(syncode[0], 'name') =~ 'asciidoc\%(H[1-6]\)\|Title'
+ return ">" . depth
+ endif
+ endif
+
+ return "="
+endfunction
+
+if has("folding") && get(g:, 'asciidoc_folding', 0)
+ setlocal foldexpr=AsciidocFold()
+ setlocal foldmethod=expr
+ let b:undo_ftplugin .= "|setl foldexpr< foldmethod< foldtext<"
+endif
diff --git a/mnv/runtime/ftplugin/asm.mnv b/mnv/runtime/ftplugin/asm.mnv
new file mode 100644
index 0000000000..628af4988e
--- /dev/null
+++ b/mnv/runtime/ftplugin/asm.mnv
@@ -0,0 +1,25 @@
+" MNV filetype plugin file
+" Language: asm
+" Maintainer: Colin Caine <cmcaine at the common googlemail domain>
+" Last Change: 2020 May 23
+" 2023 Aug 28 by MNV Project (undo_ftplugin)
+" 2024 Apr 09 by MNV Project (add Matchit support)
+" 2024 May 23 by Riley Bruins <ribru17@gmail.com> ('commentstring')
+" 2026 Jan 19 by MNV Project (add # as comment symbol)
+
+if exists("b:did_ftplugin") | finish | endif
+let b:did_ftplugin = 1
+
+setl include=^\\s*%\\s*include
+setl comments=:;,s1:/*,mb:*,ex:*/,://,:#
+setl commentstring=;\ %s
+
+let b:undo_ftplugin = "setl commentstring< comments< include<"
+
+" Matchit support
+if !exists('b:match_words')
+ let b:match_skip = 's:comment\|string\|character\|special'
+ let b:match_words = '^\s*%\s*if\%(\|num\|idn\|nidn\)\>:^\s*%\s*elif\>:^\s*%\s*else\>:^\s*%\s*endif\>,^\s*%\s*macro\>:^\s*%\s*endmacro\>,^\s*%\s*rep\>:^\s*%\s*endrep\>'
+ let b:match_ignorecase = 1
+ let b:undo_ftplugin ..= " | unlet! b:match_ignorecase b:match_words b:match_skip"
+endif
diff --git a/mnv/runtime/ftplugin/aspvbs.mnv b/mnv/runtime/ftplugin/aspvbs.mnv
new file mode 100644
index 0000000000..b4c34c987e
--- /dev/null
+++ b/mnv/runtime/ftplugin/aspvbs.mnv
@@ -0,0 +1,67 @@
+" MNV filetype plugin file
+" Language: aspvbs
+"
+" This runtime file is looking for a new maintainer.
+"
+" Former maintainer: Dan Sharp
+" Last Change: 2009 Jan 20
+" 2024 Jan 14 by MNV Project (browsefilter)
+
+if exists("b:did_ftplugin") | finish | endif
+
+" Make sure the continuation lines below do not cause problems in
+" compatibility mode.
+let s:save_cpo = &cpo
+set cpo-=C
+
+" Define some defaults in case the included ftplugins don't set them.
+let s:undo_ftplugin = ""
+let s:browsefilter = "HTML Files (*.html, *.htm)\t*.htm*\n"
+if has("win32")
+ let s:browsefilter .= "All Files (*.*)\t*\n"
+else
+ let s:browsefilter .= "All Files (*)\t*\n"
+endif
+let s:match_words = ""
+
+runtime! ftplugin/html.mnv ftplugin/html_*.mnv ftplugin/html/*.mnv
+let b:did_ftplugin = 1
+
+" Override our defaults if these were set by an included ftplugin.
+if exists("b:undo_ftplugin")
+ let s:undo_ftplugin = b:undo_ftplugin
+endif
+if exists("b:browsefilter")
+ let s:browsefilter = b:browsefilter
+endif
+if exists("b:match_words")
+ let s:match_words = b:match_words
+endif
+
+" ASP: Active Server Pages (with Visual Basic Script)
+" thanks to Gontran BAERTS
+if exists("loaded_matchit")
+ let s:notend = '\%(\<end\s\+\)\@<!'
+ let b:match_ignorecase = 1
+ let b:match_words =
+ \ s:notend . '\<if\>\%(.\{-}then\s\+\w\)\@!:\<elseif\>:^\s*\<else\>:\<end\s\+\<if\>,' .
+ \ s:notend . '\<select\s\+case\>:\<case\>:\<case\s\+else\>:\<end\s\+select\>,' .
+ \ '^\s*\<sub\>:\<end\s\+sub\>,' .
+ \ '^\s*\<function\>:\<end\s\+function\>,' .
+ \ '\<class\>:\<end\s\+class\>,' .
+ \ '^\s*\<do\>:\<loop\>,' .
+ \ '^\s*\<for\>:\<next\>,' .
+ \ '\<while\>:\<wend\>,' .
+ \ s:match_words
+endif
+
+" Change the :browse e filter to primarily show ASP-related files.
+if (has("gui_win32") || has("gui_gtk")) && !exists("b:browsefilter")
+ let b:browsefilter="ASP Files (*.asp)\t*.asp\n" . s:browsefilter
+endif
+
+let b:undo_ftplugin = "unlet! b:match_words b:match_ignorecase b:browsefilter | " . s:undo_ftplugin
+
+" Restore the saved compatibility options.
+let &cpo = s:save_cpo
+unlet s:save_cpo
diff --git a/mnv/runtime/ftplugin/astro.mnv b/mnv/runtime/ftplugin/astro.mnv
new file mode 100644
index 0000000000..57fcca9237
--- /dev/null
+++ b/mnv/runtime/ftplugin/astro.mnv
@@ -0,0 +1,192 @@
+" MNV filetype plugin file
+" Language: Astro
+" Maintainer: Romain Lafourcade <romainlafourcade@gmail.com>
+" Last Change: 2024 Apr 21
+" 2024 May 24 by Riley Bruins <ribru17@gmail.com> ('commentstring')
+" 2025 Aug 29 by MNV project, add try/catch around json_decode(), #18141
+
+if exists("b:did_ftplugin")
+ finish
+endif
+let b:did_ftplugin = 1
+
+let s:cpo_save = &cpo
+set cpo-=C
+
+function! s:IdentifyScope(start, end) abort
+ let pos_start = searchpairpos(a:start, '', a:end, 'bnW')
+ let pos_end = searchpairpos(a:start, '', a:end, 'nW')
+
+ return pos_start != [0, 0]
+ \ && pos_end != [0, 0]
+ \ && pos_start[0] != getpos('.')[1]
+endfunction
+
+function! s:AstroComments() abort
+ if s:IdentifyScope('^---\n\s*\S', '^---\n\n')
+ \ || s:IdentifyScope('^\s*<script', '^\s*<\/script>')
+ " ECMAScript comments
+ setlocal comments=sO:*\ -,mO:*\ \ ,exO:*/,s1:/*,mb:*,ex:*/,://
+ setlocal commentstring=//\ %s
+
+ elseif s:IdentifyScope('^\s*<style', '^\s*<\/style>')
+ " CSS comments
+ setlocal comments=s1:/*,mb:*,ex:*/
+ setlocal commentstring=/*\ %s\ */
+
+ else
+ " HTML comments
+ setlocal comments=s:<!--,m:\ \ \ \ ,e:-->
+ setlocal commentstring=<!--\ %s\ -->
+ endif
+endfunction
+
+" https://code.visualstudio.com/docs/languages/jsconfig
+function! s:CollectPathsFromConfig() abort
+ let config_json = findfile('tsconfig.json', '.;')
+
+ if empty(config_json)
+ let config_json = findfile('jsconfig.json', '.;')
+
+ if empty(config_json)
+ return
+ endif
+ endif
+
+ try
+ let paths_from_config = config_json
+ \ ->readfile()
+ \ ->filter({ _, val -> val =~ '^\s*[\[\]{}"0-9]' })
+ \ ->join()
+ \ ->json_decode()
+ \ ->get('compilerOptions', {})
+ \ ->get('paths', {})
+ catch /^MNV\%((\a\+)\)\=:E491:/ " invalid json
+ let paths_from_config = {}
+ endtry
+
+ if !empty(paths_from_config)
+ let b:astro_paths = paths_from_config
+ \ ->map({key, val -> [
+ \ key->glob2regpat(),
+ \ val[0]->substitute('\/\*$', '', '')
+ \ ]})
+ \ ->values()
+ endif
+
+ let b:undo_ftplugin ..= " | unlet! b:astro_paths"
+endfunction
+
+function! s:AstroInclude(filename) abort
+ let decorated_filename = a:filename
+ \ ->substitute("^", "@", "")
+
+ let found_path = b:
+ \ ->get("astro_paths", [])
+ \ ->indexof({ key, val -> decorated_filename =~ val[0]})
+
+ if found_path != -1
+ let alias = b:astro_paths[found_path][0]
+ let path = b:astro_paths[found_path][1]
+ \ ->substitute('\(\/\)*$', '/', '')
+
+ return decorated_filename
+ \ ->substitute(alias, path, '')
+ endif
+
+ return a:filename
+endfunction
+
+let b:undo_ftplugin = "setlocal"
+ \ .. " formatoptions<"
+ \ .. " path<"
+ \ .. " suffixesadd<"
+ \ .. " matchpairs<"
+ \ .. " comments<"
+ \ .. " commentstring<"
+ \ .. " iskeyword<"
+ \ .. " define<"
+ \ .. " include<"
+ \ .. " includeexpr<"
+
+" Create self-resetting autocommand group
+augroup Astro
+ autocmd! * <buffer>
+augroup END
+
+" Set 'formatoptions' to break comment lines but not other lines,
+" and insert the comment leader when hitting <CR> or using "o".
+setlocal formatoptions-=t
+setlocal formatoptions+=croql
+
+" Remove irrelevant part of 'path'.
+setlocal path-=/usr/include
+
+" Seed 'path' with default directories for :find, gf, etc.
+setlocal path+=src/**
+setlocal path+=public/**
+
+" Help MNV find extension-less filenames
+let &l:suffixesadd =
+ \ ".astro"
+ \ .. ",.js,.jsx,.es,.es6,.cjs,.mjs,.jsm"
+ \ .. ",.json"
+ \ .. ",.scss,.sass,.css"
+ \ .. ",.svelte"
+ \ .. ",.ts,.tsx,.d.ts"
+ \ .. ",.vue"
+
+" From $MNVRUNTIME/ftplugin/html.mnv
+setlocal matchpairs+=<:>
+
+" Matchit configuration
+if exists("loaded_matchit")
+ let b:match_ignorecase = 0
+
+ " From $MNVRUNTIME/ftplugin/javascript.mnv
+ let b:match_words =
+ \ '\<do\>:\<while\>,'
+ \ .. '<\@<=\([^ \t>/]\+\)\%(\s\+[^>]*\%([^/]>\|$\)\|>\|$\):<\@<=/\1>,'
+ \ .. '<\@<=\%([^ \t>/]\+\)\%(\s\+[^/>]*\|$\):/>'
+
+ " From $MNVRUNTIME/ftplugin/html.mnv
+ let b:match_words ..=
+ \ '<!--:-->,'
+ \ .. '<:>,'
+ \ .. '<\@<=[ou]l\>[^>]*\%(>\|$\):<\@<=li\>:<\@<=/[ou]l>,'
+ \ .. '<\@<=dl\>[^>]*\%(>\|$\):<\@<=d[td]\>:<\@<=/dl>,'
+ \ .. '<\@<=\([^/!][^ \t>]*\)[^>]*\%(>\|$\):<\@<=/\1>'
+
+ let b:undo_ftplugin ..= " | unlet! b:match_ignorecase b:match_words"
+endif
+
+" Change what constitutes a word, mainly useful for CSS/SASS
+setlocal iskeyword+=-
+setlocal iskeyword+=$
+setlocal iskeyword+=%
+
+" Define paths/aliases for module resolution
+call s:CollectPathsFromConfig()
+
+" Find ESM imports
+setlocal include=^\\s*\\(import\\\|import\\s\\+[^\/]\\+from\\)\\s\\+['\"]
+
+" Process aliases if file can't be found
+setlocal includeexpr=s:AstroInclude(v:fname)
+
+" Set 'define' to a comprehensive value
+" From $MNVRUNTIME/ftplugin/javascript.mnv and
+" $MNVRUNTIME/ftplugin/sass.mnv
+let &l:define =
+ \ '\(^\s*(*async\s\+function\|(*function\)'
+ \ .. '\|^\s*\(\*\|static\|async\|get\|set\|\i\+\.\)'
+ \ .. '\|^\s*\(\ze\i\+\)\(([^)]*).*{$\|\s*[:=,]\)'
+
+
+" Set &comments and &commentstring according to current scope
+autocmd Astro CursorMoved <buffer> call s:AstroComments()
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
+
+" mnv: textwidth=78 tabstop=8 shiftwidth=4 softtabstop=4 expandtab
diff --git a/mnv/runtime/ftplugin/asy.mnv b/mnv/runtime/ftplugin/asy.mnv
new file mode 100644
index 0000000000..5ac4d51b3e
--- /dev/null
+++ b/mnv/runtime/ftplugin/asy.mnv
@@ -0,0 +1,14 @@
+" MNV filetype plugin
+" Language: Asymptote
+" Maintainer: AvidSeeker <avidseeker7@protonmail.com>
+" Last Change: 2024 Jul 13
+"
+
+if exists("b:did_ftplugin")
+ finish
+endif
+let g:did_ftplugin = 1
+
+setlocal commentstring=/*\ %s\ */
+
+let b:undo_ftplugin = "setl commentstring<"
diff --git a/mnv/runtime/ftplugin/autohotkey.mnv b/mnv/runtime/ftplugin/autohotkey.mnv
new file mode 100644
index 0000000000..0b1627433e
--- /dev/null
+++ b/mnv/runtime/ftplugin/autohotkey.mnv
@@ -0,0 +1,16 @@
+" MNV filetype plugin file
+" Language: AutoHotkey
+" Maintainer: Peter Aronoff <peteraronoff@fastmail.com>
+" Last Changed: 2024 Jul 25
+
+if exists("b:did_ftplugin")
+ finish
+endif
+let b:did_ftplugin = 1
+
+setlocal comments=:;
+setlocal commentstring=;\ %s
+
+let b:undo_ftplugin = "setlocal comments< commentstring<"
+
+" mnv: nowrap sw=2 sts=2 ts=8 noet:
diff --git a/mnv/runtime/ftplugin/automake.mnv b/mnv/runtime/ftplugin/automake.mnv
new file mode 100644
index 0000000000..5825a828ec
--- /dev/null
+++ b/mnv/runtime/ftplugin/automake.mnv
@@ -0,0 +1,16 @@
+" MNV filetype plugin file
+" Language: Automake
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2008-07-09
+
+if exists("b:did_ftplugin")
+ finish
+endif
+
+let s:cpo_save = &cpo
+set cpo&mnv
+
+runtime! ftplugin/make.mnv ftplugin/make_*.mnv ftplugin/make/*.mnv
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/mnv/runtime/ftplugin/autopkgtest.mnv b/mnv/runtime/ftplugin/autopkgtest.mnv
new file mode 100644
index 0000000000..74799241a8
--- /dev/null
+++ b/mnv/runtime/ftplugin/autopkgtest.mnv
@@ -0,0 +1,17 @@
+" MNV filetype plugin file
+" Language: Debian autopkgtest control files
+" Maintainer: Debian MNV Maintainers
+" Last Change: 2025 Jul 05
+" URL: https://salsa.debian.org/mnv-team/mnv-debian/blob/main/ftplugin/autopkgtest.mnv
+
+" Do these settings once per buffer
+if exists('b:did_ftplugin')
+ finish
+endif
+let b:did_ftplugin=1
+
+setlocal comments=:#
+setlocal commentstring=#\ %s
+
+" Clean unloading
+let b:undo_ftplugin = 'setlocal comments< commentstring<'
diff --git a/mnv/runtime/ftplugin/awk.mnv b/mnv/runtime/ftplugin/awk.mnv
new file mode 100644
index 0000000000..a6f2ae6a04
--- /dev/null
+++ b/mnv/runtime/ftplugin/awk.mnv
@@ -0,0 +1,63 @@
+" MNV filetype plugin
+" Language: awk, nawk, gawk, mawk
+" Maintainer: Doug Kearns <dougkearns@gmail.com>
+" Previous Maintainer: Antonio Colombo <azc100@gmail.com>
+" Last Change: 2024 Jan 14
+
+" This plugin was prepared by Mark Sikora
+" This plugin was updated as proposed by Doug Kearns
+
+" Only do this when not done yet for this buffer
+if exists("b:did_ftplugin")
+ finish
+endif
+
+" Don't load another plugin for this buffer
+let b:did_ftplugin = 1
+
+let s:cpo_save = &cpo
+set cpo&mnv
+
+setlocal comments=:#
+setlocal commentstring=#\ %s
+setlocal formatoptions-=t formatoptions+=croql
+
+setlocal define=function
+setlocal suffixesadd+=.awk
+
+let b:undo_ftplugin = "setl fo< com< cms< def< sua<"
+
+" TODO: set this in scripts.mnv?
+if exists("g:awk_is_gawk")
+ setlocal include=@include
+ setlocal suffixesadd+=.gawk
+ if has("unix") || has("win32unix")
+ setlocal formatprg=gawk\ -f-\ -o/dev/stdout
+ let b:undo_ftplugin .= " | setl fp<"
+ endif
+
+ " Disabled by default for security reasons.
+ if dist#mnv#IsSafeExecutable('awk', 'gawk')
+ let path = system("gawk 'BEGIN { printf ENVIRON[\"AWKPATH\"] }'")
+ let path = substitute(path, '^\.\=:\|:\.\=$\|:\.\=:', ',,', 'g') " POSIX cwd
+ let path = substitute(path, ':', ',', 'g')
+
+ let &l:path = path
+ endif
+ let b:undo_ftplugin .= " | setl inc< path<"
+endif
+
+if (has("gui_win32") || has("gui_gtk")) && !exists("b:browsefilter")
+ let b:browsefilter = "Awk Source Files (*.awk, *.gawk)\t*.awk;*.gawk\n"
+ if has("win32")
+ let b:browsefilter .= "All Files (*.*)\t*\n"
+ else
+ let b:browsefilter .= "All Files (*)\t*\n"
+ endif
+ let b:undo_ftplugin .= " | unlet! b:browsefilter"
+endif
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
+
+" mnv: nowrap sw=2 sts=2 ts=8
diff --git a/mnv/runtime/ftplugin/bash.mnv b/mnv/runtime/ftplugin/bash.mnv
new file mode 100644
index 0000000000..7068e16463
--- /dev/null
+++ b/mnv/runtime/ftplugin/bash.mnv
@@ -0,0 +1,20 @@
+" MNV filetype plugin file
+" Language: bash
+" Maintainer: The MNV Project <https://github.com/Project-Tick/Project-Tick>
+" Last Changed: 2023 Aug 13
+"
+" This is not a real filetype plugin. It allows for someone to set 'filetype'
+" to "bash" in the modeline, and gets the effect of filetype "sh" with
+" b:is_bash set. Idea from Mahmode Al-Qudsi.
+
+if exists("b:did_ftplugin")
+ finish
+endif
+
+unlet! b:is_sh
+unlet! b:is_kornshell
+let b:is_bash = 1
+
+runtime! ftplugin/sh.mnv ftplugin/sh_*.mnv ftplugin/sh/*.mnv
+
+" mnv: ts=8
diff --git a/mnv/runtime/ftplugin/basic.mnv b/mnv/runtime/ftplugin/basic.mnv
new file mode 100644
index 0000000000..391e008dde
--- /dev/null
+++ b/mnv/runtime/ftplugin/basic.mnv
@@ -0,0 +1,61 @@
+" MNV filetype plugin file
+" Language: BASIC (QuickBASIC 4.5)
+" Maintainer: Doug Kearns <dougkearns@gmail.com>
+" Last Change: 2024 Jan 14
+
+if exists("b:did_ftplugin")
+ finish
+endif
+let b:did_ftplugin = 1
+
+let s:cpo_save = &cpo
+set cpo&mnv
+
+setlocal comments=:REM\ ,:Rem\ ,:rem\ ,:'
+setlocal commentstring='\ %s
+setlocal formatoptions-=t formatoptions+=croql
+
+let b:undo_ftplugin = "setl fo< com< cms<"
+
+" TODO: support exit ... as middle matches?
+if exists("loaded_matchit") && !exists("b:match_words")
+ let s:line_start = '\%(^\s*\)\@<='
+ let s:not_end = '\%(end\s\+\)\@<!'
+ let s:not_end_or_exit = '\%(\%(end\|exit\)\s\+\)\@<!'
+
+ let b:match_ignorecase = 1
+ let b:match_words =
+ \ s:not_end_or_exit .. '\<def\s\+fn:\<end\s\+def\>,' ..
+ \ s:not_end_or_exit .. '\<function\>:\<end\s\+function\>,' ..
+ \ s:not_end_or_exit .. '\<sub\>:\<end\s\+sub\>,' ..
+ \ s:not_end .. '\<type\>:\<end\s\+type\>,' ..
+ \ s:not_end .. '\<select\>:\%(select\s\+\)\@<!\<case\%(\s\+\%(else\|is\)\)\=\>:\<end\s\+select\>,' ..
+ \ '\<do\>:\<loop\>,' ..
+ \ '\<for\>\%(\s\+\%(input\|output\|random\|append\|binary\)\)\@!:\<next\>,' ..
+ \ '\<while\>:\<wend\>,' ..
+ \ s:line_start .. 'if\%(.*\<then\s*\%($\|''\)\)\@=:\<\%(' .. s:line_start .. 'else\|elseif\)\>:\<end\s\+if\>,' ..
+ \ '\<lock\>:\<unlock\>'
+ let b:match_skip = 'synIDattr(synID(line("."),col("."),1),"name") =~? "comment\\|string" || ' ..
+ \ 'strpart(getline("."), 0, col(".") ) =~? "\\<exit\\s\\+"'
+
+ let b:undo_ftplugin ..= " | unlet! b:match_ignorecase b:match_skip b:match_words"
+
+ unlet s:line_start s:not_end s:not_end_or_exit
+endif
+
+if (has("gui_win32") || has("gui_gtk")) && !exists("b:browsefilter")
+ let b:browsefilter = "BASIC Source Files (*.bas)\t*.bas\n" ..
+ \ "BASIC Include Files (*.bi, *.bm)\t*.bi;*.bm\n"
+ if has("win32")
+ let b:browsefilter ..= "All Files (*.*)\t*\n"
+ else
+ let b:browsefilter ..= "All Files (*)\t*\n"
+ endif
+ let b:basic_set_browsefilter = 1
+ let b:undo_ftplugin ..= " | unlet! b:browsefilter b:basic_set_browsefilter"
+endif
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
+
+" mnv: nowrap sw=2 sts=2 ts=8 noet fdm=marker:
diff --git a/mnv/runtime/ftplugin/bdf.mnv b/mnv/runtime/ftplugin/bdf.mnv
new file mode 100644
index 0000000000..b42dfd964a
--- /dev/null
+++ b/mnv/runtime/ftplugin/bdf.mnv
@@ -0,0 +1,20 @@
+" MNV filetype plugin file
+" Language: BDF font definition
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2008-07-09
+
+if exists("b:did_ftplugin")
+ finish
+endif
+let b:did_ftplugin = 1
+
+let s:cpo_save = &cpo
+set cpo&mnv
+
+let b:undo_ftplugin = "setl com< cms< fo<"
+
+setlocal comments=b:COMMENT commentstring=COMMENT\ %s
+setlocal formatoptions-=t formatoptions+=croql
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/mnv/runtime/ftplugin/bicep-params.mnv b/mnv/runtime/ftplugin/bicep-params.mnv
new file mode 100644
index 0000000000..575b30e0b8
--- /dev/null
+++ b/mnv/runtime/ftplugin/bicep-params.mnv
@@ -0,0 +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.mnv
diff --git a/mnv/runtime/ftplugin/bicep.mnv b/mnv/runtime/ftplugin/bicep.mnv
new file mode 100644
index 0000000000..cf0605779c
--- /dev/null
+++ b/mnv/runtime/ftplugin/bicep.mnv
@@ -0,0 +1,14 @@
+" MNV filetype plugin
+" Language: Bicep
+" Maintainer: Scott McKendry <me@scottmckendry.tech>
+" Last Change: 2025 Dec 27
+
+if exists('b:did_ftplugin')
+ finish
+endif
+let b:did_ftplugin = 1
+
+setlocal comments=s1:/*,mb:*,ex:*/,://
+setlocal commentstring=//\ %s
+
+let b:undo_ftplugin = "setlocal comments< commentstring<"
diff --git a/mnv/runtime/ftplugin/bindzone.mnv b/mnv/runtime/ftplugin/bindzone.mnv
new file mode 100644
index 0000000000..d7af2eaf89
--- /dev/null
+++ b/mnv/runtime/ftplugin/bindzone.mnv
@@ -0,0 +1,16 @@
+" MNV filetype plugin file
+" Language: bind zone file
+" Maintainer: This runtime file is looking for a new maintainer.
+" Last Change: 2024 Jul 06
+
+if exists("b:did_ftplugin")
+ finish
+endif
+let b:did_ftplugin=1
+
+setlocal comments=b:;
+setlocal commentstring=;\ %s
+setlocal formatoptions-=t
+setlocal formatoptions+=crq
+
+let b:undo_ftplugin = "setlocal com< cms< fo<"
diff --git a/mnv/runtime/ftplugin/bitbake.mnv b/mnv/runtime/ftplugin/bitbake.mnv
new file mode 100644
index 0000000000..3ec01d9161
--- /dev/null
+++ b/mnv/runtime/ftplugin/bitbake.mnv
@@ -0,0 +1,17 @@
+" MNV filetype plugin file
+" Language: Bitbake
+" Maintainer: Gregory Anders <greg@gpanders.com>
+" Repository: https://github.com/openembedded/bitbake
+" Latest Revision: 2022-07-23
+" 2024-05-23 by Riley Bruins <ribru17@gmail.com> ('commentstring')
+
+if exists("b:did_ftplugin")
+ finish
+endif
+let b:did_ftplugin = 1
+
+setlocal commentstring=#\ %s
+setlocal comments=:#
+setlocal suffixesadd=.bb,.bbclass
+
+let b:undo_ftplugin = "setl cms< com< sua<"
diff --git a/mnv/runtime/ftplugin/bp.mnv b/mnv/runtime/ftplugin/bp.mnv
new file mode 100644
index 0000000000..d7d89e9f39
--- /dev/null
+++ b/mnv/runtime/ftplugin/bp.mnv
@@ -0,0 +1,14 @@
+" Blueprint build system filetype plugin file
+" Language: Blueprint
+" Maintainer: Bruno BELANYI <bruno.mnv@belanyi.fr>
+" Latest Revision: 2024-04-19
+
+if exists("b:did_ftplugin")
+ finish
+endif
+let b:did_ftplugin = 1
+
+setlocal comments=b://,s1:/*,mb:*,ex:*/
+setlocal commentstring=//\ %s
+
+let b:undo_ftplugin = "setlocal comments< commentstring<"
diff --git a/mnv/runtime/ftplugin/bpftrace.mnv b/mnv/runtime/ftplugin/bpftrace.mnv
new file mode 100644
index 0000000000..20aa6067a7
--- /dev/null
+++ b/mnv/runtime/ftplugin/bpftrace.mnv
@@ -0,0 +1,16 @@
+" MNV filetype plugin
+" Language: bpftrace
+" Maintainer: Stanislaw Gruszka <stf_xl@wp.pl>
+" Last Change: 2025 Dec 23
+
+if exists('b:did_ftplugin')
+ finish
+endif
+let b:did_ftplugin = 1
+
+setlocal comments=sO:*\ -,mO:*\ \ ,exO:*/,s1:/*,mb:*,ex:*/,://
+setlocal commentstring=//\ %s
+
+setlocal formatoptions-=t formatoptions+=croql
+
+let b:undo_ftplugin = "setlocal comments< commentstring< formatoptions<"
diff --git a/mnv/runtime/ftplugin/brighterscript.mnv b/mnv/runtime/ftplugin/brighterscript.mnv
new file mode 100644
index 0000000000..1f49983baa
--- /dev/null
+++ b/mnv/runtime/ftplugin/brighterscript.mnv
@@ -0,0 +1,11 @@
+" MNV filetype plugin
+" Language: Brighterscript
+" Maintainer: Riley Bruins <ribru17@gmail.com>
+" Last Change: 2025 Jun 17
+
+if exists('b:did_ftplugin')
+ finish
+endif
+let b:did_ftplugin = 1
+
+runtime! ftplugin/brightscript.mnv
diff --git a/mnv/runtime/ftplugin/brightscript.mnv b/mnv/runtime/ftplugin/brightscript.mnv
new file mode 100644
index 0000000000..bc3ca4d1ab
--- /dev/null
+++ b/mnv/runtime/ftplugin/brightscript.mnv
@@ -0,0 +1,13 @@
+" MNV filetype plugin
+" Language: Brightscript
+" Maintainer: Riley Bruins <ribru17@gmail.com>
+" Last Change: 2025 Jun 17
+
+if exists('b:did_ftplugin')
+ finish
+endif
+let b:did_ftplugin = 1
+
+setl comments=:' commentstring='\ %s
+
+let b:undo_ftplugin = 'setl com< cms<'
diff --git a/mnv/runtime/ftplugin/bst.mnv b/mnv/runtime/ftplugin/bst.mnv
new file mode 100644
index 0000000000..31c34ace43
--- /dev/null
+++ b/mnv/runtime/ftplugin/bst.mnv
@@ -0,0 +1,15 @@
+" MNV filetype plugin file
+" Language: bst
+" Author: Tim Pope <mnvNOSPAM@tpope.info>
+" $Id: bst.mnv,v 1.1 2007/05/05 17:37:57 mnvboss Exp $
+
+if exists("b:did_ftplugin")
+ finish
+endif
+let b:did_ftplugin = 1
+
+setlocal commentstring=%\ %s
+setlocal comments=:%
+setlocal fo-=t fo+=croql
+
+let b:undo_ftplugin = "setlocal com< cms< fo<"
diff --git a/mnv/runtime/ftplugin/btm.mnv b/mnv/runtime/ftplugin/btm.mnv
new file mode 100644
index 0000000000..2eaf0031d6
--- /dev/null
+++ b/mnv/runtime/ftplugin/btm.mnv
@@ -0,0 +1,13 @@
+" MNV filetype plugin file
+" Language: BTM
+" Maintainer: The MNV Project <https://github.com/Project-Tick/Project-Tick>
+" Last Change: 2023 Aug 10
+" Former Maintainer: Bram Moolenaar <Bram@mnv.org>
+
+" Only do this when not done yet for this buffer
+if exists("b:did_ftplugin")
+ finish
+endif
+
+" Behaves just like dosbatch
+runtime! ftplugin/dosbatch.mnv ftplugin/dosbatch_*.mnv ftplugin/dosbatch/*.mnv
diff --git a/mnv/runtime/ftplugin/bzl.mnv b/mnv/runtime/ftplugin/bzl.mnv
new file mode 100644
index 0000000000..68d38a3b11
--- /dev/null
+++ b/mnv/runtime/ftplugin/bzl.mnv
@@ -0,0 +1,101 @@
+" MNV filetype plugin file
+" Language: Bazel (http://bazel.io)
+" Maintainer: David Barnett (https://github.com/google/mnv-ft-bzl)
+" Last Change: 2021 Jan 19
+" 2023 Aug 28 by MNV Project (undo_ftplugin)
+
+""
+" @section Introduction, intro
+" Core settings for the bzl filetype, used for BUILD and *.bzl files for the
+" Bazel build system (http://bazel.io/).
+
+if exists('b:did_ftplugin')
+ finish
+endif
+
+
+" MNV 7.4.051 has opinionated settings in ftplugin/python.mnv that try to force
+" PEP8 conventions on every python file, but these conflict with Google's
+" indentation guidelines. As a workaround, we explicitly source the system
+" ftplugin, but save indentation settings beforehand and restore them after.
+let s:save_expandtab = &l:expandtab
+let s:save_shiftwidth = &l:shiftwidth
+let s:save_softtabstop = &l:softtabstop
+let s:save_tabstop = &l:tabstop
+
+" NOTE: MNV versions before 7.3.511 had a ftplugin/python.mnv that was broken
+" for compatible mode.
+let s:save_cpo = &cpo
+set cpo&mnv
+
+" Load base python ftplugin (also defines b:did_ftplugin).
+source $MNVRUNTIME/ftplugin/python.mnv
+
+" NOTE: MNV versions before 7.4.104 and later set this in ftplugin/python.mnv.
+setlocal comments=b:#,fb:-
+
+" Restore pre-existing indentation settings.
+let &l:expandtab = s:save_expandtab
+let &l:shiftwidth = s:save_shiftwidth
+let &l:softtabstop = s:save_softtabstop
+let &l:tabstop = s:save_tabstop
+
+setlocal formatoptions-=t
+
+" Initially defined in the python ftplugin sourced above
+let b:undo_ftplugin .= " | setlocal fo<"
+
+" Make gf work with imports in BUILD files.
+setlocal includeexpr=substitute(v:fname,'//','','')
+
+" Enable syntax-based folding, if specified.
+if get(g:, 'ft_bzl_fold', 0)
+ setlocal foldmethod=syntax
+ setlocal foldtext=BzlFoldText()
+ let b:undo_ftplugin .= " | setlocal fdm< fdt<"
+endif
+
+if exists('*BzlFoldText')
+ let &cpo = s:save_cpo
+ unlet s:save_cpo
+ finish
+endif
+
+function BzlFoldText() abort
+ let l:start_num = nextnonblank(v:foldstart)
+ let l:end_num = prevnonblank(v:foldend)
+
+ if l:end_num <= l:start_num + 1
+ " If the fold is empty, don't print anything for the contents.
+ let l:content = ''
+ else
+ " Otherwise look for something matching the content regex.
+ " And if nothing matches, print an ellipsis.
+ let l:content = '...'
+ for l:line in getline(l:start_num + 1, l:end_num - 1)
+ let l:content_match = matchstr(l:line, '\m\C^\s*name = \zs.*\ze,$')
+ if !empty(l:content_match)
+ let l:content = l:content_match
+ break
+ endif
+ endfor
+ endif
+
+ " Enclose content with start and end
+ let l:start_text = getline(l:start_num)
+ let l:end_text = substitute(getline(l:end_num), '^\s*', '', '')
+ let l:text = l:start_text . ' ' . l:content . ' ' . l:end_text
+
+ " Compute the available width for the displayed text.
+ let l:width = winwidth(0) - &foldcolumn - (&number ? &numberwidth : 0)
+ let l:lines_folded = ' ' . string(1 + v:foldend - v:foldstart) . ' lines'
+
+ " Expand tabs, truncate, pad, and concatenate
+ let l:text = substitute(l:text, '\t', repeat(' ', &tabstop), 'g')
+ let l:text = strpart(l:text, 0, l:width - len(l:lines_folded))
+ let l:padding = repeat(' ', l:width - len(l:lines_folded) - len(l:text))
+ return l:text . l:padding . l:lines_folded
+endfunction
+
+let &cpo = s:save_cpo
+unlet s:save_cpo
diff --git a/mnv/runtime/ftplugin/c.mnv b/mnv/runtime/ftplugin/c.mnv
new file mode 100644
index 0000000000..a2ad5ece51
--- /dev/null
+++ b/mnv/runtime/ftplugin/c.mnv
@@ -0,0 +1,93 @@
+" MNV filetype plugin file
+" Language: C
+" Maintainer: The MNV Project <https://github.com/Project-Tick/Project-Tick>
+" Last Change: 2026 Feb 3
+" Former Maintainer: Bram Moolenaar <Bram@mnv.org>
+
+" Only do this when not done yet for this buffer
+if exists("b:did_ftplugin")
+ finish
+endif
+
+" Don't load another plugin for this buffer
+let b:did_ftplugin = 1
+
+" Using line continuation here.
+let s:cpo_save = &cpo
+set cpo-=C
+
+let b:undo_ftplugin = "setl fo< com< ofu< cms< def< inc< | if has('vms') | setl isk< | endif"
+
+" Set 'formatoptions' to break comment lines but not other lines,
+" and insert the comment leader when hitting <CR> or using "o".
+setlocal fo-=t fo+=croql
+
+" These options have the right value as default, but the user may have
+" overruled that.
+setlocal commentstring=/*\ %s\ */ define& include&
+
+" Set completion with CTRL-X CTRL-O to autoloaded function.
+if exists('&ofu') && has("mnv9script")
+ setlocal ofu=ccomplete#Complete
+endif
+
+" Set 'comments' to format dashed lists in comments.
+" Also include ///, used for Doxygen.
+setlocal comments=sO:*\ -,mO:*\ \ ,exO:*/,s1:/*,mb:*,ex:*/,:///,://
+
+" In VMS C keywords contain '$' characters.
+if has("vms")
+ setlocal iskeyword+=$
+endif
+
+" Use terminal window for gui
+if has('gui_running') && exists(':terminal') == 2 && executable("man")
+ setlocal keywordprg=:CKeywordPrg
+
+ command! -buffer -nargs=1 -count CKeywordPrg call s:CKeywordPrg(<q-args>, <count>)
+
+ function! s:CKeywordPrg(arg, count) abort
+ if a:count > 0
+ exe printf('term ++close man -s %d %s', a:count, a:arg)
+ else
+ exe printf('term ++close man %s', a:arg)
+ endif
+ endfunction
+
+ let b:undo_ftplugin .= ' | setl kp< | sil! delc -buffer CKeywordPrg'
+endif
+
+" When the matchit plugin is loaded, this makes the % command skip parens and
+" braces in comments properly.
+if !exists("b:match_words")
+ let b:match_words = '^\s*#\s*if\%(\|def\|ndef\)\>:^\s*#\s*elif\%(\|def\|ndef\)\>:^\s*#\s*else\>:^\s*#\s*endif\>'
+ let b:match_skip = 's:comment\|string\|character\|special'
+ let b:undo_ftplugin ..= " | unlet! b:match_skip b:match_words"
+endif
+
+" Win32 and GTK can filter files in the browse dialog
+if (has("gui_win32") || has("gui_gtk")) && !exists("b:browsefilter")
+ if &ft == "cpp"
+ let b:browsefilter = "C++ Source Files (*.cpp, *.c++)\t*.cpp;*.c++\n" ..
+ \ "C Header Files (*.h)\t*.h\n" ..
+ \ "C Source Files (*.c)\t*.c\n"
+ elseif &ft == "ch"
+ let b:browsefilter = "Ch Source Files (*.ch, *.chf)\t*.ch;*.chf\n" ..
+ \ "C Header Files (*.h)\t*.h\n" ..
+ \ "C Source Files (*.c)\t*.c\n"
+ else
+ let b:browsefilter = "C Source Files (*.c)\t*.c\n" ..
+ \ "C Header Files (*.h)\t*.h\n" ..
+ \ "Ch Source Files (*.ch, *.chf)\t*.ch;*.chf\n" ..
+ \ "C++ Source Files (*.cpp, *.c++)\t*.cpp;*.c++\n"
+ endif
+ if has("win32")
+ let b:browsefilter ..= "All Files (*.*)\t*\n"
+ else
+ let b:browsefilter ..= "All Files (*)\t*\n"
+ endif
+ let b:undo_ftplugin ..= " | unlet! b:browsefilter"
+endif
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/mnv/runtime/ftplugin/c3.mnv b/mnv/runtime/ftplugin/c3.mnv
new file mode 100644
index 0000000000..4bd5abfccd
--- /dev/null
+++ b/mnv/runtime/ftplugin/c3.mnv
@@ -0,0 +1,14 @@
+" MNV filetype plugin
+" Language: C3
+" Maintainer: Turiiya <34311583+ttytm@users.noreply.github.com>
+" Last Change: 2024 Nov 24
+
+if exists('b:did_ftplugin')
+ finish
+endif
+let b:did_ftplugin = 1
+
+setl comments=sO:*\ -,mO:*\ \ ,exO:*/,s1:/*,mb:*,ex:*/,:///,://
+setl commentstring=//\ %s
+
+let b:undo_ftplugin = 'setl com< cms<'
diff --git a/mnv/runtime/ftplugin/cabal.mnv b/mnv/runtime/ftplugin/cabal.mnv
new file mode 100644
index 0000000000..a1a70c6315
--- /dev/null
+++ b/mnv/runtime/ftplugin/cabal.mnv
@@ -0,0 +1,18 @@
+" MNV filetype plugin file
+" Language: Haskell Cabal Build file
+" Maintainer: Riley Bruins <ribru17@gmail.com>
+" Last Change: 2024 Jul 06
+" 2026 Jan 13 by MNV project: set compiler #19152
+
+if exists('b:did_ftplugin')
+ finish
+endif
+let b:did_ftplugin = 1
+
+compiler cabal
+
+let b:undo_ftplugin = 'compiler make'
+
+setl comments=:-- commentstring=--\ %s
+
+let b:undo_ftplugin .= '| setl com< cms<'
diff --git a/mnv/runtime/ftplugin/calendar.mnv b/mnv/runtime/ftplugin/calendar.mnv
new file mode 100644
index 0000000000..1452b2ce74
--- /dev/null
+++ b/mnv/runtime/ftplugin/calendar.mnv
@@ -0,0 +1,21 @@
+" MNV filetype plugin file
+" Language: calendar(1) input file
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2008-07-09
+" 2024-06-02 by Riley Bruins <ribru17@gmail.com> ('commentstring')
+
+if exists("b:did_ftplugin")
+ finish
+endif
+let b:did_ftplugin = 1
+
+let s:cpo_save = &cpo
+set cpo&mnv
+
+let b:undo_ftplugin = "setl com< cms< inc< fo<"
+
+setlocal comments=s1:/*,mb:*,ex:*/ commentstring=/*\ %s\ */ include&
+setlocal formatoptions-=t formatoptions+=croql
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/mnv/runtime/ftplugin/cdrdaoconf.mnv b/mnv/runtime/ftplugin/cdrdaoconf.mnv
new file mode 100644
index 0000000000..49c324a33f
--- /dev/null
+++ b/mnv/runtime/ftplugin/cdrdaoconf.mnv
@@ -0,0 +1,18 @@
+" MNV filetype plugin file
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2007-12-04
+
+if exists("b:did_ftplugin")
+ finish
+endif
+let b:did_ftplugin = 1
+
+let s:cpo_save = &cpo
+set cpo&mnv
+
+let b:undo_ftplugin = "setl com< cms< fo<"
+
+setlocal comments=:# commentstring=#\ %s formatoptions-=t formatoptions+=croql
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/mnv/runtime/ftplugin/cedar.mnv b/mnv/runtime/ftplugin/cedar.mnv
new file mode 100644
index 0000000000..6a11f6a249
--- /dev/null
+++ b/mnv/runtime/ftplugin/cedar.mnv
@@ -0,0 +1,13 @@
+" MNV filetype plugin
+" Language: Cedar
+" Maintainer: Riley Bruins <ribru17@gmail.com>
+" Last Change: 2024 Jul 4
+
+if exists('b:did_ftplugin')
+ finish
+endif
+let b:did_ftplugin = 1
+
+setl comments=:// commentstring=//\ %s
+
+let b:undo_ftplugin = 'setl com< cms<'
diff --git a/mnv/runtime/ftplugin/cfg.mnv b/mnv/runtime/ftplugin/cfg.mnv
new file mode 100644
index 0000000000..4074f2a9fd
--- /dev/null
+++ b/mnv/runtime/ftplugin/cfg.mnv
@@ -0,0 +1,19 @@
+" MNV filetype plugin file
+" Language: Configuration File
+" Maintainer: Christian Brabandt <cb@256bit.org>
+" Latest Revision: 2018-12-24
+
+if exists("b:did_ftplugin")
+ finish
+endif
+let b:did_ftplugin = 1
+
+let s:cpo_save = &cpo
+set cpo&mnv
+
+let b:undo_ftplugin = "setl cms< fo<"
+
+setlocal commentstring=#\ %s formatoptions-=t formatoptions+=croql
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/mnv/runtime/ftplugin/cgdbrc.mnv b/mnv/runtime/ftplugin/cgdbrc.mnv
new file mode 100644
index 0000000000..947d778aa8
--- /dev/null
+++ b/mnv/runtime/ftplugin/cgdbrc.mnv
@@ -0,0 +1,22 @@
+" MNV filetype plugin file
+" Language: cgdbrc
+" Maintainer: Wu, Zhenyu <wuzhenyu@ustc.edu>
+" Documentation: https://cgdb.github.io/docs/Configuring-CGDB.html
+" Latest Revision: 2024-04-09
+" 2024-05-23 by Riley Bruins <ribru17@gmail.com> ('commentstring')
+
+if exists('b:did_ftplugin')
+ finish
+endif
+let b:did_ftplugin = 1
+
+let s:save_cpoptions = &cpoptions
+set cpoptions&mnv
+
+let b:undo_ftplugin = 'setl com< cms<'
+
+setlocal commentstring=#\ %s
+setlocal comments=:#
+
+let &cpoptions = s:save_cpoptions
+unlet s:save_cpoptions
diff --git a/mnv/runtime/ftplugin/ch.mnv b/mnv/runtime/ftplugin/ch.mnv
new file mode 100644
index 0000000000..7aa0781900
--- /dev/null
+++ b/mnv/runtime/ftplugin/ch.mnv
@@ -0,0 +1,17 @@
+" MNV filetype plugin file
+" Language: Ch
+" Maintainer: SoftIntegration, Inc. <info@softintegration.com>
+" URL: http://www.softintegration.com/download/mnv/ftplugin/ch.mnv
+" Last change: 2004 May 16
+" Created based on cpp.mnv
+"
+" Ch is a C/C++ interpreter with many high level extensions
+"
+
+" Only do this when not done yet for this buffer
+if exists("b:did_ftplugin")
+ finish
+endif
+
+" Behaves just like C
+runtime! ftplugin/c.mnv ftplugin/c_*.mnv ftplugin/c/*.mnv
diff --git a/mnv/runtime/ftplugin/changelog.mnv b/mnv/runtime/ftplugin/changelog.mnv
new file mode 100644
index 0000000000..cdccc7e1ad
--- /dev/null
+++ b/mnv/runtime/ftplugin/changelog.mnv
@@ -0,0 +1,313 @@
+" MNV filetype plugin file
+" Language: generic Changelog file
+" Maintainer: Martin Florian <marfl@posteo.de>
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2021-10-17
+" Variables:
+" g:changelog_timeformat (deprecated: use g:changelog_dateformat instead) -
+" description: the timeformat used in ChangeLog entries.
+" default: "%Y-%m-%d".
+" g:changelog_dateformat -
+" description: the format sent to strftime() to generate a date string.
+" default: "%Y-%m-%d".
+" g:changelog_username -
+" description: the username to use in ChangeLog entries
+" default: try to deduce it from environment variables and system files.
+" Local Mappings:
+" <Leader>o -
+" adds a new changelog entry for the current user for the current date.
+" Global Mappings:
+" <Leader>o -
+" switches to the ChangeLog buffer opened for the current directory, or
+" opens it in a new buffer if it exists in the current directory. Then
+" it does the same as the local <Leader>o described above.
+" Notes:
+" run 'runtime ftplugin/changelog.mnv' to enable the global mapping for
+" changelog files.
+" TODO:
+" should we perhaps open the ChangeLog file even if it doesn't exist already?
+" Problem is that you might end up with ChangeLog files all over the place.
+
+" If 'filetype' isn't "changelog", we must have been to add ChangeLog opener
+if &filetype == 'changelog'
+ if exists('b:did_ftplugin')
+ finish
+ endif
+ let b:did_ftplugin = 1
+
+ let s:cpo_save = &cpo
+ set cpo&mnv
+
+ " Set up the format used for dates.
+ if !exists('g:changelog_dateformat')
+ if exists('g:changelog_timeformat')
+ let g:changelog_dateformat = g:changelog_timeformat
+ else
+ let g:changelog_dateformat = "%Y-%m-%d"
+ endif
+ endif
+
+ function! s:username()
+ if exists('g:changelog_username')
+ return g:changelog_username
+ elseif $EMAIL != ""
+ return $EMAIL
+ elseif $EMAIL_ADDRESS != ""
+ return $EMAIL_ADDRESS
+ endif
+ let s:default_login = 'unknown'
+
+ " Disabled by default for security reasons.
+ if dist#mnv#IsSafeExecutable('changelog', 'whoami')
+ let login = s:login()
+ else
+ let login = s:default_login
+ endif
+ return printf('%s <%s@%s>', s:name(login), login, s:hostname())
+ endfunction
+
+ function! s:login()
+ return s:trimmed_system_with_default('whoami', s:default_login)
+ endfunction
+
+ function! s:trimmed_system_with_default(command, default)
+ return s:first_line(s:system_with_default(a:command, a:default))
+ endfunction
+
+ function! s:system_with_default(command, default)
+ let output = system(a:command)
+ if v:shell_error
+ return a:default
+ endif
+ return output
+ endfunction
+
+ function! s:first_line(string)
+ return substitute(a:string, '\n.*$', "", "")
+ endfunction
+
+ function! s:name(login)
+ for name in [s:gecos_name(a:login), $NAME, s:capitalize(a:login)]
+ if name != ""
+ return name
+ endif
+ endfor
+ endfunction
+
+ function! s:gecos_name(login)
+ for line in s:try_reading_file('/etc/passwd')
+ if line =~ '^' . a:login . ':'
+ return substitute(s:passwd_field(line, 5), '&', s:capitalize(a:login), "")
+ endif
+ endfor
+ return ""
+ endfunction
+
+ function! s:try_reading_file(path)
+ try
+ return readfile(a:path)
+ catch
+ return []
+ endtry
+ endfunction
+
+ function! s:passwd_field(line, field)
+ let fields = split(a:line, ':', 1)
+ if len(fields) < a:field
+ return ""
+ endif
+ return fields[a:field - 1]
+ endfunction
+
+ function! s:capitalize(word)
+ return toupper(a:word[0]) . strpart(a:word, 1)
+ endfunction
+
+ function! s:hostname()
+ return s:trimmed_system_with_default('hostname', 'localhost')
+ endfunction
+
+ " Format used for new date entries.
+ if !exists('g:changelog_new_date_format')
+ let g:changelog_new_date_format = "%d %u\n\n\t* %p%c\n\n"
+ endif
+
+ " Format used for new entries to current date entry.
+ if !exists('g:changelog_new_entry_format')
+ let g:changelog_new_entry_format = "\t* %p%c"
+ endif
+
+ " Regular expression used to find a given date entry.
+ if !exists('g:changelog_date_entry_search')
+ let g:changelog_date_entry_search = '^\s*%d\_s*%u'
+ endif
+
+ " Regular expression used to find the end of a date entry
+ if !exists('g:changelog_date_end_entry_search')
+ let g:changelog_date_end_entry_search = '^\s*$'
+ endif
+
+
+ " Substitutes specific items in new date-entry formats and search strings.
+ " Can be done with substitute of course, but unclean, and need \@! then.
+ function! s:substitute_items(str, date, user, prefix)
+ let str = a:str
+ let middles = {'%': '%', 'd': a:date, 'u': a:user, 'p': a:prefix, 'c': '{cursor}'}
+ let i = stridx(str, '%')
+ while i != -1
+ let inc = 0
+ if has_key(middles, str[i + 1])
+ let mid = middles[str[i + 1]]
+ let str = strpart(str, 0, i) . mid . strpart(str, i + 2)
+ let inc = strlen(mid) - 1
+ endif
+ let i = stridx(str, '%', i + 1 + inc)
+ endwhile
+ return str
+ endfunction
+
+ " Position the cursor once we've done all the funky substitution.
+ function! s:position_cursor()
+ if search('{cursor}') > 0
+ let lnum = line('.')
+ let line = getline(lnum)
+ let cursor = stridx(line, '{cursor}')
+ call setline(lnum, substitute(line, '{cursor}', '', ''))
+ endif
+ startinsert
+ endfunction
+
+ " Internal function to create a new entry in the ChangeLog.
+ function! s:new_changelog_entry(prefix)
+ " Deal with 'paste' option.
+ let save_paste = &paste
+ let &paste = 1
+ call cursor(1, 1)
+ " Look for an entry for today by our user.
+ let date = strftime(g:changelog_dateformat)
+ let search = s:substitute_items(g:changelog_date_entry_search, date,
+ \ s:username(), a:prefix)
+ if search(search) > 0
+ " Ok, now we look for the end of the date entry, and add an entry.
+ call cursor(nextnonblank(line('.') + 1), 1)
+ if search(g:changelog_date_end_entry_search, 'W') > 0
+ let p = (line('.') == line('$')) ? line('.') : line('.') - 1
+ else
+ let p = line('.')
+ endif
+ let ls = split(s:substitute_items(g:changelog_new_entry_format, '', '', a:prefix),
+ \ '\n')
+ call append(p, ls)
+ call cursor(p + 1, 1)
+ else
+ " Flag for removing empty lines at end of new ChangeLogs.
+ let remove_empty = line('$') == 1
+
+ " No entry today, so create a date-user header and insert an entry.
+ let todays_entry = s:substitute_items(g:changelog_new_date_format,
+ \ date, s:username(), a:prefix)
+ " Make sure we have a cursor positioning.
+ if stridx(todays_entry, '{cursor}') == -1
+ let todays_entry = todays_entry . '{cursor}'
+ endif
+
+ " Now do the work.
+ call append(0, split(todays_entry, '\n'))
+
+ " Remove empty lines at end of file.
+ if remove_empty
+ $-/^\s*$/-1,$delete
+ endif
+
+ " Reposition cursor once we're done.
+ call cursor(1, 1)
+ endif
+
+ call s:position_cursor()
+
+ " And reset 'paste' option
+ let &paste = save_paste
+ endfunction
+
+ let b:undo_ftplugin = "setl com< fo< et< ai<"
+
+ setlocal comments=
+ setlocal formatoptions+=t
+ setlocal noexpandtab
+ setlocal autoindent
+
+ if &textwidth == 0
+ setlocal textwidth=78
+ let b:undo_ftplugin .= " tw<"
+ endif
+
+ if !exists("no_plugin_maps") && !exists("no_changelog_maps") && exists(":NewChangelogEntry") != 2
+ nnoremap <buffer> <silent> <Leader>o :<C-u>call <SID>new_changelog_entry('')<CR>
+ xnoremap <buffer> <silent> <Leader>o :<C-u>call <SID>new_changelog_entry('')<CR>
+ command! -buffer -nargs=0 NewChangelogEntry call s:new_changelog_entry('')
+ let b:undo_ftplugin .= " | sil! exe 'nunmap <buffer> <Leader>o'" .
+ \ " | sil! exe 'vunmap <buffer> <Leader>o'" .
+ \ " | sil! delc NewChangelogEntry"
+ endif
+
+ let &cpo = s:cpo_save
+ unlet s:cpo_save
+else
+ let s:cpo_save = &cpo
+ set cpo&mnv
+
+ if !exists("no_plugin_maps") && !exists("no_changelog_maps")
+ " Add the Changelog opening mapping
+ nnoremap <silent> <Leader>o :call <SID>open_changelog()<CR>
+ let b:undo_ftplugin .= " | silent! exe 'nunmap <buffer> <Leader>o"
+ endif
+
+ function! s:open_changelog()
+ let path = expand('%:p:h')
+ if exists('b:changelog_path')
+ let changelog = b:changelog_path
+ else
+ if exists('b:changelog_name')
+ let name = b:changelog_name
+ else
+ let name = 'ChangeLog'
+ endif
+ while isdirectory(path)
+ let changelog = path . '/' . name
+ if filereadable(changelog)
+ break
+ endif
+ let parent = substitute(path, '/\+[^/]*$', "", "")
+ if path == parent
+ break
+ endif
+ let path = parent
+ endwhile
+ endif
+ if !filereadable(changelog)
+ return
+ endif
+
+ if exists('b:changelog_entry_prefix')
+ let prefix = call(b:changelog_entry_prefix, [])
+ else
+ let prefix = substitute(strpart(expand('%:p'), strlen(path)), '^/\+', "", "")
+ endif
+
+ let buf = bufnr(changelog)
+ if buf != -1
+ if bufwinnr(buf) != -1
+ execute bufwinnr(buf) . 'wincmd w'
+ else
+ execute 'sbuffer' buf
+ endif
+ else
+ execute 'split' fnameescape(changelog)
+ endif
+
+ call s:new_changelog_entry(prefix)
+ endfunction
+
+ let &cpo = s:cpo_save
+ unlet s:cpo_save
+endif
diff --git a/mnv/runtime/ftplugin/chatito.mnv b/mnv/runtime/ftplugin/chatito.mnv
new file mode 100644
index 0000000000..90f0f5b0e3
--- /dev/null
+++ b/mnv/runtime/ftplugin/chatito.mnv
@@ -0,0 +1,15 @@
+" MNV filetype plugin
+" Language: Chatito
+" Maintainer: ObserverOfTime <chronobserver@disroot.org>
+" Last Change: 2022 Sep 19
+
+if exists('b:did_ftplugin')
+ finish
+endif
+let b:did_ftplugin = 1
+
+setlocal comments=:#,:// commentstring=#\ %s
+" indent of 4 spaces is mandated by the spec
+setlocal expandtab softtabstop=4 shiftwidth=4
+
+let b:undo_ftplugin = 'setl com< cms< et< sts< sw<'
diff --git a/mnv/runtime/ftplugin/chicken.mnv b/mnv/runtime/ftplugin/chicken.mnv
new file mode 100644
index 0000000000..0778b95e9a
--- /dev/null
+++ b/mnv/runtime/ftplugin/chicken.mnv
@@ -0,0 +1,55 @@
+" CHICKEN-specific MNV customizations
+" Last Change: 2024 Jun 21
+" Author: Evan Hanson <evhan@foldling.org>
+" Maintainer: Evan Hanson <evhan@foldling.org>
+" Repository: https://git.foldling.org/mnv-scheme.git
+" URL: https://foldling.org/mnv/ftplugin/chicken.mnv
+" Notes: These are supplemental settings, to be loaded after the
+" core Scheme ftplugin file (ftplugin/scheme.mnv). Enable
+" it by setting b:is_chicken=1 and filetype=scheme.
+
+if !exists('b:did_scheme_ftplugin')
+ finish
+endif
+
+setl keywordprg=chicken-doc
+
+setl lispwords+=and-let*
+setl lispwords+=compiler-typecase
+setl lispwords+=condition-case
+setl lispwords+=define-compiler-syntax
+setl lispwords+=define-constant
+setl lispwords+=define-external
+setl lispwords+=define-for-syntax
+setl lispwords+=define-foreign-type
+setl lispwords+=define-inline
+setl lispwords+=define-location
+setl lispwords+=define-record
+setl lispwords+=define-record-printer
+setl lispwords+=define-specialization
+setl lispwords+=fluid-let
+setl lispwords+=foreign-lambda*
+setl lispwords+=foreign-primitive
+setl lispwords+=foreign-safe-lambda*
+setl lispwords+=functor
+setl lispwords+=handle-exceptions
+setl lispwords+=let-compiler-syntax
+setl lispwords+=let-location
+setl lispwords+=let-optionals
+setl lispwords+=let-optionals*
+setl lispwords+=letrec-values
+setl lispwords+=match
+setl lispwords+=match-let
+setl lispwords+=match-let*
+setl lispwords+=match-letrec
+setl lispwords+=module
+setl lispwords+=receive
+setl lispwords+=set!-values
+setl lispwords+=test-group
+
+let b:undo_ftplugin = b:undo_ftplugin . ' keywordprg<'
+
+if exists('g:loaded_matchit') && !exists('b:match_words')
+ let b:match_words = '#>:<#'
+ let b:undo_ftplugin = b:undo_ftplugin . ' | unlet! b:match_words'
+endif
diff --git a/mnv/runtime/ftplugin/clojure.mnv b/mnv/runtime/ftplugin/clojure.mnv
new file mode 100644
index 0000000000..8830295c84
--- /dev/null
+++ b/mnv/runtime/ftplugin/clojure.mnv
@@ -0,0 +1,85 @@
+" MNV filetype plugin file
+" Language: Clojure
+" Maintainer: Alex Vear <alex@vear.uk>
+" Former Maintainers: Sung Pae <self@sungpae.com>
+" Meikel Brandmeyer <mb@kotka.de>
+" URL: https://github.com/clojure-mnv/clojure.mnv
+" License: MNV (see :h license)
+" Last Change: 2022-03-24
+" 2024 Jan 14 by MNV Project (browsefilter)
+
+if exists("b:did_ftplugin")
+ finish
+endif
+let b:did_ftplugin = 1
+
+let s:cpo_save = &cpo
+set cpo&mnv
+
+let b:undo_ftplugin = 'setlocal iskeyword< define< formatoptions< comments< commentstring< lispwords<'
+
+setlocal iskeyword+=?,-,*,!,+,/,=,<,>,.,:,$,%,&,\|
+
+" There will be false positives, but this is better than missing the whole set
+" of user-defined def* definitions.
+setlocal define=\\v[(/]def(ault)@!\\S*
+
+" Remove 't' from 'formatoptions' to avoid auto-wrapping code.
+setlocal formatoptions-=t
+
+" Lisp comments are routinely nested (e.g. ;;; SECTION HEADING)
+setlocal comments=n:;
+setlocal commentstring=;\ %s
+
+" Specially indented symbols from clojure.core and clojure.test.
+"
+" Clojure symbols are indented in the defn style when they:
+"
+" * Define vars and anonymous functions
+" * Create new lexical scopes or scopes with altered environments
+" * Create conditional branches from a predicate function or value
+"
+" The arglists for these functions are generally in the form of [x & body];
+" Functions that accept a flat list of forms do not treat the first argument
+" specially and hence are not indented specially.
+"
+" -*- LISPWORDS -*-
+" Generated from https://github.com/clojure-mnv/clojure.mnv/blob/fd280e33e84c88e97860930557dba3ff80b1a82d/clj/src/mnv_clojure_static/generate.clj
+setlocal lispwords=as->,binding,bound-fn,case,catch,cond->,cond->>,condp,def,definline,definterface,defmacro,defmethod,defmulti,defn,defn-,defonce,defprotocol,defrecord,defstruct,deftest,deftest-,deftype,doseq,dotimes,doto,extend,extend-protocol,extend-type,fn,for,if,if-let,if-not,if-some,let,letfn,locking,loop,ns,proxy,reify,set-test,testing,when,when-first,when-let,when-not,when-some,while,with-bindings,with-in-str,with-local-vars,with-open,with-precision,with-redefs,with-redefs-fn,with-test
+
+" Provide insert mode completions for special forms and clojure.core. As
+" 'omnifunc' is set by popular Clojure REPL client plugins, we also set
+" 'completefunc' so that the user has some form of completion available when
+" 'omnifunc' is set and no REPL connection exists.
+for s:setting in ['omnifunc', 'completefunc']
+ if exists('&' . s:setting) && empty(eval('&' . s:setting))
+ execute 'setlocal ' . s:setting . '=clojurecomplete#Complete'
+ let b:undo_ftplugin .= ' | setlocal ' . s:setting . '<'
+ endif
+endfor
+
+" Skip brackets in ignored syntax regions when using the % command
+if exists('loaded_matchit')
+ let b:match_words = &matchpairs
+ let b:match_skip = 's:comment\|string\|regex\|character'
+ let b:undo_ftplugin .= ' | unlet! b:match_words b:match_skip'
+endif
+
+" Filter files in the browse dialog
+if (has("gui_win32") || has("gui_gtk")) && !exists("b:browsefilter")
+ let b:browsefilter = "Clojure Files\t*.clj;*.cljc;*.cljs;*.cljx\n" .
+ \ "EDN Files\t*.edn\n" .
+ \ "Java Files\t*.java\n"
+ if has("win32")
+ let b:browsefilter .= "All Files (*.*)\t*\n"
+ else
+ let b:browsefilter .= "All Files (*)\t*\n"
+ endif
+ let b:undo_ftplugin .= ' | unlet! b:browsefilter'
+endif
+
+let &cpo = s:cpo_save
+
+unlet! s:cpo_save s:setting s:dir
+
+" mnv:sts=8:sw=8:ts=8:noet
diff --git a/mnv/runtime/ftplugin/cmake.mnv b/mnv/runtime/ftplugin/cmake.mnv
new file mode 100644
index 0000000000..90755359f4
--- /dev/null
+++ b/mnv/runtime/ftplugin/cmake.mnv
@@ -0,0 +1,37 @@
+" MNV filetype plugin
+" Language: CMake
+" Maintainer: Keith Smiley <keithbsmiley@gmail.com>
+" Last Change: 2018 Aug 30
+" 2024 Apr 20 - add include and suffixadd (MNV Project)
+
+" Only do this when not done yet for this buffer
+if exists("b:did_ftplugin")
+ finish
+endif
+
+" save 'cpo' for restoration at the end of this file
+let s:cpo_save = &cpo
+set cpo&mnv
+
+" Don't load another plugin for this buffer
+let b:did_ftplugin = 1
+
+let b:undo_ftplugin = "setl inc< sua< commentstring<"
+
+if exists('loaded_matchit')
+ let b:match_words = '\<if\>:\<elseif\>\|\<else\>:\<endif\>'
+ \ . ',\<foreach\>\|\<while\>:\<break\>:\<endforeach\>\|\<endwhile\>'
+ \ . ',\<macro\>:\<endmacro\>'
+ \ . ',\<function\>:\<endfunction\>'
+ let b:match_ignorecase = 1
+
+ let b:undo_ftplugin .= "| unlet b:match_words"
+endif
+
+setlocal include=\s*include
+setlocal suffixesadd=.cmake,-config.cmake
+setlocal commentstring=#\ %s
+
+" restore 'cpo' and clean up buffer variable
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/mnv/runtime/ftplugin/cmakecache.mnv b/mnv/runtime/ftplugin/cmakecache.mnv
new file mode 100644
index 0000000000..40cb35407c
--- /dev/null
+++ b/mnv/runtime/ftplugin/cmakecache.mnv
@@ -0,0 +1,13 @@
+" MNV filetype plugin
+" Language: cmakecache - CMakeCache.txt files generated by CMake
+" Maintainer: Riley Bruins <ribru17@gmail.com>
+" Last Change: 2024 Jul 06
+
+if exists('b:did_ftplugin')
+ finish
+endif
+let b:did_ftplugin = 1
+
+setl comments=:#,:// commentstring=//\ %s
+
+let b:undo_ftplugin = 'setl com< cms<'
diff --git a/mnv/runtime/ftplugin/cobol.mnv b/mnv/runtime/ftplugin/cobol.mnv
new file mode 100644
index 0000000000..74be3b1f09
--- /dev/null
+++ b/mnv/runtime/ftplugin/cobol.mnv
@@ -0,0 +1,274 @@
+" MNV filetype plugin file
+" Language: cobol
+" Maintainer: Ankit Jain <ajatkj@yahoo.co.in>
+" (formerly Tim Pope <mnvNOSPAM@tpope.info>)
+" Last Update: By Ankit Jain (add gtk support) on 15.08.2020
+" 2024 Jan 14 by MNV Project (browsefilter)
+
+" Insert mode mappings: <C-T> <C-D> <Tab>
+" Normal mode mappings: < > << >> [[ ]] [] ][
+" Visual mode mappings: < >
+
+if exists("b:did_ftplugin")
+ finish
+endif
+let b:did_ftplugin = 1
+
+let s:cpo_save = &cpo
+set cpo&mnv
+
+setlocal commentstring=\ \ \ \ \ \ *%s
+setlocal comments=:*
+setlocal fo+=croqlt
+setlocal expandtab
+setlocal textwidth=72
+
+" matchit support
+if exists("loaded_matchit")
+ let s:ordot = '\|\ze\.\%( \@=\|$\)'
+ let b:match_ignorecase=1
+ "let b:match_skip = 'getline(".") =~ "^.\\{6\\}[*/C]"'
+ let b:match_words=
+ \ '\$if\>:$else\>:\$endif\>,' .
+ \ '[$-]\@<!\<if\>:\<\%(then\|else\)\>:\<end-if\>'.s:ordot.',' .
+ \ '-\@<!\<perform\s\+\%(\d\+\s\+times\|until\|varying\|with\s\+test\)\>:\<end-perform\>'.s:ordot . ',' .
+ \ '-\@<!\<\%(search\|evaluate\)\>:\<\%(when\)\>:\<end-\%(search\|evaluate\)\>' .s:ordot . ',' .
+ \ '-\@<!\<\%(add\|compute\|divide\|multiply\|subtract\)\>\%(.*\(\%$\|\%(\n\%(\%(\s*\|.\{6\}\)[*/].*\n\)*\)\=\s*\%(not\s\+\)\=on\s\+size\s\+error\>\)\)\@=:\%(\<not\s\+\)\@<!\<\%(not\s\+\)\=on\s\+size\s\+error\>:\<end-\%(add\|compute\|divide\|multiply\|subtract\)\>' .s:ordot . ',' .
+ \ '-\@<!\<\%(string\|unstring\|accept\|display\|call\)\>\%(.*\(\%$\|\%(\n\%(\%(\s*\|.\{6\}\)[*/].*\n\)*\)\=\s*\%(not\s\+\)\=on\s\+\%(overflow\|exception\)\>\)\)\@=:\%(\<not\s\+\)\@<!\<\%(not\s\+\)\=on\s\+\%(overflow\|exception\)\>:\<end-\%(string\|unstring\|accept\|display\|call\)\>' .s:ordot . ',' .
+ \ '-\@<!\<\%(delete\|rewrite\|start\|write\|read\)\>\%(.*\(\%$\|\%(\n\%(\%(\s*\|.\{6\}\)[*/].*\n\)*\)\=\s*\%(invalid\s\+key\|at\s\+end\|no\s\+data\|at\s\+end-of-page\)\>\)\)\@=:\%(\<not\s\+\)\@<!\<\%(not\s\+\)\=\%(invalid\s\+key\|at\s\+end\|no\s\+data\|at\s\+end-of-page\)\>:\<end-\%(delete\|rewrite\|start\|write\|read\)\>' .s:ordot
+endif
+
+" add gtk support
+if (has("gui_win32") || has("gui_gtk")) && !exists("b:browsefilter")
+ let b:browsefilter = "COBOL Source Files (*.cbl, *.cob)\t*.cbl;*.cob;*.lib\n"
+ if has("win32")
+ let b:browsefilter .= "All Files (*.*)\t*\n"
+ else
+ let b:browsefilter .= "All Files (*)\t*\n"
+ endif
+endif
+
+let b:undo_ftplugin = "setlocal com< cms< fo< et< tw<" .
+ \ " | unlet! b:browsefilter b:match_words b:match_ignorecase b:match_skip"
+if !exists("g:no_plugin_maps") && !exists("g:no_cobol_maps")
+ let b:undo_ftplugin = b:undo_ftplugin .
+ \ " | sil! exe 'nunmap <buffer> <'" .
+ \ " | sil! exe 'nunmap <buffer> >'" .
+ \ " | sil! exe 'nunmap <buffer> <<'" .
+ \ " | sil! exe 'nunmap <buffer> >>'" .
+ \ " | sil! exe 'vunmap <buffer> <'" .
+ \ " | sil! exe 'vunmap <buffer> >'" .
+ \ " | sil! exe 'iunmap <buffer> <C-D>'" .
+ \ " | sil! exe 'iunmap <buffer> <C-T>'" .
+ \ " | sil! exe 'iunmap <buffer> <Tab>'" .
+ \ " | sil! exe 'nunmap <buffer> <Plug>Traditional'" .
+ \ " | sil! exe 'nunmap <buffer> <Plug>Comment'" .
+ \ " | sil! exe 'nunmap <buffer> <Plug>DeComment'" .
+ \ " | sil! exe 'vunmap <buffer> <Plug>VisualTraditional'" .
+ \ " | sil! exe 'vunmap <buffer> <Plug>VisualComment'" .
+ \ " | sil! exe 'iunmap <buffer> <Plug>VisualDeComment'" .
+ \ " | sil! exe 'unmap <buffer> [['" .
+ \ " | sil! exe 'unmap <buffer> ]]'" .
+ \ " | sil! exe 'unmap <buffer> []'" .
+ \ " | sil! exe 'unmap <buffer> ]['"
+endif
+
+if !exists("g:no_plugin_maps") && !exists("g:no_cobol_maps")
+ if version >= 700
+ nnoremap <silent> <buffer> > :set opfunc=<SID>IncreaseFunc<CR>g@
+ nnoremap <silent> <buffer> < :set opfunc=<SID>DecreaseFunc<CR>g@
+ endif
+ nnoremap <silent> <buffer> >> :call CobolIndentBlock(1)<CR>
+ nnoremap <silent> <buffer> << :call CobolIndentBlock(-1)<CR>
+ vnoremap <silent> <buffer> > :call CobolIndentBlock(v:count1)<CR>
+ vnoremap <silent> <buffer> < :call CobolIndentBlock(-v:count1)<CR>
+ inoremap <silent> <buffer> <C-T> <C-R>=<SID>IncreaseIndent()<CR><C-R>=<SID>RestoreShiftwidth()<CR>
+ inoremap <silent> <buffer> <C-D> <C-R>=<SID>DecreaseIndent()<CR><C-R>=<SID>RestoreShiftwidth()<CR>
+ if !maparg("<Tab>","i")
+ inoremap <silent> <buffer> <Tab> <C-R>=<SID>Tab()<CR><C-R>=<SID>RestoreShiftwidth()<CR>
+ endif
+ noremap <silent> <buffer> [[ m':call search('\c^\%(\s*\<Bar>.\{6\}\s\+\)\zs[A-Za-z0-9-]\+\s\+\%(division\<Bar>section\)\s*\.','bW')<CR>
+ noremap <silent> <buffer> ]] m':call search('\c^\%(\s*\<Bar>.\{6\}\s\+\)\zs[A-Za-z0-9-]\+\s\+\%(division\<Bar>section\)\.','W')<CR>
+ noremap <silent> <buffer> [] m':call <SID>toend('b')<CR>
+ noremap <silent> <buffer> ][ m':call <SID>toend('')<CR>
+ " For EnhancedCommentify
+ noremap <silent> <buffer> <Plug>Traditional :call <SID>Comment('t')<CR>
+ noremap <silent> <buffer> <Plug>Comment :call <SID>Comment('c')<CR>
+ noremap <silent> <buffer> <Plug>DeComment :call <SID>Comment('u')<CR>
+ noremap <silent> <buffer> <Plug>VisualTraditional :'<,'>call <SID>Comment('t')<CR>
+ noremap <silent> <buffer> <Plug>VisualComment :'<,'>call <SID>Comment('c')<CR>
+ noremap <silent> <buffer> <Plug>VisualDeComment :'<,'>call <SID>Comment('u')<CR>
+endif
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
+
+if exists("g:did_cobol_ftplugin_functions")
+ finish
+endif
+let g:did_cobol_ftplugin_functions = 1
+
+function! s:repeat(str,count)
+ let i = 0
+ let ret = ""
+ while i < a:count
+ let ret = ret . a:str
+ let i = i + 1
+ endwhile
+ return ret
+endfunction
+
+function! s:increase(...)
+ let lnum = '.'
+ let sw = shiftwidth()
+ let i = a:0 ? a:1 : indent(lnum)
+ if i >= 11
+ return sw - (i - 11) % sw
+ elseif i >= 7
+ return 11-i
+ elseif i == 6
+ return 1
+ else
+ return 6-i
+ endif
+endfunction
+
+function! s:decrease(...)
+ let lnum = '.'
+ let sw = shiftwidth()
+ let i = indent(a:0 ? a:1 : lnum)
+ if i >= 11 + sw
+ return 1 + (i + 12) % sw
+ elseif i > 11
+ return i-11
+ elseif i > 7
+ return i-7
+ elseif i == 7
+ return 1
+ else
+ return i
+ endif
+endfunction
+
+function! CobolIndentBlock(shift)
+ let head = strpart(getline('.'),0,7)
+ let tail = strpart(getline('.'),7)
+ let indent = match(tail,'[^ ]')
+ let sw = shiftwidth()
+ let shift = a:shift
+ if shift > 0
+ if indent < 4
+ let tail = s:repeat(" ",4-indent).tail
+ let shift = shift - 1
+ endif
+ let tail = s:repeat(" ",shift*sw).tail
+ let shift = 0
+ elseif shift < 0
+ if (indent-4) > -shift * sw
+ let tail = strpart(tail,-shift * sw)
+ elseif (indent-4) > (-shift-1) * sw
+ let tail = strpart(tail,indent - 4)
+ else
+ let tail = strpart(tail,indent)
+ endif
+ endif
+ call setline('.',head.tail)
+endfunction
+
+function! s:IncreaseFunc(type)
+ '[,']call CobolIndentBlock(1)
+endfunction
+
+function! s:DecreaseFunc(type)
+ '[,']call CobolIndentBlock(-1)
+endfunction
+
+function! s:IncreaseIndent()
+ let c = "\<C-T>"
+ if exists("*InsertCtrlTWrapper")
+ let key = InsertCtrlTWrapper()
+ if key != c
+ return key
+ endif
+ endif
+ let interval = s:increase()
+ let b:cobol_shiftwidth = &shiftwidth
+ let &shiftwidth = 1
+ let lastchar = strpart(getline('.'),col('.')-2,1)
+ if lastchar == '0' || lastchar == '^'
+ return "\<BS>".lastchar.c
+ else
+ return s:repeat(c,interval)
+ endif
+endfunction
+
+function! s:DecreaseIndent()
+ let c = "\<C-D>"
+ if exists("*InsertCtrlDWrapper")
+ " I hack Ctrl-D to delete when not at the end of the line.
+ let key = InsertCtrlDWrapper()
+ if key != c
+ return key
+ endif
+ endif
+ let interval = s:decrease()
+ let b:cobol_shiftwidth = &shiftwidth
+ let &shiftwidth = 1
+ return s:repeat(c,interval)
+endfunction
+
+function! s:RestoreShiftwidth()
+ if exists("b:cobol_shiftwidth")
+ let &shiftwidth=b:cobol_shiftwidth
+ unlet b:cobol_shiftwidth
+ endif
+ return ""
+endfunction
+
+function! s:Tab()
+ if (strpart(getline('.'),0,col('.')-1) =~ '^\s*$' && &sta)
+ return s:IncreaseIndent()
+ " &softtabstop < 0: &softtabstop follows &shiftwidth
+ elseif (&sts < 0 || &sts == shiftwidth()) && &sts != 8 && &et
+ return s:repeat(" ",s:increase(col('.')-1))
+ else
+ return "\<Tab>"
+ endif
+endfunction
+
+function! s:Comment(arg)
+ " For EnhancedCommentify
+ let line = getline('.')
+ if (line =~ '^.\{6\}[*/C]' || a:arg == 'c') && a:arg != 'u'
+ let line = substitute(line,'^.\{6\}\zs.',' ','')
+ else
+ let line = substitute(line,'^.\{6\}\zs.','*','')
+ endif
+ call setline('.',line)
+endfunction
+
+function! s:toend(direction)
+ let ignore = '^\(\s*\|.\{6\}\)\%([*/]\|\s*$\)'
+ let keep = line('.')
+ keepjumps +
+ while line('.') < line('$') && getline('.') =~ ignore
+ keepjumps +
+ endwhile
+ let res = search('\c^\%(\s*\|.\{6\}\s\+\)\zs[A-Za-z0-9-]\+\s\+\%(division\|section\)\s*\.',a:direction.'W')
+ if a:direction != 'b' && !res
+ let res = line('$')
+ keepjumps $
+ elseif res
+ keepjumps -
+ endif
+ if res
+ while line('.') > 1 && getline('.') =~ ignore
+ keepjumps -
+ endwhile
+ if line('.') == 1 && getline('.') =~ ignore
+ exe "keepjumps ".keep
+ endif
+ else
+ exe "keepjumps ".keep
+ endif
+endfunction
diff --git a/mnv/runtime/ftplugin/codeowners.mnv b/mnv/runtime/ftplugin/codeowners.mnv
new file mode 100644
index 0000000000..c2d6c75f06
--- /dev/null
+++ b/mnv/runtime/ftplugin/codeowners.mnv
@@ -0,0 +1,14 @@
+" MNV filetype plugin
+" Language: codeowners
+" Maintainer: Jon Parise <jon@indelible.org>
+" Last Change: 2025 Sep 14
+"
+if exists('b:did_ftplugin')
+ finish
+endif
+let b:did_ftplugin = 1
+
+setl comments=:# commentstring=#\ %s
+setl formatoptions-=t formatoptions+=croql
+
+let b:undo_ftplugin = 'setl com< cms< fo<'
diff --git a/mnv/runtime/ftplugin/conf.mnv b/mnv/runtime/ftplugin/conf.mnv
new file mode 100644
index 0000000000..472db6a905
--- /dev/null
+++ b/mnv/runtime/ftplugin/conf.mnv
@@ -0,0 +1,19 @@
+" MNV filetype plugin file
+" Language: generic configuration file
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2008-07-09
+
+if exists("b:did_ftplugin")
+ finish
+endif
+let b:did_ftplugin = 1
+
+let s:cpo_save = &cpo
+set cpo&mnv
+
+let b:undo_ftplugin = "setl com< cms< fo<"
+
+setlocal comments=:# commentstring=#\ %s formatoptions-=t formatoptions+=croql
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/mnv/runtime/ftplugin/config.mnv b/mnv/runtime/ftplugin/config.mnv
new file mode 100644
index 0000000000..1e463c223d
--- /dev/null
+++ b/mnv/runtime/ftplugin/config.mnv
@@ -0,0 +1,49 @@
+" MNV filetype plugin file
+" Language: config
+"
+" This runtime file is looking for a new maintainer.
+"
+" Former maintainer: Dan Sharp
+" Last Change: 2009 Jan 20
+" 2024 Jan 14 by MNV Project (browsefilter)
+
+if exists("b:did_ftplugin") | finish | endif
+
+" Make sure the continuation lines below do not cause problems in
+" compatibility mode.
+let s:save_cpo = &cpo
+set cpo-=C
+
+" Define some defaults in case the included ftplugins don't set them.
+let s:undo_ftplugin = ""
+let s:browsefilter = "Bourne Shell Files (*.sh)\t*.sh\n"
+if has("win32")
+ let s:browsefilter .= "All Files (*.*)\t*\n"
+else
+ let s:browsefilter .= "All Files (*)\t*\n"
+endif
+let s:match_words = ""
+
+runtime! ftplugin/sh.mnv ftplugin/sh_*.mnv ftplugin/sh/*.mnv
+let b:did_ftplugin = 1
+
+" Override our defaults if these were set by an included ftplugin.
+if exists("b:undo_ftplugin")
+ let s:undo_ftplugin = b:undo_ftplugin
+endif
+if exists("b:browsefilter")
+ let s:browsefilter = b:browsefilter
+endif
+
+" Change the :browse e filter to primarily show configure-related files.
+if (has("gui_win32") || has("gui_gtk")) && !exists("b:browsefilter")
+ let b:browsefilter="Configure Scripts (configure.*, config.*)\tconfigure*;config.*\n" .
+ \ s:browsefilter
+endif
+
+" Undo the stuff we changed.
+let b:undo_ftplugin = "unlet! b:browsefilter | " . b:undo_ftplugin
+
+" Restore the saved compatibility options.
+let &cpo = s:save_cpo
+unlet s:save_cpo
diff --git a/mnv/runtime/ftplugin/confini.mnv b/mnv/runtime/ftplugin/confini.mnv
new file mode 100644
index 0000000000..9a30c7eada
--- /dev/null
+++ b/mnv/runtime/ftplugin/confini.mnv
@@ -0,0 +1,10 @@
+" MNV filetype plugin file
+" Language: confini
+
+" Quit if a ftplugin file was already loaded
+if exists("b:did_ftplugin")
+ finish
+endif
+
+" Use the cfg plugin, it's similar enough.
+runtime! ftplugin/cfg.mnv
diff --git a/mnv/runtime/ftplugin/context.mnv b/mnv/runtime/ftplugin/context.mnv
new file mode 100644
index 0000000000..187e9278fd
--- /dev/null
+++ b/mnv/runtime/ftplugin/context.mnv
@@ -0,0 +1,117 @@
+mnv9script
+
+# MNV filetype plugin file
+# Language: ConTeXt typesetting engine
+# Maintainer: Nicola Vitacolonna <nvitacolonna@gmail.com>
+# Former Maintainers: Nikolai Weibull <now@bitwi.se>
+# Latest Revision: 2026 Jan 10
+
+if exists("b:did_ftplugin")
+ finish
+endif
+
+import autoload '../autoload/context.mnv'
+
+b:did_ftplugin = 1
+
+b:undo_ftplugin = "setl com< cms< def< inc< sua< fo< ofu<"
+
+setlocal comments=b:%D,b:%C,b:%M,:%
+setlocal commentstring=%\ %s
+setlocal formatoptions+=tjcroql2
+setlocal omnifunc=context.Complete
+setlocal suffixesadd=.tex,.mkxl,.mkvi,.mkiv,.mkii
+
+&l:define = '\\\%([egx]\|char\|mathchar\|count\|dimen\|muskip\|skip\|toks\)\='
+.. 'def\|\\font\|\\\%(future\)\=let'
+.. '\|\\new\%(count\|dimen\|skip\|muskip\|box\|toks\|read\|write'
+.. '\|fam\|insert\|if\)'
+
+&l:include = '^\s*\\\%(input\|component\|product\|project\|environment\)'
+
+if exists("g:loaded_matchit") && !exists("b:match_words")
+ b:match_ignorecase = 0
+ b:match_skip = 'r:\\\@<!\%(\\\\\)*%'
+ b:match_words = '(:),\[:],{:},\\(:\\),\\\[:\\],\\start\(\a\+\):\\stop\1'
+ b:undo_ftplugin ..= "| unlet! b:match_ignorecase b:match_words b:match_skip"
+endif
+
+if !get(g:, 'no_context_maps', 0) && !get(g:, 'no_plugin_maps', 0)
+ const context_regex = {
+ 'beginsection': '\\\%(start\)\=\%(\%(sub\)*section\|\%(sub\)*subject\|chapter\|part\|component\|product\|title\)\>',
+ 'endsection': '\\\%(stop\)\=\%(\%(sub\)*section\|\%(sub\)*subject\|chapter\|part\|component\|product\|title\)\>',
+ 'beginblock': '\\\%(start\|setup\|define\)',
+ 'endblock': '\\\%(stop\|setup\|define\)',
+ }
+
+ def UndoMap(mapping: string, modes: string)
+ for mode in modes
+ b:undo_ftplugin ..= printf(" | silent! execute '%sunmap <buffer> %s'", mode, mapping)
+ endfor
+ enddef
+
+ def MoveAround(count: number, what: string, flags: string)
+ search(context_regex[what], flags .. 's') # 's' sets previous context mark
+ var i = 2
+ while i <= count
+ search(context_regex[what], flags)
+ i += 1
+ endwhile
+ enddef
+
+ # Macros to move around
+ nnoremap <silent><buffer> [[ <scriptcmd>MoveAround(v:count1, "beginsection", "bW")<cr>
+ vnoremap <silent><buffer> [[ <scriptcmd>MoveAround(v:count1, "beginsection", "bW")<cr>
+ nnoremap <silent><buffer> ]] <scriptcmd>MoveAround(v:count1, "beginsection", "W") <cr>
+ vnoremap <silent><buffer> ]] <scriptcmd>MoveAround(v:count1, "beginsection", "W") <cr>
+ nnoremap <silent><buffer> [] <scriptcmd>MoveAround(v:count1, "endsection", "bW")<cr>
+ vnoremap <silent><buffer> [] <scriptcmd>MoveAround(v:count1, "endsection", "bW")<cr>
+ nnoremap <silent><buffer> ][ <scriptcmd>MoveAround(v:count1, "endsection", "W") <cr>
+ vnoremap <silent><buffer> ][ <scriptcmd>MoveAround(v:count1, "endsection", "W") <cr>
+ nnoremap <silent><buffer> [{ <scriptcmd>MoveAround(v:count1, "beginblock", "bW")<cr>
+ vnoremap <silent><buffer> [{ <scriptcmd>MoveAround(v:count1, "beginblock", "bW")<cr>
+ nnoremap <silent><buffer> ]} <scriptcmd>MoveAround(v:count1, "endblock", "W") <cr>
+ vnoremap <silent><buffer> ]} <scriptcmd>MoveAround(v:count1, "endblock", "W") <cr>
+
+ for mapping in ['[[', ']]', '[]', '][', '[{', ']}']
+ UndoMap(mapping, 'nv')
+ endfor
+
+ # Other useful mappings
+ const tp_regex = '?^$\|^\s*\\\(item\|start\|stop\|blank\|\%(sub\)*section\|chapter\|\%(sub\)*subject\|title\|part\)'
+
+ def TeXPar()
+ cursor(search(tp_regex, 'bcW') + 1, 1)
+ normal! V
+ cursor(search(tp_regex, 'W') - 1, 1)
+ enddef
+
+ # Reflow paragraphs with mappings like gqtp ("gq TeX paragraph")
+ onoremap <silent><buffer> tp <scriptcmd>TeXPar()<cr>
+ # Select TeX paragraph
+ vnoremap <silent><buffer> tp <scriptcmd>TeXPar()<cr>
+
+ # $...$ text object
+ onoremap <silent><buffer> i$ <scriptcmd>normal! T$vt$<cr>
+ onoremap <silent><buffer> a$ <scriptcmd>normal! F$vf$<cr>
+ vnoremap <buffer> i$ T$ot$
+ vnoremap <buffer> a$ F$of$
+
+ for mapping in ['tp', 'i$', 'a$']
+ UndoMap(mapping, 'ov')
+ endfor
+endif
+
+if !exists('current_compiler')
+ b:undo_ftplugin ..= "| compiler make"
+ compiler context
+endif
+
+b:undo_ftplugin ..= "| sil! delc -buffer ConTeXt | sil! delc -buffer ConTeXtLog | sil! delc -buffer ConTeXtJobStatus | sil! delc -buffer ConTeXtStopJobs"
+# Commands for asynchronous typesetting
+command! -buffer -nargs=? -complete=buffer ConTeXt context.Typeset(<q-args>)
+command! -buffer -nargs=0 ConTeXtLog context.Log(bufname('%'))
+command! -nargs=0 ConTeXtJobStatus context.JobStatus()
+command! -nargs=0 ConTeXtStopJobs context.StopJobs()
+
+# mnv: sw=2 fdm=marker
diff --git a/mnv/runtime/ftplugin/cook.mnv b/mnv/runtime/ftplugin/cook.mnv
new file mode 100644
index 0000000000..3ffb009bb9
--- /dev/null
+++ b/mnv/runtime/ftplugin/cook.mnv
@@ -0,0 +1,13 @@
+" MNV filetype plugin
+" Language: Cooklang
+" Maintainer: Riley Bruins <ribru17@gmail.com>
+" Last Change: 2024 Nov 03
+
+if exists('b:did_ftplugin')
+ finish
+endif
+let b:did_ftplugin = 1
+
+setl comments=:-- commentstring=--\ %s
+
+let b:undo_ftplugin = 'setl com< cms<'
diff --git a/mnv/runtime/ftplugin/corn.mnv b/mnv/runtime/ftplugin/corn.mnv
new file mode 100644
index 0000000000..15ab73a87d
--- /dev/null
+++ b/mnv/runtime/ftplugin/corn.mnv
@@ -0,0 +1,18 @@
+" MNV filetype plugin
+" Language: Corn
+" Original Author: Jake Stanger (mail@jstanger.dev)
+" License: MIT
+" Last Change: 2023 May 28
+
+if exists('b:did_ftplugin')
+ finish
+endif
+let b:did_ftplugin = 1
+
+setlocal formatoptions-=t
+
+" Set comment (formatting) related options.
+setlocal commentstring=//\ %s comments=://
+
+" Let MNV know how to disable the plug-in.
+let b:undo_ftplugin = 'setlocal commentstring< comments< formatoptions<'
diff --git a/mnv/runtime/ftplugin/cpp.mnv b/mnv/runtime/ftplugin/cpp.mnv
new file mode 100644
index 0000000000..5c3f746359
--- /dev/null
+++ b/mnv/runtime/ftplugin/cpp.mnv
@@ -0,0 +1,22 @@
+" MNV filetype plugin file
+" Language: C++
+" Maintainer: The MNV Project <https://github.com/Project-Tick/Project-Tick>
+" Last Change: 2024 Jun 06
+" Former Maintainer: Bram Moolenaar <Bram@mnv.org>
+
+" Only do this when not done yet for this buffer
+if exists("b:did_ftplugin")
+ finish
+endif
+
+" Behaves mostly just like C
+runtime! ftplugin/c.mnv ftplugin/c_*.mnv ftplugin/c/*.mnv
+
+" Change 'commentstring' to "C++ style"/"mono-line" comments
+setlocal commentstring=//\ %s
+let b:undo_ftplugin ..= ' | setl commentstring<'
+
+" C++ uses templates with <things>
+" Disabled, because it gives an error for typing an unmatched ">".
+" set matchpairs+=<:>
+" let b:undo_ftplugin ..= ' | setl matchpairs<'
diff --git a/mnv/runtime/ftplugin/crm.mnv b/mnv/runtime/ftplugin/crm.mnv
new file mode 100644
index 0000000000..010769dfe2
--- /dev/null
+++ b/mnv/runtime/ftplugin/crm.mnv
@@ -0,0 +1,19 @@
+" MNV filetype plugin file
+" Language: CRM114
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2008-07-09
+
+if exists("b:did_ftplugin")
+ finish
+endif
+let b:did_ftplugin = 1
+
+let s:cpo_save = &cpo
+set cpo&mnv
+
+let b:undo_ftplugin = "setl com< cms< fo<"
+
+setlocal comments=:# commentstring=#\ %s formatoptions-=t formatoptions+=croql
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/mnv/runtime/ftplugin/crontab.mnv b/mnv/runtime/ftplugin/crontab.mnv
new file mode 100644
index 0000000000..901a1327cb
--- /dev/null
+++ b/mnv/runtime/ftplugin/crontab.mnv
@@ -0,0 +1,16 @@
+" MNV filetype plugin
+" Language: crontab
+" Maintainer: Keith Smiley <keithbsmiley@gmail.com>
+" Last Change: 2022 Sep 11
+
+" Only do this when not done yet for this buffer
+if exists("b:did_ftplugin")
+ finish
+endif
+
+" Don't load another plugin for this buffer
+let b:did_ftplugin = 1
+
+let b:undo_ftplugin = "setl commentstring<"
+
+setlocal commentstring=#\ %s
diff --git a/mnv/runtime/ftplugin/cs.mnv b/mnv/runtime/ftplugin/cs.mnv
new file mode 100644
index 0000000000..280723b6bb
--- /dev/null
+++ b/mnv/runtime/ftplugin/cs.mnv
@@ -0,0 +1,51 @@
+" MNV filetype plugin file
+" Language: C#
+" Maintainer: Nick Jensen <nickspoon@gmail.com>
+" Former Maintainer: Johannes Zellner <johannes@zellner.org>
+" Last Change: 2025-03-14
+" License: MNV (see :h license)
+" Repository: https://github.com/nickspoons/mnv-cs
+
+if exists('b:did_ftplugin')
+ finish
+endif
+let b:did_ftplugin = 1
+
+let s:save_cpo = &cpoptions
+set cpoptions&mnv
+
+" Set 'formatoptions' to break comment lines but not other lines,
+" and insert the comment leader when hitting <CR> or using "o".
+setlocal formatoptions-=t formatoptions+=croql
+
+" Set 'comments' to format dashed lists in comments.
+setlocal comments=sO:*\ -,mO:*\ \ ,exO:*/,s1:/*,mb:*,ex:*/,:///,://
+setlocal commentstring=//\ %s
+
+setlocal cinoptions=J1
+
+let b:undo_ftplugin = 'setl com< fo< cino<'
+
+if exists('loaded_matchit') && !exists('b:match_words')
+ " #if/#endif support included by default
+ let b:match_ignorecase = 0
+ let b:match_words = '\%(^\s*\)\@<=#\s*region\>:\%(^\s*\)\@<=#\s*endregion\>,'
+ let b:undo_ftplugin .= ' | unlet! b:match_ignorecase b:match_words'
+endif
+
+if (has('gui_win32') || has('gui_gtk')) && !exists('b:browsefilter')
+ let b:browsefilter = "C# Source Files (*.cs, *.csx)\t*.cs;*.csx\n" .
+ \ "C# Project Files (*.csproj)\t*.csproj\n" .
+ \ "Visual Studio Solution Files (*.sln)\t*.sln\n"
+ if has("win32")
+ let b:browsefilter ..= "All Files (*.*)\t*\n"
+ else
+ let b:browsefilter ..= "All Files (*)\t*\n"
+ endif
+ let b:undo_ftplugin .= ' | unlet! b:browsefilter'
+endif
+
+let &cpoptions = s:save_cpo
+unlet s:save_cpo
+
+" mnv:et:sw=2:sts=2
diff --git a/mnv/runtime/ftplugin/csc.mnv b/mnv/runtime/ftplugin/csc.mnv
new file mode 100644
index 0000000000..d4b23da1d8
--- /dev/null
+++ b/mnv/runtime/ftplugin/csc.mnv
@@ -0,0 +1,29 @@
+" MNV filetype plugin file
+" Language: csc
+"
+" This runtime file is looking for a new maintainer.
+"
+" Former maintainer: Dan Sharp
+" Last Changed: 20 Jan 2009
+
+if exists("b:did_ftplugin") | finish | endif
+let b:did_ftplugin = 1
+
+" Make sure the continuation lines below do not cause problems in
+" compatibility mode.
+let s:save_cpo = &cpo
+set cpo-=C
+
+if exists("loaded_matchit")
+ let b:match_words=
+ \ '\<fix\>:\<endfix\>,' .
+ \ '\<if\>:\<else\%(if\)\=\>:\<endif\>,' .
+ \ '\<!loopondimensions\>\|\<!looponselected\>:\<!endloop\>'
+endif
+
+" Undo the stuff we changed.
+let b:undo_ftplugin = "unlet! b:match_words"
+
+" Restore the saved compatibility options.
+let &cpo = s:save_cpo
+unlet s:save_cpo
diff --git a/mnv/runtime/ftplugin/csh.mnv b/mnv/runtime/ftplugin/csh.mnv
new file mode 100644
index 0000000000..8af49bd51d
--- /dev/null
+++ b/mnv/runtime/ftplugin/csh.mnv
@@ -0,0 +1,82 @@
+" MNV filetype plugin file
+" Language: csh
+" Maintainer: Doug Kearns <dougkearns@gmail.com>
+" Previous Maintainer: Dan Sharp
+" Contributor: Johannes Zellner <johannes@zellner.org>
+" Riley Bruins <ribru17@gmail.com>
+" Last Change: 2026 Jan 16
+
+if exists("b:did_ftplugin")
+ finish
+endif
+let b:did_ftplugin = 1
+
+let s:save_cpo = &cpo
+set cpo-=C
+
+setlocal comments=:#
+setlocal commentstring=#\ %s
+setlocal formatoptions-=t
+setlocal formatoptions+=crql
+
+let b:undo_ftplugin = "setlocal com< cms< fo<"
+
+if exists("loaded_matchit") && !exists("b:match_words")
+ let b:match_ignorecase = 0
+ let b:match_words = "CshMatchWords()"
+ let b:match_skip = "CshMatchSkip()"
+ let b:undo_ftplugin ..= " | unlet! b:match_ignorecase b:match_skip b:match_words"
+endif
+
+" skip single line 'if' commands
+function CshMatchSkip()
+ return getline(".") =~# '^\s*if\>' && !s:CshIsIfThenCommand()
+endfunction
+
+function CshMatchWords()
+ let line_start = '\%(^\s*\)\@<='
+ let match_words =
+ \ line_start .. '\%(foreach\s\+\h\w*\s*(\|while\>\):' ..
+ \ '\<break\>:\<continue\>:' ..
+ \ line_start .. 'end\>,' ..
+ \ line_start .. 'switch\s*(:' ..
+ \ line_start .. 'case\s\+:' .. line_start .. 'default\>:\<breaksw\>:' ..
+ \ line_start .. 'endsw\>'
+
+ if expand("<cword>") =~# '\<if\>' && !s:CshIsIfThenCommand()
+ return match_words
+ else
+ return match_words .. "," ..
+ \ line_start .. 'if\>:' ..
+ \ line_start .. 'else\s\+if\>:' .. line_start .. 'else\>:' ..
+ \ line_start .. 'endif\>'
+ endif
+endfunction
+
+function s:CshIsIfThenCommand()
+ let lnum = line(".")
+ let line = getline(lnum)
+
+ " join continued lines
+ while lnum < line("$") && line =~ '^\%([^\\]\|\\\\\)*\\$'
+ let lnum += 1
+ let line = substitute(line, '\\$', '', '') .. getline(lnum)
+ endwhile
+
+ " TODO: confirm with syntax checks when the highlighting is more accurate
+ return line =~# '^\s*if\>.*\<then\s*\%(#.*\)\=$'
+endfunction
+
+if (has("gui_win32") || has("gui_gtk")) && !exists("b:browsefilter")
+ let b:browsefilter = "csh Scripts (*.csh)\t*.csh\n"
+ if has("win32")
+ let b:browsefilter ..= "All Files (*.*)\t*\n"
+ else
+ let b:browsefilter ..= "All Files (*)\t*\n"
+ endif
+ let b:csh_set_browsefilter = 1
+ let b:undo_ftplugin ..= " | unlet! b:browsefilter b:csh_set_browsefilter"
+endif
+
+let &cpo = s:save_cpo
+unlet s:save_cpo
diff --git a/mnv/runtime/ftplugin/css.mnv b/mnv/runtime/ftplugin/css.mnv
new file mode 100644
index 0000000000..08664f8919
--- /dev/null
+++ b/mnv/runtime/ftplugin/css.mnv
@@ -0,0 +1,26 @@
+" MNV filetype plugin file
+" Language: CSS
+" Maintainer: Doug Kearns <dougkearns@gmail.com>
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Last Change: 2020 Dec 21
+" 2024 Jun 02 by Riley Bruins <ribru17@gmail.com> ('commentstring')
+
+if exists("b:did_ftplugin")
+ finish
+endif
+let b:did_ftplugin = 1
+
+let s:cpo_save = &cpo
+set cpo&mnv
+
+let b:undo_ftplugin = "setl com< cms< inc< fo< ofu< isk<"
+
+setlocal comments=s1:/*,mb:*,ex:*/ commentstring=/*\ %s\ */
+setlocal formatoptions-=t formatoptions+=croql
+setlocal omnifunc=csscomplete#CompleteCSS
+setlocal iskeyword+=-
+
+let &l:include = '^\s*@import\s\+\%(url(\)\='
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/mnv/runtime/ftplugin/csv.mnv b/mnv/runtime/ftplugin/csv.mnv
new file mode 100644
index 0000000000..5e76e86412
--- /dev/null
+++ b/mnv/runtime/ftplugin/csv.mnv
@@ -0,0 +1,23 @@
+mnv9script
+
+# Maintainer: Maxim Kim <habamax@gmail.com>
+# Last Update: 2024-06-18
+
+if !exists("b:csv_delimiter")
+ # detect delimiter
+ var delimiters = ",;\t|"
+
+ var max = 0
+ for d in delimiters
+ var count = getline(1)->split(d)->len() + getline(2)->split(d)->len()
+ if count > max
+ max = count
+ b:csv_delimiter = d
+ endif
+ endfor
+endif
+
+if exists("b:did_ftplugin")
+ finish
+endif
+b:did_ftplugin = 1
diff --git a/mnv/runtime/ftplugin/cucumber.mnv b/mnv/runtime/ftplugin/cucumber.mnv
new file mode 100644
index 0000000000..2ba874bc33
--- /dev/null
+++ b/mnv/runtime/ftplugin/cucumber.mnv
@@ -0,0 +1,150 @@
+" MNV filetype plugin
+" Language: Cucumber
+" Maintainer: Tim Pope <mnvNOSPAM@tpope.org>
+" Last Change: 2016 Aug 29
+
+" Only do this when not done yet for this buffer
+if (exists("b:did_ftplugin"))
+ finish
+endif
+let b:did_ftplugin = 1
+
+let s:keepcpo= &cpo
+set cpo&mnv
+
+setlocal formatoptions-=t formatoptions+=croql
+setlocal comments=:# commentstring=#\ %s
+setlocal omnifunc=CucumberComplete
+
+let b:undo_ftplugin = "setl fo< com< cms< ofu<"
+
+let b:cucumber_root = expand('%:p:h:s?.*[\/]\%(features\|stories\)\zs[\/].*??')
+if !exists("b:cucumber_steps_glob")
+ let b:cucumber_steps_glob = b:cucumber_root.'/**/*.rb'
+endif
+
+if !exists("g:no_plugin_maps") && !exists("g:no_cucumber_maps")
+ cnoremap <SID>foldopen <Bar>if &foldopen =~# 'tag'<Bar>exe 'norm! zv'<Bar>endif
+ nnoremap <silent> <script> <buffer> [<C-D> :<C-U>exe <SID>jump('edit',v:count)<SID>foldopen<CR>
+ nnoremap <silent> <script> <buffer> ]<C-D> :<C-U>exe <SID>jump('edit',v:count)<SID>foldopen<CR>
+ nnoremap <silent> <script> <buffer> <C-W>d :<C-U>exe <SID>jump('split',v:count)<SID>foldopen<CR>
+ nnoremap <silent> <script> <buffer> <C-W><C-D> :<C-U>exe <SID>jump('split',v:count)<SID>foldopen<CR>
+ nnoremap <silent> <script> <buffer> [d :<C-U>exe <SID>jump('pedit',v:count)<CR>
+ nnoremap <silent> <script> <buffer> ]d :<C-U>exe <SID>jump('pedit',v:count)<CR>
+ let b:undo_ftplugin .=
+ \ "|sil! nunmap <buffer> [<C-D>" .
+ \ "|sil! nunmap <buffer> ]<C-D>" .
+ \ "|sil! nunmap <buffer> <C-W>d" .
+ \ "|sil! nunmap <buffer> <C-W><C-D>" .
+ \ "|sil! nunmap <buffer> [d" .
+ \ "|sil! nunmap <buffer> ]d"
+endif
+
+function! s:jump(command,count)
+ let steps = s:steps('.')
+ if len(steps) == 0 || len(steps) < a:count
+ return 'echoerr "No matching step found"'
+ elseif len(steps) > 1 && !a:count
+ return 'echoerr "Multiple matching steps found"'
+ else
+ let c = a:count ? a:count-1 : 0
+ return a:command.' +'.steps[c][1].' '.escape(steps[c][0],' %#')
+ endif
+endfunction
+
+function! s:allsteps()
+ let step_pattern = '\C^\s*\K\k*\>\s*(\=\s*\zs\S.\{-\}\ze\s*)\=\s*\%(do\|{\)\s*\%(|[^|]*|\s*\)\=\%($\|#\)'
+ let steps = []
+ for file in split(glob(b:cucumber_steps_glob),"\n")
+ let lines = readfile(file)
+ let num = 0
+ for line in lines
+ let num += 1
+ if line =~ step_pattern
+ let type = matchstr(line,'\w\+')
+ let steps += [[file,num,type,matchstr(line,step_pattern)]]
+ endif
+ endfor
+ endfor
+ return steps
+endfunction
+
+function! s:steps(lnum)
+ let c = match(getline(a:lnum), '\S') + 1
+ while synIDattr(synID(a:lnum,c,1),'name') !~# '^$\|Region$'
+ let c = c + 1
+ endwhile
+ let step = matchstr(getline(a:lnum)[c-1 : -1],'^\s*\zs.\{-\}\ze\s*$')
+ return filter(s:allsteps(),'s:stepmatch(v:val[3],step)')
+endfunction
+
+function! s:stepmatch(receiver,target)
+ if a:receiver =~ '^[''"].*[''"]$'
+ let pattern = '^'.escape(substitute(a:receiver[1:-2],'$\w\+','(.*)','g'),'/').'$'
+ elseif a:receiver =~ '^/.*/$'
+ let pattern = a:receiver[1:-2]
+ elseif a:receiver =~ '^%r..*.$'
+ let pattern = escape(a:receiver[3:-2],'/')
+ else
+ return 0
+ endif
+ try
+ let mnvpattern = substitute(substitute(pattern,'\\\@<!(?:','%(','g'),'\\\@<!\*?','{-}','g')
+ if a:target =~# '\v'.mnvpattern
+ return 1
+ endif
+ catch
+ endtry
+ if has("ruby") && pattern !~ '\\\@<!#{'
+ ruby MNV.command("return #{if (begin; Kernel.eval('/'+MNV.evaluate('pattern')+'/'); rescue SyntaxError; end) === MNV.evaluate('a:target') then 1 else 0 end}")
+ else
+ return 0
+ endif
+endfunction
+
+function! s:bsub(target,pattern,replacement)
+ return substitute(a:target,'\C\\\@<!'.a:pattern,a:replacement,'g')
+endfunction
+
+function! CucumberComplete(findstart,base) abort
+ let indent = indent('.')
+ let group = synIDattr(synID(line('.'),indent+1,1),'name')
+ let type = matchstr(group,'\Ccucumber\zs\%(Given\|When\|Then\)')
+ let e = matchend(getline('.'),'^\s*\S\+\s')
+ if type == '' || col('.') < col('$') || e < 0
+ return -1
+ endif
+ if a:findstart
+ return e
+ endif
+ let steps = []
+ for step in s:allsteps()
+ if step[2] ==# type
+ if step[3] =~ '^[''"]'
+ let steps += [step[3][1:-2]]
+ elseif step[3] =~ '^/\^.*\$/$'
+ let pattern = step[3][2:-3]
+ let pattern = substitute(pattern,'\C^(?:|I )','I ','')
+ let pattern = s:bsub(pattern,'\\[Sw]','w')
+ let pattern = s:bsub(pattern,'\\d','1')
+ let pattern = s:bsub(pattern,'\\[sWD]',' ')
+ let pattern = s:bsub(pattern,'\[\^\\\="\]','_')
+ let pattern = s:bsub(pattern,'[[:alnum:]. _-][?*]?\=','')
+ let pattern = s:bsub(pattern,'\[\([^^]\).\{-\}\]','\1')
+ let pattern = s:bsub(pattern,'+?\=','')
+ let pattern = s:bsub(pattern,'(\([[:alnum:]. -]\{-\}\))','\1')
+ let pattern = s:bsub(pattern,'\\\([[:punct:]]\)','\1')
+ if pattern !~ '[\\()*?]'
+ let steps += [pattern]
+ endif
+ endif
+ endif
+ endfor
+ call filter(steps,'strpart(v:val,0,strlen(a:base)) ==# a:base')
+ return sort(steps)
+endfunction
+
+let &cpo = s:keepcpo
+unlet s:keepcpo
+
+" mnv:set sts=2 sw=2:
diff --git a/mnv/runtime/ftplugin/cuda.mnv b/mnv/runtime/ftplugin/cuda.mnv
new file mode 100644
index 0000000000..84304345f8
--- /dev/null
+++ b/mnv/runtime/ftplugin/cuda.mnv
@@ -0,0 +1,11 @@
+" MNV filetype plugin
+" Language: CUDA
+" Maintainer: Riley Bruins <ribru17@gmail.com>
+" Last Change: 2024 Jul 29
+
+if exists('b:did_ftplugin')
+ finish
+endif
+
+" Behaves mostly just like C++
+runtime! ftplugin/cpp.mnv
diff --git a/mnv/runtime/ftplugin/cvsrc.mnv b/mnv/runtime/ftplugin/cvsrc.mnv
new file mode 100644
index 0000000000..8298c74031
--- /dev/null
+++ b/mnv/runtime/ftplugin/cvsrc.mnv
@@ -0,0 +1,19 @@
+" MNV filetype plugin file
+" Language: cvs(1) RC file
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2008-07-09
+
+if exists("b:did_ftplugin")
+ finish
+endif
+let b:did_ftplugin = 1
+
+let s:cpo_save = &cpo
+set cpo&mnv
+
+let b:undo_ftplugin = "setl com< cms< fo<"
+
+setlocal comments= commentstring= formatoptions-=tcroql
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/mnv/runtime/ftplugin/dart.mnv b/mnv/runtime/ftplugin/dart.mnv
new file mode 100644
index 0000000000..6437913fcc
--- /dev/null
+++ b/mnv/runtime/ftplugin/dart.mnv
@@ -0,0 +1,15 @@
+" MNV filetype plugin
+" Language: dart
+" Maintainer: Riley Bruins <ribru17@gmail.com>
+" Last Change: 2024 May 18
+
+if exists('b:did_ftplugin')
+ finish
+endif
+let b:did_ftplugin = 1
+
+" Set 'comments' to format dashed lists in comments.
+" Also include ///, used for Doxygen.
+setl comments=sO:*\ -,mO:*\ \ ,exO:*/,s1:/*,mb:*,ex:*/,:///,:// commentstring=//\ %s
+
+let b:undo_ftplugin = 'setl com< cms<'
diff --git a/mnv/runtime/ftplugin/dax.mnv b/mnv/runtime/ftplugin/dax.mnv
new file mode 100644
index 0000000000..5f6957a3fd
--- /dev/null
+++ b/mnv/runtime/ftplugin/dax.mnv
@@ -0,0 +1,16 @@
+" MNV filetype plugin
+" Language: Data Analysis Expressions (DAX)
+" Maintainer: Anarion Dunedain <anarion80@gmail.com>
+" Last Change: 2025 Apr 2
+
+if exists('b:did_ftplugin')
+ finish
+endif
+
+let b:did_ftplugin = 1
+
+setlocal comments=sO:*\ -,mO:*\ \ ,exO:*/,s1:/*,mb:*,ex:*/,://
+
+setlocal commentstring=//\ %s
+
+let b:undo_ftplugin = 'setl com< cms<'
diff --git a/mnv/runtime/ftplugin/deb822sources.mnv b/mnv/runtime/ftplugin/deb822sources.mnv
new file mode 100644
index 0000000000..d7f2e5ec21
--- /dev/null
+++ b/mnv/runtime/ftplugin/deb822sources.mnv
@@ -0,0 +1,16 @@
+" Language: Debian sources.list
+" Maintainer: Debian MNV Maintainers <team+mnv@tracker.debian.org>
+" Last Change: 2024 May 25
+" License: MNV License
+" URL: https://salsa.debian.org/mnv-team/mnv-debian/blob/main/ftplugin/deb822sources.mnv
+
+if exists('b:did_ftplugin')
+ finish
+endif
+let b:did_ftplugin=1
+
+setlocal comments=:#
+setlocal commentstring=#\ %s
+setlocal formatoptions-=t
+
+let b:undo_ftplugin = 'setlocal comments< commentstring< formatoptions<'
diff --git a/mnv/runtime/ftplugin/debchangelog.mnv b/mnv/runtime/ftplugin/debchangelog.mnv
new file mode 100644
index 0000000000..141d868875
--- /dev/null
+++ b/mnv/runtime/ftplugin/debchangelog.mnv
@@ -0,0 +1,394 @@
+" MNV filetype plugin file (GUI menu, folding and completion)
+" Language: Debian Changelog
+" Maintainer: Debian MNV Maintainers <team+mnv@tracker.debian.org>
+" Former Maintainers: Michael Piefel <piefel@informatik.hu-berlin.de>
+" Stefano Zacchiroli <zack@debian.org>
+" Last Change: 2023 Aug 18
+" License: MNV License
+" URL: https://salsa.debian.org/mnv-team/mnv-debian/blob/main/ftplugin/debchangelog.mnv
+
+" Bug completion requires apt-listbugs installed for Debian packages or
+" python-launchpadlib installed for Ubuntu packages
+
+if exists('b:did_ftplugin')
+ finish
+endif
+let b:did_ftplugin=1
+
+" {{{1 Local settings (do on every load)
+if exists('g:debchangelog_fold_enable')
+ setlocal foldmethod=expr
+ setlocal foldexpr=DebGetChangelogFold(v:lnum)
+ setlocal foldtext=DebChangelogFoldText()
+endif
+
+" Debian changelogs are not supposed to have any other text width,
+" so the user cannot override this setting
+setlocal tw=78
+setlocal comments=f:*
+
+" Clean unloading
+let b:undo_ftplugin = 'setlocal tw< comments< foldmethod< foldexpr< foldtext<'
+" }}}1
+
+if exists('g:did_changelog_ftplugin')
+ finish
+endif
+
+" Don't load another plugin (this is global)
+let g:did_changelog_ftplugin = 1
+
+" Make sure the '<' and 'C' flags are not included in 'cpoptions', otherwise
+" <CR> would not be recognized. See ":help 'cpoptions'".
+let s:cpo_save = &cpo
+set cpo&mnv
+
+" {{{1 GUI menu
+
+" Helper functions returning various data.
+" Returns full name, either from $DEBFULLNAME or debianfullname.
+" TODO Is there a way to determine name from anywhere else?
+function <SID>FullName()
+ if exists('$DEBFULLNAME')
+ return $DEBFULLNAME
+ elseif exists('g:debianfullname')
+ return g:debianfullname
+ else
+ return 'Your Name'
+ endif
+endfunction
+
+" Returns email address, from $DEBEMAIL, $EMAIL or debianemail.
+function <SID>Email()
+ if exists('$DEBEMAIL')
+ return $DEBEMAIL
+ elseif exists('$EMAIL')
+ return $EMAIL
+ elseif exists('g:debianemail')
+ return g:debianemail
+ else
+ return 'your@email.address'
+ endif
+endfunction
+
+" Returns date in RFC822 format.
+function <SID>Date()
+ let savelang = v:lc_time
+ execute 'language time C'
+ let dateandtime = strftime('%a, %d %b %Y %X %z')
+ execute 'language time ' . savelang
+ return dateandtime
+endfunction
+
+function <SID>WarnIfNotUnfinalised()
+ if match(getline('.'), ' -- [[:alpha:]][[:alnum:].]')!=-1
+ echohl WarningMsg
+ echo 'The entry has not been unfinalised before editing.'
+ echohl None
+ return 1
+ endif
+ return 0
+endfunction
+
+function <SID>Finalised()
+ let savelinenum = line('.')
+ 1
+ call search('^ -- ')
+ if match(getline('.'), ' -- [[:alpha:]][[:alnum:].]')!=-1
+ let returnvalue = 1
+ else
+ let returnvalue = 0
+ endif
+ execute savelinenum
+ return returnvalue
+endfunction
+
+" These functions implement the menus
+function NewVersion()
+ " The new entry is unfinalised and shall be changed
+ amenu disable &Changelog.&New\ Version
+ amenu enable &Changelog.&Add\ Entry
+ amenu enable &Changelog.&Close\ Bug
+ amenu enable &Changelog.Set\ &Distribution
+ amenu enable &Changelog.Set\ &Urgency
+ amenu disable &Changelog.U&nfinalise
+ amenu enable &Changelog.&Finalise
+ call append(0, substitute(getline(1), '-\([[:digit:]]\+\))', '-$$\1)', ''))
+ call append(1, '')
+ call append(2, '')
+ call append(3, ' -- ')
+ call append(4, '')
+ call Urgency('low')
+ normal! 1G0
+ call search(')')
+ normal! h
+ " ':normal' doesn't support key annotation (<c-a>) directly.
+ " MNV's manual recommends using ':exe' to use key annotation indirectly (backslash-escaping needed though).
+ exe "normal! \<c-a>"
+ call setline(1, substitute(getline(1), '-\$\$', '-', ''))
+ if exists('g:debchangelog_fold_enable')
+ foldopen
+ endif
+ call AddEntry()
+endfunction
+
+function AddEntry()
+ 1
+ call search('^ -- ')
+ .-2
+ call append('.', ' * ')
+ .+3
+ let warn=<SID>WarnIfNotUnfinalised()
+ .-2
+ if warn
+ echohl MoreMsg
+ call input('Hit ENTER')
+ echohl None
+ endif
+ startinsert!
+endfunction
+
+function CloseBug()
+ 1
+ call search('^ -- ')
+ let warn=<SID>WarnIfNotUnfinalised()
+ .-2
+ call append('.', ' * (closes: #' . input('Bug number to close: ') . ')')
+ normal! j^ll
+ startinsert
+endfunction
+
+function Distribution(dist)
+ call setline(1, substitute(getline(1), ') *\%(UNRELEASED\|\l\+\);', ') ' . a:dist . ';', ''))
+endfunction
+
+function Urgency(urg)
+ call setline(1, substitute(getline(1), 'urgency=.*$', 'urgency=' . a:urg, ''))
+endfunction
+
+function <SID>UnfinaliseMenu()
+ " This means the entry shall be changed
+ amenu disable &Changelog.&New\ Version
+ amenu enable &Changelog.&Add\ Entry
+ amenu enable &Changelog.&Close\ Bug
+ amenu enable &Changelog.Set\ &Distribution
+ amenu enable &Changelog.Set\ &Urgency
+ amenu disable &Changelog.U&nfinalise
+ amenu enable &Changelog.&Finalise
+endfunction
+
+function Unfinalise()
+ call <SID>UnfinaliseMenu()
+ 1
+ call search('^ -- ')
+ call setline('.', ' -- ')
+endfunction
+
+function <SID>FinaliseMenu()
+ " This means the entry should not be changed anymore
+ amenu enable &Changelog.&New\ Version
+ amenu disable &Changelog.&Add\ Entry
+ amenu disable &Changelog.&Close\ Bug
+ amenu disable &Changelog.Set\ &Distribution
+ amenu disable &Changelog.Set\ &Urgency
+ amenu enable &Changelog.U&nfinalise
+ amenu disable &Changelog.&Finalise
+endfunction
+
+function Finalise()
+ call <SID>FinaliseMenu()
+ 1
+ call search('^ -- ')
+ call setline('.', ' -- ' . <SID>FullName() . ' <' . <SID>Email() . '> ' . <SID>Date())
+endfunction
+
+
+function <SID>MakeMenu()
+ amenu &Changelog.&New\ Version :call NewVersion()<CR>
+ amenu &Changelog.&Add\ Entry :call AddEntry()<CR>
+ amenu &Changelog.&Close\ Bug :call CloseBug()<CR>
+ menu &Changelog.-sep- <nul>
+
+ amenu &Changelog.Set\ &Distribution.&unstable :call Distribution("unstable")<CR>
+ amenu &Changelog.Set\ &Distribution.&frozen :call Distribution("frozen")<CR>
+ amenu &Changelog.Set\ &Distribution.&stable :call Distribution("stable")<CR>
+ menu &Changelog.Set\ &Distribution.-sep- <nul>
+ amenu &Changelog.Set\ &Distribution.frozen\ unstable :call Distribution("frozen unstable")<CR>
+ amenu &Changelog.Set\ &Distribution.stable\ unstable :call Distribution("stable unstable")<CR>
+ amenu &Changelog.Set\ &Distribution.stable\ frozen :call Distribution("stable frozen")<CR>
+ amenu &Changelog.Set\ &Distribution.stable\ frozen\ unstable :call Distribution("stable frozen unstable")<CR>
+
+ amenu &Changelog.Set\ &Urgency.&low :call Urgency("low")<CR>
+ amenu &Changelog.Set\ &Urgency.&medium :call Urgency("medium")<CR>
+ amenu &Changelog.Set\ &Urgency.&high :call Urgency("high")<CR>
+
+ menu &Changelog.-sep- <nul>
+ amenu &Changelog.U&nfinalise :call Unfinalise()<CR>
+ amenu &Changelog.&Finalise :call Finalise()<CR>
+
+ if <SID>Finalised()
+ call <SID>FinaliseMenu()
+ else
+ call <SID>UnfinaliseMenu()
+ endif
+endfunction
+
+augroup changelogMenu
+au BufEnter * if &filetype == "debchangelog" | call <SID>MakeMenu() | endif
+au BufLeave * if &filetype == "debchangelog" | silent! aunmenu &Changelog | endif
+augroup END
+
+" }}}
+" {{{1 folding
+
+" look for an author name in the [zonestart zoneend] lines searching backward
+function! s:getAuthor(zonestart, zoneend)
+ let linepos = a:zoneend
+ while linepos >= a:zonestart
+ let line = getline(linepos)
+ if line =~# '^ --'
+ return substitute(line, '^ --\s*\([^<]\+\)\s*.*', '\1', '')
+ endif
+ let linepos -= 1
+ endwhile
+ return '[unknown]'
+endfunction
+
+" Look for a package source name searching backward from the givenline and
+" returns it. Return the empty string if the package name can't be found
+function! DebGetPkgSrcName(lineno)
+ let lineidx = a:lineno
+ let pkgname = ''
+ while lineidx > 0
+ let curline = getline(lineidx)
+ if curline =~# '^\S'
+ let pkgname = matchlist(curline, '^\(\S\+\).*$')[1]
+ break
+ endif
+ let lineidx = lineidx - 1
+ endwhile
+ return pkgname
+endfunction
+
+function! DebChangelogFoldText()
+ if v:folddashes ==# '-' " changelog entry fold
+ return foldtext() . ' -- ' . s:getAuthor(v:foldstart, v:foldend) . ' '
+ endif
+ return foldtext()
+endfunction
+
+function! DebGetChangelogFold(lnum)
+ let line = getline(a:lnum)
+ if line =~# '^\w\+'
+ return '>1' " beginning of a changelog entry
+ endif
+ if line =~# '^\s\+\[.*\]'
+ return '>2' " beginning of an author-specific chunk
+ endif
+ if line =~# '^ --'
+ return '1'
+ endif
+ return '='
+endfunction
+
+if exists('g:debchangelog_fold_enable')
+ silent! foldopen! " unfold the entry the cursor is on (usually the first one)
+endif
+
+" }}}
+
+" {{{1 omnicompletion for Closes: #
+
+if !exists('g:debchangelog_listbugs_severities')
+ let g:debchangelog_listbugs_severities = 'critical,grave,serious,important,normal,minor,wishlist'
+endif
+
+fun! DebCompleteBugs(findstart, base)
+ if a:findstart
+ let line = getline('.')
+
+ " try to detect whether this is closes: or lp:
+ let g:debchangelog_complete_mode = 'debbugs'
+ let try_colidx = col('.') - 1
+ let colidx = -1 " default to no-completion-possible
+
+ while try_colidx > 0 && line[try_colidx - 1] =~# '\s\|\d\|#\|,\|:'
+ let try_colidx = try_colidx - 1
+ if line[try_colidx] ==# '#' && colidx == -1
+ " found hash, where we complete from:
+ let colidx = try_colidx
+ elseif line[try_colidx] ==# ':'
+ if try_colidx > 1 && strpart(line, try_colidx - 2, 3) =~? '\clp:'
+ let g:debchangelog_complete_mode = 'lp'
+ endif
+ break
+ endif
+ endwhile
+ return colidx
+ else " return matches:
+ let bug_lines = []
+ if g:debchangelog_complete_mode ==? 'lp'
+ if ! has('python')
+ echoerr 'mnv must be built with Python support to use LP bug completion'
+ return
+ endif
+ let pkgsrc = DebGetPkgSrcName(line('.'))
+ python << EOF
+import mnv
+try:
+ from launchpadlib.launchpad import Launchpad
+ from lazr.restfulclient.errors import HTTPError
+ # login anonymously
+ lp = Launchpad.login_anonymously('debchangelog.mnv', 'production')
+ ubuntu = lp.distributions['ubuntu']
+ try:
+ sp = ubuntu.getSourcePackage(name=mnv.eval('pkgsrc'))
+ status = ('New', 'Incomplete', 'Confirmed', 'Triaged',
+ 'In Progress', 'Fix Committed')
+ tasklist = sp.searchTasks(status=status, order_by='id')
+ liststr = '['
+ for task in tasklist:
+ bug = task.bug
+ liststr += "'#%d - %s'," % (bug.id, bug.title.replace('\'', '\'\''))
+ liststr += ']'
+ mnv.command('silent let bug_lines = %s' % liststr.encode('utf-8'))
+ except HTTPError:
+ pass
+except ImportError:
+ mnv.command('echoerr \'python-launchpadlib >= 1.5.4 needs to be installed to use Launchpad bug completion\'')
+EOF
+ else
+ if ! filereadable('/usr/sbin/apt-listbugs')
+ echoerr 'apt-listbugs not found, you should install it to use Closes bug completion'
+ return
+ endif
+ let pkgsrc = DebGetPkgSrcName(line('.'))
+ let listbugs_output = system('/usr/sbin/apt-listbugs -s ' . g:debchangelog_listbugs_severities . ' list ' . pkgsrc . ' | grep "^ #" 2> /dev/null')
+ let bug_lines = split(listbugs_output, '\n')
+ endif
+ let completions = []
+ for line in bug_lines
+ let parts = matchlist(line, '^\s*\(#\S\+\)\s*-\s*\(.*\)$')
+ " filter only those which match a:base:
+ if parts[1] !~ '^' . a:base
+ continue
+ endif
+ let completion = {}
+ let completion['word'] = parts[1]
+ let completion['menu'] = parts[2]
+ let completion['info'] = parts[0]
+ let completions += [completion]
+ endfor
+ return completions
+ endif
+endfun
+
+setlocal omnifunc=DebCompleteBugs
+
+" }}}
+
+" Restore the previous value of 'cpoptions'.
+let &cpo = s:cpo_save
+unlet s:cpo_save
+
+" mnv: set foldmethod=marker:
diff --git a/mnv/runtime/ftplugin/debcontrol.mnv b/mnv/runtime/ftplugin/debcontrol.mnv
new file mode 100644
index 0000000000..7f4c6ea1ea
--- /dev/null
+++ b/mnv/runtime/ftplugin/debcontrol.mnv
@@ -0,0 +1,73 @@
+" MNV filetype plugin file (GUI menu and folding)
+" Language: Debian control files
+" Maintainer: Debian MNV Maintainers
+" Former Maintainer: Pierre Habouzit <madcoder@debian.org>
+" Last Change: 2024 May 25
+" URL: https://salsa.debian.org/mnv-team/mnv-debian/blob/main/ftplugin/debcontrol.mnv
+
+" Do these settings once per buffer
+if exists('b:did_ftplugin')
+ finish
+endif
+let b:did_ftplugin=1
+
+" {{{1 Local settings (do on every load)
+if exists('g:debcontrol_fold_enable')
+ setlocal foldmethod=expr
+ setlocal foldexpr=DebControlFold(v:lnum)
+ setlocal foldtext=DebControlFoldText()
+endif
+setlocal textwidth=0
+
+setlocal comments=:#
+setlocal commentstring=#\ %s
+
+" Clean unloading
+let b:undo_ftplugin = 'setlocal tw< foldmethod< foldexpr< foldtext< comments< commentstring<'
+
+" }}}1
+
+" {{{1 folding
+
+function! s:getField(f, lnum)
+ let line = getline(a:lnum)
+ let fwdsteps = 0
+ while line !~ '^'.a:f.':'
+ let fwdsteps += 1
+ let line = getline(a:lnum + fwdsteps)
+ if line ==# ''
+ return 'unknown'
+ endif
+ endwhile
+ return substitute(line, '^'.a:f.': *', '', '')
+endfunction
+
+function! DebControlFoldText()
+ if v:folddashes ==# '-' " debcontrol entry fold
+ let type = substitute(getline(v:foldstart), ':.*', '', '')
+ if type ==# 'Source'
+ let ftext = substitute(foldtext(), ' *Source: *', ' ', '')
+ return ftext . ' -- ' . s:getField('Maintainer', v:foldstart) . ' '
+ endif
+ let arch = s:getField('Architecture', v:foldstart)
+ let ftext = substitute(foldtext(), ' *Package: *', ' [' . arch . '] ', '')
+ return ftext . ': ' . s:getField('Description', v:foldstart) . ' '
+ endif
+ return foldtext()
+endfunction
+
+function! DebControlFold(l)
+
+ " This is for not merging blank lines around folds to them
+ if getline(a:l) =~# '^Source:'
+ return '>1'
+ endif
+
+ if getline(a:l) =~# '^Package:'
+ return '>1'
+ endif
+
+ return '='
+endfunction
+
+" }}}1
diff --git a/mnv/runtime/ftplugin/debsources.mnv b/mnv/runtime/ftplugin/debsources.mnv
new file mode 100644
index 0000000000..23239ca108
--- /dev/null
+++ b/mnv/runtime/ftplugin/debsources.mnv
@@ -0,0 +1,16 @@
+" Language: Debian sources.list
+" Maintainer: Debian MNV Maintainers <team+mnv@tracker.debian.org>
+" Last Change: 2024 May 25
+" License: MNV License
+" URL: https://salsa.debian.org/mnv-team/mnv-debian/blob/main/ftplugin/debsources.mnv
+
+if exists('b:did_ftplugin')
+ finish
+endif
+let b:did_ftplugin=1
+
+setlocal comments=:#
+setlocal commentstring=#\ %s
+setlocal formatoptions-=t
+
+let b:undo_ftplugin = 'setlocal comments< commentstring< formatoptions<'
diff --git a/mnv/runtime/ftplugin/denyhosts.mnv b/mnv/runtime/ftplugin/denyhosts.mnv
new file mode 100644
index 0000000000..49c324a33f
--- /dev/null
+++ b/mnv/runtime/ftplugin/denyhosts.mnv
@@ -0,0 +1,18 @@
+" MNV filetype plugin file
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2007-12-04
+
+if exists("b:did_ftplugin")
+ finish
+endif
+let b:did_ftplugin = 1
+
+let s:cpo_save = &cpo
+set cpo&mnv
+
+let b:undo_ftplugin = "setl com< cms< fo<"
+
+setlocal comments=:# commentstring=#\ %s formatoptions-=t formatoptions+=croql
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/mnv/runtime/ftplugin/desktop.mnv b/mnv/runtime/ftplugin/desktop.mnv
new file mode 100644
index 0000000000..715f82b6f7
--- /dev/null
+++ b/mnv/runtime/ftplugin/desktop.mnv
@@ -0,0 +1,14 @@
+" MNV filetype plugin file
+" Language: XDG desktop entry
+" Maintainer: Eisuke Kawashima ( e.kawaschima+mnv AT gmail.com )
+" Last Change: 2022-07-26
+" 2024-05-24 by Riley Bruins <ribru17@gmail.com> ('commentstring')
+
+if exists('b:did_ftplugin')
+ finish
+endif
+let b:did_ftplugin = v:true
+
+setl comments=:#
+setl commentstring=#\ %s
+let b:undo_ftplugin = 'setl com< cms<'
diff --git a/mnv/runtime/ftplugin/dictconf.mnv b/mnv/runtime/ftplugin/dictconf.mnv
new file mode 100644
index 0000000000..faeaf47c4d
--- /dev/null
+++ b/mnv/runtime/ftplugin/dictconf.mnv
@@ -0,0 +1,19 @@
+" MNV filetype plugin file
+" Language: dict(1) configuration file
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2008-07-09
+
+if exists("b:did_ftplugin")
+ finish
+endif
+let b:did_ftplugin = 1
+
+let s:cpo_save = &cpo
+set cpo&mnv
+
+let b:undo_ftplugin = "setl com< cms< fo<"
+
+setlocal comments=:# commentstring=#\ %s formatoptions-=t formatoptions+=croql
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/mnv/runtime/ftplugin/dictdconf.mnv b/mnv/runtime/ftplugin/dictdconf.mnv
new file mode 100644
index 0000000000..6043192885
--- /dev/null
+++ b/mnv/runtime/ftplugin/dictdconf.mnv
@@ -0,0 +1,19 @@
+" MNV filetype plugin file
+" Language: dictd(8) configuration file
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2008-07-09
+
+if exists("b:did_ftplugin")
+ finish
+endif
+let b:did_ftplugin = 1
+
+let s:cpo_save = &cpo
+set cpo&mnv
+
+let b:undo_ftplugin = "setl com< cms< fo<"
+
+setlocal comments=:# commentstring=#\ %s formatoptions-=t formatoptions+=croql
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/mnv/runtime/ftplugin/diff.mnv b/mnv/runtime/ftplugin/diff.mnv
new file mode 100644
index 0000000000..15692af16e
--- /dev/null
+++ b/mnv/runtime/ftplugin/diff.mnv
@@ -0,0 +1,29 @@
+" MNV filetype plugin file
+" Language: Diff
+" Maintainer: The MNV Project <https://github.com/Project-Tick/Project-Tick>
+" Last Change: 2023 Aug 22
+" Former Maintainer: Bram Moolenaar <Bram@mnv.org>
+
+" Only do this when not done yet for this buffer
+if exists("b:did_ftplugin")
+ finish
+endif
+let b:did_ftplugin = 1
+
+let b:undo_ftplugin = "setl modeline< commentstring<"
+
+" Don't use modelines in a diff, they apply to the diffed file
+setlocal nomodeline
+
+" If there are comments they start with #
+let &l:commentstring = "# %s"
+
+if (has("gui_win32") || has("gui_gtk")) && !exists("b:browsefilter")
+ let b:browsefilter = "Diff Files (*.diff)\t*.diff\nPatch Files (*.patch)\t*.h\n"
+ if has("win32")
+ let b:browsefilter ..= "All Files (*.*)\t*\n"
+ else
+ let b:browsefilter ..= "All Files (*)\t*\n"
+ endif
+ let b:undo_ftplugin ..= " | unlet! b:browsefilter"
+endif
diff --git a/mnv/runtime/ftplugin/dircolors.mnv b/mnv/runtime/ftplugin/dircolors.mnv
new file mode 100644
index 0000000000..242a6bf5c0
--- /dev/null
+++ b/mnv/runtime/ftplugin/dircolors.mnv
@@ -0,0 +1,19 @@
+" MNV filetype plugin file
+" Language: dircolors(1) input file
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2008-07-09
+
+if exists("b:did_ftplugin")
+ finish
+endif
+let b:did_ftplugin = 1
+
+let s:cpo_save = &cpo
+set cpo&mnv
+
+let b:undo_ftplugin = "setl com< cms< fo<"
+
+setlocal comments=:# commentstring=#\ %s formatoptions-=t formatoptions+=croql
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/mnv/runtime/ftplugin/dnsmasq.mnv b/mnv/runtime/ftplugin/dnsmasq.mnv
new file mode 100644
index 0000000000..c6a8e612e5
--- /dev/null
+++ b/mnv/runtime/ftplugin/dnsmasq.mnv
@@ -0,0 +1,11 @@
+" MNV filetype plugin
+" Language: dnsmasq
+" Maintainer: dringsim <dringsim@qq.com>
+" Last Change: 2025-02-18
+
+if exists('b:did_ftplugin')
+ finish
+endif
+
+" Behaves mostly just like cfg
+runtime! ftplugin/cfg.mnv
diff --git a/mnv/runtime/ftplugin/docbk.mnv b/mnv/runtime/ftplugin/docbk.mnv
new file mode 100644
index 0000000000..ae6d5ece02
--- /dev/null
+++ b/mnv/runtime/ftplugin/docbk.mnv
@@ -0,0 +1,24 @@
+" MNV filetype plugin file
+" Language: DocBook
+" Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2012-04-25
+
+if exists('b:did_ftplugin')
+ finish
+endif
+
+if !exists('b:docbk_type')
+ if expand('%:e') == 'sgml'
+ let b:docbk_type = 'sgml'
+ else
+ let b:docbk_type = 'xml'
+ endif
+endif
+
+if b:docbk_type == 'sgml'
+ runtime! ftplugin/sgml.mnv ftplugin/sgml_*.mnv ftplugin/sgml/*.mnv
+else
+ runtime! ftplugin/xml.mnv ftplugin/xml_*.mnv ftplugin/xml/*.mnv
+endif
+
+let b:undo_ftplugin = "unlet! b:docbk_type"
diff --git a/mnv/runtime/ftplugin/dockerfile.mnv b/mnv/runtime/ftplugin/dockerfile.mnv
new file mode 100644
index 0000000000..c830f232d1
--- /dev/null
+++ b/mnv/runtime/ftplugin/dockerfile.mnv
@@ -0,0 +1,17 @@
+" MNV filetype plugin
+" Language: Dockerfile
+" Maintainer: Honza Pokorny <http://honza.ca>
+" Last Change: 2025 Feb 21
+
+" Only do this when not done yet for this buffer
+if exists("b:did_ftplugin")
+ finish
+endif
+
+" Don't load another plugin for this buffer
+let b:did_ftplugin = 1
+
+setlocal comments=:#
+setlocal commentstring=#\ %s
+
+let b:undo_ftplugin = "setl comments< commentstring<"
diff --git a/mnv/runtime/ftplugin/dosbatch.mnv b/mnv/runtime/ftplugin/dosbatch.mnv
new file mode 100644
index 0000000000..8034debdbe
--- /dev/null
+++ b/mnv/runtime/ftplugin/dosbatch.mnv
@@ -0,0 +1,54 @@
+" MNV filetype plugin file
+" Language: MS-DOS/Windows .bat files
+" Maintainer: Mike Williams <mrmrdubya@gmail.com>
+" Last Change: 12th February 2023
+" 2024 Jan 14 by MNV Project (browsefilter)
+"
+" Options Flags:
+" dosbatch_colons_comment - any value to treat :: as comment line
+
+" Only do this when not done yet for this buffer
+if exists("b:did_ftplugin")
+ finish
+endif
+
+" Don't load another plugin for this buffer
+let b:did_ftplugin = 1
+
+let s:cpo_save = &cpo
+set cpo&mnv
+
+" BAT comment formatting
+setlocal comments=b:rem,b:@rem,b:REM,b:@REM
+if exists("dosbatch_colons_comment")
+ setlocal comments+=:::
+ setlocal commentstring=::\ %s
+else
+ setlocal commentstring=REM\ %s
+endif
+setlocal formatoptions-=t formatoptions+=rol
+
+" Lookup DOS keywords using Windows command help.
+if executable('help.exe')
+ if has('terminal')
+ setlocal keywordprg=:term\ help.exe
+ else
+ setlocal keywordprg=help.exe
+ endif
+endif
+
+" Define patterns for the browse file filter
+if (has("gui_win32") || has("gui_gtk")) && !exists("b:browsefilter")
+ let b:browsefilter = "DOS Batch Files (*.bat, *.cmd)\t*.bat;*.cmd\n"
+ if has("win32")
+ let b:browsefilter ..= "All Files (*.*)\t*\n"
+ else
+ let b:browsefilter ..= "All Files (*)\t*\n"
+ endif
+endif
+
+let b:undo_ftplugin = "setlocal comments< formatoptions< keywordprg<"
+ \ . "| unlet! b:browsefilter"
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/mnv/runtime/ftplugin/dosini.mnv b/mnv/runtime/ftplugin/dosini.mnv
new file mode 100644
index 0000000000..47e78256fe
--- /dev/null
+++ b/mnv/runtime/ftplugin/dosini.mnv
@@ -0,0 +1,20 @@
+" MNV filetype plugin file
+" Language: Configuration File (ini file) for MS-DOS/MS Windows
+" Maintainer: This runtime file is looking for a new maintainer.
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2025 Feb 20
+
+if exists("b:did_ftplugin")
+ finish
+endif
+let b:did_ftplugin = 1
+
+let s:cpo_save = &cpo
+set cpo&mnv
+
+let b:undo_ftplugin = "setl com< cms< fo<"
+
+setlocal comments=:;,:# commentstring=;\ %s formatoptions-=t formatoptions+=croql
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/mnv/runtime/ftplugin/dtd.mnv b/mnv/runtime/ftplugin/dtd.mnv
new file mode 100644
index 0000000000..13b1cd5774
--- /dev/null
+++ b/mnv/runtime/ftplugin/dtd.mnv
@@ -0,0 +1,48 @@
+" MNV filetype plugin file
+" Language: dtd
+"
+" This runtime file is looking for a new maintainer.
+"
+" Former maintainer: Dan Sharp
+" Last Change: 2009 Jan 20
+" 2024 Jan 14 by MNV Project (browsefilter)
+" 2024 May 23 by Riley Bruins <ribru17@gmail.com> ('commentstring')
+
+if exists("b:did_ftplugin") | finish | endif
+let b:did_ftplugin = 1
+
+" Make sure the continuation lines below do not cause problems in
+" compatibility mode.
+let s:save_cpo = &cpo
+set cpo-=C
+
+setlocal commentstring=<!--\ %s\ -->
+setlocal comments=s:<!--,m:\ \ \ \ \ ,e:-->
+
+setlocal formatoptions-=t
+if !exists("g:ft_dtd_autocomment") || (g:ft_dtd_autocomment == 1)
+ setlocal formatoptions+=croql
+endif
+
+if exists("loaded_matchit")
+ let b:match_words = '<!--:-->,<!:>'
+endif
+
+" Change the :browse e filter to primarily show Java-related files.
+if (has("gui_win32") || has("gui_gtk")) && !exists("b:browsefilter")
+ let b:browsefilter="DTD Files (*.dtd)\t*.dtd\n" .
+ \ "XML Files (*.xml)\t*.xml\n"
+ if has("win32")
+ let b:browsefilter .= "All Files (*.*)\t*\n"
+ else
+ let b:browsefilter .= "All Files (*)\t*\n"
+ endif
+endif
+
+" Undo the stuff we changed.
+let b:undo_ftplugin = "setlocal commentstring< comments< formatoptions<" .
+ \ " | unlet! b:matchwords b:browsefilter"
+
+" Restore the saved compatibility options.
+let &cpo = s:save_cpo
+unlet s:save_cpo
diff --git a/mnv/runtime/ftplugin/dtrace.mnv b/mnv/runtime/ftplugin/dtrace.mnv
new file mode 100644
index 0000000000..a276b310a3
--- /dev/null
+++ b/mnv/runtime/ftplugin/dtrace.mnv
@@ -0,0 +1,41 @@
+" Language: D script as described in "Solaris Dynamic Tracing Guide",
+" http://docs.sun.com/app/docs/doc/817-6223
+" Last Change: 2008/03/20
+" 2024/05/23 by Riley Bruins <ribru17@gmail.com ('commentstring')
+" Version: 1.2
+" Maintainer: Nicolas Weber <nicolasweber@gmx.de>
+
+" Only do this when not done yet for this buffer
+if exists("b:did_ftplugin")
+ finish
+endif
+
+" Don't load another plugin for this buffer
+let b:did_ftplugin = 1
+
+" Using line continuation here.
+let s:cpo_save = &cpo
+set cpo-=C
+
+let b:undo_ftplugin = "setl fo< com< cms< isk<"
+
+" Set 'formatoptions' to break comment lines but not other lines,
+" and insert the comment leader when hitting <CR> or using "o".
+setlocal fo-=t fo+=croql
+
+" Set 'comments' to format dashed lists in comments.
+setlocal comments=sO:*\ -,mO:*\ \ ,exO:*/,s1:/*,mb:*,ex:*/
+
+" dtrace uses /* */ comments. Set this explicitly, just in case the user
+" changed this (/*\ %s\ */ is the default)
+setlocal commentstring=/*\ %s\ */
+
+setlocal iskeyword+=@,$
+
+" When the matchit plugin is loaded, this makes the % command skip parens and
+" braces in comments.
+let b:match_words = &matchpairs
+let b:match_skip = 's:comment\|string\|character'
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/mnv/runtime/ftplugin/dts.mnv b/mnv/runtime/ftplugin/dts.mnv
new file mode 100644
index 0000000000..1fc5278e16
--- /dev/null
+++ b/mnv/runtime/ftplugin/dts.mnv
@@ -0,0 +1,17 @@
+" MNV filetype plugin file
+" Language: dts/dtsi (device tree files)
+" Maintainer: Wu, Zhenyu <wuzhenyu@ustc.edu>
+" Latest Revision: 2024 Apr 12
+" 2024 Jun 02 by Riley Bruins <ribru17@gmail.com> ('commentstring')
+
+if exists('b:did_ftplugin')
+ finish
+endif
+let b:did_ftplugin = 1
+
+let b:undo_ftplugin = 'setl inc< cms< com<'
+
+setlocal include=^\\%(#include\\\|/include/\\)
+" same as C
+setlocal commentstring=/*\ %s\ */
+setlocal comments=sO:*\ -,mO:*\ \ ,exO:*/,s1:/*,mb:*,ex:*/,:///,://
diff --git a/mnv/runtime/ftplugin/dune.mnv b/mnv/runtime/ftplugin/dune.mnv
new file mode 100644
index 0000000000..0ecdec6595
--- /dev/null
+++ b/mnv/runtime/ftplugin/dune.mnv
@@ -0,0 +1,24 @@
+" Language: Dune buildsystem
+" Maintainer: Markus Mottl <markus.mottl@gmail.com>
+" Anton Kochkov <anton.kochkov@gmail.com>
+" URL: https://github.com/ocaml/mnv-ocaml
+" Last Change:
+" 2023 Aug 28 - Added undo_ftplugin (MNV Project)
+" 2018 Nov 03 - Added commentstring (Markus Mottl)
+" 2017 Sep 06 - Initial version (Etienne Millon)
+" 2024 Nov 09 - use setl instead of :set
+
+if exists("b:did_ftplugin")
+ finish
+endif
+let b:did_ftplugin=1
+
+setl lisp
+
+" Comment string
+setl commentstring=;\ %s
+setl comments=:;
+
+setl iskeyword+=#,?,.,/
+
+let b:undo_ftplugin = "setl lisp< cms< com< isk<"
diff --git a/mnv/runtime/ftplugin/editorconfig.mnv b/mnv/runtime/ftplugin/editorconfig.mnv
new file mode 100644
index 0000000000..ce7314dacc
--- /dev/null
+++ b/mnv/runtime/ftplugin/editorconfig.mnv
@@ -0,0 +1,15 @@
+" MNV filetype plugin
+" Language: EditorConfig
+" Maintainer: Riley Bruins <ribru17@gmail.com>
+" Last Change: 2025 Jan 10
+
+if exists('b:did_ftplugin')
+ finish
+endif
+let b:did_ftplugin = 1
+
+setl comments=:#,:; commentstring=#\ %s
+
+setl omnifunc=syntaxcomplete#Complete
+
+let b:undo_ftplugin = 'setl com< cms< ofu<'
diff --git a/mnv/runtime/ftplugin/eiffel.mnv b/mnv/runtime/ftplugin/eiffel.mnv
new file mode 100644
index 0000000000..05ed7dd258
--- /dev/null
+++ b/mnv/runtime/ftplugin/eiffel.mnv
@@ -0,0 +1,100 @@
+" MNV filetype plugin
+" Language: Eiffel
+" Maintainer: Doug Kearns <dougkearns@gmail.com>
+" Last Change: 2024 Jan 14
+
+if (exists("b:did_ftplugin"))
+ finish
+endif
+let b:did_ftplugin = 1
+
+let s:cpo_save = &cpo
+set cpo&mnv
+
+setlocal comments=:--
+setlocal commentstring=--\ %s
+
+setlocal formatoptions-=t formatoptions+=croql
+
+if (has("gui_win32") || has("gui_gtk")) && !exists("b:browsefilter")
+ let b:browsefilter = "Eiffel Source Files (*.e)\t*.e\n" .
+ \ "Eiffel Control Files (*.ecf, *.ace, *.xace)\t*.ecf;*.ace;*.xace\n"
+ if has("win32")
+ let b:browsefilter .= "All Files (*.*)\t*\n"
+ else
+ let b:browsefilter .= "All Files (*)\t*\n"
+ endif
+endif
+
+if exists("loaded_matchit") && !exists("b:match_words")
+ let b:match_ignorecase = 0
+ " Silly \%^ trick to match note at head of pair and in middle prevents
+ " 'g%' wrapping from 'note' to 'end'
+ let b:match_words = '\%^:' .
+ \ '\<\%(^note\|indexing\|class\|^obsolete\|inherit\|insert\|^create\|convert\|feature\|^invariant\)\>:' .
+ \ '^end\>,' .
+ \ '\<\%(do\|deferred\|external\|once\%(\s\+"\)\@!\|check\|debug\|if\|inspect\|from\|across\)\>:' .
+ \ '\%(\%(^\s\+\)\@<=\%(then\|until\|loop\)\|\%(then\|until\|loop\)\s\+[^ -]\|' .
+ \ '\<\%(ensure\%(\s\+then\)\=\|rescue\|_then\|elseif\|else\|when\|\s\@<=invariant\|_until\|_loop\|variant\|_as\|alias\)\>\):' .
+ \ '\s\@<=end\>'
+ let b:match_skip = 's:\<eiffel\%(Comment\|String\|Operator\)\>'
+ noremap [% <Nop>
+ noremap ]% <Nop>
+ vnoremap a% <Nop>
+endif
+
+let b:undo_ftplugin = "setl fo< com< cms<" .
+ \ "| unlet! b:browsefilter b:match_ignorecase b:match_words b:match_skip"
+
+if !exists("g:no_plugin_maps") && !exists("g:no_eiffel_maps")
+ function! s:DoMotion(pattern, count, flags) abort
+ normal! m'
+ for i in range(a:count)
+ call search(a:pattern, a:flags)
+ endfor
+ endfunction
+
+ let sections = '^\%(note\|indexing\|' .
+ \ '\%(\%(deferred\|expanded\|external\|frozen\)\s\+\)*class\|' .
+ \ 'obsolete\|inherit\|insert\|create\|convert\|feature\|' .
+ \ 'invariant\|end\)\>'
+
+ nnoremap <silent> <buffer> ]] :<C-U>call <SID>DoMotion(sections, v:count1, 'W')<CR>
+ xnoremap <silent> <buffer> ]] :<C-U>exe "normal! gv"<Bar>call <SID>DoMotion(sections, v:count1, 'W')<CR>
+ nnoremap <silent> <buffer> [[ :<C-U>call <SID>DoMotion(sections, v:count1, 'Wb')<CR>
+ xnoremap <silent> <buffer> [[ :<C-U>exe "normal! gv"<Bar>call <SID>DoMotion(sections, v:count1, 'Wb')<CR>
+
+ function! s:DoFeatureMotion(count, flags)
+ let view = winsaveview()
+ call cursor(1, 1)
+ let [features_start, _] = searchpos('^feature\>')
+ call search('^\s\+\a') " find the first feature
+ let spaces = indent(line('.'))
+ let [features_end, _] = searchpos('^\%(invariant\|note\|end\)\>')
+ call winrestview(view)
+ call s:DoMotion('\%>' . features_start . 'l\%<' . features_end . 'l^\s*\%' . (spaces + 1) . 'v\zs\a', a:count, a:flags)
+ endfunction
+
+ nnoremap <silent> <buffer> ]m :<C-U>call <SID>DoFeatureMotion(v:count1, 'W')<CR>
+ xnoremap <silent> <buffer> ]m :<C-U>exe "normal! gv"<Bar>call <SID>DoFeatureMotion(v:count1, 'W')<CR>
+ nnoremap <silent> <buffer> [m :<C-U>call <SID>DoFeatureMotion(v:count1, 'Wb')<CR>
+ xnoremap <silent> <buffer> [m :<C-U>exe "normal! gv"<Bar>call <SID>DoFeatureMotion(v:count1, 'Wb')<CR>
+
+ let comment_block_start = '^\%(\s\+--.*\n\)\@<!\s\+--'
+ let comment_block_end = '^\s\+--.*\n\%(\s\+--\)\@!'
+
+ nnoremap <silent> <buffer> ]- :<C-U>call <SID>DoMotion(comment_block_start, 1, 'W')<CR>
+ xnoremap <silent> <buffer> ]- :<C-U>exe "normal! gv"<Bar>call <SID>DoMotion(comment_block_start, 1, 'W')<CR>
+ nnoremap <silent> <buffer> [- :<C-U>call <SID>DoMotion(comment_block_end, 1, 'Wb')<CR>
+ xnoremap <silent> <buffer> [- :<C-U>exe "normal! gv"<Bar>call <SID>DoMotion(comment_block_end, 1, 'Wb')<CR>
+
+ let b:undo_ftplugin = b:undo_ftplugin .
+ \ "| silent! execute 'unmap <buffer> [[' | silent! execute 'unmap <buffer> ]]'" .
+ \ "| silent! execute 'unmap <buffer> [m' | silent! execute 'unmap <buffer> ]m'" .
+ \ "| silent! execute 'unmap <buffer> [-' | silent! execute 'unmap <buffer> ]-'"
+endif
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
+
+" mnv: nowrap sw=2 sts=2 ts=8
diff --git a/mnv/runtime/ftplugin/elinks.mnv b/mnv/runtime/ftplugin/elinks.mnv
new file mode 100644
index 0000000000..cf6e7a4d3f
--- /dev/null
+++ b/mnv/runtime/ftplugin/elinks.mnv
@@ -0,0 +1,19 @@
+" MNV filetype plugin file
+" Language: elinks(1) configuration file
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2008-07-09
+
+if exists("b:did_ftplugin")
+ finish
+endif
+let b:did_ftplugin = 1
+
+let s:cpo_save = &cpo
+set cpo&mnv
+
+let b:undo_ftplugin = "setl com< cms< fo<"
+
+setlocal comments=:# commentstring=#\ %s formatoptions-=t formatoptions+=croql
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/mnv/runtime/ftplugin/elixir.mnv b/mnv/runtime/ftplugin/elixir.mnv
new file mode 100644
index 0000000000..159ca7ba30
--- /dev/null
+++ b/mnv/runtime/ftplugin/elixir.mnv
@@ -0,0 +1,39 @@
+" Elixir filetype plugin
+" Language: Elixir
+" Maintainer: Mitchell Hanberg <mnvNOSPAM@mitchellhanberg.com>
+" Last Change: 2023 Dec 27
+
+if exists("b:did_ftplugin")
+ finish
+endif
+let b:did_ftplugin = 1
+
+let s:save_cpo = &cpo
+set cpo&mnv
+
+" Matchit support
+if exists('loaded_matchit') && !exists('b:match_words')
+ let b:match_ignorecase = 0
+
+ let b:match_words = '\:\@<!\<\%(do\|fn\)\:\@!\>' .
+ \ ':' .
+ \ '\<\%(else\|catch\|after\|rescue\)\:\@!\>' .
+ \ ':' .
+ \ '\:\@<!\<end\>' .
+ \ ',{:},\[:\],(:)'
+endif
+
+setlocal shiftwidth=2 softtabstop=2 expandtab iskeyword+=!,?
+setlocal comments=:#
+setlocal commentstring=#\ %s
+
+setlocal indentkeys=0#,!^F,o,O
+" Enable keys for blocks
+setlocal indentkeys+=0=after,0=catch,0=do,0=else,0=end,0=rescue
+" Enable keys that are usually the first keys in a line
+setlocal indentkeys+=0->,0\|>,0},0],0),>
+
+let b:undo_ftplugin = 'setlocal sw< sts< et< isk< com< cms< indk<'
+
+let &cpo = s:save_cpo
+unlet s:save_cpo
diff --git a/mnv/runtime/ftplugin/elm.mnv b/mnv/runtime/ftplugin/elm.mnv
new file mode 100644
index 0000000000..5ffcdce456
--- /dev/null
+++ b/mnv/runtime/ftplugin/elm.mnv
@@ -0,0 +1,20 @@
+" Elm filetype plugin file
+" Language: Elm
+" Maintainer: Andreas Scharf <as@99n.de>
+" Latest Revision: 2022-04-25
+
+if exists("b:did_ftplugin")
+ finish
+endif
+let b:did_ftplugin = 1
+
+let s:cpo_save = &cpo
+set cpo&mnv
+
+setlocal comments=s1fl:{-,mb:\ ,ex:-},:--
+setlocal commentstring=--\ %s
+
+let b:undo_ftplugin = "setl com< cms<"
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/mnv/runtime/ftplugin/env.mnv b/mnv/runtime/ftplugin/env.mnv
new file mode 100644
index 0000000000..54479d8106
--- /dev/null
+++ b/mnv/runtime/ftplugin/env.mnv
@@ -0,0 +1,19 @@
+" MNV filetype plugin file
+" Language: env
+" Maintainer: This runtime file is looking for a new maintainer.
+" Last Change: 2026 Feb 27
+
+if exists("b:did_ftplugin")
+ finish
+endif
+let b:did_ftplugin = 1
+
+let s:cpo_save = &cpo
+set cpo&mnv
+
+let b:undo_ftplugin = "setl com< cms< fo<"
+
+setlocal comments=b:# commentstring=#\ %s formatoptions-=t formatoptions+=croql
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/mnv/runtime/ftplugin/erlang.mnv b/mnv/runtime/ftplugin/erlang.mnv
new file mode 100644
index 0000000000..7538a1eef3
--- /dev/null
+++ b/mnv/runtime/ftplugin/erlang.mnv
@@ -0,0 +1,120 @@
+" MNV ftplugin file
+" Language: Erlang (http://www.erlang.org)
+" Maintainer: Csaba Hoch <csaba.hoch@gmail.com>
+" Author: Oscar Hellström <oscar@oscarh.net>
+" Contributors: Ricardo Catalinas Jiménez <jimenezrick@gmail.com>
+" Eduardo Lopez (http://github.com/tapichu)
+" Arvid Bjurklint (http://github.com/slarwise)
+" Paweł Zacharek (http://github.com/subc2)
+" Riley Bruins (http://github.com/ribru17) ('commentstring')
+" Last Update: 2024 May 23
+" License: MNV license
+" URL: https://github.com/mnv-erlang/mnv-erlang-runtime
+
+if exists('b:did_ftplugin')
+ finish
+endif
+let b:did_ftplugin = 1
+
+let s:cpo_save = &cpo
+set cpo&mnv
+
+let &l:keywordprg = get(g:, 'erlang_keywordprg', 'erl -man')
+
+if get(g:, 'erlang_folding', 0)
+ setlocal foldmethod=expr
+ setlocal foldexpr=GetErlangFold(v:lnum)
+ setlocal foldtext=ErlangFoldText()
+endif
+
+setlocal comments=:%%%,:%%,:%
+setlocal commentstring=%\ %s
+
+setlocal formatoptions+=ro
+
+if get(g:, 'erlang_extend_path', 1)
+ " typical erlang.mk paths
+ let &l:path = join([
+ \ 'deps/*/include',
+ \ 'deps/*/src',
+ \ 'deps/*/test',
+ \ 'deps/*/apps/*/include',
+ \ 'deps/*/apps/*/src',
+ \ &g:path], ',')
+ " typical rebar3 paths
+ let &l:path = join([
+ \ 'apps/*/include',
+ \ 'apps/*/src',
+ \ '_build/default/lib/*/src',
+ \ '_build/default/*/include',
+ \ &l:path], ',')
+ " typical erlang paths
+ let &l:path = join(['include', 'src', 'test', &l:path], ',')
+
+ set wildignore+=*/.erlang.mk/*,*.beam
+endif
+
+setlocal suffixesadd=.erl,.hrl
+
+let &l:include = '^\s*-\%(include\|include_lib\)\s*("\zs\f*\ze")'
+let &l:define = '^\s*-\%(define\|record\|type\|opaque\)'
+
+let s:erlang_fun_begin = '^\l[A-Za-z0-9_@]*(.*$'
+let s:erlang_fun_end = '^[^%]*\.\s*\(%.*\)\?$'
+
+if !exists('*GetErlangFold')
+ function GetErlangFold(lnum)
+ let lnum = a:lnum
+ let line = getline(lnum)
+
+ if line =~ s:erlang_fun_end
+ return '<1'
+ endif
+
+ if line =~ s:erlang_fun_begin && foldlevel(lnum - 1) == 1
+ return '1'
+ endif
+
+ if line =~ s:erlang_fun_begin
+ return '>1'
+ endif
+
+ return '='
+ endfunction
+endif
+
+if !exists('*ErlangFoldText')
+ function ErlangFoldText()
+ let line = getline(v:foldstart)
+ let foldlen = v:foldend - v:foldstart + 1
+ let lines = ' ' . foldlen . ' lines: ' . substitute(line, "[\ \t]*", '', '')
+ if foldlen < 10
+ let lines = ' ' . lines
+ endif
+ let retval = '+' . v:folddashes . lines
+
+ return retval
+ endfunction
+endif
+
+" The following lines enable the macros/matchit.mnv plugin for extended
+" matching with the % key.
+let b:match_ignorecase = 0
+let b:match_words =
+ \ '\<\%(begin\|case\|fun\|if\|maybe\|receive\|try\)\>' .
+ \ ':\<\%(after\|catch\|else\|of\)\>' .
+ \ ':\<end\>,' .
+ \ '^\l[A-Za-z0-9_@]*' .
+ \ ':^\%(\%(\t\| \{' . shiftwidth() .
+ \ '}\)\%([^\t\ %][^%]*\)\?\)\?;\s*\%(%.*\)\?$\|\.[\t\ %]\|\.$'
+let b:match_skip = 's:comment\|string\|erlangmodifier\|erlangquotedatom'
+
+let b:undo_ftplugin = "setlocal keywordprg< foldmethod< foldexpr< foldtext<"
+ \ . " comments< commentstring< formatoptions< suffixesadd< include<"
+ \ . " define<"
+ \ . " | unlet b:match_ignorecase b:match_words b:match_skip"
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
+
+" mnv: sw=2 et
diff --git a/mnv/runtime/ftplugin/eruby.mnv b/mnv/runtime/ftplugin/eruby.mnv
new file mode 100644
index 0000000000..3c84f7e17d
--- /dev/null
+++ b/mnv/runtime/ftplugin/eruby.mnv
@@ -0,0 +1,141 @@
+" MNV filetype plugin
+" Language: eRuby
+" Maintainer: Tim Pope <mnvNOSPAM@tpope.org>
+" URL: https://github.com/mnv-ruby/mnv-ruby
+" Last Change: 2022 May 15
+" 2024 Jan 14 by MNV Project (browsefilter)
+" 2024 May 23 by Riley Bruins <ribru17@gmail.com> ('commentstring')
+
+" Only do this when not done yet for this buffer
+if exists("b:did_ftplugin")
+ finish
+endif
+
+let s:save_cpo = &cpo
+set cpo-=C
+
+" Define some defaults in case the included ftplugins don't set them.
+let s:undo_ftplugin = ""
+if has("win32")
+ let s:browsefilter = "All Files (*.*)\t*\n"
+else
+ let s:browsefilter = "All Files (*)\t*\n"
+endif
+let s:match_words = ""
+
+if !exists("g:eruby_default_subtype")
+ let g:eruby_default_subtype = "html"
+endif
+
+if &filetype =~ '^eruby\.'
+ let b:eruby_subtype = matchstr(&filetype,'^eruby\.\zs\w\+')
+elseif !exists("b:eruby_subtype")
+ let s:lines = getline(1)."\n".getline(2)."\n".getline(3)."\n".getline(4)."\n".getline(5)."\n".getline("$")
+ let b:eruby_subtype = matchstr(s:lines,'eruby_subtype=\zs\w\+')
+ if b:eruby_subtype == ''
+ let b:eruby_subtype = matchstr(substitute(expand("%:t"),'\c\%(\.erb\|\.eruby\|\.erubis\|\.example\)\+$','',''),'\.\zs\w\+\%(\ze+\w\+\)\=$')
+ endif
+ if b:eruby_subtype == 'rhtml'
+ let b:eruby_subtype = 'html'
+ elseif b:eruby_subtype == 'rb'
+ let b:eruby_subtype = 'ruby'
+ elseif b:eruby_subtype == 'yml'
+ let b:eruby_subtype = 'yaml'
+ elseif b:eruby_subtype == 'js'
+ let b:eruby_subtype = 'javascript'
+ elseif b:eruby_subtype == 'txt'
+ " Conventional; not a real file type
+ let b:eruby_subtype = 'text'
+ elseif b:eruby_subtype == ''
+ let b:eruby_subtype = g:eruby_default_subtype
+ endif
+endif
+
+if exists("b:eruby_subtype") && b:eruby_subtype != '' && b:eruby_subtype !=? 'eruby'
+ exe "runtime! ftplugin/".b:eruby_subtype.".mnv ftplugin/".b:eruby_subtype."_*.mnv ftplugin/".b:eruby_subtype."/*.mnv"
+else
+ runtime! ftplugin/html.mnv ftplugin/html_*.mnv ftplugin/html/*.mnv
+endif
+unlet! b:did_ftplugin
+
+" Override our defaults if these were set by an included ftplugin.
+if exists("b:undo_ftplugin")
+ let s:undo_ftplugin = b:undo_ftplugin
+ unlet b:undo_ftplugin
+endif
+if exists("b:browsefilter")
+ let s:browsefilter = b:browsefilter
+ unlet b:browsefilter
+endif
+if exists("b:match_words")
+ let s:match_words = b:match_words
+ unlet b:match_words
+endif
+
+let s:cfilemap = v:version >= 704 ? maparg('<Plug><cfile>', 'c', 0, 1) : {}
+if !get(s:cfilemap, 'buffer') || !s:cfilemap.expr || s:cfilemap.rhs =~# 'ErubyAtCursor()'
+ let s:cfilemap = {}
+endif
+if !has_key(s:cfilemap, 'rhs')
+ let s:cfilemap.rhs = "substitute(&l:inex =~# '\\<v:fname\\>' && len(expand('<cfile>')) ? eval(substitute(&l:inex, '\\<v:fname\\>', '\\=string(expand(\"<cfile>\"))', 'g')) : '', '^$', \"\\022\\006\",'')"
+endif
+let s:ctagmap = v:version >= 704 ? maparg('<Plug><ctag>', 'c', 0, 1) : {}
+if !get(s:ctagmap, 'buffer') || !s:ctagmap.expr || s:ctagmap.rhs =~# 'ErubyAtCursor()'
+ let s:ctagmap = {}
+endif
+let s:include = &l:include
+let s:path = &l:path
+let s:suffixesadd = &l:suffixesadd
+
+runtime! ftplugin/ruby.mnv ftplugin/ruby_*.mnv ftplugin/ruby/*.mnv
+let b:did_ftplugin = 1
+
+" Combine the new set of values with those previously included.
+if !exists('b:undo_ftplugin')
+ " No-op
+ let b:undo_ftplugin = 'exe'
+endif
+if !empty(s:undo_ftplugin)
+ let b:undo_ftplugin .= '|' . s:undo_ftplugin
+endif
+if exists ("b:browsefilter")
+ let s:browsefilter = substitute(b:browsefilter,'\cAll Files (\*\.\*)\t\*\.\*\n','','') . s:browsefilter
+endif
+if exists("b:match_words")
+ let s:match_words = b:match_words . ',' . s:match_words
+endif
+
+if len(s:include)
+ let &l:include = s:include
+endif
+let &l:path = s:path . (s:path =~# ',$\|^$' ? '' : ',') . &l:path
+let &l:suffixesadd = s:suffixesadd . (s:suffixesadd =~# ',$\|^$' ? '' : ',') . &l:suffixesadd
+exe 'cmap <buffer><script><expr> <Plug><cfile> ErubyAtCursor() ? ' . maparg('<Plug><cfile>', 'c') . ' : ' . s:cfilemap.rhs
+exe 'cmap <buffer><script><expr> <Plug><ctag> ErubyAtCursor() ? ' . maparg('<Plug><ctag>', 'c') . ' : ' . get(s:ctagmap, 'rhs', '"\022\027"')
+unlet s:cfilemap s:ctagmap s:include s:path s:suffixesadd
+
+" Change the browse dialog on Win32 and GTK to show mainly eRuby-related files
+if (has("gui_win32") || has("gui_gtk")) && !exists("b:browsefilter")
+ let b:browsefilter="eRuby Files (*.erb, *.rhtml)\t*.erb;*.rhtml\n" . s:browsefilter
+endif
+
+" Load the combined list of match_words for matchit.mnv
+if exists("loaded_matchit")
+ let b:match_words = s:match_words
+endif
+
+" TODO: comments=
+setlocal commentstring=<%#\ %s\ %>
+
+let b:undo_ftplugin = "setl cms< " .
+ \ " | unlet! b:browsefilter b:match_words | " . b:undo_ftplugin
+
+let &cpo = s:save_cpo
+unlet s:save_cpo
+
+function! ErubyAtCursor() abort
+ let groups = map(['erubyBlock', 'erubyComment', 'erubyExpression', 'erubyOneLiner'], 'hlID(v:val)')
+ return !empty(filter(synstack(line('.'), col('.')), 'index(groups, v:val) >= 0'))
+endfunction
+
+" mnv: nowrap sw=2 sts=2 ts=8:
diff --git a/mnv/runtime/ftplugin/eterm.mnv b/mnv/runtime/ftplugin/eterm.mnv
new file mode 100644
index 0000000000..bcd87cd4d8
--- /dev/null
+++ b/mnv/runtime/ftplugin/eterm.mnv
@@ -0,0 +1,20 @@
+" MNV filetype plugin file
+" Language: eterm(1) configuration file
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2008-07-09
+
+if exists("b:did_ftplugin")
+ finish
+endif
+let b:did_ftplugin = 1
+
+let s:cpo_save = &cpo
+set cpo&mnv
+
+let b:undo_ftplugin = "setl com< cms< inc< fo<"
+
+setlocal comments=:# commentstring=#\ %s include=^\\s*include
+setlocal formatoptions-=t formatoptions+=croql
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/mnv/runtime/ftplugin/expect.mnv b/mnv/runtime/ftplugin/expect.mnv
new file mode 100644
index 0000000000..25073d0ac7
--- /dev/null
+++ b/mnv/runtime/ftplugin/expect.mnv
@@ -0,0 +1,28 @@
+" MNV filetype plugin file
+" Language: Expect
+" Maintainer: Doug Kearns <dougkearns@gmail.com>
+" Last Change: 2024 Jan 14
+
+if exists("b:did_ftplugin")
+ finish
+endif
+
+" Syntax is similar to Tcl
+runtime! ftplugin/tcl.mnv
+
+let s:cpo_save = &cpo
+set cpo&mnv
+
+if (has("gui_win32") || has("gui_gtk")) && !exists("b:browsefilter")
+ let b:browsefilter = "Expect Command Files (*.exp)\t*.exp\n"
+ if has("win32")
+ let b:browsefilter ..= "All Files (*.*)\t*\n"
+ else
+ let b:browsefilter ..= "All Files (*)\t*\n"
+ endif
+endif
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
+
+" mnv: nowrap sw=2 sts=2 ts=8
diff --git a/mnv/runtime/ftplugin/exports.mnv b/mnv/runtime/ftplugin/exports.mnv
new file mode 100644
index 0000000000..03b4ec3b6f
--- /dev/null
+++ b/mnv/runtime/ftplugin/exports.mnv
@@ -0,0 +1,14 @@
+" MNV filetype plugin
+" Language: exports(5) configuration file
+" Maintainer: Matt Perry <matt@mattperry.com>
+" Last Change: 2025 Feb 13
+
+if exists('b:did_ftplugin')
+ finish
+endif
+let b:did_ftplugin = 1
+
+setlocal comments=:# commentstring=#\ %s
+setlocal formatoptions-=t formatoptions+=croql
+
+let b:undo_ftplugin = 'setl com< cms< fo<'
diff --git a/mnv/runtime/ftplugin/falcon.mnv b/mnv/runtime/ftplugin/falcon.mnv
new file mode 100644
index 0000000000..9099fa77ce
--- /dev/null
+++ b/mnv/runtime/ftplugin/falcon.mnv
@@ -0,0 +1,54 @@
+" MNV filetype plugin file
+" Language: Falcon
+" Author: Steven Oliver <oliver.steven@gmail.com>
+" Copyright: Copyright (c) 2009-2013 Steven Oliver
+" License: You may redistribute this under the same terms as MNV itself
+" Last Update: 2020 Oct 10
+" 2024 Jan 14 by MNV Project (browsefilter)
+" --------------------------------------------------------------------------
+
+" Only do this when not done yet for this buffer
+if (exists("b:did_ftplugin"))
+ finish
+endif
+let b:did_ftplugin = 1
+
+let s:cpo_save = &cpo
+set cpo&mnv
+
+setlocal softtabstop=4 shiftwidth=4
+setlocal suffixesadd=.fal,.ftd
+
+" Matchit support
+if exists("loaded_matchit") && !exists("b:match_words")
+ let b:match_ignorecase = 0
+
+ let b:match_words =
+ \ '\<\%(if\|case\|while\|until\|for\|do\|class\)\>=\@!' .
+ \ ':' .
+ \ '\<\%(else\|elsif\|when\)\>' .
+ \ ':' .
+ \ '\<end\>' .
+ \ ',{:},\[:\],(:)'
+endif
+
+setlocal comments=sO:*\ -,mO:*\ \ ,exO:*/,s1:/*,mb:*,ex:*/,://
+
+" Windows allows you to filter the open file dialog
+if (has("gui_win32") || has("gui_gtk")) && !exists("b:browsefilter")
+ let b:browsefilter = "Falcon Source Files (*.fal, *.ftd)\t*.fal;*.ftd\n"
+ if has("win32")
+ let b:browsefilter ..= "All Files (*.*)\t*\n"
+ else
+ let b:browsefilter ..= "All Files (*)\t*\n"
+ endif
+endif
+
+let b:undo_ftplugin = "setlocal tabstop< shiftwidth< expandtab< fileencoding<"
+ \ . " suffixesadd< comments<"
+ \ . "| unlet! b:browsefilter"
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
+
+" mnv: set sw=4 sts=4 et tw=80 :
diff --git a/mnv/runtime/ftplugin/fennel.mnv b/mnv/runtime/ftplugin/fennel.mnv
new file mode 100644
index 0000000000..d475ef785e
--- /dev/null
+++ b/mnv/runtime/ftplugin/fennel.mnv
@@ -0,0 +1,19 @@
+" MNV filetype plugin file
+" Language: Fennel
+" Maintainer: Gregory Anders <greg[NOSPAM]@gpanders.com>
+" Last Update: 2023 Jun 9
+" 2024 May 24 by Riley Bruins <ribru17@gmail.com> ('commentstring')
+
+if exists('b:did_ftplugin')
+ finish
+endif
+let b:did_ftplugin = 1
+
+setlocal commentstring=;\ %s
+setlocal comments=:;;,:;
+setlocal formatoptions-=t
+setlocal suffixesadd=.fnl
+setlocal lisp
+setlocal lispwords=accumulate,case,case-try,collect,do,doto,each,eval-compiler,faccumulate,fcollect,fn,for,icollect,lambda,let,macro,macros,match,match-try,when,while,with-open
+
+let b:undo_ftplugin = 'setlocal commentstring< comments< formatoptions< suffixesadd< lisp< lispwords<'
diff --git a/mnv/runtime/ftplugin/fetchmail.mnv b/mnv/runtime/ftplugin/fetchmail.mnv
new file mode 100644
index 0000000000..d84a78d999
--- /dev/null
+++ b/mnv/runtime/ftplugin/fetchmail.mnv
@@ -0,0 +1,16 @@
+" MNV filetype plugin file
+" Language: fetchmail(1) RC File
+" Maintainer: Doug Kearns <dougkearns@gmail.com>
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2022 Jun 30
+
+if exists("b:did_ftplugin")
+ finish
+endif
+let b:did_ftplugin = 1
+
+setlocal comments=:# commentstring=#\ %s
+setlocal formatoptions-=t formatoptions+=croql
+
+let b:undo_ftplugin = "setl com< cms< fo<"
+
diff --git a/mnv/runtime/ftplugin/fga.mnv b/mnv/runtime/ftplugin/fga.mnv
new file mode 100644
index 0000000000..48df73eae7
--- /dev/null
+++ b/mnv/runtime/ftplugin/fga.mnv
@@ -0,0 +1,13 @@
+" MNV filetype plugin
+" Language: FGA
+" Maintainer: Riley Bruins <ribru17@gmail.com>
+" Last Change: 2025 Jul 14
+
+if exists('b:did_ftplugin')
+ finish
+endif
+let b:did_ftplugin = 1
+
+setl comments=:# commentstring=#\ %s
+
+let b:undo_ftplugin = 'setl com< cms<'
diff --git a/mnv/runtime/ftplugin/fish.mnv b/mnv/runtime/ftplugin/fish.mnv
new file mode 100644
index 0000000000..20f1d572ba
--- /dev/null
+++ b/mnv/runtime/ftplugin/fish.mnv
@@ -0,0 +1,41 @@
+" MNV filetype plugin file
+" Language: fish
+" Maintainer: Nicholas Boyle (github.com/nickeb96)
+" Repository: https://github.com/nickeb96/fish.mnv
+" Last Change: February 1, 2023
+" 2023 Aug 28 by MNV Project (undo_ftplugin)
+" 2024 May 23 by Riley Bruins <ribru17@gmail.com> ('commentstring')
+" 2026 Mar 16 by Phạm Bình An (add matchit support)
+
+if exists("b:did_ftplugin")
+ finish
+endif
+
+let s:saved_cpo = &cpo
+set cpo-=C
+
+let b:did_ftplugin = 1
+
+setlocal iskeyword=@,48-57,_,192-255,-,.
+setlocal comments=:#
+setlocal commentstring=#\ %s
+setlocal formatoptions+=crjq
+
+let b:undo_ftplugin = "setl cms< com< fo< isk<"
+
+" Define patterns for the matchit plugin
+if exists("loaded_matchit") && !exists("b:match_words")
+ let b:match_words =
+ \ '\<\%(else\s\+\)\@<!if\>\|\<\%(switch\|begin\|function\|while\|for\)\>:' ..
+ \ '\<else\%(\s\+if\)\?\>\|\<case\>:' ..
+ \ '\<end\>'
+
+ let b:match_ignorecase = 0
+ let b:match_skip = "S:keyword"
+
+ let b:undo_ftplugin ..= " | unlet! b:match_words b:match_ignorecase b:match_skip"
+endif
+
+" Restore 'cpo' to its original value
+let &cpo = s:saved_cpo
+unlet s:saved_cpo
diff --git a/mnv/runtime/ftplugin/flexwiki.mnv b/mnv/runtime/ftplugin/flexwiki.mnv
new file mode 100644
index 0000000000..01bb4c03fc
--- /dev/null
+++ b/mnv/runtime/ftplugin/flexwiki.mnv
@@ -0,0 +1,59 @@
+" MNV filetype plugin file
+" Language: FlexWiki, http://www.flexwiki.com/
+" Maintainer: George V. Reilly <george@reilly.org>
+" Home: http://www.georgevreilly.com/mnv/flexwiki/
+" Other Home: http://www.mnv.org/scripts/script.php?script_id=1529
+" Author: George V. Reilly
+" Filenames: *.wiki
+" Last Change: Wed Apr 26 11:00 PM 2006 P
+" Version: 0.3
+
+if exists("b:did_ftplugin")
+ finish
+endif
+
+let b:did_ftplugin = 1 " Don't load another plugin for this buffer
+
+" Reset the following options to undo this plugin.
+let b:undo_ftplugin = "setl tw< wrap< lbr< et< ts< fenc< bomb< ff<"
+
+" Allow lines of unlimited length. Do NOT want automatic linebreaks,
+" as a newline starts a new paragraph in FlexWiki.
+setlocal textwidth=0
+" Wrap long lines, rather than using horizontal scrolling.
+setlocal wrap
+" Wrap at a character in 'breakat' rather than at last char on screen
+setlocal linebreak
+" Don't transform <TAB> characters into spaces, as they are significant
+" at the beginning of the line for numbered and bulleted lists.
+setlocal noexpandtab
+" 4-char tabstops, per flexwiki.el
+setlocal tabstop=4
+" Save *.wiki files in UTF-8
+setlocal fileencoding=utf-8
+" Add the UTF-8 Byte Order Mark to the beginning of the file
+setlocal bomb
+" Save <EOL>s as \n, not \r\n
+setlocal fileformat=unix
+
+if exists("g:flexwiki_maps")
+ " Move up and down by display lines, to account for screen wrapping
+ " of very long lines
+ nmap <buffer> <Up> gk
+ nmap <buffer> k gk
+ vmap <buffer> <Up> gk
+ vmap <buffer> k gk
+
+ nmap <buffer> <Down> gj
+ nmap <buffer> j gj
+ vmap <buffer> <Down> gj
+ vmap <buffer> j gj
+
+ " for earlier versions - for when 'wrap' is set
+ imap <buffer> <S-Down> <C-o>gj
+ imap <buffer> <S-Up> <C-o>gk
+ if v:version >= 700
+ imap <buffer> <Down> <C-o>gj
+ imap <buffer> <Up> <C-o>gk
+ endif
+endif
diff --git a/mnv/runtime/ftplugin/forth.mnv b/mnv/runtime/ftplugin/forth.mnv
new file mode 100644
index 0000000000..b8ebd02680
--- /dev/null
+++ b/mnv/runtime/ftplugin/forth.mnv
@@ -0,0 +1,77 @@
+" MNV filetype plugin
+" Language: Forth
+" Maintainer: Johan Kotlinski <kotlinski@gmail.com>
+" Last Change: 2023 Sep 15
+" 2024 Jan 14 by MNV Project (browsefilter)
+" URL: https://github.com/jkotlinski/forth.mnv
+
+if exists("b:did_ftplugin")
+ finish
+endif
+let b:did_ftplugin = 1
+
+let s:cpo_save = &cpo
+set cpo&mnv
+
+setlocal commentstring=\\\ %s
+setlocal comments=s:(,mb:\ ,e:),b:\\
+setlocal iskeyword=33-126,128-255
+
+let s:include_patterns =<< trim EOL
+
+ \<\%(INCLUDE\|REQUIRE\)\>\s\+\zs\k\+\ze
+ \<S"\s\+\zs[^"]*\ze"\s\+\%(INCLUDED\|REQUIRED\)\>
+EOL
+let &l:include = $'\c{ s:include_patterns[1:]->join('\|') }'
+
+let s:define_patterns =<< trim EOL
+ :
+ [2F]\=CONSTANT
+ [2F]\=VALUE
+ [2F]\=VARIABLE
+ BEGIN-STRUCTURE
+ BUFFER:
+ CODE
+ CREATE
+ MARKER
+ SYNONYM
+EOL
+let &l:define = $'\c\<\%({ s:define_patterns->join('\|') }\)'
+
+" assume consistent intra-project file extensions
+let &l:suffixesadd = "." .. expand("%:e")
+
+let b:undo_ftplugin = "setl cms< com< def< inc< isk< sua<"
+
+if exists("loaded_matchit") && !exists("b:match_words")
+ let s:matchit_patterns =<< trim EOL
+
+ \<\:\%(NONAME\)\=\>:\<EXIT\>:\<;\>
+ \<IF\>:\<ELSE\>:\<THEN\>
+ \<\[IF]\>:\<\[ELSE]\>:\<\[THEN]\>
+ \<?\=DO\>:\<LEAVE\>:\<+\=LOOP\>
+ \<CASE\>:\<ENDCASE\>
+ \<OF\>:\<ENDOF\>
+ \<BEGIN\>:\<WHILE\>:\<\%(AGAIN\|REPEAT\|UNTIL\)\>
+ \<CODE\>:\<END-CODE\>
+ \<BEGIN-STRUCTURE\>:\<END-STRUCTURE\>
+ EOL
+ let b:match_ignorecase = 1
+ let b:match_words = s:matchit_patterns[1:]->join(',')
+ let b:undo_ftplugin ..= "| unlet! b:match_ignorecase b:match_words"
+ unlet s:matchit_patterns
+endif
+
+if (has("gui_win32") || has("gui_gtk")) && !exists("b:browsefilter")
+ let b:browsefilter = "Forth Source Files (*.f, *.fs, *.ft, *.fth, *.4th)\t*.f;*.fs;*.ft;*.fth;*.4th\n"
+ if has("win32")
+ let b:browsefilter ..= "All Files (*.*)\t*\n"
+ else
+ let b:browsefilter ..= "All Files (*)\t*\n"
+ endif
+ let b:undo_ftplugin ..= " | unlet! b:browsefilter"
+endif
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
+unlet s:define_patterns s:include_patterns
diff --git a/mnv/runtime/ftplugin/fortran.mnv b/mnv/runtime/ftplugin/fortran.mnv
new file mode 100644
index 0000000000..cbce31fcde
--- /dev/null
+++ b/mnv/runtime/ftplugin/fortran.mnv
@@ -0,0 +1,155 @@
+" MNV settings file
+" Language: Fortran 2023 (and Fortran 2018, 2008, 2003, 95, 90, 77, 66)
+" Version: (v55) 2023 December 22
+" Maintainers: Ajit J. Thakkar <ajit@unb.ca>; <https://ajit.ext.unb.ca/>
+" Joshua Hollett <j.hollett@uwinnipeg.ca>
+" Usage: For instructions, do :help fortran-plugin from MNV
+" Credits:
+" Version 0.1 was created in September 2000 by Ajit Thakkar.
+" Since then, useful suggestions and contributions have been made, in order, by:
+" Stefano Zacchiroli, Hendrik Merx, Ben Fritz, David Barnett, Eisuke Kawashima,
+" Doug Kearns, and Fritz Reese.
+" Last Change: 2023 Dec 22
+" 2024 Jan 14 by MNV Project (browsefilter)
+" 2024 May 23 by Riley Bruins <ribru17@gmail.com> ('commentstring')
+
+" Only do these settings when not done yet for this buffer
+if exists("b:did_ftplugin")
+ finish
+endif
+
+let s:cposet=&cpoptions
+set cpoptions&mnv
+
+" Don't do other file type settings for this buffer
+let b:did_ftplugin = 1
+
+" Determine whether this is a fixed or free format source file
+" if this hasn't been done yet using the priority:
+" buffer-local value
+" > global value
+" > file extension as in Intel ifort, gcc (gfortran), NAG, Pathscale, and Cray compilers
+if !exists("b:fortran_fixed_source")
+ if exists("fortran_free_source")
+ " User guarantees free source form
+ let b:fortran_fixed_source = 0
+ elseif exists("fortran_fixed_source")
+ " User guarantees fixed source form
+ let b:fortran_fixed_source = 1
+ elseif expand("%:e") =~? '^f\%(90\|95\|03\|08\)$'
+ " Free-form file extension defaults as in Intel ifort, gcc(gfortran), NAG, Pathscale, and Cray compilers
+ let b:fortran_fixed_source = 0
+ elseif expand("%:e") =~? '^\%(f\|f77\|for\)$'
+ " Fixed-form file extension defaults
+ let b:fortran_fixed_source = 1
+ else
+ " Modern fortran compilers still allow both fixed and free source form
+ " Assume fixed source form unless signs of free source form
+ " are detected in the first five columns of the first s:lmax lines.
+ " Detection becomes more accurate and time-consuming if more lines
+ " are checked. Increase the limit below if you keep lots of comments at
+ " the very top of each file and you have a fast computer.
+ let s:lmax = 500
+ if ( s:lmax > line("$") )
+ let s:lmax = line("$")
+ endif
+ let b:fortran_fixed_source = 1
+ let s:ln=1
+ while s:ln <= s:lmax
+ let s:test = strpart(getline(s:ln),0,5)
+ if s:test !~ '^[Cc*]' && s:test !~ '^ *[!#]' && s:test =~ '[^ 0-9\t]' && s:test !~ '^[ 0-9]*\t'
+ let b:fortran_fixed_source = 0
+ break
+ endif
+ let s:ln = s:ln + 1
+ endwhile
+ unlet! s:lmax s:ln s:test
+ endif
+endif
+
+" Set comments and textwidth according to source type
+if (b:fortran_fixed_source == 1)
+ setlocal comments=:!,:*,:C
+ " Fixed format requires a textwidth of 72 for code,
+ " but some vendor extensions allow longer lines
+ if exists("fortran_extended_line_length")
+ setlocal tw=132
+ else
+ " The use of columns 73-80 for sequence numbers is obsolete
+ " so almost all compilers allow a textwidth of 80
+ setlocal tw=80
+ " If you need to add "&" on continued lines so that the code is
+ " compatible with both free and fixed format, then you should do so
+ " in column 81 and uncomment the next line
+ " setlocal tw=81
+ endif
+else
+ setlocal comments=:!
+ " Free format allows a textwidth of 132
+ setlocal tw=132
+endif
+
+" Set commentstring for foldmethod=marker
+setlocal cms=!\ %s
+
+" Tabs are not a good idea in Fortran so the default is to expand tabs
+if !exists("fortran_have_tabs")
+ setlocal expandtab
+endif
+
+" Set 'formatoptions' to break text lines
+setlocal fo+=t
+
+setlocal include=^\\c#\\=\\s*include\\s\\+
+setlocal suffixesadd+=.f08,.f03,.f95,.f90,.for,.f,.F,.f77,.ftn,.fpp
+
+" Define patterns for the matchit plugin
+if !exists("b:match_words")
+ let s:notend = '\%(\<end\s\+\)\@<!'
+ let s:notselect = '\%(\<select\s\+\)\@<!'
+ let s:notelse = '\%(\<end\s\+\|\<else\s\+\)\@<!'
+ let s:notprocedure = '\%(\s\+procedure\>\)\@!'
+ let s:nothash = '\%(^\s*#\s*\)\@<!'
+ let b:match_ignorecase = 1
+ let b:match_words =
+ \ '(:),' .
+ \ s:notend .'\<select\s\+type\>:' . s:notselect. '\<type\|class\>:\<end\s*select\>,' .
+ \ s:notend .'\<select\s\+rank\>:' . s:notselect. '\<rank\>:\<end\s*select\>,' .
+ \ s:notend .'\<select\>:' . s:notselect. '\<case\>:\<end\s*select\>,' .
+ \ s:notelse . '\<if\s*(.\+)\s*then\>:' .
+ \ s:nothash . '\<else\s*\%(if\s*(.\+)\s*then\)\=\>:' . s:nothash . '\<end\s*if\>,'.
+ \ 'do\s\+\(\d\+\):\%(^\s*\)\@<=\1\s,'.
+ \ s:notend . '\<do\>:\<end\s*do\>,'.
+ \ s:notelse . '\<where\>:\<elsewhere\>:\<end\s*where\>,'.
+ \ s:notend . '\<type\s*[^(]:\<end\s*type\>,'.
+ \ s:notend . '\<forall\>:\<end\s*forall\>,'.
+ \ s:notend . '\<associate\>:\<end\s*associate\>,'.
+ \ s:notend . '\<change\s\+team\>:\<end\s*team\>,'.
+ \ s:notend . '\<critical\>:\<end\s*critical\>,'.
+ \ s:notend . '\<block\>:\<end\s*block\>,'.
+ \ s:notend . '\<enum\>:\<end\s*enum\>,'.
+ \ s:notend . '\<interface\>:\<end\s*interface\>,'.
+ \ s:notend . '\<subroutine\>:\<end\s*subroutine\>,'.
+ \ s:notend . '\<function\>:\<end\s*function\>,'.
+ \ s:notend . '\<module\>' . s:notprocedure . ':\<end\s*module\>,'.
+ \ s:notend . '\<program\>:\<end\s*program\>,'.
+ \ '\%(^\s*\)\@<=#\s*if\%(def\|ndef\)\=\>:\%(^\s*\)\@<=#\s*\%(elif\|else\)\>:\%(^\s*\)\@<=#\s*endif\>'
+endif
+
+" File filters for :browse e
+if (has("gui_win32") || has("gui_gtk")) && !exists("b:browsefilter")
+ let b:browsefilter = "Fortran Files (*.f, *.for, *.f77, *.f90, *.f95, *.f03, *.f08, *.fpp, *.ftn)\t*.f;*.for;*.f77;*.f90;*.f95;*.f03;*.f08;*.fpp;*.ftn\n"
+ if has("win32")
+ let b:browsefilter .= "All Files (*.*)\t*\n"
+ else
+ let b:browsefilter .= "All Files (*)\t*\n"
+ endif
+endif
+
+let b:undo_ftplugin = "setl fo< com< tw< cms< et< inc< sua<"
+ \ . "| unlet! b:match_ignorecase b:match_words b:browsefilter"
+
+let &cpoptions=s:cposet
+unlet s:cposet
+
+" mnv:sw=2
diff --git a/mnv/runtime/ftplugin/fpcmake.mnv b/mnv/runtime/ftplugin/fpcmake.mnv
new file mode 100644
index 0000000000..585df14283
--- /dev/null
+++ b/mnv/runtime/ftplugin/fpcmake.mnv
@@ -0,0 +1,29 @@
+" MNV filetype plugin file
+" Language: Free Pascal Makefile Generator
+" Maintainer: Doug Kearns <dougkearns@gmail.com>
+" Last Change: 2024 Jan 14
+
+if exists("b:did_ftplugin")
+ finish
+endif
+
+let s:cpo_save = &cpo
+set cpo&mnv
+
+runtime! ftplugin/make.mnv
+
+if (has("gui_win32") || has("gui_gtk")) && !exists("b:browsefilter")
+ let b:browsefilter = "Free Pascal Makefile Definition Files (*.fpc)\t*.fpc\n"
+ if has("win32")
+ let b:browsefilter ..= "All Files (*.*)\t*\n"
+ else
+ let b:browsefilter ..= "All Files (*)\t*\n"
+ endif
+ let b:undo_ftplugin ..= " | unlet! b:browsefilter"
+endif
+
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
+
+" mnv: nowrap sw=2 sts=2 ts=8 noet:
diff --git a/mnv/runtime/ftplugin/framescript.mnv b/mnv/runtime/ftplugin/framescript.mnv
new file mode 100644
index 0000000000..32249cd583
--- /dev/null
+++ b/mnv/runtime/ftplugin/framescript.mnv
@@ -0,0 +1,30 @@
+" MNV ftplugin file
+" Language: FrameScript
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2008-07-19
+
+if exists("b:did_ftplugin")
+ finish
+endif
+let b:did_ftplugin = 1
+
+let s:cpo_save = &cpo
+set cpo&mnv
+
+let b:undo_ftplugin = "setl com< cms< fo< inc< | unlet! b:matchwords"
+
+setlocal comments=s1:/*,mb:*,ex:*/,:// commentstring=/*\ %s\ */
+setlocal formatoptions-=t formatoptions+=croql
+setlocal include=^\\s*<#Include
+
+if exists("loaded_matchit")
+ let s:not_end = '\c\%(\<End\)\@<!'
+ let b:match_words =
+ \ s:not_end . '\<If\>:\c\<ElseIf\>:\c\<Else\>:\c\<EndIf\>,' .
+ \ s:not_end . '\<Loop\>:\c\<EndLoop\>' .
+ \ s:not_end . '\<Sub\>:\c\<EndSub\>'
+ unlet s:not_end
+endif
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/mnv/runtime/ftplugin/freebasic.mnv b/mnv/runtime/ftplugin/freebasic.mnv
new file mode 100644
index 0000000000..18b14e9b9d
--- /dev/null
+++ b/mnv/runtime/ftplugin/freebasic.mnv
@@ -0,0 +1,85 @@
+" MNV filetype plugin file
+" Language: FreeBASIC
+" Maintainer: Doug Kearns <dougkearns@gmail.com>
+" Last Change: 2023 Aug 22
+
+" Setup {{{1
+if exists("b:did_ftplugin")
+ finish
+endif
+
+let s:cpo_save = &cpo
+set cpo&mnv
+
+runtime! ftplugin/basic.mnv
+
+let s:dialect = freebasic#GetDialect()
+
+" Comments {{{1
+" add ''comments before 'comments
+let &l:comments = "sO:*\ -,mO:*\ \ ,exO:*/,s1:/',mb:',ex:'/,:''," .. &l:comments
+
+" Match words {{{1
+if exists("loaded_matchit")
+ let s:line_start = '\%(^\s*\)\@<='
+ let s:not_end = '\%(end\s\+\)\@<!'
+
+ let b:match_words ..= ','
+
+ if s:dialect == 'fb'
+ let b:match_words ..= s:not_end .. '\<constructor\>:\<end\s\+constructor\>,' ..
+ \ s:not_end .. '\<destructor\>:\<end\s\+destructor\>,' ..
+ \ s:not_end .. '\<property\>:\<end\s\+property\>,' ..
+ \ s:not_end .. '\<operator\>:\<end\s\+operator\>,' ..
+ \ s:not_end .. '\<extern\%(\s\+"\)\@=:\<end\s\+extern\>,'
+ endif
+
+ if s:dialect == 'fb' || s:dialect == 'deprecated'
+ let b:match_words ..= s:not_end .. '\<scope\>:\<end\s\+scope\>,'
+ endif
+
+ if s:dialect == 'qb'
+ let b:match_words ..= s:not_end .. '\<__asm\>:\<end\s\+__asm\>,' ..
+ \ s:not_end .. '\<__union\>:\<end\s\+__union\>,' ..
+ \ s:not_end .. '\<__with\>:\<end\s\+__with\>,'
+ else
+ let b:match_words ..= s:not_end .. '\<asm\>:\<end\s\+asm\>,' ..
+ \ s:not_end .. '\<namespace\>:\<end\s\+namespace\>,' ..
+ \ s:not_end .. '\<union\>:\<end\s\+union\>,' ..
+ \ s:not_end .. '\<with\>:\<end\s\+with\>,'
+ endif
+
+ let b:match_words ..= s:not_end .. '\<enum\>:\<end\s\+enum\>,' ..
+ \ s:line_start .. '#\s*\%(if\|ifdef\|ifndef\)\>:' ..
+ \ s:line_start .. '#\s*\%(else\|elseif\)\>:' ..
+ \ s:line_start .. '#\s*endif\>,' ..
+ \ s:line_start .. '#\s*macro\>:' .. s:line_start .. '#\s*endmacro\>,' ..
+ \ "/':'/"
+
+ " skip "function = <retval>" and "continue { do | for | while }"
+ if s:dialect == "qb"
+ let s:continue = "__continue"
+ else
+ let s:continue = "continue"
+ endif
+ let b:match_skip ..= ' || strpart(getline("."), col(".") - 1) =~? "^\\<function\\s\\+="' ..
+ \ ' || strpart(getline("."), 0, col(".") ) =~? "\\<' .. s:continue .. '\\s\\+"'
+
+ unlet s:not_end s:line_start
+endif
+
+if (has("gui_win32") || has("gui_gtk")) && exists("b:basic_set_browsefilter")
+ let b:browsefilter = "FreeBASIC Source Files (*.bas)\t*.bas\n" ..
+ \ "FreeBASIC Header Files (*.bi)\t*.bi\n"
+ if has("win32")
+ let b:browsefilter ..= "All Files (*.*)\t*\n"
+ else
+ let b:browsefilter ..= "All Files (*)\t*\n"
+ endif
+endif
+
+" Cleanup {{{1
+let &cpo = s:cpo_save
+unlet s:cpo_save s:dialect
+
+" mnv: nowrap sw=2 sts=2 ts=8 noet fdm=marker:
diff --git a/mnv/runtime/ftplugin/fstab.mnv b/mnv/runtime/ftplugin/fstab.mnv
new file mode 100644
index 0000000000..2c681d3619
--- /dev/null
+++ b/mnv/runtime/ftplugin/fstab.mnv
@@ -0,0 +1,30 @@
+" MNV ftplugin file
+" Language: fstab file
+" Maintainer: Radu Dineiu <radu.dineiu@gmail.com>
+" URL: https://raw.github.com/rid9/mnv-fstab/master/ftplugin/fstab.mnv
+" Last Change: 2025 Aug 21
+" Version: 1.1.0
+"
+" Changelog:
+" - 2025 Aug 21 added support for mtab
+" - 2024 May 23 by Riley Bruins <ribru17@gmail.com> ('commentstring')
+" - 2025 Mar 31 added setlocal formatoptions-=t
+"
+" Credits:
+" Subhaditya Nath <sn03.general@gmail.com>
+
+if exists("b:did_ftplugin")
+ finish
+endif
+let b:did_ftplugin = 1
+
+setlocal commentstring=#\ %s
+setlocal formatoptions-=t
+
+if expand('%:t') == 'mtab'
+ let b:fstab_enable_mtab = 1
+endif
+
+let b:undo_ftplugin = "setlocal commentstring< | setlocal formatoptions<"
+
+" mnv: ts=8 ft=mnv
diff --git a/mnv/runtime/ftplugin/fvwm.mnv b/mnv/runtime/ftplugin/fvwm.mnv
new file mode 100644
index 0000000000..89e1a8317a
--- /dev/null
+++ b/mnv/runtime/ftplugin/fvwm.mnv
@@ -0,0 +1,14 @@
+" Created : Tue 09 May 2006 02:07:31 PM CDT
+" Modified : Tue 09 May 2006 02:07:31 PM CDT
+" Author : Gautam Iyer <gi1242@users.sourceforge.net>
+" Description : ftplugin for fvwm config files
+
+if exists("b:did_ftplugin")
+ finish
+endif
+let b:did_ftplugin = 1
+
+let b:undo_ftplugin = "setl com< cms< fo<"
+
+setlocal comments=:# commentstring=#\ %s
+setlocal formatoptions-=t formatoptions+=croql
diff --git a/mnv/runtime/ftplugin/gdb.mnv b/mnv/runtime/ftplugin/gdb.mnv
new file mode 100644
index 0000000000..89353af37a
--- /dev/null
+++ b/mnv/runtime/ftplugin/gdb.mnv
@@ -0,0 +1,54 @@
+" MNV filetype plugin file
+" Language: gdb
+" Maintainer: Michaël Peeters <NOSPAMm.mnv@noekeon.org>
+" Contributors: Riley Bruins
+" Last Changed: 2017 Oct 26
+" 2024 Apr 10: add Matchit support (by MNV Project)
+" 2024 Apr 23: add space to commentstring (by Riley Bruins) ('commentstring')
+" 2026 Feb 08: add browsefilter, comment formatting, and improve matchit support (by MNV Project)
+
+if exists("b:did_ftplugin")
+ finish
+endif
+let b:did_ftplugin = 1
+
+let s:cpo_save = &cpo
+set cpo&mnv
+
+setlocal comments=:#
+setlocal commentstring=#\ %s
+setlocal formatoptions-=t
+setlocal formatoptions+=croql
+setlocal include=^\\s*source
+
+" Undo the stuff we changed.
+let b:undo_ftplugin = "setlocal com< cms< fo< inc<"
+
+if exists("loaded_matchit") && !exists("b:match_words")
+ let b:match_ignorecase = 0
+ let s:line_start = '\%(^\s*\)\@<='
+ let b:match_words =
+ \ s:line_start .. '\%(commands\|define\|document\|if\|while\|' ..
+ \ '\%(py\%[thon]\|gu\%[ile]\)\%(\s*$\)\@=\|' ..
+ \ '\%(compi\%[le]\|exp\%[ression]\)\s\+\%(c\%[ode]\|p\%[rint]\)\)\>:' ..
+ \ s:line_start .. '\%(else\|loop_continue\|loop_break\)\>:' ..
+ \ s:line_start .. 'end\>'
+ unlet s:line_start
+ let b:undo_ftplugin ..= " | unlet! b:match_ignorecase b:match_words"
+endif
+
+if (has("gui_win32") || has("gui_gtk")) && !exists("b:browsefilter")
+ let b:browsefilter =
+ \ "GDB Init Files (.gdbinit gdbinit .gdbearlyinit gdbearlyinit)\t" ..
+ \ ".gdbinit;gdbinit;.gdbearlyinit;gdbearlyinit\n" ..
+ \ "GDB Command Files (*.gdb)\t*.gdb\n"
+ if has("win32")
+ let b:browsefilter ..= "All Files (*.*)\t*\n"
+ else
+ let b:browsefilter ..= "All Files (*)\t*\n"
+ endif
+ let b:undo_ftplugin ..= " | unlet! b:browsefilter"
+endif
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/mnv/runtime/ftplugin/gdscript.mnv b/mnv/runtime/ftplugin/gdscript.mnv
new file mode 100644
index 0000000000..91e3614db0
--- /dev/null
+++ b/mnv/runtime/ftplugin/gdscript.mnv
@@ -0,0 +1,65 @@
+mnv9script
+
+# MNV filetype plugin file
+# Language: gdscript (Godot game engine scripting language)
+# Maintainer: Maxim Kim <habamax@gmail.com>
+# Website: https://github.com/habamax/mnv-gdscript
+# Last Change: 2024 Jul 14
+
+if exists("b:did_ftplugin") | finish | endif
+
+b:did_ftplugin = 1
+b:undo_ftplugin = 'setlocal cinkeys<'
+ \ .. '| setlocal indentkeys<'
+ \ .. '| setlocal commentstring<'
+ \ .. '| setlocal suffixesadd<'
+ \ .. '| setlocal foldexpr<'
+ \ .. '| setlocal foldignore<'
+
+setlocal cinkeys-=0#
+setlocal indentkeys-=0#
+setlocal suffixesadd=.gd
+setlocal commentstring=#\ %s
+setlocal foldignore=
+setlocal foldexpr=GDScriptFoldLevel()
+
+if get(g:, 'gdscript_recommended_style', 1)
+ setlocal noexpandtab tabstop=4 softtabstop=0 shiftwidth=0
+ b:undo_ftplugin ..= ' | setlocal expandtab< tabstop< softtabstop< shiftwidth<'
+endif
+
+
+def GDScriptFoldLevel(): string
+ var line = getline(v:lnum)
+ if line =~? '^\s*$'
+ return "-1"
+ endif
+
+ var sw = shiftwidth()
+ var indent = indent(v:lnum) / sw
+ var indent_next = indent(nextnonblank(v:lnum + 1)) / sw
+
+ if indent_next > indent && line =~ ':\s*$'
+ return $">{indent_next}"
+ else
+ return $"{indent}"
+ endif
+enddef
+
+
+if !exists("g:no_plugin_maps")
+ # Next/Previous section
+ def NextSection(back: bool, cnt: number)
+ for n in range(cnt)
+ search('^\s*func\s', back ? 'bW' : 'W')
+ endfor
+ enddef
+
+ nnoremap <silent><buffer> ]] <scriptcmd>NextSection(false, v:count1)<CR>
+ nnoremap <silent><buffer> [[ <scriptcmd>NextSection(true, v:count1)<CR>
+ xmap <buffer><expr> ]] $'<C-\><C-N>{v:count1}]]m>gv'
+ xmap <buffer><expr> [[ $'<C-\><C-N>{v:count1}[[m>gv'
+ b:undo_ftplugin ..=
+ \ " | silent exe 'unmap <buffer> [['"
+ \ .. " | silent exe 'unmap <buffer> ]]'"
+endif
diff --git a/mnv/runtime/ftplugin/gdshader.mnv b/mnv/runtime/ftplugin/gdshader.mnv
new file mode 100644
index 0000000000..317c10b6f9
--- /dev/null
+++ b/mnv/runtime/ftplugin/gdshader.mnv
@@ -0,0 +1,16 @@
+mnv9script
+
+# MNV filetype plugin file
+# Language: Godot shading language
+# Maintainer: Maxim Kim <habamax@gmail.com>
+# Website: https://github.com/habamax/mnv-gdscript
+# Last Update: 2025-06-09
+
+if exists("b:did_ftplugin") | finish | endif
+b:did_ftplugin = 1
+
+b:undo_ftplugin = 'setlocal suffixesadd< comments< commentstring<'
+
+setlocal suffixesadd=.gdshader
+setlocal comments=sO:*\ -,mO:*\ \ ,exO:*/,s1:/*,mb:*,ex:*/,://
+setlocal commentstring=//\ %s
diff --git a/mnv/runtime/ftplugin/gel.mnv b/mnv/runtime/ftplugin/gel.mnv
new file mode 100644
index 0000000000..52f27187a7
--- /dev/null
+++ b/mnv/runtime/ftplugin/gel.mnv
@@ -0,0 +1,13 @@
+" MNV filetype plugin file
+" Language: TI Code Composer Studio General Extension Language
+" Document: https://downloads.ti.com/ccs/esd/documents/users_guide/ccs_debug-gel.html
+" Maintainer: Wu, Zhenyu <wuzhenyu@ustc.edu>
+" Last Change: 2024 Dec 25
+
+if exists("b:did_ftplugin") | finish | endif
+let b:did_ftplugin = 1
+
+setlocal comments=sO:*\ -,mO:*\ \ ,exO:*/,s1:/*,mb:*,ex:*/,:///,://
+setlocal commentstring=/*\ %s\ */
+
+let b:undo_ftplugin = "setl commentstring< comments<"
diff --git a/mnv/runtime/ftplugin/git.mnv b/mnv/runtime/ftplugin/git.mnv
new file mode 100644
index 0000000000..36f8040c41
--- /dev/null
+++ b/mnv/runtime/ftplugin/git.mnv
@@ -0,0 +1,15 @@
+" MNV filetype plugin
+" Language: generic git output
+" Maintainer: Tim Pope <mnvNOSPAM@tpope.org>
+" Last Change: 2023 Mar 26
+
+" Only do this when not done yet for this buffer
+if (exists("b:did_ftplugin"))
+ finish
+endif
+
+let b:did_ftplugin = 1
+
+setlocal nomodeline
+
+let b:undo_ftplugin = "setl modeline<"
diff --git a/mnv/runtime/ftplugin/gitattributes.mnv b/mnv/runtime/ftplugin/gitattributes.mnv
new file mode 100644
index 0000000000..c1b6859367
--- /dev/null
+++ b/mnv/runtime/ftplugin/gitattributes.mnv
@@ -0,0 +1,13 @@
+" MNV filetype plugin
+" Language: git attributes
+" Maintainer: ObserverOfTime <chronobserver@disroot.org>
+" Last Change: 2022 Sep 08
+
+if exists('b:did_ftplugin')
+ finish
+endif
+let b:did_ftplugin = 1
+
+setl comments=:# commentstring=#\ %s
+
+let b:undo_ftplugin = 'setl com< cms<'
diff --git a/mnv/runtime/ftplugin/gitcommit.mnv b/mnv/runtime/ftplugin/gitcommit.mnv
new file mode 100644
index 0000000000..1667f15b67
--- /dev/null
+++ b/mnv/runtime/ftplugin/gitcommit.mnv
@@ -0,0 +1,60 @@
+" MNV filetype plugin
+" Language: git commit file
+" Maintainer: Tim Pope <mnvNOSPAM@tpope.org>
+" Last Change: 2023 Dec 28
+
+" Only do this when not done yet for this buffer
+if (exists("b:did_ftplugin"))
+ finish
+endif
+
+let b:did_ftplugin = 1
+
+setlocal nomodeline tabstop=8 formatoptions+=tl textwidth=72
+setlocal formatoptions-=c formatoptions-=r formatoptions-=o formatoptions-=q formatoptions+=n
+setlocal formatlistpat=^\\s*\\d\\+[\\]:.)}]\\s\\+\\\|^\\s*[-*+]\\s\\+
+setlocal include=^+++
+setlocal includeexpr=substitute(v:fname,'^[bi]/','','')
+
+let b:undo_ftplugin = 'setl modeline< tabstop< formatoptions< tw< com< cms< formatlistpat< inc< inex<'
+
+let s:l = search('\C\m^[#;@!$%^&|:] -\{24,\} >8 -\{24,\}$', 'cnW', '', 100)
+let &l:comments = ':' . (matchstr(getline(s:l ? s:l : '$'), '^[#;@!$%^&|:]\S\@!') . '#')[0]
+let &l:commentstring = &l:comments[1] . ' %s'
+unlet s:l
+
+if exists("g:no_gitcommit_commands")
+ finish
+endif
+
+command! -bang -bar -buffer -complete=custom,s:diffcomplete -nargs=* DiffGitCached :call s:gitdiffcached(<bang>0, <f-args>)
+
+let b:undo_ftplugin = b:undo_ftplugin . "|delc DiffGitCached"
+
+function! s:diffcomplete(A, L, P) abort
+ let args = ""
+ if a:P <= match(a:L." -- "," -- ")+3
+ let args = args . "-p\n--stat\n--shortstat\n--summary\n--patch-with-stat\n--no-renames\n-B\n-M\n-C\n"
+ end
+ if a:A !~ '^-' && !empty(getftype('.git'))
+ let args = args."\n".system("git diff --cached --name-only")
+ endif
+ return args
+endfunction
+
+function! s:setupdiff() abort
+ command! -bang -bar -buffer -complete=custom,s:diffcomplete -nargs=* DiffGitCached :call s:gitdiffcached(<bang>0, <f-args>)
+ setlocal buftype=nowrite nobuflisted noswapfile nomodifiable filetype=git
+endfunction
+
+function! s:gitdiffcached(bang, ...) abort
+ let name = tempname()
+ if a:0
+ let extra = join(map(copy(a:000), 'shellescape(v:val)'))
+ else
+ let extra = "-p --stat=".&columns
+ endif
+ call system("git diff --cached --no-color --no-ext-diff ".extra." > ".shellescape(name))
+ exe 'pedit +call\ s:setupdiff()' fnameescape(name)
+ silent! wincmd P
+endfunction
diff --git a/mnv/runtime/ftplugin/gitconfig.mnv b/mnv/runtime/ftplugin/gitconfig.mnv
new file mode 100644
index 0000000000..7e8632684c
--- /dev/null
+++ b/mnv/runtime/ftplugin/gitconfig.mnv
@@ -0,0 +1,15 @@
+" MNV filetype plugin
+" Language: git config file
+" Maintainer: Tim Pope <mnvNOSPAM@tpope.org>
+" Last Change: 2009 Dec 24
+
+" Only do this when not done yet for this buffer
+if (exists("b:did_ftplugin"))
+ finish
+endif
+let b:did_ftplugin = 1
+
+setlocal formatoptions-=t formatoptions+=croql
+setlocal comments=:#,:; commentstring=;\ %s
+
+let b:undo_ftplugin = "setl fo< com< cms<"
diff --git a/mnv/runtime/ftplugin/gitignore.mnv b/mnv/runtime/ftplugin/gitignore.mnv
new file mode 100644
index 0000000000..bec26d0474
--- /dev/null
+++ b/mnv/runtime/ftplugin/gitignore.mnv
@@ -0,0 +1,13 @@
+" MNV filetype plugin
+" Language: git ignore
+" Maintainer: ObserverOfTime <chronobserver@disroot.org>
+" Last Change: 2022 Sep 10
+
+if exists('b:did_ftplugin')
+ finish
+endif
+let b:did_ftplugin = 1
+
+setl comments=:# commentstring=#\ %s
+
+let b:undo_ftplugin = 'setl com< cms<'
diff --git a/mnv/runtime/ftplugin/gitrebase.mnv b/mnv/runtime/ftplugin/gitrebase.mnv
new file mode 100644
index 0000000000..5696e8e574
--- /dev/null
+++ b/mnv/runtime/ftplugin/gitrebase.mnv
@@ -0,0 +1,45 @@
+" MNV filetype plugin
+" Language: git rebase --interactive
+" Maintainer: Tim Pope <mnvNOSPAM@tpope.org>
+" Last Change: 2022 Jan 05
+
+" Only do this when not done yet for this buffer
+if (exists("b:did_ftplugin"))
+ finish
+endif
+
+let b:did_ftplugin = 1
+
+let &l:comments = ':' . (matchstr(getline('$'), '^[#;@!$%^&|:]\S\@!') . '#')[0]
+let &l:commentstring = &l:comments[1] . ' %s'
+setlocal formatoptions-=t
+setlocal nomodeline
+let b:undo_ftplugin = "setl com< cms< fo< ml<"
+
+function! s:choose(word) abort
+ s/^\(\w\+\>\)\=\(\s*\)\ze\x\{4,40\}\>/\=(strlen(submatch(1)) == 1 ? a:word[0] : a:word) . substitute(submatch(2),'^$',' ','')/e
+endfunction
+
+function! s:cycle(count) abort
+ let words = ['pick', 'edit', 'fixup', 'squash', 'reword', 'drop']
+ let index = index(map(copy(words), 'v:val[0]'), getline('.')[0])
+ let index = ((index < 0 ? 0 : index) + 10000 * len(words) + a:count) % len(words)
+ call s:choose(words[index])
+endfunction
+
+command! -buffer -bar -range Pick :<line1>,<line2>call s:choose('pick')
+command! -buffer -bar -range Squash :<line1>,<line2>call s:choose('squash')
+command! -buffer -bar -range Edit :<line1>,<line2>call s:choose('edit')
+command! -buffer -bar -range Reword :<line1>,<line2>call s:choose('reword')
+command! -buffer -bar -range Fixup :<line1>,<line2>call s:choose('fixup')
+command! -buffer -bar -range Drop :<line1>,<line2>call s:choose('drop')
+command! -buffer -count=1 -bar -bang Cycle call s:cycle(<bang>0 ? -<count> : <count>)
+
+if exists("g:no_plugin_maps") || exists("g:no_gitrebase_maps")
+ finish
+endif
+
+nnoremap <buffer> <silent> <C-A> :<C-U><C-R>=v:count1<CR>Cycle<CR>
+nnoremap <buffer> <silent> <C-X> :<C-U><C-R>=v:count1<CR>Cycle!<CR>
+
+let b:undo_ftplugin = b:undo_ftplugin . "|exe 'nunmap <buffer> <C-A>'|exe 'nunmap <buffer> <C-X>'"
diff --git a/mnv/runtime/ftplugin/gitsendemail.mnv b/mnv/runtime/ftplugin/gitsendemail.mnv
new file mode 100644
index 0000000000..95afd1a348
--- /dev/null
+++ b/mnv/runtime/ftplugin/gitsendemail.mnv
@@ -0,0 +1,6 @@
+" MNV filetype plugin
+" Language: git send-email message
+" Maintainer: Tim Pope <mnvNOSPAM@tpope.org>
+" Last Change: 2009 Dec 24
+
+runtime! ftplugin/mail.mnv
diff --git a/mnv/runtime/ftplugin/gleam.mnv b/mnv/runtime/ftplugin/gleam.mnv
new file mode 100644
index 0000000000..8886ab1c01
--- /dev/null
+++ b/mnv/runtime/ftplugin/gleam.mnv
@@ -0,0 +1,33 @@
+" MNV filetype plugin file
+" Language: Gleam
+" Maintainer: Kirill Morozov <kirill@robotix.pro>
+" Previous Maintainer: Trilowy (https://github.com/trilowy)
+" Based On: https://github.com/gleam-lang/gleam.mnv
+" Last Change: 2025 Apr 21
+" 2026 Feb 13 by MNV Project (remove 'formatprg' #19108)
+
+if exists('b:did_ftplugin')
+ finish
+endif
+let b:did_ftplugin = 1
+
+setlocal comments=:////,:///,://
+setlocal commentstring=//\ %s
+setlocal suffixesadd=.gleam
+let b:undo_ftplugin = "setlocal com< cms< sua<"
+
+if get(g:, "gleam_recommended_style", 1)
+ setlocal expandtab
+ setlocal shiftwidth=2
+ setlocal smartindent
+ setlocal softtabstop=2
+ setlocal tabstop=2
+ let b:undo_ftplugin ..= " | setlocal et< sw< si< sts< ts<"
+endif
+
+if !exists('current_compiler')
+ compiler gleam_build
+ let b:undo_ftplugin ..= "| compiler make"
+endif
+
+" mnv: sw=2 sts=2 et
diff --git a/mnv/runtime/ftplugin/go.mnv b/mnv/runtime/ftplugin/go.mnv
new file mode 100644
index 0000000000..74505a962d
--- /dev/null
+++ b/mnv/runtime/ftplugin/go.mnv
@@ -0,0 +1,86 @@
+" MNV filetype plugin file
+" Language: Go
+" Maintainer: David Barnett (https://github.com/google/mnv-ft-go is archived)
+" Last Change: 2014 Aug 16
+" 2024 Jul 16 by MNV Project (add recommended indent style)
+" 2025 Mar 07 by MNV Project (add formatprg and keywordprg option #16804)
+" 2025 Mar 18 by MNV Project (use :term for 'keywordprg' #16911)
+" 2025 Apr 16 by MNV Project (set 'cpoptions' for line continuation, #17121)
+" 2025 Jul 02 by MNV Project (add section movement mappings #17641)
+" 2025 Jul 05 by MNV Project (update b:undo_ftplugin #17664)
+" 2026 Feb 13 by MNV Project (remove formatprg #19108)
+
+if exists('b:did_ftplugin')
+ finish
+endif
+let b:did_ftplugin = 1
+
+let s:cpo_save = &cpo
+set cpo&mnv
+
+setlocal formatoptions-=t
+
+setlocal comments=s1:/*,mb:*,ex:*/,://
+setlocal commentstring=//\ %s
+setlocal keywordprg=:GoKeywordPrg
+
+command! -buffer -nargs=* GoKeywordPrg call s:GoKeywordPrg()
+
+let b:undo_ftplugin = 'setl fo< com< cms< kp<'
+ \ . '| delcommand -buffer GoKeywordPrg'
+
+if get(g:, 'go_recommended_style', 1)
+ setlocal noexpandtab softtabstop=0 shiftwidth=0
+ let b:undo_ftplugin .= ' | setl et< sts< sw<'
+endif
+
+if !exists('*' . expand('<SID>') . 'GoKeywordPrg')
+ func! s:GoKeywordPrg()
+ let temp_isk = &l:iskeyword
+ setl iskeyword+=.
+ try
+ let cmd = 'go doc -C ' . shellescape(expand('%:h')) . ' ' . shellescape(expand('<cword>'))
+ if has('gui_running') || has('nmnv')
+ exe 'hor term' cmd
+ else
+ exe '!' . cmd
+ endif
+ finally
+ let &l:iskeyword = temp_isk
+ endtry
+ endfunc
+endif
+
+if !exists("no_plugin_maps") && !exists("no_go_maps")
+ noremap <silent> <buffer> ]] <Cmd>call <SID>GoFindSection('next_start', v:count1)<CR>
+ noremap <silent> <buffer> ][ <Cmd>call <SID>GoFindSection('next_end', v:count1)<CR>
+ noremap <silent> <buffer> [[ <Cmd>call <SID>GoFindSection('prev_start', v:count1)<CR>
+ noremap <silent> <buffer> [] <Cmd>call <SID>GoFindSection('prev_end', v:count1)<CR>
+ let b:undo_ftplugin .= ''
+ \ . "| silent! exe 'unmap <buffer> ]]'"
+ \ . "| silent! exe 'unmap <buffer> ]['"
+ \ . "| silent! exe 'unmap <buffer> [['"
+ \ . "| silent! exe 'unmap <buffer> []'"
+endif
+
+function! <SID>GoFindSection(dir, count)
+ mark '
+ let c = a:count
+ while c > 0
+ if a:dir == 'next_start'
+ keepjumps call search('^\(type\|func\)\>', 'W')
+ elseif a:dir == 'next_end'
+ keepjumps call search('^}', 'W')
+ elseif a:dir == 'prev_start'
+ keepjumps call search('^\(type\|func\)\>', 'bW')
+ elseif a:dir == 'prev_end'
+ keepjumps call search('^}', 'bW')
+ endif
+ let c -= 1
+ endwhile
+endfunction
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
+
+" mnv: sw=2 sts=2 et
diff --git a/mnv/runtime/ftplugin/goaccess.mnv b/mnv/runtime/ftplugin/goaccess.mnv
new file mode 100644
index 0000000000..60476b060a
--- /dev/null
+++ b/mnv/runtime/ftplugin/goaccess.mnv
@@ -0,0 +1,14 @@
+" MNV filetype plugin
+" Language: GoAccess configuration
+" Maintainer: Adam Monsen <haircut@gmail.com>
+" Last Change: 2024 Aug 1
+
+if exists('b:did_ftplugin')
+ finish
+endif
+
+let b:did_ftplugin = 1
+
+setl comments=:# commentstring=#\ %s
+
+let b:undo_ftplugin = 'setl com< cms<'
diff --git a/mnv/runtime/ftplugin/gomod.mnv b/mnv/runtime/ftplugin/gomod.mnv
new file mode 100644
index 0000000000..04519b4e7e
--- /dev/null
+++ b/mnv/runtime/ftplugin/gomod.mnv
@@ -0,0 +1,16 @@
+" MNV filetype plugin file
+" Language: go module file
+" Maintainer: YU YUK KUEN <yukkuen.yu719@gmail.com>
+" Last Change: 2024-06-21
+" 2024 Jul 16 by MNV Project (noexpandtab)
+
+if exists('b:did_ftplugin')
+ finish
+endif
+let b:did_ftplugin = 1
+
+setlocal noexpandtab
+setlocal formatoptions-=t formatoptions-=c
+setlocal commentstring=//\ %s
+
+let b:undo_ftplugin = 'setl et< fo< cms<'
diff --git a/mnv/runtime/ftplugin/gpg.mnv b/mnv/runtime/ftplugin/gpg.mnv
new file mode 100644
index 0000000000..3d0378cf11
--- /dev/null
+++ b/mnv/runtime/ftplugin/gpg.mnv
@@ -0,0 +1,29 @@
+" MNV filetype plugin file
+" Language: gpg(1) configuration file
+" Maintainer: This runtime file is looking for a new maintainer.
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2025-07-22 (use :hor term #17822)
+
+if exists("b:did_ftplugin")
+ finish
+endif
+let b:did_ftplugin = 1
+
+let s:cpo_save = &cpo
+set cpo&mnv
+
+let b:undo_ftplugin = "setl com< cms< fo<"
+
+setlocal comments=:# commentstring=#\ %s formatoptions-=t formatoptions+=croql
+
+if has('unix') && executable('less') && exists(':terminal') == 2
+ command -buffer -nargs=1 GpgKeywordPrg
+ \ silent exe ':hor term ' . 'env LESS= MANPAGER="less --pattern=''' . escape('^\s+--' . <q-args> . '\b', '\') . ''' --hilite-search" man ' . 'gpg'
+ setlocal iskeyword+=-
+ setlocal keywordprg=:GpgKeywordPrg
+ let b:undo_ftplugin .= '| setlocal keywordprg< iskeyword< | sil! delc -buffer GpgKeywordPrg'
+endif
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
+
diff --git a/mnv/runtime/ftplugin/gprof.mnv b/mnv/runtime/ftplugin/gprof.mnv
new file mode 100644
index 0000000000..1afba1490f
--- /dev/null
+++ b/mnv/runtime/ftplugin/gprof.mnv
@@ -0,0 +1,36 @@
+" Language: gprof
+" Maintainer: Dominique Pelle <dominique.pelle@gmail.com>
+" Contributors: Doug Kearns <dougkearns@gmail.com>
+" Last Change: 2021 Sep 19
+
+" When cursor is on one line of the gprof call graph,
+" calling this function jumps to this function in the call graph.
+if exists("b:did_ftplugin")
+ finish
+endif
+let b:did_ftplugin=1
+
+func! <SID>GprofJumpToFunctionIndex()
+ let l:line = getline('.')
+ if l:line =~ '[\d\+\]$'
+ " We're in a line in the call graph.
+ norm! $y%
+ call search('^' . escape(@", '[]'), 'sw')
+ norm! zz
+ elseif l:line =~ '^\(\s*[0-9\.]\+\)\{3}\s\+'
+ " We're in line in the flat profile.
+ norm! 55|eby$
+ call search('^\[\d\+\].*\d\s\+' . escape(@", '[]*.') . '\>', 'sW')
+ norm! zz
+ endif
+endfunc
+
+if !exists("no_plugin_maps") && !exists("no_gprof_maps")
+ " Pressing <C-]> on a line in the gprof flat profile or in
+ " the call graph, jumps to the corresponding function inside
+ " the flat profile.
+ map <buffer> <silent> <C-]> :call <SID>GprofJumpToFunctionIndex()<CR>
+ let b:undo_ftplugin = "silent! unmap <buffer> <C-]>"
+endif
+
+" mnv:sw=2 fdm=indent
diff --git a/mnv/runtime/ftplugin/graphql.mnv b/mnv/runtime/ftplugin/graphql.mnv
new file mode 100644
index 0000000000..96d78fa0c6
--- /dev/null
+++ b/mnv/runtime/ftplugin/graphql.mnv
@@ -0,0 +1,22 @@
+" MNV filetype plugin
+" Language: graphql
+" Maintainer: Jon Parise <jon@indelible.org>
+" Filenames: *.graphql *.graphqls *.gql
+" URL: https://github.com/jparise/mnv-graphql
+" License: MIT <https://opensource.org/license/mit>
+" Last Change: 2024 Dec 21
+
+if exists('b:did_ftplugin')
+ finish
+endif
+let b:did_ftplugin = 1
+
+setlocal comments=:#
+setlocal commentstring=#\ %s
+setlocal formatoptions-=t
+setlocal iskeyword+=$,@-@
+setlocal softtabstop=2
+setlocal shiftwidth=2
+setlocal expandtab
+
+let b:undo_ftplugin = 'setlocal com< cms< fo< isk< sts< sw< et<'
diff --git a/mnv/runtime/ftplugin/groff.mnv b/mnv/runtime/ftplugin/groff.mnv
new file mode 100644
index 0000000000..586dd1a1e7
--- /dev/null
+++ b/mnv/runtime/ftplugin/groff.mnv
@@ -0,0 +1,19 @@
+" MNV syntax file
+" Language: groff(7)
+" Maintainer: Eisuke Kawashima ( e.kawaschima+mnv AT gmail.com )
+" Last Change: 2025 Apr 24
+" 2025 Jun 18 by MNV Project: update commentstring option (#17516)
+
+if exists('b:did_ftplugin')
+ finish
+endif
+
+let b:nroff_is_groff = 1
+
+runtime! ftplugin/nroff.mnv
+
+setlocal commentstring=\\#\ %s
+setlocal comments=:\\#,:.\\\",:\\\",:'\\\",:'''
+
+let b:undo_ftplugin .= '| unlet! b:nroff_is_groff'
+let b:did_ftplugin = 1
diff --git a/mnv/runtime/ftplugin/groovy.mnv b/mnv/runtime/ftplugin/groovy.mnv
new file mode 100644
index 0000000000..60cd6a1473
--- /dev/null
+++ b/mnv/runtime/ftplugin/groovy.mnv
@@ -0,0 +1,20 @@
+" MNV filetype plugin file
+" Language: groovy
+" Maintainer: Justin M. Keyes <justinkz@gmail.com>
+" Last Change: 2016 May 22
+" 2024 May 24 by Riley Bruins <ribru17@gmail.com> ('commentstring')
+
+if exists('b:did_ftplugin')
+ finish
+endif
+let b:did_ftplugin = 1
+
+let s:cpo_save = &cpo
+set cpo-=C
+
+let b:undo_ftplugin = 'setlocal commentstring<'
+
+setlocal commentstring=//\ %s
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/mnv/runtime/ftplugin/group.mnv b/mnv/runtime/ftplugin/group.mnv
new file mode 100644
index 0000000000..12d6b573f9
--- /dev/null
+++ b/mnv/runtime/ftplugin/group.mnv
@@ -0,0 +1,19 @@
+" MNV filetype plugin file
+" Language: group(5) user group file
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2008-07-09
+
+if exists("b:did_ftplugin")
+ finish
+endif
+let b:did_ftplugin = 1
+
+let s:cpo_save = &cpo
+set cpo&mnv
+
+let b:undo_ftplugin = "setl com< cms< fo<"
+
+setlocal comments= commentstring= formatoptions-=tcroq formatoptions+=l
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/mnv/runtime/ftplugin/grub.mnv b/mnv/runtime/ftplugin/grub.mnv
new file mode 100644
index 0000000000..c04abf5075
--- /dev/null
+++ b/mnv/runtime/ftplugin/grub.mnv
@@ -0,0 +1,19 @@
+" MNV filetype plugin file
+" Language: grub(8) configuration file
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2008-07-09
+
+if exists("b:did_ftplugin")
+ finish
+endif
+let b:did_ftplugin = 1
+
+let s:cpo_save = &cpo
+set cpo&mnv
+
+let b:undo_ftplugin = "setl com< cms< fo<"
+
+setlocal comments=:# commentstring=#\ %s formatoptions-=t formatoptions+=croql
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/mnv/runtime/ftplugin/gyp.mnv b/mnv/runtime/ftplugin/gyp.mnv
new file mode 100644
index 0000000000..a4153265e5
--- /dev/null
+++ b/mnv/runtime/ftplugin/gyp.mnv
@@ -0,0 +1,14 @@
+" MNV filetype plugin
+" Language: GYP
+" Maintainer: ObserverOfTime <chronobserver@disroot.org>
+" Last Change: 2022 Sep 27
+
+if exists('b:did_ftplugin')
+ finish
+endif
+let b:did_ftplugin = 1
+
+setlocal formatoptions-=t
+setlocal commentstring=#\ %s comments=b:#,fb:-
+
+let b:undo_ftplugin = 'setlocal fo< cms< com<'
diff --git a/mnv/runtime/ftplugin/haml.mnv b/mnv/runtime/ftplugin/haml.mnv
new file mode 100644
index 0000000000..8a40994107
--- /dev/null
+++ b/mnv/runtime/ftplugin/haml.mnv
@@ -0,0 +1,76 @@
+" MNV filetype plugin
+" Language: Haml
+" Maintainer: Tim Pope <mnvNOSPAM@tpope.org>
+" Last Change: 2019 Dec 05
+" 2024 Jan 14 by MNV Project (browsefilter)
+
+" Only do this when not done yet for this buffer
+if exists("b:did_ftplugin")
+ finish
+endif
+
+let s:save_cpo = &cpo
+set cpo-=C
+
+" Define some defaults in case the included ftplugins don't set them.
+let s:undo_ftplugin = ""
+if has("win32")
+ let s:browsefilter = "All Files (*.*)\t*\n"
+else
+ let s:browsefilter = "All Files (*)\t*\n"
+endif
+let s:match_words = ""
+
+runtime! ftplugin/html.mnv ftplugin/html_*.mnv ftplugin/html/*.mnv
+unlet! b:did_ftplugin
+set matchpairs-=<:>
+
+" Override our defaults if these were set by an included ftplugin.
+if exists("b:undo_ftplugin")
+ let s:undo_ftplugin = b:undo_ftplugin
+ unlet b:undo_ftplugin
+endif
+if exists("b:browsefilter")
+ let s:browsefilter = b:browsefilter
+ unlet b:browsefilter
+endif
+if exists("b:match_words")
+ let s:match_words = b:match_words
+ unlet b:match_words
+endif
+
+runtime! ftplugin/ruby.mnv ftplugin/ruby_*.mnv ftplugin/ruby/*.mnv
+let b:did_ftplugin = 1
+
+let &l:define .= empty(&l:define ? '' : '\|') . '^\s*\%(%\w*\)\=\%(\.[[:alnum:]_-]\+\)*#'
+
+" Combine the new set of values with those previously included.
+if exists("b:undo_ftplugin")
+ let s:undo_ftplugin = b:undo_ftplugin . " | " . s:undo_ftplugin
+endif
+if exists ("b:browsefilter")
+ let s:browsefilter = substitute(b:browsefilter,'\cAll Files (.*)\t\*\n','','') . s:browsefilter
+endif
+if exists("b:match_words")
+ let s:match_words = b:match_words . ',' . s:match_words
+endif
+
+" Change the browse dialog on Win32 and GTK to show mainly Haml-related files
+if has("gui_win32") || has("gui_gtk")
+ let b:browsefilter="Haml Files (*.haml)\t*.haml\nSass Files (*.sass)\t*.sass\n" . s:browsefilter
+endif
+
+" Load the combined list of match_words for matchit.mnv
+if exists("loaded_matchit")
+ let b:match_words = s:match_words
+endif
+
+setlocal comments= commentstring=-#\ %s
+
+let b:undo_ftplugin = "setl def< cms< com< " .
+ \ " | unlet! b:browsefilter b:match_words | " . s:undo_ftplugin
+
+let &cpo = s:save_cpo
+unlet s:save_cpo
+
+" mnv:set sw=2:
diff --git a/mnv/runtime/ftplugin/hamster.mnv b/mnv/runtime/ftplugin/hamster.mnv
new file mode 100644
index 0000000000..041e62b0a8
--- /dev/null
+++ b/mnv/runtime/ftplugin/hamster.mnv
@@ -0,0 +1,67 @@
+" MNV filetype plugin
+" Language: Hamster Script
+" Version: 2.0.6.0
+" Maintainer: David Fishburn <dfishburn dot mnv at gmail dot com>
+" Last Change: 2021 Jan 19
+" 2024 May 23 by Riley Bruins <ribru17@gmail.com> ('commentstring')
+" 2025 Sep 05 by MNV Project, disable setting global ignorecase
+
+" Only do this when not done yet for this buffer
+if exists("b:did_ftplugin")
+ finish
+endif
+
+" Don't load another plugin for this buffer
+let b:did_ftplugin = 1
+
+let s:cpo_save = &cpo
+set cpo&mnv
+
+let b:undo_ftplugin = "setl fo< com< tw< commentstring<"
+ \ . "| unlet! b:match_ignorecase b:match_words b:match_skip"
+
+" Set 'formatoptions' to break comment lines but not other lines,
+" and insert the comment leader when hitting <CR> or using "o".
+setlocal fo-=t fo+=croql
+
+" Use the # sign for comments
+setlocal comments=:#
+
+" Format comments to be up to 78 characters long
+if &tw == 0
+ setlocal tw=78
+endif
+
+" Comments start with a double quote
+setlocal commentstring=#\ %s
+
+" Move around functions.
+noremap <silent><buffer> [[ :call search('^\s*sub\>', "bW")<CR>
+noremap <silent><buffer> ]] :call search('^\s*sub\>', "W")<CR>
+noremap <silent><buffer> [] :call search('^\s*endsub\>', "bW")<CR>
+noremap <silent><buffer> ][ :call search('^\s*endsub\>', "W")<CR>
+
+" Move around comments
+noremap <silent><buffer> ]# :call search('^\s*#\@!', "W")<CR>
+noremap <silent><buffer> [# :call search('^\s*#\@!', "bW")<CR>
+
+" Let the matchit plugin know what items can be matched.
+if exists("loaded_matchit")
+ let b:match_ignorecase = 0
+ let b:match_words =
+ \ '\<sub\>:\<return\>:\<endsub\>,' .
+ \ '\<do\|while\|repeat\|for\>:\<break\>:\<continue\>:\<loop\|endwhile\|until\|endfor\>,' .
+ \ '\<if\>:\<else\%[if]\>:\<endif\>'
+
+ " Ignore ":syntax region" commands, the 'end' argument clobbers if-endif
+ " let b:match_skip = 'getline(".") =~ "^\\s*sy\\%[ntax]\\s\\+region" ||
+ " \ synIDattr(synID(line("."),col("."),1),"name") =~? "comment\\|string"'
+endif
+
+" setlocal ignorecase
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
+
+" Disabled, 'cpo' is a global option.
+" setlocal cpo+=M " makes \%( match \)
diff --git a/mnv/runtime/ftplugin/hare.mnv b/mnv/runtime/ftplugin/hare.mnv
new file mode 100644
index 0000000000..6f7c4cc20b
--- /dev/null
+++ b/mnv/runtime/ftplugin/hare.mnv
@@ -0,0 +1,51 @@
+mnv9script
+
+# MNV filetype plugin.
+# Language: Hare
+# Maintainer: Amelia Clarke <selene@perilune.dev>
+# Last Change: 2026 Jan 24
+# Upstream: https://git.sr.ht/~sircmpwn/hare.mnv
+
+if exists('b:did_ftplugin')
+ finish
+endif
+b:did_ftplugin = 1
+
+# Use the Hare compiler.
+compiler hare
+b:undo_ftplugin = 'compiler make'
+
+# Formatting settings.
+setlocal comments=://
+setlocal commentstring=//\ %s
+setlocal formatlistpat=^\\s*-\\s\\+
+setlocal formatoptions+=croqnlj/ formatoptions-=t
+b:undo_ftplugin ..= ' | setl cms< com< flp< fo<'
+
+# Locate Hare modules.
+&l:include = '\v^\s*use\s+%(\h\w*\s*\=)?'
+&l:includeexpr = 'trim(v:fname, ":", 2)->substitute("::", "/", "g")'
+setlocal isfname+=:
+&l:path = ',,' .. hare#GetPath()
+b:undo_ftplugin ..= ' | setl inc< inex< isf< pa<'
+
+# Follow the official style guide by default.
+if get(g:, 'hare_recommended_style', 1)
+ setlocal noexpandtab
+ setlocal shiftwidth=8
+ setlocal softtabstop=0
+ setlocal tabstop=8
+ setlocal textwidth=80
+ b:undo_ftplugin ..= ' | setl et< sts< sw< ts< tw<'
+endif
+
+# Highlight incorrect whitespace outside of insert mode.
+if get(g:, 'hare_space_error', 1)
+ augroup HareSpaceError
+ autocmd!
+ autocmd InsertEnter * hi link hareSpaceError NONE
+ autocmd InsertLeave * hi link hareSpaceError Error
+ augroup END
+endif
+
+# mnv: et sts=2 sw=2 ts=8 tw=80
diff --git a/mnv/runtime/ftplugin/haredoc.mnv b/mnv/runtime/ftplugin/haredoc.mnv
new file mode 100644
index 0000000000..271d5d3cc2
--- /dev/null
+++ b/mnv/runtime/ftplugin/haredoc.mnv
@@ -0,0 +1,50 @@
+mnv9script
+
+# MNV filetype plugin.
+# Language: Haredoc (Hare documentation format)
+# Maintainer: Amelia Clarke <selene@perilune.dev>
+# Last Change: 2026 Jan 24
+# Upstream: https://git.sr.ht/~sircmpwn/hare.mnv
+
+if exists('b:did_ftplugin')
+ finish
+endif
+b:did_ftplugin = 1
+
+# Use the Hare compiler.
+compiler hare
+b:undo_ftplugin = 'compiler make'
+
+# Formatting settings.
+setlocal comments=:\
+setlocal commentstring=\ %s
+setlocal formatlistpat=^\\s*-\\s\\+
+setlocal formatoptions+=tnlj formatoptions-=c formatoptions-=q
+b:undo_ftplugin ..= ' | setl cms< com< flp< fo<'
+
+# Locate Hare modules.
+&l:includeexpr = 'trim(v:fname, ":", 2)->substitute("::", "/", "g")'
+setlocal isfname+=:
+&l:path = ',,' .. hare#GetPath()
+b:undo_ftplugin ..= ' | setl inex< isf< pa<'
+
+# Follow the official style guide by default.
+if get(g:, 'hare_recommended_style', 1)
+ setlocal noexpandtab
+ setlocal shiftwidth=8
+ setlocal softtabstop=0
+ setlocal tabstop=8
+ setlocal textwidth=80
+ b:undo_ftplugin ..= ' | setl et< sts< sw< ts< tw<'
+endif
+
+# Highlight incorrect whitespace outside of insert mode.
+if get(g:, 'hare_space_error', 1)
+ augroup HaredocSpaceError
+ autocmd!
+ autocmd InsertEnter * hi link haredocSpaceError NONE
+ autocmd InsertLeave * hi link haredocSpaceError Error
+ augroup END
+endif
+
+# mnv: et sts=2 sw=2 ts=8 tw=80
diff --git a/mnv/runtime/ftplugin/haskell.mnv b/mnv/runtime/ftplugin/haskell.mnv
new file mode 100644
index 0000000000..bd819841f8
--- /dev/null
+++ b/mnv/runtime/ftplugin/haskell.mnv
@@ -0,0 +1,32 @@
+" MNV filetype plugin file
+" Language: Haskell
+" Maintainer: Daniel Campoverde <alx@sillybytes.net>
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2018-08-27
+" 2025 Jul 09 by MNV Project revert setting iskeyword #8191
+" 2026 Jan 18 by MNV Project add include-search and define support #19143
+
+if exists("b:did_ftplugin")
+ finish
+endif
+let b:did_ftplugin = 1
+
+let s:cpo_save = &cpo
+set cpo&mnv
+
+let b:undo_ftplugin = "setl com< cms< fo< su< sua< inex< inc< def<"
+
+setlocal comments=s1fl:{-,mb:-,ex:-},:-- commentstring=--\ %s
+setlocal formatoptions-=t formatoptions+=croql
+setlocal omnifunc=haskellcomplete#Complete
+
+setlocal suffixes+=.hi
+setlocal suffixesadd=.hs,.lhs,.hsc
+
+setlocal includeexpr=findfile(tr(v:fname,'.','/'),'.;')
+setlocal include=^import\\>\\%(\\s\\+safe\\>\\)\\?\\%(\\s\\+qualified\\>\\)\\?
+
+setlocal define=^\\%(data\\>\\\|class\\>\\%(.*=>\\)\\?\\\|\\%(new\\)\\?type\\>\\\|\\ze\\k\\+\\s*\\%(::\\\|=\\)\\)
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/mnv/runtime/ftplugin/hcl.mnv b/mnv/runtime/ftplugin/hcl.mnv
new file mode 100644
index 0000000000..90ed8a6345
--- /dev/null
+++ b/mnv/runtime/ftplugin/hcl.mnv
@@ -0,0 +1,10 @@
+" MNV filetype plugin
+" Language: HCL
+" Maintainer: Gregory Anders
+" Last Change: 2024-09-03
+
+if exists('b:did_ftplugin')
+ finish
+endif
+
+runtime! ftplugin/terraform.mnv
diff --git a/mnv/runtime/ftplugin/heex.mnv b/mnv/runtime/ftplugin/heex.mnv
new file mode 100644
index 0000000000..e0223a4f9d
--- /dev/null
+++ b/mnv/runtime/ftplugin/heex.mnv
@@ -0,0 +1,34 @@
+" Elixir filetype plugin
+" Language: HEEx
+" Maintainer: Mitchell Hanberg <mnvNOSPAM@mitchellhanberg.com>
+" Last Change: 2022 Sep 21
+" 2025 Apr 16 by MNV Project (set 'cpoptions' for line continuation, #17121)
+
+if exists("b:did_ftplugin")
+ finish
+endif
+let b:did_ftplugin = 1
+
+let s:cpo_save = &cpo
+set cpo&mnv
+
+setlocal shiftwidth=2 softtabstop=2 expandtab
+
+setlocal comments=:<%!--
+setlocal commentstring=<%!--\ %s\ --%>
+
+let b:undo_ftplugin = 'set sw< sts< et< com< cms<'
+
+" HTML: thanks to Johannes Zellner and Benji Fisher.
+if exists("loaded_matchit") && !exists("b:match_words")
+ let b:match_ignorecase = 1
+ let b:match_words = '<%\{-}!--:--%\{-}>,' ..
+ \ '<:>,' ..
+ \ '<\@<=[ou]l\>[^>]*\%(>\|$\):<\@<=li\>:<\@<=/[ou]l>,' ..
+ \ '<\@<=dl\>[^>]*\%(>\|$\):<\@<=d[td]\>:<\@<=/dl>,' ..
+ \ '<\@<=\([^/!][^ \t>]*\)[^>]*\%(>\|$\):<\@<=/\1>'
+ let b:undo_ftplugin ..= " | unlet! b:match_ignorecase b:match_words"
+endif
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/mnv/runtime/ftplugin/help.mnv b/mnv/runtime/ftplugin/help.mnv
new file mode 100644
index 0000000000..8764a5bb0a
--- /dev/null
+++ b/mnv/runtime/ftplugin/help.mnv
@@ -0,0 +1,47 @@
+" MNV filetype plugin file
+" Language: MNV help file
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Last Change: 2025 Apr 08
+" 2025 Apr 08 by MNV project (set 'omnifunc' and 'iskeyword', #17073)
+" 2025 Aug 08 by MNV project (unset comment options, #17889)
+
+if exists("b:did_ftplugin")
+ finish
+endif
+let b:did_ftplugin = 1
+
+let s:cpo_save = &cpo
+set cpo&mnv
+
+let b:undo_ftplugin = "setl isk< fo< tw< cole< cocu< keywordprg< omnifunc< comments< cms<"
+
+setl comments= cms=
+
+setlocal formatoptions+=tcroql textwidth=78 keywordprg=:help omnifunc=s:HelpComplete
+let &l:iskeyword='!-~,^*,^|,^",192-255'
+if has("conceal")
+ setlocal cole=2 cocu=nc
+endif
+
+if !exists('*s:HelpComplete')
+ func s:HelpComplete(findstart, base)
+ if a:findstart
+ let colnr = col('.') - 1 " Get the column number before the cursor
+ let line = getline('.')
+ for i in range(colnr - 1, 0, -1)
+ if line[i] ==# '|'
+ return i + 1 " Don't include the `|` in base
+ elseif line[i] ==# "'"
+ return i " Include the `'` in base
+ endif
+ endfor
+ else
+ return taglist('^' .. a:base)
+ \ ->map({_, item -> #{word: item->get('name'), kind: item->get('kind')}})
+ \ ->extend(getcompletion(a:base, 'help'))
+ endif
+ endfunc
+endif
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/mnv/runtime/ftplugin/hgcommit.mnv b/mnv/runtime/ftplugin/hgcommit.mnv
new file mode 100644
index 0000000000..be70a5179d
--- /dev/null
+++ b/mnv/runtime/ftplugin/hgcommit.mnv
@@ -0,0 +1,20 @@
+" MNV filetype plugin file
+" Language: hg (Mercurial) commit file
+" Maintainer: Ken Takata <kentkt at csc dot jp>
+" Last Change: 2025 Jun 8
+" Filenames: hg-editor-*.txt
+" License: MNV License
+" URL: https://github.com/k-takata/hg-mnv
+" 2025 Jun 18 by MNV Project: update commentstring option (#17480)
+
+if exists("b:did_ftplugin")
+ finish
+endif
+let b:did_ftplugin = 1
+
+setlocal nomodeline
+
+setlocal comments=:HG\:
+setlocal commentstring=HG:\ %s
+
+let b:undo_ftplugin = 'setl modeline< com< cms<'
diff --git a/mnv/runtime/ftplugin/hlsplaylist.mnv b/mnv/runtime/ftplugin/hlsplaylist.mnv
new file mode 100644
index 0000000000..fd12086468
--- /dev/null
+++ b/mnv/runtime/ftplugin/hlsplaylist.mnv
@@ -0,0 +1,37 @@
+" MNV filetype plugin
+" Language: HLS/M3U Playlist
+" Maintainer: AvidSeeker <avidseeker7@protonmail.com>
+" Last Change: 2024 Jul 07
+"
+
+if exists("b:did_ftplugin")
+ finish
+endif
+let g:did_ftplugin = 1
+
+setlocal commentstring=#%s
+
+let b:undo_ftplugin = "setl commentstring<"
+
+function! M3UFold() abort
+ let line = getline(v:lnum)
+ if line =~# '^#EXTGRP'
+ return ">1"
+ endif
+ return "="
+endfunction
+
+function! M3UFoldText() abort
+ let start_line = getline(v:foldstart)
+ let title = substitute(start_line, '^#EXTGRP:*', '', '')
+ let foldsize = (v:foldend - v:foldstart + 1)
+ let linecount = '['.foldsize.' lines]'
+ return title.' '.linecount
+endfunction
+
+if has("folding")
+ setlocal foldexpr=M3UFold()
+ setlocal foldmethod=expr
+ setlocal foldtext=M3UFoldText()
+ let b:undo_ftplugin .= "|setl foldexpr< foldmethod< foldtext<"
+endif
diff --git a/mnv/runtime/ftplugin/hog.mnv b/mnv/runtime/ftplugin/hog.mnv
new file mode 100644
index 0000000000..60d0798ee9
--- /dev/null
+++ b/mnv/runtime/ftplugin/hog.mnv
@@ -0,0 +1,40 @@
+" MNV filetype plugin
+" Language: hog (snort.conf)
+" Maintainer: . Victor Roemer, <vroemer@badsec.org>.
+" Last Change: Mar 1, 2013
+" 2025 Dec 03 by MNV Project: set undo_ftplugin correctly #18727
+
+if exists("b:did_ftplugin")
+ finish
+endif
+let b:did_ftplugin = 1
+
+let b:undo_ftplugin = "setl fo< com< cms< def< inc<"
+
+let s:cpo_save = &cpo
+set cpo&mnv
+
+setlocal formatoptions=croq
+setlocal comments=:#
+setlocal commentstring=\c#\ %s
+setlocal define=\c^\s\{-}var
+setlocal include=\c^\s\{-}include
+
+" Move around configurations
+let s:hog_keyword_match = '\c^\s*\<\(preprocessor\\|config\\|output\\|include\\|ipvar\\|portvar\\|var\\|dynamicpreprocessor\\|' .
+ \ 'dynamicengine\\|dynamicdetection\\|activate\\|alert\\|drop\\|block\\|dynamic\\|log\\|pass\\|reject\\|sdrop\\|sblock\)\>'
+
+exec "nnoremap <buffer><silent> ]] :call search('" . s:hog_keyword_match . "', 'W' )<CR>"
+exec "nnoremap <buffer><silent> [[ :call search('" . s:hog_keyword_match . "', 'bW' )<CR>"
+
+if exists("loaded_matchit")
+ let b:match_words =
+ \ '^\s*\<\%(preprocessor\|config\|output\|include\|ipvar\|portvar' .
+ \ '\|var\|dynamicpreprocessor\|dynamicengine\|dynamicdetection' .
+ \ '\|activate\|alert\|drop\|block\|dynamic\|log\|pass\|reject' .
+ \ '\|sdrop\|sblock\>\):$,\::\,:;'
+ let b:match_skip = 'r:\\.\{-}$\|^\s*#.\{-}$\|^\s*$'
+endif
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/mnv/runtime/ftplugin/hostconf.mnv b/mnv/runtime/ftplugin/hostconf.mnv
new file mode 100644
index 0000000000..49c324a33f
--- /dev/null
+++ b/mnv/runtime/ftplugin/hostconf.mnv
@@ -0,0 +1,18 @@
+" MNV filetype plugin file
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2007-12-04
+
+if exists("b:did_ftplugin")
+ finish
+endif
+let b:did_ftplugin = 1
+
+let s:cpo_save = &cpo
+set cpo&mnv
+
+let b:undo_ftplugin = "setl com< cms< fo<"
+
+setlocal comments=:# commentstring=#\ %s formatoptions-=t formatoptions+=croql
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/mnv/runtime/ftplugin/hostsaccess.mnv b/mnv/runtime/ftplugin/hostsaccess.mnv
new file mode 100644
index 0000000000..3bd77f8a7a
--- /dev/null
+++ b/mnv/runtime/ftplugin/hostsaccess.mnv
@@ -0,0 +1,19 @@
+" MNV filetype plugin file
+" Language: hosts_access(5) control file
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2008-07-09
+
+if exists("b:did_ftplugin")
+ finish
+endif
+let b:did_ftplugin = 1
+
+let s:cpo_save = &cpo
+set cpo&mnv
+
+let b:undo_ftplugin = "setl com< cms< fo<"
+
+setlocal comments=:# commentstring=#\ %s formatoptions-=t formatoptions+=croql
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/mnv/runtime/ftplugin/html.mnv b/mnv/runtime/ftplugin/html.mnv
new file mode 100644
index 0000000000..1fe30d2690
--- /dev/null
+++ b/mnv/runtime/ftplugin/html.mnv
@@ -0,0 +1,111 @@
+" MNV filetype plugin file
+" Language: HTML
+" Maintainer: Doug Kearns <dougkearns@gmail.com>
+" Previous Maintainer: Dan Sharp
+" Last Change: 2025 Sep 12
+
+if exists("b:did_ftplugin")
+ finish
+endif
+let b:did_ftplugin = 1
+
+let s:save_cpo = &cpo
+set cpo-=C
+
+setlocal matchpairs+=<:>
+setlocal commentstring=<!--\ %s\ -->
+setlocal comments=s:<!--,m:\ \ \ \ ,e:-->
+
+if exists('b:undo_ftplugin')
+ " no whitespace before |, handle possible :unmap at end of current value
+ let b:undo_ftplugin ..= "| setlocal comments< commentstring< matchpairs<"
+else
+ let b:undo_ftplugin = "setlocal comments< commentstring< matchpairs<"
+endif
+
+if get(g:, "ft_html_autocomment", 0)
+ setlocal formatoptions-=t formatoptions+=croql
+ let b:undo_ftplugin ..= " | setlocal formatoptions<"
+endif
+
+if exists('&omnifunc')
+ setlocal omnifunc=htmlcomplete#CompleteTags
+ call htmlcomplete#DetectOmniFlavor()
+ let b:undo_ftplugin ..= " | setlocal omnifunc<"
+endif
+
+" HTML: thanks to Johannes Zellner and Benji Fisher.
+if exists("loaded_matchit") && !exists("b:match_words")
+ let b:match_ignorecase = 1
+ let b:match_words = '<!--:-->,' ..
+ \ '<:>,' ..
+ \ '<\@<=[ou]l\>[^>]*\%(>\|$\):<\@<=li\>:<\@<=/[ou]l>,' ..
+ \ '<\@<=dl\>[^>]*\%(>\|$\):<\@<=d[td]\>:<\@<=/dl>,' ..
+ \ '<\@<=\([^/!][^ \t>]*\)[^>]*\%(>\|$\):<\@<=/\1>'
+ let b:html_set_match_words = 1
+ let b:undo_ftplugin ..= " | unlet! b:match_ignorecase b:match_words b:html_set_match_words"
+endif
+
+" Change the :browse e filter to primarily show HTML-related files.
+if (has("gui_win32") || has("gui_gtk")) && !exists("b:browsefilter")
+ let b:browsefilter = "HTML Files (*.html, *.htm)\t*.html;*.htm\n" ..
+ \ "JavaScript Files (*.js)\t*.js\n" ..
+ \ "Cascading StyleSheets (*.css)\t*.css\n"
+ if has("win32")
+ let b:browsefilter ..= "All Files (*.*)\t*\n"
+ else
+ let b:browsefilter ..= "All Files (*)\t*\n"
+ endif
+ let b:html_set_browsefilter = 1
+ let b:undo_ftplugin ..= " | unlet! b:browsefilter b:html_set_browsefilter"
+endif
+
+if has("folding") && get(g:, "html_expr_folding", 0)
+ function! HTMLTagFold() abort
+ if empty(get(b:, "foldsmap", {}))
+ if empty(get(b:, "current_syntax", ''))
+ return '0'
+ else
+ let b:foldsmap = htmlfold#MapBalancedTags()
+ endif
+ endif
+
+ return get(b:foldsmap, v:lnum, '=')
+ endfunction
+
+ setlocal foldexpr=HTMLTagFold()
+ setlocal foldmethod=expr
+ let b:undo_ftplugin ..= " | setlocal foldexpr< foldmethod<"
+
+ if !get(g:, "html_expr_folding_without_recomputation", 0)
+ augroup htmltagfold
+ autocmd! htmltagfold
+ autocmd TextChanged,InsertLeave <buffer> let b:foldsmap = {}
+ augroup END
+
+ " XXX: Keep ":autocmd" last in "b:undo_ftplugin" (see ":help :bar").
+ let b:undo_ftplugin ..= " | silent! autocmd! htmltagfold * <buffer>"
+ endif
+endif
+
+let &cpo = s:save_cpo
+unlet s:save_cpo
+
+" See ":help mnv9-mix".
+if !has("mnv9script")
+ finish
+endif
+
+if exists("*g:HTMLTagFold")
+ def! g:HTMLTagFold(): string
+ if empty(get(b:, "foldsmap", {}))
+ if empty(get(b:, "current_syntax", ''))
+ return '0'
+ else
+ b:foldsmap = g:htmlfold#MapBalancedTags()
+ endif
+ endif
+
+ return get(b:foldsmap, v:lnum, '=')
+ enddef
+endif
diff --git a/mnv/runtime/ftplugin/htmlangular.mnv b/mnv/runtime/ftplugin/htmlangular.mnv
new file mode 100644
index 0000000000..8f6c330c99
--- /dev/null
+++ b/mnv/runtime/ftplugin/htmlangular.mnv
@@ -0,0 +1,12 @@
+" MNV filetype plugin file
+" Language: Angular HTML Template
+" Maintainer: Dennis van den Berg <dennis@vdberg.dev>
+" Last Change: 2024 Jul 9
+
+" Only use this filetype plugin when no other was loaded.
+if exists("b:did_ftplugin")
+ finish
+endif
+
+" source the HTML ftplugin
+runtime! ftplugin/html.mnv
diff --git a/mnv/runtime/ftplugin/htmldjango.mnv b/mnv/runtime/ftplugin/htmldjango.mnv
new file mode 100644
index 0000000000..3f34f2abe0
--- /dev/null
+++ b/mnv/runtime/ftplugin/htmldjango.mnv
@@ -0,0 +1,13 @@
+" MNV filetype plugin file
+" Language: Django HTML template
+" Maintainer: Dave Hodder <dmh@dmh.org.uk>
+" Last Change: 2007 Jan 25
+
+" Only use this filetype plugin when no other was loaded.
+if exists("b:did_ftplugin")
+ finish
+endif
+
+" Use HTML and Django template ftplugins.
+runtime! ftplugin/html.mnv
+runtime! ftplugin/django.mnv
diff --git a/mnv/runtime/ftplugin/http.mnv b/mnv/runtime/ftplugin/http.mnv
new file mode 100644
index 0000000000..6af6507695
--- /dev/null
+++ b/mnv/runtime/ftplugin/http.mnv
@@ -0,0 +1,13 @@
+" MNV filetype plugin
+" Language: HTTP
+" Maintainer: Riley Bruins <ribru17@gmail.com>
+" Last Change: 2024 Sep 28
+
+if exists('b:did_ftplugin')
+ finish
+endif
+let b:did_ftplugin = 1
+
+setl comments=:# commentstring=#\ %s
+
+let b:undo_ftplugin = 'setl com< cms<'
diff --git a/mnv/runtime/ftplugin/hurl.mnv b/mnv/runtime/ftplugin/hurl.mnv
new file mode 100644
index 0000000000..cd4774080e
--- /dev/null
+++ b/mnv/runtime/ftplugin/hurl.mnv
@@ -0,0 +1,11 @@
+" MNV filetype plugin file
+" Language: hurl
+" Maintainer: Melker Ulander <melker.ulander@pm.me>
+" Last Changed: 2024 01 26
+
+if exists("b:did_ftplugin") | finish | endif
+
+let b:did_ftplugin = 1
+setlocal commentstring=#\ %s
+
+let b:undo_ftplugin = "setlocal commentstring<"
diff --git a/mnv/runtime/ftplugin/hyprlang.mnv b/mnv/runtime/ftplugin/hyprlang.mnv
new file mode 100644
index 0000000000..a3f9c551fb
--- /dev/null
+++ b/mnv/runtime/ftplugin/hyprlang.mnv
@@ -0,0 +1,13 @@
+" MNV filetype plugin
+" Language: hyprlang
+" Maintainer: ribru17 <ribru17@gmail.com>
+" Last Change: 2024 May 18
+
+if exists('b:did_ftplugin')
+ finish
+endif
+let b:did_ftplugin = 1
+
+setl comments=:# commentstring=#\ %s
+
+let b:undo_ftplugin = 'setl com< cms<'
diff --git a/mnv/runtime/ftplugin/i3config.mnv b/mnv/runtime/ftplugin/i3config.mnv
new file mode 100644
index 0000000000..93f28a705c
--- /dev/null
+++ b/mnv/runtime/ftplugin/i3config.mnv
@@ -0,0 +1,13 @@
+" MNV filetype plugin file
+" Language: i3 config file
+" Original Author: Mohamed Boughaba <mohamed dot bgb at gmail dot com>
+" Maintainer: Quentin Hibon
+" Version: 0.4
+" Last Change: 2021 Dec 14
+
+if exists("b:did_ftplugin") | finish | endif
+let b:did_ftplugin = 1
+
+let b:undo_ftplugin = "setlocal cms<"
+
+setlocal commentstring=#\ %s
diff --git a/mnv/runtime/ftplugin/icon.mnv b/mnv/runtime/ftplugin/icon.mnv
new file mode 100644
index 0000000000..0c32dfc1a4
--- /dev/null
+++ b/mnv/runtime/ftplugin/icon.mnv
@@ -0,0 +1,40 @@
+" MNV filetype plugin file
+" Language: Icon
+" Maintainer: Doug Kearns <dougkearns@gmail.com>
+" Last Change: 2024 Jan 14
+
+if exists("b:did_ftplugin")
+ finish
+endif
+let b:did_ftplugin = 1
+
+let s:cpo_save = &cpo
+set cpo&mnv
+
+setlocal comments=:#
+setlocal commentstring=#\ %s
+setlocal formatoptions-=t formatoptions+=croql
+
+let b:undo_ftplugin = "setl fo< com< cms<"
+
+if exists("loaded_matchit")
+ let b:match_ignorecase = 0
+ let b:match_words = '^\s*$\s*if\(def\|ndef\)\=\>:^\s*$\s*elif\>:^\s*$\s*else\>:^\s*$\s*endif\>,' ..
+ \ '\<procedure\>:\<\%(initial\|return\|suspend\|fail\)\>:\<end\>'
+ let b:undo_ftplugin ..= " | unlet! b:match_ignorecase b:match_words"
+endif
+
+if (has("gui_win32") || has("gui_gtk")) && !exists("b:browsefilter")
+ let b:browsefilter = "Icon Source Files (*.icn)\t*.icn\n"
+ if has("win32")
+ let b:browsefilter ..= "All Files (*.*)\t*\n"
+ else
+ let b:browsefilter ..= "All Files (*)\t*\n"
+ endif
+ let b:undo_ftplugin ..= " | unlet! b:browsefilter"
+endif
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
+
+" mnv: nowrap sw=2 sts=2 ts=8
diff --git a/mnv/runtime/ftplugin/idris2.mnv b/mnv/runtime/ftplugin/idris2.mnv
new file mode 100644
index 0000000000..72f632a20f
--- /dev/null
+++ b/mnv/runtime/ftplugin/idris2.mnv
@@ -0,0 +1,34 @@
+" MNV ftplugin file
+" Language: Idris 2
+" Last Change: 2024 Nov 05
+" Maintainer: Idris Hackers (https://github.com/edwinb/idris2-mnv), Serhii Khoma <srghma@gmail.com>
+" License: MNV (see :h license)
+" Repository: https://github.com/ShinKage/idris2-nmnv
+"
+" Based on ftplugin/idris2.mnv from https://github.com/edwinb/idris2-mnv
+
+if exists("b:did_ftplugin")
+ finish
+endif
+
+setlocal shiftwidth=2
+setlocal tabstop=2
+
+" Set g:idris2#allow_tabchar = 1 to use tabs instead of spaces
+if exists('g:idris2#allow_tabchar') && g:idris2#allow_tabchar != 0
+ setlocal noexpandtab
+else
+ setlocal expandtab
+endif
+
+setlocal comments=s1:{-,mb:-,ex:-},:\|\|\|,:--
+setlocal commentstring=--\ %s
+
+" makes ? a part of a word, e.g. for named holes `vzipWith f [] [] = ?vzipWith_rhs_3`, uncomment if want to reenable
+" setlocal iskeyword+=?
+
+setlocal wildignore+=*.ibc
+
+let b:undo_ftplugin = "setlocal shiftwidth< tabstop< expandtab< comments< commentstring< iskeyword< wildignore<"
+
+let b:did_ftplugin = 1
diff --git a/mnv/runtime/ftplugin/indent.mnv b/mnv/runtime/ftplugin/indent.mnv
new file mode 100644
index 0000000000..a536fd8368
--- /dev/null
+++ b/mnv/runtime/ftplugin/indent.mnv
@@ -0,0 +1,22 @@
+" MNV filetype plugin file
+" Language: indent(1) configuration file
+" Maintainer: Doug Kearns <dougkearns@gmail.com>
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2008-07-09
+" 2024-06-02 by Riley Bruins <ribru17@gmail.com> ('commentstring')
+
+if exists("b:did_ftplugin")
+ finish
+endif
+let b:did_ftplugin = 1
+
+let s:cpo_save = &cpo
+set cpo&mnv
+
+let b:undo_ftplugin = "setl com< cms< fo<"
+
+setlocal comments=s1:/*,mb:*,ex:*/ commentstring=/*\ %s\ */
+setlocal formatoptions-=t formatoptions+=croql
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/mnv/runtime/ftplugin/initex.mnv b/mnv/runtime/ftplugin/initex.mnv
new file mode 100644
index 0000000000..3251bcd4d6
--- /dev/null
+++ b/mnv/runtime/ftplugin/initex.mnv
@@ -0,0 +1,40 @@
+" filetype plugin for TeX and variants
+" Language: TeX (ft=initex)
+" Maintainer: Benji Fisher, Ph.D. <benji@member.AMS.org>
+" Version: 1.0
+" Last Change: Wed 19 Apr 2006
+" Last Change: Thu 23 May 2024 by Riley Bruins <ribru17@gmail.com> ('commentstring')
+
+" Only do this when not done yet for this buffer.
+if exists("b:did_ftplugin")
+ finish
+endif
+
+" Don't load another plugin for this buffer.
+let b:did_ftplugin = 1
+
+" Avoid problems if running in 'compatible' mode.
+let s:save_cpo = &cpo
+set cpo&mnv
+
+let b:undo_ftplugin = "setl com< cms< define< include< sua<"
+
+" Set 'comments' to format dashed lists in comments
+setlocal com=sO:%\ -,mO:%\ \ ,eO:%%,:%
+
+" Set 'commentstring' to recognize the % comment character:
+" (Thanks to Ajit Thakkar.)
+setlocal cms=%\ %s
+
+" Allow "[d" to be used to find a macro definition:
+let &l:define='\\\([egx]\|char\|mathchar\|count\|dimen\|muskip\|skip\|toks\)\='
+ \ . 'def\|\\font\|\\\(future\)\=let'
+
+" Tell MNV to recognize \input bar :
+let &l:include = '\\input'
+setlocal suffixesadd=.tex
+
+let &cpo = s:save_cpo
+unlet s:save_cpo
+
+" mnv:sts=2:sw=2:
diff --git a/mnv/runtime/ftplugin/ipkg.mnv b/mnv/runtime/ftplugin/ipkg.mnv
new file mode 100644
index 0000000000..34f302af1d
--- /dev/null
+++ b/mnv/runtime/ftplugin/ipkg.mnv
@@ -0,0 +1,19 @@
+" MNV ftplugin file
+" Language: Ipkg
+" Maintainer: Idris Hackers (https://github.com/edwinb/idris2-mnv), Serhii Khoma <srghma@gmail.com>
+" Last Change: 2024 Nov 05
+" Author: ShinKage
+" License: MNV (see :h license)
+" Repository: https://github.com/ShinKage/idris2-nmnv
+
+if exists("b:did_ftplugin")
+ finish
+endif
+
+setlocal comments=:--
+setlocal commentstring=--\ %s
+setlocal wildignore+=*.ibc
+
+let b:undo_ftplugin = "setlocal shiftwidth< tabstop< expandtab< comments< commentstring< iskeyword< wildignore<"
+
+let b:did_ftplugin = 1
diff --git a/mnv/runtime/ftplugin/ishd.mnv b/mnv/runtime/ftplugin/ishd.mnv
new file mode 100644
index 0000000000..5ad581c514
--- /dev/null
+++ b/mnv/runtime/ftplugin/ishd.mnv
@@ -0,0 +1,45 @@
+" MNV filetype plugin file
+" Language: InstallShield (ft=ishd)
+" Maintainer: Doug Kearns <dougkearns@gmail.com>
+" Previous Maintainer: Johannes Zellner <johannes@zellner.org>
+" Last Change: 2025 Jun 18
+" 2025 Jun 18 by MNV Project: set comments and commentstring option (#17490)
+
+if exists("b:did_ftplugin") | finish | endif
+let b:did_ftplugin = 1
+
+" Using line continuation here.
+let s:cpo_save = &cpo
+set cpo-=C
+
+setlocal foldmethod=syntax
+setlocal commentstring=//\ %s
+setlocal comments=sO:*\ -,mO:*\ \ ,exO:*/,s1:/*,mb:*,ex:*/,://
+
+let b:undo_ftplugin = "setl fdm< com< cms"
+
+" matchit support
+if exists("loaded_matchit")
+ let b:match_ignorecase = 0
+ let b:match_words =
+ \ '\%(^\s*\)\@<=\<function\>\s\+[^()]\+\s*(:\%(^\s*\)\@<=\<begin\>\s*$:\%(^\s*\)\@<=\<return\>:\%(^\s*\)\@<=\<end\>\s*;\s*$,' .
+ \ '\%(^\s*\)\@<=\<repeat\>\s*$:\%(^\s*\)\@<=\<until\>\s\+.\{-}\s*;\s*$,' .
+ \ '\%(^\s*\)\@<=\<switch\>\s*(.\{-}):\%(^\s*\)\@<=\<\%(case\|default\)\>:\%(^\s*\)\@<=\<endswitch\>\s*;\s*$,' .
+ \ '\%(^\s*\)\@<=\<while\>\s*(.\{-}):\%(^\s*\)\@<=\<endwhile\>\s*;\s*$,' .
+ \ '\%(^\s*\)\@<=\<for\>.\{-}\<\%(to\|downto\)\>:\%(^\s*\)\@<=\<endfor\>\s*;\s*$,' .
+ \ '\%(^\s*\)\@<=\<if\>\s*(.\{-})\s*then:\%(^\s*\)\@<=\<else\s*if\>\s*([^)]*)\s*then:\%(^\s*\)\@<=\<else\>:\%(^\s*\)\@<=\<endif\>\s*;\s*$'
+ let b:undo_ftplugin .= " | unlet! b:match_ignorecase b:match_words"
+endif
+
+if (has("gui_win32") || has("gui_gtk")) && !exists("b:browsefilter")
+ let b:browsefilter = "InstallShield Files (*.rul)\t*.rul\n"
+ if has("win32")
+ let b:browsefilter .= "All Files (*.*)\t*\n"
+ else
+ let b:browsefilter .= "All Files (*)\t*\n"
+ endif
+ let b:undo_ftplugin .= " | unlet! b:browsefilter"
+endif
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/mnv/runtime/ftplugin/j.mnv b/mnv/runtime/ftplugin/j.mnv
new file mode 100644
index 0000000000..28f232a790
--- /dev/null
+++ b/mnv/runtime/ftplugin/j.mnv
@@ -0,0 +1,88 @@
+" MNV filetype plugin
+" Language: J
+" Maintainer: David Bürgin <dbuergin@gluet.ch>
+" URL: https://gitlab.com/glts/mnv-j
+" Last Change: 2022-08-06
+" 2024 Jan 14 by MNV Project (browsefilter)
+
+if exists('b:did_ftplugin')
+ finish
+endif
+let b:did_ftplugin = 1
+
+let s:save_cpo = &cpo
+set cpo&mnv
+
+setlocal iskeyword=48-57,A-Z,a-z,_
+setlocal comments=:NB.
+setlocal commentstring=NB.\ %s
+setlocal formatoptions-=t
+setlocal matchpairs=(:)
+setlocal path-=/usr/include
+
+" Includes. To make the shorthand form "require 'web/cgi'" work, double the
+" last path component. Also strip off leading folder names like "~addons/".
+setlocal include=\\v^\\s*(load\|require)\\s*'\\zs\\f+\\ze'
+setlocal includeexpr=substitute(substitute(tr(v:fname,'\\','/'),'\\v^[^~][^/.]*(/[^/.]+)$','&\\1',''),'\\v^\\~[^/]+/','','')
+setlocal suffixesadd=.ijs
+
+let b:undo_ftplugin = 'setlocal suffixesadd< includeexpr< include< path< matchpairs< formatoptions< commentstring< comments< iskeyword<'
+
+" Section movement with ]] ][ [[ []. The start/end patterns below are amended
+" inside the function in order to avoid matching on the current cursor line.
+if !exists('no_plugin_maps') && !exists('no_j_maps')
+ let s:sectionstart = '\%(\s*Note\|.\{-}\<\%([0-4]\|13\|noun\|adverb\|conjunction\|verb\|monad\|dyad\)\s\+\%(:\s*0\|def\s\+0\|define\)\)\>.*'
+ let s:sectionend = '\s*)\s*'
+
+ function! s:SearchSection(end, backwards, visualmode) abort
+ if a:visualmode !=# ''
+ normal! gv
+ endif
+ let l:flags = a:backwards ? 'bsW' : 'sW'
+ if a:end
+ call search('^' . s:sectionend . (a:backwards ? '\n\_.\{-}\%#' : '$'), l:flags)
+ else
+ call search('^' . s:sectionstart . (a:backwards ? '\n\_.\{-}\%#' : '$'), l:flags)
+ endif
+ endfunction
+
+ noremap <buffer> <silent> ]] :<C-U>call <SID>SearchSection(0, 0, '')<CR>
+ xnoremap <buffer> <silent> ]] :<C-U>call <SID>SearchSection(0, 0, visualmode())<CR>
+ sunmap <buffer> ]]
+ noremap <buffer> <silent> ][ :<C-U>call <SID>SearchSection(1, 0, '')<CR>
+ xnoremap <buffer> <silent> ][ :<C-U>call <SID>SearchSection(1, 0, visualmode())<CR>
+ sunmap <buffer> ][
+ noremap <buffer> <silent> [[ :<C-U>call <SID>SearchSection(0, 1, '')<CR>
+ xnoremap <buffer> <silent> [[ :<C-U>call <SID>SearchSection(0, 1, visualmode())<CR>
+ sunmap <buffer> [[
+ noremap <buffer> <silent> [] :<C-U>call <SID>SearchSection(1, 1, '')<CR>
+ xnoremap <buffer> <silent> [] :<C-U>call <SID>SearchSection(1, 1, visualmode())<CR>
+ sunmap <buffer> []
+
+ let b:undo_ftplugin .= ' | silent! execute "unmap <buffer> ]]"'
+ \ . ' | silent! execute "unmap <buffer> ]["'
+ \ . ' | silent! execute "unmap <buffer> [["'
+ \ . ' | silent! execute "unmap <buffer> []"'
+endif
+
+" Browse dialog filter on Windows and GTK (see ":help browsefilter")
+if (has('gui_win32') || has('gui_gtk')) && !exists('b:browsefilter')
+ let b:browsefilter = "J Script Files (*.ijs)\t*.ijs\n"
+ if has("win32")
+ let b:browsefilter .= "All Files (*.*)\t*\n"
+ else
+ let b:browsefilter .= "All Files (*)\t*\n"
+ endif
+ let b:undo_ftplugin .= ' | unlet! b:browsefilter'
+endif
+
+" Enhanced "%" matching (see ":help matchit")
+if exists('loaded_matchit') && !exists('b:match_words')
+ let b:match_ignorecase = 0
+ let b:match_words = '^\%(\s*Note\|.\{-}\<\%([0-4]\|13\|noun\|adverb\|conjunction\|verb\|monad\|dyad\)\s\+\%(\:\s*0\|def\s\+0\|define\)\)\>:^\s*\:\s*$:^\s*)\s*$'
+ \ . ',\<\%(for\%(_\a\k*\)\=\|if\|select\|try\|whil\%(e\|st\)\)\.:\<\%(case\|catch[dt]\=\|else\%(if\)\=\|fcase\)\.:\<end\.'
+ let b:undo_ftplugin .= ' | unlet! b:match_ignorecase b:match_words'
+endif
+
+let &cpo = s:save_cpo
+unlet s:save_cpo
diff --git a/mnv/runtime/ftplugin/java.mnv b/mnv/runtime/ftplugin/java.mnv
new file mode 100644
index 0000000000..01d0e2e08e
--- /dev/null
+++ b/mnv/runtime/ftplugin/java.mnv
@@ -0,0 +1,418 @@
+" MNV filetype plugin file
+" Language: Java
+" Maintainer: Aliaksei Budavei <0x000c70 AT gmail DOT com>
+" Former Maintainer: Dan Sharp
+" Repository: https://github.com/zzzyxwvut/java-mnv.git
+" Last Change: 2025 May 08
+
+" Make sure the continuation lines below do not cause problems in
+" compatibility mode.
+let s:save_cpo = &cpo
+set cpo-=C
+
+if (exists("g:java_ignore_javadoc") || exists("g:java_ignore_markdown")) &&
+ \ exists("*javaformat#RemoveCommonMarkdownWhitespace")
+ delfunction javaformat#RemoveCommonMarkdownWhitespace
+ unlet! g:loaded_javaformat
+endif
+
+if exists("b:did_ftplugin")
+ let &cpo = s:save_cpo
+ unlet s:save_cpo
+ finish
+endif
+
+let b:did_ftplugin = 1
+
+" For filename completion, prefer the .java extension over the .class
+" extension.
+set suffixes+=.class
+
+" Set up "&define" and "&include".
+let s:peek = ''
+
+try
+ " Since v7.3.1037.
+ if 'ab' !~ 'a\@1<!b'
+ let s:peek = string(strlen('instanceof') + 8)
+ endif
+catch /\<E59:/
+endtry
+
+" Treat "s:common" as a non-backtracking unit to avoid matching constructor
+" declarations whose package-private headers are indistinguishable from method
+" invocation. Note that "[@-]" must not and "$" may not be in "&l:iskeyword".
+let s:common = '\%(\%(\%(@\%(interface\)\@!\%(\K\k*\.\)*\K\k*\)\s\+\)*' .
+ \ '\%(p\%(rivate\|rotected\|ublic\)\s\+\)\=\)\@>'
+let s:types = '\%(\%(abstract\|final\|non-sealed\|s\%(ealed\|tatic\|trictfp\)\)\s\+\)*' .
+ \ '\%(class\|enum\|@\=interface\|record\)\s\+\ze\K\k*\>'
+let s:methods = '\%(\%(abstract\|default\|final\|native\|s\%(tatic\|trictfp\|ynchronized\)\)\s\+\)*' .
+ \ '\%(<.\{-1,}>\s\+\)\=\%(\K\k*\.\)*\K\k*\s*\%(<.\{-1,}>\%(\s\|\[\)\@=\)\=\s*\%(\[\]\s*\)*' .
+ \ '\s\+\ze\%(\<\%(assert\|case\|instanceof\|new\|return\|throw\|when\)\s\+\)\@' .
+ \ s:peek . '<!\K\k*\s*('
+let &l:define = printf('\C\m^\s*%s\%%(%s\|%s\)', s:common, s:types, s:methods)
+let &l:include = '\C\m^\s*import\s\+\ze\%(\K\k*\.\)\+\K\k*;'
+unlet s:methods s:types s:common s:peek
+
+" Enable gf on import statements. Convert . in the package
+" name to / and append .java to the name, then search the path.
+setlocal includeexpr=substitute(v:fname,'\\.','/','g')
+setlocal suffixesadd=.java
+
+" Clean up in case this file is sourced again.
+unlet! s:zip_func_upgradable
+
+"""" STRIVE TO REMAIN COMPATIBLE FOR AT LEAST MNV 7.0.
+
+" Documented in ":help ft-java-plugin".
+if exists("g:ftplugin_java_source_path") &&
+ \ type(g:ftplugin_java_source_path) == type("")
+ if filereadable(g:ftplugin_java_source_path)
+ if exists("#zip") &&
+ \ g:ftplugin_java_source_path =~# '.\.\%(jar\|zip\)$'
+ if !exists("s:zip_files")
+ let s:zip_files = {}
+ endif
+
+ let s:zip_files[bufnr('%')] = g:ftplugin_java_source_path
+ let s:zip_files[0] = g:ftplugin_java_source_path
+ let s:zip_func_upgradable = 1
+
+ function! JavaFileTypeZipFile() abort
+ let @/ = substitute(v:fname, '\.', '\\/', 'g') . '.java'
+ return get(s:zip_files, bufnr('%'), s:zip_files[0])
+ endfunction
+
+ " E120 for "inex=s:JavaFileTypeZipFile()" before v8.2.3900.
+ setlocal includeexpr=JavaFileTypeZipFile()
+ setlocal suffixesadd<
+ endif
+ else
+ let &l:path = g:ftplugin_java_source_path . ',' . &l:path
+ endif
+endif
+
+" Set 'formatoptions' to break comment lines but not other lines,
+" and insert the comment leader when hitting <CR> or using "o".
+setlocal formatoptions-=t formatoptions+=croql
+
+" Set 'comments' to format Markdown Javadoc comments and dashed lists
+" in other multi-line comments (it behaves just like C).
+setlocal comments& comments^=:///,sO:*\ -,mO:*\ \ ,exO:*/
+
+setlocal commentstring=//\ %s
+
+" Change the :browse e filter to primarily show Java-related files.
+if (has("gui_win32") || has("gui_gtk")) && !exists("b:browsefilter")
+ let b:browsefilter="Java Files (*.java)\t*.java\n" .
+ \ "Properties Files (*.prop*)\t*.prop*\n" .
+ \ "Manifest Files (*.mf)\t*.mf\n"
+ if has("win32")
+ let b:browsefilter .= "All Files (*.*)\t*\n"
+ else
+ let b:browsefilter .= "All Files (*)\t*\n"
+ endif
+endif
+
+"""" Support pre- and post-compiler actions for SpotBugs.
+if (!empty(get(g:, 'spotbugs_properties', {})) ||
+ \ !empty(get(b:, 'spotbugs_properties', {}))) &&
+ \ filereadable($MNVRUNTIME . '/compiler/spotbugs.mnv')
+
+ function! s:SpotBugsGetProperty(name, default) abort
+ return get(
+ \ {s:spotbugs_properties_scope}spotbugs_properties,
+ \ a:name,
+ \ a:default)
+ endfunction
+
+ function! s:SpotBugsHasProperty(name) abort
+ return has_key(
+ \ {s:spotbugs_properties_scope}spotbugs_properties,
+ \ a:name)
+ endfunction
+
+ function! s:SpotBugsGetProperties() abort
+ return {s:spotbugs_properties_scope}spotbugs_properties
+ endfunction
+
+ " Work around ":bar"s and ":autocmd"s.
+ function! JavaFileTypeExecuteActionOnce(cleanup_cmd, action_cmd) abort
+ try
+ execute a:cleanup_cmd
+ finally
+ execute a:action_cmd
+ endtry
+ endfunction
+
+ if exists("b:spotbugs_properties")
+ let s:spotbugs_properties_scope = 'b:'
+
+ " Merge global entries, if any, in buffer-local entries, favouring
+ " defined buffer-local ones.
+ call extend(
+ \ b:spotbugs_properties,
+ \ get(g:, 'spotbugs_properties', {}),
+ \ 'keep')
+ elseif exists("g:spotbugs_properties")
+ let s:spotbugs_properties_scope = 'g:'
+ endif
+
+ let s:commands = {}
+
+ for s:name in ['DefaultPreCompilerCommand',
+ \ 'DefaultPreCompilerTestCommand',
+ \ 'DefaultPostCompilerCommand']
+ if s:SpotBugsHasProperty(s:name)
+ let s:commands[s:name] = remove(
+ \ s:SpotBugsGetProperties(),
+ \ s:name)
+ endif
+ endfor
+
+ if s:SpotBugsHasProperty('compiler')
+ " XXX: Postpone loading the script until all state, if any, has been
+ " collected.
+ if !empty(s:commands)
+ let g:spotbugs#state = {
+ \ 'compiler': remove(s:SpotBugsGetProperties(), 'compiler'),
+ \ 'commands': copy(s:commands),
+ \ }
+ else
+ let g:spotbugs#state = {
+ \ 'compiler': remove(s:SpotBugsGetProperties(), 'compiler'),
+ \ }
+ endif
+
+ " Merge default entries in global (or buffer-local) entries, favouring
+ " defined global (or buffer-local) ones.
+ call extend(
+ \ {s:spotbugs_properties_scope}spotbugs_properties,
+ \ spotbugs#DefaultProperties(),
+ \ 'keep')
+ elseif !empty(s:commands)
+ " XXX: Postpone loading the script until all state, if any, has been
+ " collected.
+ let g:spotbugs#state = {'commands': copy(s:commands)}
+ endif
+
+ unlet s:commands s:name
+ let s:request = 0
+
+ if s:SpotBugsHasProperty('PostCompilerAction')
+ let s:request += 4
+ endif
+
+ if s:SpotBugsHasProperty('PreCompilerTestAction')
+ let s:dispatcher = printf('call call(%s, [])',
+ \ string(s:SpotBugsGetProperties().PreCompilerTestAction))
+ let s:request += 2
+ endif
+
+ if s:SpotBugsHasProperty('PreCompilerAction')
+ let s:dispatcher = printf('call call(%s, [])',
+ \ string(s:SpotBugsGetProperties().PreCompilerAction))
+ let s:request += 1
+ endif
+
+ " Adapt the tests for "s:FindClassFiles()" from "compiler/spotbugs.mnv".
+ if (s:request == 3 || s:request == 7) &&
+ \ (!empty(s:SpotBugsGetProperty('sourceDirPath', [])) &&
+ \ !empty(s:SpotBugsGetProperty('classDirPath', [])) &&
+ \ !empty(s:SpotBugsGetProperty('testSourceDirPath', [])) &&
+ \ !empty(s:SpotBugsGetProperty('testClassDirPath', [])))
+ function! s:DispatchAction(paths_action_pairs) abort
+ let name = expand('%:p')
+
+ for [paths, Action] in a:paths_action_pairs
+ for path in paths
+ if name =~# (path . '.\{-}\.java\=$')
+ call Action()
+ return
+ endif
+ endfor
+ endfor
+ endfunction
+
+ let s:dir_cnt = min([
+ \ len(s:SpotBugsGetProperties().sourceDirPath),
+ \ len(s:SpotBugsGetProperties().classDirPath)])
+ let s:test_dir_cnt = min([
+ \ len(s:SpotBugsGetProperties().testSourceDirPath),
+ \ len(s:SpotBugsGetProperties().testClassDirPath)])
+
+ " Do not break up path pairs with filtering!
+ let s:dispatcher = printf('call s:DispatchAction(%s)',
+ \ string([[s:SpotBugsGetProperties().sourceDirPath[0 : s:dir_cnt - 1],
+ \ s:SpotBugsGetProperties().PreCompilerAction],
+ \ [s:SpotBugsGetProperties().testSourceDirPath[0 : s:test_dir_cnt - 1],
+ \ s:SpotBugsGetProperties().PreCompilerTestAction]]))
+ unlet s:test_dir_cnt s:dir_cnt
+ endif
+
+ if exists("s:dispatcher")
+ function! s:ExecuteActions(pre_action, post_action) abort
+ try
+ execute a:pre_action
+ catch /\<E42:/
+ execute a:post_action
+ endtry
+ endfunction
+ endif
+
+ if s:request
+ if exists("b:spotbugs_syntax_once") || empty(join(getline(1, 8), ''))
+ let s:actions = [{'event': 'User'}]
+ else
+ " XXX: Handle multiple FileType events when mnvrc contains more
+ " than one filetype setting for the language, e.g.:
+ " :filetype plugin indent on
+ " :autocmd BufRead,BufNewFile *.java setlocal filetype=java ...
+ " XXX: DO NOT ADD b:spotbugs_syntax_once TO b:undo_ftplugin !
+ let b:spotbugs_syntax_once = 1
+ let s:actions = [{
+ \ 'event': 'Syntax',
+ \ 'once': 1,
+ \ }, {
+ \ 'event': 'User',
+ \ }]
+ endif
+
+ for s:idx in range(len(s:actions))
+ if s:request == 7 || s:request == 6 || s:request == 5
+ let s:actions[s:idx].cmd = printf('call s:ExecuteActions(%s, %s)',
+ \ string(s:dispatcher),
+ \ string(printf('compiler spotbugs | call call(%s, [])',
+ \ string(s:SpotBugsGetProperties().PostCompilerAction))))
+ elseif s:request == 4
+ let s:actions[s:idx].cmd = printf(
+ \ 'compiler spotbugs | call call(%s, [])',
+ \ string(s:SpotBugsGetProperties().PostCompilerAction))
+ elseif s:request == 3 || s:request == 2 || s:request == 1
+ let s:actions[s:idx].cmd = printf('call s:ExecuteActions(%s, %s)',
+ \ string(s:dispatcher),
+ \ string('compiler spotbugs'))
+ else
+ let s:actions[s:idx].cmd = ''
+ endif
+ endfor
+
+ if !exists("#java_spotbugs")
+ augroup java_spotbugs
+ augroup END
+ endif
+
+ " The events are defined in s:actions.
+ silent! autocmd! java_spotbugs User <buffer>
+ silent! autocmd! java_spotbugs Syntax <buffer>
+
+ for s:action in s:actions
+ if has_key(s:action, 'once')
+ execute printf('autocmd java_spotbugs %s <buffer> ' .
+ \ 'call JavaFileTypeExecuteActionOnce(%s, %s)',
+ \ s:action.event,
+ \ string(printf('autocmd! java_spotbugs %s <buffer>',
+ \ s:action.event)),
+ \ string(s:action.cmd))
+ else
+ execute printf('autocmd java_spotbugs %s <buffer> %s',
+ \ s:action.event,
+ \ s:action.cmd)
+ endif
+ endfor
+
+ if s:SpotBugsHasProperty('PostCompilerActionExecutor') &&
+ \ (s:request == 7 || s:request == 6 ||
+ \ s:request == 5 || s:request == 4)
+ let s:augroup = s:SpotBugsGetProperty(
+ \ 'augroupForPostCompilerAction',
+ \ 'java_spotbugs_post')
+ let s:augroup = !empty(s:augroup) ? s:augroup : 'java_spotbugs_post'
+
+ for s:candidate in ['java_spotbugs_post', s:augroup]
+ if !exists("#" . s:candidate)
+ execute printf('augroup %s | augroup END', s:candidate)
+ endif
+ endfor
+
+ silent! autocmd! java_spotbugs_post User <buffer>
+
+ " Define a User ":autocmd" to define a once-only ShellCmdPost
+ " ":autocmd" that will invoke "PostCompilerActionExecutor" and let
+ " it decide whether to proceed with ":compiler spotbugs" etc.; and
+ " seek explicit synchronisation with ":doautocmd ShellCmdPost" by
+ " omitting "nested" for "java_spotbugs_post" and "java_spotbugs".
+ execute printf('autocmd java_spotbugs_post User <buffer> ' .
+ \ 'call JavaFileTypeExecuteActionOnce(%s, %s)',
+ \ string(printf('autocmd! %s ShellCmdPost <buffer>', s:augroup)),
+ \ string(printf('autocmd %s ShellCmdPost <buffer> ' .
+ \ 'call JavaFileTypeExecuteActionOnce(%s, %s)',
+ \ s:augroup,
+ \ string(printf('autocmd! %s ShellCmdPost <buffer>', s:augroup)),
+ \ string(printf('call call(%s, [%s])',
+ \ string(s:SpotBugsGetProperties().PostCompilerActionExecutor),
+ \ string(printf('compiler spotbugs | call call(%s, [])',
+ \ string(s:SpotBugsGetProperties().PostCompilerAction))))))))
+ endif
+
+ unlet! s:candidate s:augroup s:action s:actions s:idx s:dispatcher
+ endif
+
+ delfunction s:SpotBugsGetProperties
+ delfunction s:SpotBugsHasProperty
+ delfunction s:SpotBugsGetProperty
+ unlet! s:request s:spotbugs_properties_scope
+endif
+
+function! JavaFileTypeCleanUp() abort
+ setlocal suffixes< suffixesadd< formatoptions< comments< commentstring< path< includeexpr< include< define<
+ unlet! b:browsefilter
+
+ " The concatenated ":autocmd" removals may be misparsed as an ":autocmd".
+ " A _once-only_ ShellCmdPost ":autocmd" is always a call-site definition.
+ silent! autocmd! java_spotbugs User <buffer>
+ silent! autocmd! java_spotbugs Syntax <buffer>
+ silent! autocmd! java_spotbugs_post User <buffer>
+endfunction
+
+" Undo the stuff we changed.
+let b:undo_ftplugin = 'call JavaFileTypeCleanUp() | delfunction JavaFileTypeCleanUp'
+
+" See ":help mnv9-mix".
+if !has("mnv9script")
+ let &cpo = s:save_cpo
+ unlet s:save_cpo
+ finish
+endif
+
+if exists("s:zip_func_upgradable")
+ delfunction! JavaFileTypeZipFile
+
+ def! s:JavaFileTypeZipFile(): string
+ @/ = substitute(v:fname, '\.', '\\/', 'g') .. '.java'
+ return get(zip_files, bufnr('%'), zip_files[0])
+ enddef
+
+ setlocal includeexpr=s:JavaFileTypeZipFile()
+ setlocal suffixesadd<
+endif
+
+if exists("*s:DispatchAction")
+ def! s:DispatchAction(paths_action_pairs: list<list<any>>)
+ const name: string = expand('%:p')
+
+ for [paths: list<string>, Action: func: any] in paths_action_pairs
+ for path in paths
+ if name =~# (path .. '.\{-}\.java\=$')
+ Action()
+ return
+ endif
+ endfor
+ endfor
+ enddef
+endif
+
+" Restore the saved compatibility options.
+let &cpo = s:save_cpo
+unlet s:save_cpo
+" mnv: fdm=syntax sw=4 ts=8 noet sta
diff --git a/mnv/runtime/ftplugin/javacc.mnv b/mnv/runtime/ftplugin/javacc.mnv
new file mode 100644
index 0000000000..52bd9a4007
--- /dev/null
+++ b/mnv/runtime/ftplugin/javacc.mnv
@@ -0,0 +1,20 @@
+" MNV filetype plugin
+" Language: JavaCC
+" Maintainer: Riley Bruins <ribru17@gmail.com>
+" Last Change: 2024 Jul 06
+
+if exists('b:did_ftplugin')
+ finish
+endif
+let b:did_ftplugin = 1
+
+" Set 'formatoptions' to break comment lines but not other lines,
+" and insert the comment leader when hitting <CR> or using "o".
+setlocal formatoptions-=t formatoptions+=croql
+
+" Set 'comments' to format dashed lists in comments. Behaves just like C.
+setlocal comments& comments^=sO:*\ -,mO:*\ \ ,exO:*/
+
+setlocal commentstring=//\ %s
+
+let b:undo_ftplugin = 'setl fo< com< cms<'
diff --git a/mnv/runtime/ftplugin/javascript.mnv b/mnv/runtime/ftplugin/javascript.mnv
new file mode 100644
index 0000000000..b91748f901
--- /dev/null
+++ b/mnv/runtime/ftplugin/javascript.mnv
@@ -0,0 +1,80 @@
+" MNV filetype plugin file
+" Language: Javascript
+" Maintainer: Doug Kearns <dougkearns@gmail.com>
+" Contributor: Romain Lafourcade <romainlafourcade@gmail.com>
+" Last Change: 2024 Jan 14
+" 2024 May 23 by Riley Bruins <ribru17@gmail.com> ('commentstring')
+
+if exists("b:did_ftplugin")
+ finish
+endif
+let b:did_ftplugin = 1
+
+let s:cpo_save = &cpo
+set cpo-=C
+
+" Set 'formatoptions' to break comment lines but not other lines,
+" and insert the comment leader when hitting <CR> or using "o".
+setlocal formatoptions-=t formatoptions+=croql
+
+" Set completion with CTRL-X CTRL-O to autoloaded function.
+if exists('&ofu')
+ setlocal omnifunc=javascriptcomplete#CompleteJS
+endif
+
+" Set 'comments' to format dashed lists in comments.
+setlocal comments=sO:*\ -,mO:*\ \ ,exO:*/,s1:/*,mb:*,ex:*/,://
+
+setlocal commentstring=//\ %s
+
+" Change the :browse e filter to primarily show JavaScript-related files.
+if (has("gui_win32") || has("gui_gtk")) && !exists("b:browsefilter")
+ let b:browsefilter =
+ \ "JavaScript Files (*.js)\t*.js\n"
+ \ .. "JSX Files (*.jsx)\t*.jsx\n"
+ \ .. "JavaScript Modules (*.es, *.es6, *.cjs, *.mjs, *.jsm)\t*.es;*.es6;*.cjs;*.mjs;*.jsm\n"
+ \ .. "Vue Templates (*.vue)\t*.vue\n"
+ \ .. "JSON Files (*.json)\t*.json\n"
+ if has("win32")
+ let b:browsefilter ..= "All Files (*.*)\t*\n"
+ else
+ let b:browsefilter ..= "All Files (*)\t*\n"
+ endif
+endif
+
+" The following suffixes should be implied when resolving filenames
+setlocal suffixesadd+=.js,.jsx,.es,.es6,.cjs,.mjs,.jsm,.vue,.json
+
+" The following suffixes should have low priority
+" .snap jest snapshot
+setlocal suffixes+=.snap
+
+" Remove irrelevant part of 'path'.
+" User is expected to augment it with contextually-relevant paths
+setlocal path-=/usr/include
+
+" Matchit configuration
+if exists("loaded_matchit")
+ let b:match_ignorecase = 0
+ let b:match_words =
+ \ '\<do\>:\<while\>,'
+ \ .. '<\@<=\([^ \t>/]\+\)\%(\s\+[^>]*\%([^/]>\|$\)\|>\|$\):<\@<=/\1>,'
+ \ .. '<\@<=\%([^ \t>/]\+\)\%(\s\+[^/>]*\|$\):/>'
+endif
+
+" Set 'define' to a comprehensive value
+let &l:define =
+ \ '\(^\s*(*async\s\+function\|(*function\)'
+ \ .. '\|^\s*\(\*\|static\|async\|get\|set\|\i\+\.\)'
+ \ .. '\|^\s*\(\ze\i\+\)\(([^)]*).*{$\|\s*[:=,]\)'
+ \ .. '\|^\s*\(export\s\+\|export\s\+default\s\+\)*\(var\|let\|const\|function\|class\)'
+ \ .. '\|\<as\>'
+
+let b:undo_ftplugin =
+ \ "setl fo< ofu< com< cms< sua< su< def< pa<"
+ \ .. "| unlet! b:browsefilter b:match_ignorecase b:match_words"
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
+
+" mnv: textwidth=78 tabstop=8 shiftwidth=4 softtabstop=4 expandtab
diff --git a/mnv/runtime/ftplugin/javascriptreact.mnv b/mnv/runtime/ftplugin/javascriptreact.mnv
new file mode 100644
index 0000000000..e2d3dcc895
--- /dev/null
+++ b/mnv/runtime/ftplugin/javascriptreact.mnv
@@ -0,0 +1,7 @@
+" MNV filetype plugin file
+" Language: JavaScript React
+" Maintainer: Doug Kearns <dougkearns@gmail.com>
+" Last Change: 2020 Aug 19
+
+" Placeholder for backwards compatilibity: .jsx used to stand for JavaScript.
+runtime! ftplugin/javascript.mnv
diff --git a/mnv/runtime/ftplugin/jjdescription.mnv b/mnv/runtime/ftplugin/jjdescription.mnv
new file mode 100644
index 0000000000..fbb6d4d010
--- /dev/null
+++ b/mnv/runtime/ftplugin/jjdescription.mnv
@@ -0,0 +1,19 @@
+" MNV filetype plugin
+" Language: jj description
+" Maintainer: Gregory Anders <greg@gpanders.com>
+" Last Change: 2024 May 8
+
+if exists('b:did_ftplugin')
+ finish
+endif
+let b:did_ftplugin = 1
+
+" Use the same formatoptions and textwidth as the gitcommit ftplugin
+setlocal nomodeline formatoptions+=tl textwidth=72
+setlocal formatoptions-=c formatoptions-=r formatoptions-=o formatoptions-=q formatoptions+=n
+setlocal formatlistpat=^\\s*\\d\\+[\\]:.)}]\\s\\+\\\|^\\s*[-*+]\\s\\+
+
+setlocal comments=b:JJ:
+setlocal commentstring=JJ:\ %s
+
+let b:undo_ftplugin = 'setl modeline< formatoptions< textwidth< formatlistpat< comments< commentstring<'
diff --git a/mnv/runtime/ftplugin/jproperties.mnv b/mnv/runtime/ftplugin/jproperties.mnv
new file mode 100644
index 0000000000..79ae8afce4
--- /dev/null
+++ b/mnv/runtime/ftplugin/jproperties.mnv
@@ -0,0 +1,15 @@
+" MNV filetype plugin
+" Language: Java properties file
+" Maintainer: None
+" Last Change: 2019 Dec 01
+
+if exists("b:did_ftplugin")
+ finish
+endif
+let b:did_ftplugin = 1
+
+setlocal formatoptions-=t
+setlocal comments=:#,:!
+setlocal commentstring=#\ %s
+
+let b:undo_ftplugin = "setl cms< com< fo<"
diff --git a/mnv/runtime/ftplugin/jq.mnv b/mnv/runtime/ftplugin/jq.mnv
new file mode 100644
index 0000000000..3c5c0d95ef
--- /dev/null
+++ b/mnv/runtime/ftplugin/jq.mnv
@@ -0,0 +1,23 @@
+" MNV compiler file
+" Language: jq
+" Maintainer: Vito <vito.blog@gmail.com>
+" Last Change: 2024 Apr 29
+" 2024 May 23 by Riley Bruins <ribru17@gmail.com> ('commentstring')
+" 2024 Oct 04 by Konfekt (unset compiler)
+" Upstream: https://github.com/vito-c/jq.mnv
+
+if exists('b:did_ftplugin')
+ finish
+endif
+let b:did_ftplugin = 1
+
+setlocal include=^\\s*\\%(import\\\|include\\)
+setlocal commentstring=#\ %s
+
+let b:undo_ftplugin = 'setl commentstring< include<'
+
+if !exists('current_compiler')
+ let b:undo_ftplugin ..= "| compiler make"
+ compiler jq
+endif
+
diff --git a/mnv/runtime/ftplugin/json.mnv b/mnv/runtime/ftplugin/json.mnv
new file mode 100644
index 0000000000..68a3022554
--- /dev/null
+++ b/mnv/runtime/ftplugin/json.mnv
@@ -0,0 +1,17 @@
+" MNV filetype plugin
+" Language: JSON
+" Maintainer: David Barnett <daviebdawg+mnv@gmail.com>
+" Last Change: 2014 Jul 16
+
+if exists('b:did_ftplugin')
+ finish
+endif
+let b:did_ftplugin = 1
+
+let b:undo_ftplugin = 'setlocal formatoptions< comments< commentstring<'
+
+setlocal formatoptions-=t
+
+" JSON has no comments.
+setlocal comments=
+setlocal commentstring=
diff --git a/mnv/runtime/ftplugin/json5.mnv b/mnv/runtime/ftplugin/json5.mnv
new file mode 100644
index 0000000000..785ed1729c
--- /dev/null
+++ b/mnv/runtime/ftplugin/json5.mnv
@@ -0,0 +1,32 @@
+" MNV filetype plugin file
+" Language: JSON5
+" Maintainer: Doug Kearns <dougkearns@gmail.com>
+" Last Change: 2024 Jan 14
+
+if exists("b:did_ftplugin")
+ finish
+endif
+let b:did_ftplugin = 1
+
+let s:cpo_save = &cpo
+set cpo&mnv
+
+setlocal comments=sO:*\ -,mO:*\ \ ,exO:*/,s1:/*,mb:*,ex:*/,://
+setlocal commentstring=//\ %s
+setlocal formatoptions-=t formatoptions+=croql
+
+let b:undo_ftplugin = "setl fo< com< cms<"
+
+if (has("gui_win32") || has("gui_gtk")) && !exists("b:browsefilter")
+ let b:browsefilter = "JSON5 Files (*.json5)\t*.json5\n" ..
+ \ "JSON Files (*.json)\t*.json\n"
+ if has("win32")
+ let b:browsefilter ..= "All Files (*.*)\t*\n"
+ else
+ let b:browsefilter ..= "All Files (*)\t*\n"
+ endif
+ let b:undo_ftplugin ..= " | unlet! b:browsefilter"
+endif
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/mnv/runtime/ftplugin/jsonc.mnv b/mnv/runtime/ftplugin/jsonc.mnv
new file mode 100644
index 0000000000..5f0d57b68a
--- /dev/null
+++ b/mnv/runtime/ftplugin/jsonc.mnv
@@ -0,0 +1,22 @@
+" MNV filetype plugin
+" Language: JSONC (JSON with Comments)
+" Original Author: Izhak Jakov <izhak724@gmail.com>
+" Acknowledgement: Based off of mnv-jsonc maintained by Kevin Locke <kevin@kevinlocke.name>
+" https://github.com/kevinoid/mnv-jsonc
+" License: MIT
+" Last Change: 2021 Nov 22
+" 2024 May 23 by Riley Bruins <ribru17@gmail.com> ('commentstring')
+
+runtime! ftplugin/json.mnv
+
+if exists('b:did_ftplugin_jsonc')
+ finish
+else
+ let b:did_ftplugin_jsonc = 1
+endif
+
+" Set comment (formatting) related options. {{{1
+setlocal commentstring=//\ %s comments=sO:*\ -,mO:*\ \ ,exO:*/,s1:/*,mb:*,ex:*/,://
+
+" Let MNV know how to disable the plug-in.
+let b:undo_ftplugin = 'setlocal commentstring< comments<'
diff --git a/mnv/runtime/ftplugin/jsonnet.mnv b/mnv/runtime/ftplugin/jsonnet.mnv
new file mode 100644
index 0000000000..d9b8cbc9f2
--- /dev/null
+++ b/mnv/runtime/ftplugin/jsonnet.mnv
@@ -0,0 +1,17 @@
+" MNV filetype plugin
+" Language: Jsonnet
+" Maintainer: Cezary Drożak <cezary@drozak.net>
+" URL: https://github.com/google/mnv-jsonnet
+" Last Change: 2022-09-08
+
+" Only do this when not done yet for this buffer
+if exists("b:did_ftplugin")
+ finish
+endif
+
+" Don't load another plugin for this buffer
+let b:did_ftplugin = 1
+
+setlocal commentstring=//\ %s
+
+let b:undo_ftplugin = "setlocal commentstring<"
diff --git a/mnv/runtime/ftplugin/jsp.mnv b/mnv/runtime/ftplugin/jsp.mnv
new file mode 100644
index 0000000000..3daaccfbf0
--- /dev/null
+++ b/mnv/runtime/ftplugin/jsp.mnv
@@ -0,0 +1,74 @@
+" MNV filetype plugin file
+" Language: jsp
+"
+" This runtime file is looking for a new maintainer.
+"
+" Former maintainer: Dan Sharp
+" Last Change: 2009 Jan 20
+" 2024 Jan 14 by MNV Project (browsefilter)
+
+if exists("b:did_ftplugin") | finish | endif
+
+" Make sure the continuation lines below do not cause problems in
+" compatibility mode.
+let s:save_cpo = &cpo
+set cpo-=C
+
+" Define some defaults in case the included ftplugins don't set them.
+let s:undo_ftplugin = ""
+let s:browsefilter = "Java Files (*.java)\t*.java\n" .
+ \ "HTML Files (*.html, *.htm)\t*.html;*.htm\n"
+if has("win32")
+ let s:browsefilter .= "All Files (*.*)\t*\n"
+else
+ let s:browsefilter .= "All Files (*)\t*\n"
+endif
+let s:match_words = ""
+
+runtime! ftplugin/html.mnv ftplugin/html_*.mnv ftplugin/html/*.mnv
+unlet b:did_ftplugin
+
+" Override our defaults if these were set by an included ftplugin.
+if exists("b:undo_ftplugin")
+ let s:undo_ftplugin = b:undo_ftplugin
+ unlet b:undo_ftplugin
+endif
+if exists("b:browsefilter")
+ let s:browsefilter = b:browsefilter
+ unlet b:browsefilter
+endif
+if exists("b:match_words")
+ let s:match_words = b:match_words
+ unlet b:match_words
+endif
+
+runtime! ftplugin/java.mnv ftplugin/java_*.mnv ftplugin/java/*.mnv
+let b:did_ftplugin = 1
+
+" Combine the new set of values with those previously included.
+if exists("b:undo_ftplugin")
+ let s:undo_ftplugin = b:undo_ftplugin . " | " . s:undo_ftplugin
+endif
+if exists ("b:browsefilter")
+ let s:browsefilter = b:browsefilter . s:browsefilter
+endif
+if exists("b:match_words")
+ let s:match_words = b:match_words . ',' . s:match_words
+endif
+
+" Load the combined list of match_words for matchit.mnv
+if exists("loaded_matchit")
+ let b:match_words = s:match_words
+endif
+
+" Change the :browse e filter to primarily show JSP-related files.
+if (has("gui_win32") || has("gui_gtk")) && !exists("b:browsefilter")
+ let b:browsefilter="JSP Files (*.jsp)\t*.jsp\n" . s:browsefilter
+endif
+
+" Undo the stuff we changed.
+let b:undo_ftplugin = "unlet! b:browsefilter b:match_words | " . s:undo_ftplugin
+
+" Restore the saved compatibility options.
+let &cpo = s:save_cpo
+unlet s:save_cpo
diff --git a/mnv/runtime/ftplugin/julia.mnv b/mnv/runtime/ftplugin/julia.mnv
new file mode 100644
index 0000000000..695edee1b6
--- /dev/null
+++ b/mnv/runtime/ftplugin/julia.mnv
@@ -0,0 +1,92 @@
+" MNV filetype plugin file
+" Language: Julia
+" Maintainer: Carlo Baldassi <carlobaldassi@gmail.com>
+" Homepage: https://github.com/JuliaEditorSupport/julia-mnv
+" Last Change: 2021 Aug 04
+" 2026 Feb 27 sync with upstream repo
+
+if exists("b:did_ftplugin")
+ finish
+endif
+let b:did_ftplugin = 1
+
+let s:save_cpo = &cpo
+set cpo&mnv
+
+setlocal include=^\\s*\\%(reload\\\|include\\)\\>
+setlocal suffixesadd=.jl
+setlocal comments=:#
+setlocal commentstring=#\ %s
+setlocal cinoptions+=#1
+setlocal define=^\\s*macro\\>
+setlocal fo-=t fo+=croql
+
+let b:julia_mnv_loaded = 1
+
+let b:undo_ftplugin = "setlocal include< suffixesadd< comments< commentstring<"
+ \ . " define< fo< cinoptions< completefunc<"
+ \ . " | unlet! b:julia_mnv_loaded"
+
+" MatchIt plugin support
+if exists("loaded_matchit")
+ let b:match_ignorecase = 0
+
+ " note: begin_keywords must contain all blocks, in order
+ " for nested-structures-skipping to work properly
+ " note: 'mutable struct' and 'struct' are defined separately because
+ " using \? puts the cursor on 'struct' instead of 'mutable' for some reason
+ let b:julia_begin_keywords = '\%(\.\s*\|@\)\@<!\<\%(function\|macro\|begin\|mutable\s\+struct\|\%(mutable\s\+\)\@<!struct\|\%(abstract\|primitive\)\s\+type\|let\|do\|\%(bare\)\?module\|quote\|if\|for\|while\|try\)\>'
+ " note: the following regex not only recognizes macros, but also local/global keywords.
+ " the purpose is recognizing things like `@inline myfunction()`
+ " or `global myfunction(...)` etc, for matchit and block movement functionality
+ let s:macro_regex = '\%(@\%([#(]\@!\S\)\+\|\<\%(local\|global\)\)\s\+'
+ let s:nomacro = '\%(' . s:macro_regex . '\)\@<!'
+ let s:yesmacro = s:nomacro . '\%('. s:macro_regex . '\)\+'
+ let b:julia_begin_keywordsm = '\%(' . s:yesmacro . b:julia_begin_keywords . '\)\|'
+ \ . '\%(' . s:nomacro . b:julia_begin_keywords . '\)'
+ let b:julia_end_keywords = '\<end\>'
+
+ " note: this function relies heavily on the syntax file
+ function! JuliaGetMatchWords()
+ let [l,c] = [line('.'),col('.')]
+ let attr = synIDattr(synID(l, c, 1),"name")
+ let c1 = c
+ while attr == 'juliaMacro' || expand('<cword>') =~# '\<\%(global\|local\)\>'
+ normal! W
+ if line('.') > l || col('.') == c1
+ call cursor(l, c)
+ return ''
+ endif
+ let attr = synIDattr(synID(l, col('.'), 1),"name")
+ let c1 = col('.')
+ endwhile
+ call cursor(l, c)
+ if attr == 'juliaConditional'
+ return b:julia_begin_keywordsm . ':\<\%(elseif\|else\)\>:' . b:julia_end_keywords
+ elseif attr =~# '\<\%(juliaRepeat\|juliaRepKeyword\)\>'
+ return b:julia_begin_keywordsm . ':\<\%(break\|continue\)\>:' . b:julia_end_keywords
+ elseif attr == 'juliaBlKeyword'
+ return b:julia_begin_keywordsm . ':' . b:julia_end_keywords
+ elseif attr == 'juliaException'
+ return b:julia_begin_keywordsm . ':\<\%(catch\|else\|finally\)\>:' . b:julia_end_keywords
+ endif
+ return '\<\>:\<\>'
+ endfunction
+
+ let b:match_words = 'JuliaGetMatchWords()'
+
+ " we need to skip everything within comments, strings and
+ " the 'begin' and 'end' keywords when they are used as a range rather than as
+ " the delimiter of a block
+ let b:match_skip = 'synIDattr(synID(line("."),col("."),0),"name") =~# '
+ \ . '"\\<julia\\%(Comprehension\\%(For\\|If\\)\\|RangeKeyword\\|Comment\\%([LM]\\|Delim\\)\\|\\%([bs]\\|Shell\\|Printf\\|Doc\\)\\?String\\|StringPrefixed\\|DocStringM\\(Raw\\)\\?\\|RegEx\\|SymbolS\\?\\|Dotted\\)\\>"'
+
+ let b:undo_ftplugin = b:undo_ftplugin
+ \ . " | unlet! b:match_words b:match_skip b:match_ignorecase"
+ \ . " | unlet! b:julia_begin_keywords b:julia_end_keywords"
+ \ . " | delfunction JuliaGetMatchWords"
+
+endif
+
+let &cpo = s:save_cpo
+unlet s:save_cpo
diff --git a/mnv/runtime/ftplugin/just.mnv b/mnv/runtime/ftplugin/just.mnv
new file mode 100644
index 0000000000..110f183ecc
--- /dev/null
+++ b/mnv/runtime/ftplugin/just.mnv
@@ -0,0 +1,17 @@
+" MNV ftplugin file
+" Language: Justfile
+" Maintainer: Peter Benjamin <@pbnj>
+" Last Change: 2025 Jan 19
+" Credits: The original author, Noah Bogart <https://github.com/NoahTheDuke/mnv-just/>
+
+" Only do this when not done yet for this buffer
+if exists("b:did_ftplugin")
+ finish
+endif
+let b:did_ftplugin = 1
+
+setlocal iskeyword+=-
+setlocal comments=n:#
+setlocal commentstring=#\ %s
+
+let b:undo_ftplugin = "setlocal iskeyword< comments< commentstring<"
diff --git a/mnv/runtime/ftplugin/karel.mnv b/mnv/runtime/ftplugin/karel.mnv
new file mode 100644
index 0000000000..27f1c55f8d
--- /dev/null
+++ b/mnv/runtime/ftplugin/karel.mnv
@@ -0,0 +1,16 @@
+" MNV filetype plugin file
+" Language: KAREL
+" Last Change: 2024-11-18
+" Maintainer: Kirill Morozov <kirill@robotix.pro>
+" Credits: Patrick Meiser-Knosowski for the initial implementation.
+
+if exists("b:did_ftplugin")
+ finish
+endif
+let b:did_ftplugin = 1
+
+setlocal comments=:--
+setlocal commentstring=--\ %s
+setlocal suffixesadd+=.kl,.KL
+
+let b:undo_ftplugin = "setlocal com< cms< sua<"
diff --git a/mnv/runtime/ftplugin/kconfig.mnv b/mnv/runtime/ftplugin/kconfig.mnv
new file mode 100644
index 0000000000..c8253a8d55
--- /dev/null
+++ b/mnv/runtime/ftplugin/kconfig.mnv
@@ -0,0 +1,23 @@
+" MNV filetype plugin file
+" MNV syntax file
+" Maintainer: Christian Brabandt <cb@256bit.org>
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2025 Jan 20
+" License: MNV (see :h license)
+" Repository: https://github.com/chrisbra/mnv-kconfig
+
+if exists("b:did_ftplugin")
+ finish
+endif
+let b:did_ftplugin = 1
+
+let b:undo_ftplugin = "setl inc< com< cms< fo<"
+
+setlocal include=source\\s\\+
+setlocal comments=:# commentstring=#\ %s formatoptions-=t formatoptions+=croql
+
+" For matchit.mnv
+if exists("loaded_matchit")
+ let b:match_words = '^\<menu\>:\<endmenu\>,^\<if\>:\<endif\>,^\<choice\>:\<endchoice\>'
+ let b:undo_ftplugin .= "| unlet! b:match_words"
+endif
diff --git a/mnv/runtime/ftplugin/kdl.mnv b/mnv/runtime/ftplugin/kdl.mnv
new file mode 100644
index 0000000000..6423683ae6
--- /dev/null
+++ b/mnv/runtime/ftplugin/kdl.mnv
@@ -0,0 +1,17 @@
+" MNV filetype plugin
+" Language: KDL
+" Author: Aram Drevekenin <aram@poor.dev>
+" Maintainer: Yinzuo Jiang <jiangyinzuo@foxmail.com>
+" Last Change: 2024-06-10
+
+if exists("b:did_ftplugin")
+ finish
+endif
+
+let b:did_ftplugin = 1
+
+setlocal comments=://
+setlocal commentstring=//\ %s
+setlocal formatoptions-=t
+
+let b:undo_ftplugin = 'setlocal comments< commentstring< formatoptions<'
diff --git a/mnv/runtime/ftplugin/kerml.mnv b/mnv/runtime/ftplugin/kerml.mnv
new file mode 100644
index 0000000000..954684ca2f
--- /dev/null
+++ b/mnv/runtime/ftplugin/kerml.mnv
@@ -0,0 +1,25 @@
+" MNV filetype plugin
+" Language: KerML
+" Author: Daumantas Kavolis <daumantas.kavolis@sensmetry.com>
+" Last Change: 2025-10-06
+
+" Only do this when not done yet for this buffer
+if exists("b:did_ftplugin")
+ finish
+endif
+
+" Don't load another plugin for this buffer
+let b:did_ftplugin = 1
+
+" Set 'comments' to format dashed and starred lists in comments,
+" include /*...*/ in 'comments' for formatting even if it technically
+" is not
+setlocal comments=sO:*\ -,mO:*\ \ ,exO:*/,sO:*\ *,mO:*\ \ ,exO:*/,sr://*,mb:*,ex:*/,sr:/*,mb:*,ex:*/,:///,://
+setlocal commentstring=//\ %s
+
+" Set 'formatoptions' to break comment lines but not other lines,
+" and insert the comment leader when hitting <CR> or using "o"
+setlocal formatoptions-=t
+setlocal formatoptions+=croql
+
+let b:undo_ftplugin = 'setlocal comments< commentstring< formatoptions<'
diff --git a/mnv/runtime/ftplugin/kitty.mnv b/mnv/runtime/ftplugin/kitty.mnv
new file mode 100644
index 0000000000..8cea5b926e
--- /dev/null
+++ b/mnv/runtime/ftplugin/kitty.mnv
@@ -0,0 +1,13 @@
+" MNV filetype plugin
+" Language: kitty
+" Maintainer: Arvin Verain <arvinverain@proton.me>
+" Last Change: 2026 Jan 22
+
+if exists('b:did_ftplugin')
+ finish
+endif
+let b:did_ftplugin = 1
+
+setl comments=:# commentstring=#\ %s formatoptions-=t formatoptions+=rol
+
+let b:undo_ftplugin = 'setl com< cms< fo<'
diff --git a/mnv/runtime/ftplugin/kivy.mnv b/mnv/runtime/ftplugin/kivy.mnv
new file mode 100644
index 0000000000..7a131cc295
--- /dev/null
+++ b/mnv/runtime/ftplugin/kivy.mnv
@@ -0,0 +1,13 @@
+" MNV filetype plugin
+" Language: Kivy
+" Maintainer: Riley Bruins <ribru17@gmail.com>
+" Last Change: 2024 Jul 06
+
+if exists('b:did_ftplugin')
+ finish
+endif
+let b:did_ftplugin = 1
+
+setl commentstring=#\ %s
+
+let b:undo_ftplugin = 'setl cms<'
diff --git a/mnv/runtime/ftplugin/kotlin.mnv b/mnv/runtime/ftplugin/kotlin.mnv
new file mode 100644
index 0000000000..c29b873d09
--- /dev/null
+++ b/mnv/runtime/ftplugin/kotlin.mnv
@@ -0,0 +1,37 @@
+" MNV filetype plugin file
+" Language: Kotlin
+" Maintainer: Alexander Udalov
+" URL: https://github.com/udalov/kotlin-mnv
+" Last Change: 7 November 2021
+" 2024 Jan 14 by MNV Project (browsefilter)
+
+if exists('b:did_ftplugin') | finish | endif
+let b:did_ftplugin = 1
+
+let s:save_cpo = &cpo
+set cpo&mnv
+
+setlocal comments=sO:*\ -,mO:*\ \ ,exO:*/,s1:/*,mb:*,ex:*/,://
+setlocal commentstring=//\ %s
+
+setlocal formatoptions-=t formatoptions+=croqnl
+silent! setlocal formatoptions+=j
+
+setlocal includeexpr=substitute(v:fname,'\\.','/','g')
+setlocal suffixesadd=.kt
+
+let b:undo_ftplugin = "setlocal comments< commentstring< ".
+ \ "formatoptions< includeexpr< suffixesadd<"
+
+if (has("gui_win32") || has("gui_gtk")) && !exists("b:browsefilter")
+ let b:browsefilter = "Kotlin Source Files (*.kt, *kts)\t*.kt;*.kts\n"
+ if has("win32")
+ let b:browsefilter .= "All Files (*.*)\t*\n"
+ else
+ let b:browsefilter .= "All Files (*)\t*\n"
+ endif
+ let b:undo_ftplugin .= " | unlet! b:browsefilter"
+endif
+
+let &cpo = s:save_cpo
+unlet s:save_cpo
diff --git a/mnv/runtime/ftplugin/kwt.mnv b/mnv/runtime/ftplugin/kwt.mnv
new file mode 100644
index 0000000000..7f6a8744e7
--- /dev/null
+++ b/mnv/runtime/ftplugin/kwt.mnv
@@ -0,0 +1,37 @@
+" MNV filetype plugin file
+" Language: Kimwitu++
+" Maintainer: Michael Piefel <entwurf@piefel.de>
+" Last Change: 10 March 2012
+" 2024 Jan 14 by MNV Project (browsefilter)
+
+" Behaves almost like C++
+runtime! ftplugin/cpp.mnv ftplugin/cpp_*.mnv ftplugin/cpp/*.mnv
+
+let s:cpo_save = &cpo
+set cpo&mnv
+
+" Limit the browser to related files
+if (has("gui_win32") || has("gui_gtk")) && !exists("b:browsefilter")
+ let b:browsefilter = "Kimwitu/Kimwitu++ Files (*.k)\t*.k\n" .
+ \ "Lex/Flex Files (*.l)\t*.l\n" .
+ \ "Yacc/Bison Files (*.y)\t*.y\n"
+ if has("win32")
+ let b:browsefilter ..= "All Files (*.*)\t*\n"
+ else
+ let b:browsefilter ..= "All Files (*)\t*\n"
+ endif
+endif
+
+" Set the errorformat for the Kimwitu++ compiler
+set efm+=kc%.%#:\ error\ at\ %f:%l:\ %m
+
+if exists("b:undo_ftplugin")
+ let b:undo_ftplugin = b:undo_ftplugin . " | setlocal efm<"
+ \ . "| unlet! b:browsefilter"
+else
+ let b:undo_ftplugin = "setlocal efm<"
+ \ . "| unlet! b:browsefilter"
+endif
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/mnv/runtime/ftplugin/lc.mnv b/mnv/runtime/ftplugin/lc.mnv
new file mode 100644
index 0000000000..6be9cf10d7
--- /dev/null
+++ b/mnv/runtime/ftplugin/lc.mnv
@@ -0,0 +1,13 @@
+" MNV filetype plugin
+" Language: Elsa
+" Maintainer: Riley Bruins <ribru17@gmail.com>
+" Last Change: 2024 May 25
+
+if exists('b:did_ftplugin')
+ finish
+endif
+let b:did_ftplugin = 1
+
+setl comments=:-- commentstring=--\ %s
+
+let b:undo_ftplugin = 'setl com< cms<'
diff --git a/mnv/runtime/ftplugin/ld.mnv b/mnv/runtime/ftplugin/ld.mnv
new file mode 100644
index 0000000000..e4449de71a
--- /dev/null
+++ b/mnv/runtime/ftplugin/ld.mnv
@@ -0,0 +1,21 @@
+" MNV filetype plugin file
+" Language: ld(1) script
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2008 Jul 09
+" 2024 May 23 by Riley Bruins <ribru17@gmail.com> ('commentstring')
+
+if exists("b:did_ftplugin")
+ finish
+endif
+let b:did_ftplugin = 1
+
+let s:cpo_save = &cpo
+set cpo&mnv
+
+let b:undo_ftplugin = "setl com< cms< inc< fo<"
+
+setlocal comments=s1:/*,mb:*,ex:*/ commentstring=/*\ %s\ */ include=^\\s*INCLUDE
+setlocal formatoptions-=t formatoptions+=croql
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/mnv/runtime/ftplugin/ldapconf.mnv b/mnv/runtime/ftplugin/ldapconf.mnv
new file mode 100644
index 0000000000..ee5a527c94
--- /dev/null
+++ b/mnv/runtime/ftplugin/ldapconf.mnv
@@ -0,0 +1,13 @@
+" MNV filetype plugin
+" Language: ldap.conf(5) configuration file.
+" Maintainer: Riley Bruins <ribru17@gmail.com>
+" Last Change: 2024 Jul 06
+
+if exists('b:did_ftplugin')
+ finish
+endif
+let b:did_ftplugin = 1
+
+setl comments=:# commentstring=#\ %s
+
+let b:undo_ftplugin = 'setl com< cms<'
diff --git a/mnv/runtime/ftplugin/leex.mnv b/mnv/runtime/ftplugin/leex.mnv
new file mode 100644
index 0000000000..137541d3f7
--- /dev/null
+++ b/mnv/runtime/ftplugin/leex.mnv
@@ -0,0 +1,14 @@
+" MNV ftplugin file
+" Language: Leex (Erlang Lexical Analyzer Generator)
+" Maintainer: Jon Parise <jon@indelible.org>
+" Last Change: 2025 Nov 29
+" Filenames: *.xrl
+"
+" References:
+" - https://www.erlang.org/doc/apps/parsetools/leex.html
+
+if exists('b:did_ftplugin')
+ finish
+endif
+
+runtime! ftplugin/erlang.mnv
diff --git a/mnv/runtime/ftplugin/leo.mnv b/mnv/runtime/ftplugin/leo.mnv
new file mode 100644
index 0000000000..04f2befae9
--- /dev/null
+++ b/mnv/runtime/ftplugin/leo.mnv
@@ -0,0 +1,13 @@
+" MNV filetype plugin
+" Language: Leo
+" Maintainer: Riley Bruins <ribru17@gmail.com>
+" Last Change: 2024 Nov 03
+
+if exists('b:did_ftplugin')
+ finish
+endif
+let b:did_ftplugin = 1
+
+setl comments=:// commentstring=//\ %s
+
+let b:undo_ftplugin = 'setl com< cms<'
diff --git a/mnv/runtime/ftplugin/less.mnv b/mnv/runtime/ftplugin/less.mnv
new file mode 100644
index 0000000000..9af58b5748
--- /dev/null
+++ b/mnv/runtime/ftplugin/less.mnv
@@ -0,0 +1,20 @@
+" MNV filetype plugin
+" Language: less
+" Maintainer: Alessandro Vioni <jenoma@gmail.com>
+" URL: https://github.com/genoma/mnv-less
+" Last Change: 2014 November 24
+
+" Only do this when not done yet for this buffer
+if exists("b:did_ftplugin")
+ finish
+endif
+let b:did_ftplugin = 1
+
+let b:undo_ftplugin = "setl cms< def< inc< inex< ofu< sua<"
+
+setlocal formatoptions-=t formatoptions+=croql
+
+setlocal comments=:// commentstring=//\ %s
+
+setlocal omnifunc=csscomplete#CompleteCSS
+setlocal suffixesadd=.less
diff --git a/mnv/runtime/ftplugin/lex.mnv b/mnv/runtime/ftplugin/lex.mnv
new file mode 100644
index 0000000000..8c5510fa6c
--- /dev/null
+++ b/mnv/runtime/ftplugin/lex.mnv
@@ -0,0 +1,14 @@
+" MNV filetype plugin
+" Language: Lex and Flex
+" Maintainer: Riley Bruins <ribru17@gmail.com>
+" Last Change: 2024 Jul 06
+
+if exists('b:did_ftplugin')
+ finish
+endif
+let b:did_ftplugin = 1
+
+setlocal comments=sO:*\ -,mO:*\ \ ,exO:*/,s1:/*,mb:*,ex:*/,://
+setlocal commentstring=//\ %s
+
+let b:undo_ftplugin = 'setl com< cms<'
diff --git a/mnv/runtime/ftplugin/lf.mnv b/mnv/runtime/ftplugin/lf.mnv
new file mode 100644
index 0000000000..860e58f88a
--- /dev/null
+++ b/mnv/runtime/ftplugin/lf.mnv
@@ -0,0 +1,22 @@
+" MNV filetype plugin file
+" Language: lf file manager configuration file (lfrc)
+" Maintainer: Andis Sprinkis <andis@sprinkis.com>, @CatsDeservePets
+" URL: https://github.com/andis-sprinkis/lf-mnv
+" Last Change: 6 Apr 2025
+
+if exists("b:did_ftplugin") | finish | endif
+
+let b:did_ftplugin = 1
+
+let s:cpo = &cpo
+set cpo&mnv
+
+let b:undo_ftplugin = "setlocal comments< commentstring< formatoptions<"
+
+setlocal comments=:#
+setlocal commentstring=#\ %s
+
+setlocal formatoptions-=t formatoptions+=rol
+
+let &cpo = s:cpo
+unlet s:cpo
diff --git a/mnv/runtime/ftplugin/lftp.mnv b/mnv/runtime/ftplugin/lftp.mnv
new file mode 100644
index 0000000000..364a6d2f60
--- /dev/null
+++ b/mnv/runtime/ftplugin/lftp.mnv
@@ -0,0 +1,19 @@
+" MNV filetype plugin file
+" Language: lftp(1) configuration file
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2008-07-09
+
+if exists("b:did_ftplugin")
+ finish
+endif
+let b:did_ftplugin = 1
+
+let s:cpo_save = &cpo
+set cpo&mnv
+
+let b:undo_ftplugin = "setl com< cms< fo<"
+
+setlocal comments=:# commentstring=#\ %s formatoptions-=t formatoptions+=croql
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/mnv/runtime/ftplugin/libao.mnv b/mnv/runtime/ftplugin/libao.mnv
new file mode 100644
index 0000000000..dc43ef733d
--- /dev/null
+++ b/mnv/runtime/ftplugin/libao.mnv
@@ -0,0 +1,19 @@
+" MNV filetype plugin file
+" Language: libao.conf(5) configuration file
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2008-07-09
+
+if exists("b:did_ftplugin")
+ finish
+endif
+let b:did_ftplugin = 1
+
+let s:cpo_save = &cpo
+set cpo&mnv
+
+let b:undo_ftplugin = "setl com< cms< fo<"
+
+setlocal comments=:# commentstring=#\ %s formatoptions-=t formatoptions+=croql
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/mnv/runtime/ftplugin/limits.mnv b/mnv/runtime/ftplugin/limits.mnv
new file mode 100644
index 0000000000..7006f6784f
--- /dev/null
+++ b/mnv/runtime/ftplugin/limits.mnv
@@ -0,0 +1,19 @@
+" MNV filetype plugin file
+" Language: limits(5) configuration file
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2008-07-09
+
+if exists("b:did_ftplugin")
+ finish
+endif
+let b:did_ftplugin = 1
+
+let s:cpo_save = &cpo
+set cpo&mnv
+
+let b:undo_ftplugin = "setl com< cms< fo<"
+
+setlocal comments=:# commentstring=#\ %s formatoptions-=t formatoptions+=croql
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/mnv/runtime/ftplugin/liquid.mnv b/mnv/runtime/ftplugin/liquid.mnv
new file mode 100644
index 0000000000..3885e3d093
--- /dev/null
+++ b/mnv/runtime/ftplugin/liquid.mnv
@@ -0,0 +1,62 @@
+" MNV filetype plugin
+" Language: Liquid
+" Maintainer: Tim Pope <mnvNOSPAM@tpope.org>
+" Last Change: 2022 Mar 15
+" 2024 May 23 by Riley Bruins <ribru17@gmail.com> ('commentstring')
+
+if exists('b:did_ftplugin')
+ finish
+endif
+
+if !exists('g:liquid_default_subtype')
+ let g:liquid_default_subtype = 'html'
+endif
+
+if !exists('b:liquid_subtype')
+ let s:lines = getline(1)."\n".getline(2)."\n".getline(3)."\n".getline(4)."\n".getline(5)."\n".getline("$")
+ let b:liquid_subtype = matchstr(s:lines,'liquid_subtype=\zs\w\+')
+ if b:liquid_subtype == ''
+ let b:liquid_subtype = matchstr(&filetype,'^liquid\.\zs\w\+')
+ endif
+ if b:liquid_subtype == ''
+ let b:liquid_subtype = matchstr(substitute(expand('%:t'),'\c\%(\.liquid\)\+$','',''),'\.\zs\w\+$')
+ endif
+ if b:liquid_subtype == ''
+ let b:liquid_subtype = g:liquid_default_subtype
+ endif
+endif
+
+if exists('b:liquid_subtype') && b:liquid_subtype != ''
+ exe 'runtime! ftplugin/'.b:liquid_subtype.'.mnv ftplugin/'.b:liquid_subtype.'_*.mnv ftplugin/'.b:liquid_subtype.'/*.mnv'
+else
+ runtime! ftplugin/html.mnv ftplugin/html_*.mnv ftplugin/html/*.mnv
+endif
+let b:did_ftplugin = 1
+
+if exists('b:undo_ftplugin')
+ let b:undo_ftplugin .= '|'
+else
+ let b:undo_ftplugin = ''
+endif
+if exists('b:browsefilter')
+ let b:browsefilter = "\n".b:browsefilter
+else
+ let b:browsefilter = ''
+endif
+if exists('b:match_words')
+ let b:match_words .= ','
+elseif exists('loaded_matchit')
+ let b:match_words = ''
+endif
+
+if has('gui_win32')
+ let b:browsefilter="Liquid Files (*.liquid)\t*.liquid" . b:browsefilter
+endif
+
+if exists('loaded_matchit')
+ let b:match_words .= '\<\%(if\w*\|unless\|case\)\>:\<\%(elsif\|else\|when\)\>:\<end\%(if\w*\|unless\|case\)\>,\<\%(for\|tablerow\)\>:\%({%\s*\)\@<=empty\>:\<end\%(for\|tablerow\)\>,\<\(capture\|comment\|highlight\)\>:\<end\1\>'
+endif
+
+setlocal commentstring={%\ comment\ %}\ %s\ {%\ endcomment\ %}
+
+let b:undo_ftplugin .= 'setl cms< | unlet! b:browsefilter b:match_words'
diff --git a/mnv/runtime/ftplugin/lisp.mnv b/mnv/runtime/ftplugin/lisp.mnv
new file mode 100644
index 0000000000..6aa65299f6
--- /dev/null
+++ b/mnv/runtime/ftplugin/lisp.mnv
@@ -0,0 +1,25 @@
+" MNV filetype plugin
+" Language: Lisp
+" Maintainer: Sergey Khorev <sergey.khorev@gmail.com>
+" URL: http://sites.google.com/site/khorser/opensource/mnv
+" Original author: Dorai Sitaram <ds26@gte.com>
+" Original URL: http://www.ccs.neu.edu/~dorai/mnvplugins/mnvplugins.html
+" Last Change: Mar 10, 2021
+" May 23, 2024 by Riley Bruins <ribru17@gmail.com> ('commentstring')
+
+" Only do this when not done yet for this buffer
+if exists("b:did_ftplugin")
+ finish
+endif
+
+" Don't load another plugin for this buffer
+let b:did_ftplugin = 1
+
+setl comments=:;;;;,:;;;,:;;,:;,sr:#\|,mb:\|,ex:\|#
+setl define=^\\s*(def\\k*
+setl formatoptions-=t
+setl iskeyword+=+,-,*,/,%,<,=,>,:,$,?,!,@-@,94
+setl lisp
+setl commentstring=;\ %s
+
+let b:undo_ftplugin = "setlocal comments< define< formatoptions< iskeyword< lisp< commentstring<"
diff --git a/mnv/runtime/ftplugin/livebook.mnv b/mnv/runtime/ftplugin/livebook.mnv
new file mode 100644
index 0000000000..3892097824
--- /dev/null
+++ b/mnv/runtime/ftplugin/livebook.mnv
@@ -0,0 +1,9 @@
+" Placeholder livebook filetype plugin file.
+" This simply uses the markdown filetype plugin.
+
+" Only load this plugin when no other was loaded.
+if exists("b:did_ftplugin")
+ finish
+endif
+
+runtime! ftplugin/markdown.mnv ftplugin/markdown_*.mnv ftplugin/markdown/*.mnv
diff --git a/mnv/runtime/ftplugin/llvm.mnv b/mnv/runtime/ftplugin/llvm.mnv
new file mode 100644
index 0000000000..3f4ac7ece8
--- /dev/null
+++ b/mnv/runtime/ftplugin/llvm.mnv
@@ -0,0 +1,12 @@
+" MNV filetype plugin file
+" Language: LLVM IR
+" Last Change: 2024 Oct 22
+" Maintainer: Wu, Zhenyu <wuzhenyu@ustc.edu>
+
+if exists("b:did_ftplugin") | finish | endif
+let b:did_ftplugin = 1
+
+setl comments=:;
+setl commentstring=;\ %s
+
+let b:undo_ftplugin = "setl commentstring< comments<"
diff --git a/mnv/runtime/ftplugin/lnk.mnv b/mnv/runtime/ftplugin/lnk.mnv
new file mode 100644
index 0000000000..b2335963bc
--- /dev/null
+++ b/mnv/runtime/ftplugin/lnk.mnv
@@ -0,0 +1,14 @@
+" MNV filetype plugin file
+" Language: TI linker command file
+" Document: https://software-dl.ti.com/ccs/esd/documents/sdto_cgt_Linker-Command-File-Primer.html
+" Maintainer: Wu, Zhenyu <wuzhenyu@ustc.edu>
+" Last Change: 2024 Dec 31
+
+if exists("b:did_ftplugin") | finish | endif
+let b:did_ftplugin = 1
+
+setlocal comments=sO:*\ -,mO:*\ \ ,exO:*/,s1:/*,mb:*,ex:*/,:///,://
+setlocal commentstring=/*\ %s\ */
+setlocal iskeyword+=.
+
+let b:undo_ftplugin = "setl commentstring< comments< iskeyword<"
diff --git a/mnv/runtime/ftplugin/lnkmap.mnv b/mnv/runtime/ftplugin/lnkmap.mnv
new file mode 100644
index 0000000000..2c924ae28c
--- /dev/null
+++ b/mnv/runtime/ftplugin/lnkmap.mnv
@@ -0,0 +1,16 @@
+" MNV filetype plugin file
+" Language: TI Linker map
+" Document: https://downloads.ti.com/docs/esd/SPRUI03A/Content/SPRUI03A_HTML/linker_description.html
+" Maintainer: Wu, Zhenyu <wuzhenyu@ustc.edu>
+" Last Change: 2024 Dec 25
+
+if exists("b:did_ftplugin")
+ finish
+endif
+
+" Don't load another plugin for this buffer
+let b:did_ftplugin = 1
+
+let b:undo_ftplugin = "setl iskeyword<"
+
+setl iskeyword+=.
diff --git a/mnv/runtime/ftplugin/logcheck.mnv b/mnv/runtime/ftplugin/logcheck.mnv
new file mode 100644
index 0000000000..073e10a884
--- /dev/null
+++ b/mnv/runtime/ftplugin/logcheck.mnv
@@ -0,0 +1,17 @@
+" MNV filetype plugin file
+" Language: Logcheck
+" Maintainer: Debian MNV Maintainers
+" Last Change: 2023 Jan 16
+" License: MNV License
+" URL: https://salsa.debian.org/mnv-team/mnv-debian/blob/main/ftplugin/logcheck.mnv
+
+if exists('b:did_ftplugin')
+ finish
+endif
+let b:did_ftplugin = 1
+
+let b:undo_ftplugin = 'setl fo<'
+
+" Do not hard-wrap non-comment lines since each line is a self-contained
+" regular expression
+setlocal formatoptions-=t
diff --git a/mnv/runtime/ftplugin/loginaccess.mnv b/mnv/runtime/ftplugin/loginaccess.mnv
new file mode 100644
index 0000000000..c10cbf2d32
--- /dev/null
+++ b/mnv/runtime/ftplugin/loginaccess.mnv
@@ -0,0 +1,19 @@
+" MNV filetype plugin file
+" Language: login.access(5) configuration file
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2008-07-09
+
+if exists("b:did_ftplugin")
+ finish
+endif
+let b:did_ftplugin = 1
+
+let s:cpo_save = &cpo
+set cpo&mnv
+
+let b:undo_ftplugin = "setl com< cms< fo<"
+
+setlocal comments=:# commentstring=#\ %s formatoptions-=t formatoptions+=croql
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/mnv/runtime/ftplugin/logindefs.mnv b/mnv/runtime/ftplugin/logindefs.mnv
new file mode 100644
index 0000000000..2f829ee50f
--- /dev/null
+++ b/mnv/runtime/ftplugin/logindefs.mnv
@@ -0,0 +1,19 @@
+" MNV filetype plugin file
+" Language: login.defs(5) configuration file
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2008-07-09
+
+if exists("b:did_ftplugin")
+ finish
+endif
+let b:did_ftplugin = 1
+
+let s:cpo_save = &cpo
+set cpo&mnv
+
+let b:undo_ftplugin = "setl com< cms< fo<"
+
+setlocal comments=:# commentstring=#\ %s formatoptions-=t formatoptions+=croql
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/mnv/runtime/ftplugin/logtalk.dict b/mnv/runtime/ftplugin/logtalk.dict
new file mode 100644
index 0000000000..386cf1f2ab
--- /dev/null
+++ b/mnv/runtime/ftplugin/logtalk.dict
@@ -0,0 +1,271 @@
+abolish
+abolish_category
+abolish_events
+abolish_object
+abolish_protocol
+abs
+acos
+acyclic_term
+after
+alias
+always_true_or_false_goals
+arg
+asin
+asserta
+assertz
+atan
+atan2
+atom
+atomic
+atom_chars
+atom_codes
+atom_concat
+atom_length
+at_end_of_stream
+bagof
+before
+built_in
+call
+callable
+calls
+catch
+catchall_catch
+category
+category_property
+ceiling
+char_code
+char_conversion
+clause
+clean
+close
+code_prefix
+coinduction
+coinductive
+compare
+complements
+complements_object
+compound
+conditionals
+conforms_to_protocol
+context
+context_switching_calls
+copy_term
+cos
+create_category
+create_logtalk_flag
+create_object
+create_protocol
+current_category
+current_char_conversion
+current_event
+current_input
+current_logtalk_flag
+current_object
+current_op
+current_output
+current_predicate
+current_prolog_flag
+current_protocol
+debug
+define_events
+deprecated
+discontiguous
+div
+domain_error
+consistency_error
+duplicated_directives
+dynamic
+dynamic_declarations
+elif
+else
+encoding
+encoding_directive
+endif
+end_category
+end_object
+end_protocol
+engines
+ensure_loaded
+error
+evaluation_error
+events
+existence_error
+exp
+expand_goal
+expand_term
+export
+extends
+extends_category
+extends_object
+extends_protocol
+fail
+false
+findall
+float
+float_fractional_part
+float_integer_part
+floor
+flush_output
+forall
+forward
+functor
+get_byte
+get_char
+get_code
+goal_expansion
+ground
+halt
+hook
+if
+ignore
+implements
+implements_protocol
+imports
+imports_category
+include
+info
+initialization
+instantiates
+instantiates_class
+instantiation_error
+integer
+keysort
+lambda_variables
+log
+logtalk_compile
+logtalk_library_path
+logtalk_load
+logtalk_load_context
+logtalk_make
+logtalk_make_target_action
+max
+meta_non_terminal
+meta_predicate
+min
+missing_directives
+mod
+mode
+mode_non_terminal
+modules
+multifile
+nl
+nonvar
+number
+numbervars
+number_chars
+number_codes
+object
+object_property
+once
+one
+one_or_error
+one_or_more
+op
+open
+optimize
+parameter
+peek_byte
+peek_char
+peek_code
+permission_error
+phrase
+portability
+predicate_property
+private
+prolog_compatible_version
+prolog_compiler
+prolog_dialect
+prolog_loader
+prolog_version
+protected
+protocol
+protocol_property
+public
+put_byte
+put_char
+put_code
+read
+read_term
+redefined_built_ins
+reexport
+reload
+rem
+repeat
+report
+representation_error
+resource_error
+retract
+retractall
+round
+scratch_directory
+self
+sender
+setof
+set_input
+set_logtalk_flag
+set_output
+set_prolog_flag
+set_stream_position
+sign
+sin
+singleton_variables
+sort
+source_data
+specializes
+specializes_class
+sqrt
+stream_property
+subsumes_term
+sub_atom
+suspicious_calls
+synchronized
+syntax_error
+system_error
+tabling
+tan
+term_expansion
+term_variables
+this
+threaded
+threaded_call
+threaded_cancel
+threaded_engine
+threaded_engine_create
+threaded_engine_destroy
+threaded_engine_fetch
+threaded_engine_next
+threaded_engine_next_reified
+threaded_engine_post
+threaded_engine_self
+threaded_engine_yield
+threaded_exit
+threaded_ignore
+threaded_notify
+threaded_once
+threaded_peek
+threaded_wait
+threads
+throw
+trivial_goal_fails
+true
+truncate
+type_error
+undefined_predicates
+underscore_variables
+unify_with_occurs_check
+uninstantiation_error
+unknown_entities
+unknown_predicates
+uses
+use_module
+var
+version
+write
+writeq
+write_canonical
+xor
+zero
+zero_or_error
+zero_or_more
+zero_or_one
+zero_or_one_or_error
diff --git a/mnv/runtime/ftplugin/logtalk.mnv b/mnv/runtime/ftplugin/logtalk.mnv
new file mode 100644
index 0000000000..b10bdda197
--- /dev/null
+++ b/mnv/runtime/ftplugin/logtalk.mnv
@@ -0,0 +1,19 @@
+" Logtalk filetype plugin file
+" Language: Logtalk
+" Maintainer: Paulo Moura <pmoura@logtalk.org>
+" Latest Revision: 2018-08-03
+
+if exists("b:did_ftplugin")
+ finish
+endif
+let b:did_ftplugin = 1
+
+let b:undo_ftplugin = "setl ts< sw< fdm< fdc< ai< dict<"
+
+setlocal ts=4
+setlocal sw=4
+setlocal fdm=syntax
+setlocal fdn=10
+setlocal fdc=2
+setlocal autoindent
+setlocal dict=$MNVRUNTIME/ftplugin/logtalk.dict
diff --git a/mnv/runtime/ftplugin/lprolog.mnv b/mnv/runtime/ftplugin/lprolog.mnv
new file mode 100644
index 0000000000..6793a9a2fd
--- /dev/null
+++ b/mnv/runtime/ftplugin/lprolog.mnv
@@ -0,0 +1,55 @@
+" MNV settings file
+" Language: LambdaProlog (Teyjus)
+" Maintainer: Markus Mottl <markus.mottl@gmail.com>
+" URL: http://www.ocaml.info/mnv/ftplugin/lprolog.mnv
+" Last Change: 2025 Jun 08 - set 'comments', 'commentstring'
+" 2025 Apr 16 - set 'cpoptions' for line continuation
+" 2023 Aug 28 - added undo_ftplugin (MNV Project)
+" 2006 Feb 05
+" 2001 Sep 16 - fixed 'no_mail_maps'-bug (MM)
+" 2001 Sep 02 - initial release (MM)
+
+" Only do these settings when not done yet for this buffer
+if exists("b:did_ftplugin")
+ finish
+endif
+
+let s:cpo_save = &cpo
+set cpo&mnv
+
+" Don't do other file type settings for this buffer
+let b:did_ftplugin = 1
+
+" Error format
+setlocal efm=%+A./%f:%l.%c:\ %m
+
+" Formatting of comments
+setlocal formatprg=fmt\ -w75\ -p\\%
+
+setlocal comments=s1:/*,mb:*,ex:*/,:% commentstring=%\ %s
+
+let b:undo_ftplugin = "setlocal efm< fp< com< cms<"
+
+" Add mappings, unless the user didn't want this.
+if !exists("no_plugin_maps") && !exists("no_lprolog_maps")
+ " Uncommenting
+ if !hasmapto('<Plug>Comment')
+ nmap <buffer> <LocalLeader>c <Plug>LUncomOn
+ vmap <buffer> <LocalLeader>c <Plug>BUncomOn
+ nmap <buffer> <LocalLeader>C <Plug>LUncomOff
+ vmap <buffer> <LocalLeader>C <Plug>BUncomOff
+ let b:undo_ftplugin ..=
+ \ " | silent! execute 'nunmap <buffer> <LocalLeader>c'" ..
+ \ " | silent! execute 'vunmap <buffer> <LocalLeader>c'" ..
+ \ " | silent! execute 'nunmap <buffer> <LocalLeader>C'" ..
+ \ " | silent! execute 'vunmap <buffer> <LocalLeader>C'"
+ endif
+
+ nnoremap <buffer> <Plug>LUncomOn mz0i/* <ESC>$A */<ESC>`z
+ nnoremap <buffer> <Plug>LUncomOff <ESC>:s/^\/\* \(.*\) \*\//\1/<CR>
+ vnoremap <buffer> <Plug>BUncomOn <ESC>:'<,'><CR>`<O<ESC>0i/*<ESC>`>o<ESC>0i*/<ESC>`<
+ vnoremap <buffer> <Plug>BUncomOff <ESC>:'<,'><CR>`<dd`>dd`<
+endif
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/mnv/runtime/ftplugin/lua.mnv b/mnv/runtime/ftplugin/lua.mnv
new file mode 100644
index 0000000000..776b8a4d54
--- /dev/null
+++ b/mnv/runtime/ftplugin/lua.mnv
@@ -0,0 +1,190 @@
+" MNV filetype plugin file.
+
+" Language: Lua
+" Maintainer: Doug Kearns <dougkearns@gmail.com>
+" Previous Maintainer: Max Ischenko <mfi@ukr.net>
+" Contributor: Dorai Sitaram <ds26@gte.com>
+" C.D. MacEachern <craig.daniel.maceachern@gmail.com>
+" Tyler Miller <tmillr@proton.me>
+" Phạm Bình An <phambinhanctb2004@gmail.com>
+" @konfekt
+" Last Change: 2025 Apr 04
+" 2025 May 06 by MNV Project update 'path' setting #17267
+
+if exists("b:did_ftplugin")
+ finish
+endif
+let b:did_ftplugin = 1
+
+" keep in sync with syntax/lua.mnv
+if !exists("lua_version")
+ " Default is lua 5.3
+ let lua_version = 5
+ let lua_subversion = 3
+elseif !exists("lua_subversion")
+ " lua_version exists, but lua_subversion doesn't. In this case set it to 0
+ let lua_subversion = 0
+endif
+
+let s:cpo_save = &cpo
+set cpo&mnv
+
+setlocal comments=:---,:--
+setlocal commentstring=--\ %s
+setlocal formatoptions-=t formatoptions+=croql
+setlocal path-=. " Lua doesn't support importing module in path related to current file like JS
+
+let &l:define = '\<function\|\<local\%(\s\+function\)\='
+
+let &l:include = '\<\%(\%(do\|load\)file\|require\)\s*('
+setlocal includeexpr=s:LuaInclude(v:fname)
+setlocal suffixesadd=.lua
+
+let b:undo_ftplugin = "setl cms< com< def< fo< inc< inex< sua< pa<"
+
+if exists("loaded_matchit") && !exists("b:match_words")
+ let b:match_ignorecase = 0
+ let b:match_words =
+ \ '\<\%(do\|function\|if\)\>:' ..
+ \ '\<\%(return\|else\|elseif\)\>:' ..
+ \ '\<end\>,' ..
+ \ '\<repeat\>:\<until\>,' ..
+ \ '\%(--\)\=\[\(=*\)\[:]\1]'
+ let b:undo_ftplugin ..= " | unlet! b:match_words b:match_ignorecase"
+endif
+
+if (has("gui_win32") || has("gui_gtk")) && !exists("b:browsefilter")
+ let b:browsefilter = "Lua Source Files (*.lua)\t*.lua\n"
+ if has("win32")
+ let b:browsefilter ..= "All Files (*.*)\t*\n"
+ else
+ let b:browsefilter ..= "All Files (*)\t*\n"
+ endif
+ let b:undo_ftplugin ..= " | unlet! b:browsefilter"
+endif
+
+if has("folding") && get(g:, "lua_folding", 0)
+ setlocal foldmethod=expr
+ setlocal foldexpr=s:LuaFold()
+ let b:lua_lasttick = -1
+ let b:undo_ftplugin ..= " | setl foldexpr< foldmethod< | unlet! b:lua_lasttick b:lua_foldlists"
+endif
+
+" The rest of the file needs to be :sourced only once per MNV session
+if exists("s:loaded_lua") || &cp
+ let &cpo = s:cpo_save
+ unlet s:cpo_save
+ finish
+endif
+let s:loaded_lua = 1
+
+function s:LuaInclude(fname) abort
+ let lua_ver = str2float(printf("%d.%02d", g:lua_version, g:lua_subversion))
+ let fname = tr(a:fname, '.', '/')
+ let paths = lua_ver >= 5.03 ? [fname .. ".lua", fname .. "/init.lua"] : [fname .. ".lua"]
+ for path in paths
+ if filereadable(path)
+ return path
+ endif
+ endfor
+ return fname
+endfunction
+
+let s:patterns = [
+ \ ['do', 'end'],
+ \ ['if\s+.+\s+then', 'end'],
+ \ ['repeat', 'until\s+.+'],
+ \ ['for\s+.+\s+do', 'end'],
+ \ ['while\s+.+\s+do', 'end'],
+ \ ['function.+', 'end'],
+ \ ['return\s+function.+', 'end'],
+ \ ['local\s+function\s+.+', 'end'],
+ \ ]
+
+function s:LuaFold() abort
+ if b:lua_lasttick == b:changedtick
+ return b:lua_foldlists[v:lnum - 1]
+ endif
+ let b:lua_lasttick = b:changedtick
+
+ let b:lua_foldlists = []
+ let foldlist = []
+ let buf = getline(1, "$")
+ for line in buf
+ for t in s:patterns
+ let open = 0
+ let end = 0
+ let tagopen = '\v^\s*' .. t[0] ..'\s*$'
+ let tagend = '\v^\s*' .. t[1] ..'\s*$'
+ if line =~# tagopen
+ call add(foldlist, t)
+ let open = 1
+ break
+ elseif line =~# tagend
+ if len(foldlist) > 0 && line =~# foldlist[-1][1]
+ call remove(foldlist, -1)
+ let end = 1
+ else
+ let foldlist = []
+ endif
+ break
+ endif
+ endfor
+ let prefix = ""
+ if open == 1 | let prefix = ">" | endif
+ if end == 1 | let prefix = "<" | endif
+ let b:lua_foldlists += [prefix..(len(foldlist) + end)]
+ endfor
+
+ return b:lua_foldlists[v:lnum - 1]
+endfunction
+
+if !has('mnv9script')
+ let &cpo = s:cpo_save
+ unlet s:cpo_save
+
+ finish
+endif
+
+delfunction! s:LuaFold
+def s:LuaFold(): string
+ if b:lua_lasttick == b:changedtick
+ return b:lua_foldlists[v:lnum - 1]
+ endif
+ b:lua_lasttick = b:changedtick
+
+ b:lua_foldlists = []
+ var foldlist = []
+ var buf = getline(1, "$")
+ for line in buf
+ var open = 0
+ var end = 0
+ for t in patterns
+ var tagopen = '\v^\s*' .. t[0] .. '\s*$'
+ var tagend = '\v^\s*' .. t[1] .. '\s*$'
+ if line =~# tagopen
+ add(foldlist, t)
+ open = 1
+ break
+ elseif line =~# tagend
+ if len(foldlist) > 0 && line =~# foldlist[-1][1]
+ end = 1
+ remove(foldlist, -1)
+ else
+ foldlist = []
+ endif
+ break
+ endif
+ endfor
+ var prefix = ""
+ if open == 1 | prefix = ">" | endif
+ if end == 1 | prefix = "<" | endif
+ b:lua_foldlists += [prefix .. (len(foldlist) + end)]
+ endfor
+ return b:lua_foldlists[v:lnum - 1]
+enddef
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
+
+" mnv: nowrap sw=2 sts=2 ts=8 noet:
diff --git a/mnv/runtime/ftplugin/luau.mnv b/mnv/runtime/ftplugin/luau.mnv
new file mode 100644
index 0000000000..89e4970815
--- /dev/null
+++ b/mnv/runtime/ftplugin/luau.mnv
@@ -0,0 +1,14 @@
+" MNV filetype plugin file
+" Language: Luau
+" Maintainer: None yet
+" Last Change: 2023 Apr 30
+
+if exists("b:did_ftplugin")
+ finish
+endif
+
+" Luau is a superset of Lua
+runtime! ftplugin/lua.mnv
+
+
+" mnv: nowrap sw=2 sts=2 ts=8
diff --git a/mnv/runtime/ftplugin/lynx.mnv b/mnv/runtime/ftplugin/lynx.mnv
new file mode 100644
index 0000000000..2d3cc26b47
--- /dev/null
+++ b/mnv/runtime/ftplugin/lynx.mnv
@@ -0,0 +1,33 @@
+" MNV filetype plugin file
+" Language: Lynx Web Browser Configuration
+" Maintainer: Doug Kearns <dougkearns@gmail.com>
+" Last Change: 2024 Jan 14
+
+if exists("b:did_ftplugin")
+ finish
+endif
+let b:did_ftplugin = 1
+
+let s:cpo_save = &cpo
+set cpo&mnv
+
+setlocal comments=:#
+setlocal commentstring=#\ %s
+setlocal formatoptions-=t formatoptions+=croql
+
+let b:undo_ftplugin = "setl cms< com< fo<"
+
+if (has("gui_win32") || has("gui_gtk")) && !exists("b:browsefilter")
+ let b:browsefilter = "Lynx Configuration Files (lynx.cfg, .lynxrc)\tlynx.cfg;.lynxrc\n"
+ if has("win32")
+ let b:browsefilter ..= "All Files (*.*)\t*\n"
+ else
+ let b:browsefilter ..= "All Files (*)\t*\n"
+ endif
+ let b:undo_ftplugin ..= " | unlet! b:browsefilter"
+endif
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
+
+" mnv: nowrap sw=2 sts=2 ts=8 noet:
diff --git a/mnv/runtime/ftplugin/m17ndb.mnv b/mnv/runtime/ftplugin/m17ndb.mnv
new file mode 100644
index 0000000000..eac70edd4e
--- /dev/null
+++ b/mnv/runtime/ftplugin/m17ndb.mnv
@@ -0,0 +1,17 @@
+" MNV filetype plugin
+" Language: m17n database
+" Maintainer: David Mandelberg <david@mandelberg.org>
+" Last Change: 2025 Feb 21
+
+if exists('b:did_ftplugin')
+ finish
+endif
+let b:did_ftplugin = 1
+
+setlocal comments=:;;;,:;;,:;
+setlocal commentstring=;\ %s
+setlocal iskeyword=!-~,@,^34,^(,^),^92
+setlocal lisp
+setlocal lispwords=
+
+let b:undo_ftplugin = "setlocal comments< commentstring< iskeyword< lisp< lispwords<"
diff --git a/mnv/runtime/ftplugin/m3build.mnv b/mnv/runtime/ftplugin/m3build.mnv
new file mode 100644
index 0000000000..232478bf94
--- /dev/null
+++ b/mnv/runtime/ftplugin/m3build.mnv
@@ -0,0 +1,27 @@
+" MNV filetype plugin file
+" Language: Modula-3 Makefile
+" Maintainer: Doug Kearns <dougkearns@gmail.com>
+" Last Change: 2024 Jan 14
+
+if exists("b:did_ftplugin")
+ finish
+endif
+
+let s:cpo_save = &cpo
+set cpo&mnv
+
+runtime! ftplugin/m3quake.mnv
+
+if (has("gui_win32") || has("gui_gtk")) && exists("b:m3quake_set_browsefilter")
+ let b:browsefilter = "Modula-3 Makefile (m3makefile, m3overrides)\tm3makefile;m3overrides\n"
+ if has("win32")
+ let b:browsefilter ..= "All Files (*.*)\t*\n"
+ else
+ let b:browsefilter ..= "All Files (*)\t*\n"
+ endif
+endif
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
+
+" mnv: nowrap sw=2 sts=2 ts=8 noet:
diff --git a/mnv/runtime/ftplugin/m3quake.mnv b/mnv/runtime/ftplugin/m3quake.mnv
new file mode 100644
index 0000000000..47aae5635b
--- /dev/null
+++ b/mnv/runtime/ftplugin/m3quake.mnv
@@ -0,0 +1,39 @@
+" MNV filetype plugin file
+" Language: Modula-3 Quake
+" Maintainer: Doug Kearns <dougkearns@gmail.com>
+" Last Change: 2024 Jan 14
+
+if exists("b:did_ftplugin")
+ finish
+endif
+let b:did_ftplugin = 1
+
+let s:cpo_save = &cpo
+set cpo&mnv
+
+setlocal comments=s1:/*,mb:*,ex:*/,:%
+setlocal commentstring=%\ %s
+setlocal formatoptions-=t formatoptions+=croql
+
+let b:undo_ftplugin = "setl fo< com< cms<"
+
+if exists("loaded_matchit") && !exists("b:match_words")
+ let b:match_words = '\<\%(proc\|if\|foreach\)\>:\<else\>:\<end\>'
+ let b:undo_ftplugin ..= " | unlet! b:match_words"
+endif
+
+if (has("gui_win32") || has("gui_gtk")) && !exists("b:browsefilter")
+ let b:browsefilter = "Modula-3 Quake Source Files (*.quake)\t*.quake\n"
+ if has("win32")
+ let b:browsefilter ..= "All Files (*.*)\t*\n"
+ else
+ let b:browsefilter ..= "All Files (*)\t*\n"
+ endif
+ let b:m3quake_set_browsefilter = 1
+ let b:undo_ftplugin ..= " | unlet! b:browsefilter b:m3quake_set_browsefilter"
+endif
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
+
+" mnv: nowrap sw=2 sts=2 ts=8 noet:
diff --git a/mnv/runtime/ftplugin/m4.mnv b/mnv/runtime/ftplugin/m4.mnv
new file mode 100644
index 0000000000..d8ec3adef0
--- /dev/null
+++ b/mnv/runtime/ftplugin/m4.mnv
@@ -0,0 +1,20 @@
+" MNV filetype plugin file
+" Language: m4
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2008-07-09
+
+if exists("b:did_ftplugin")
+ finish
+endif
+let b:did_ftplugin = 1
+
+let s:cpo_save = &cpo
+set cpo&mnv
+
+let b:undo_ftplugin = "setl com< cms< fo<"
+
+setlocal comments=:#,:dnl commentstring=dnl\ %s
+setlocal formatoptions-=t formatoptions+=croql
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/mnv/runtime/ftplugin/mail.mnv b/mnv/runtime/ftplugin/mail.mnv
new file mode 100644
index 0000000000..5fd8984b79
--- /dev/null
+++ b/mnv/runtime/ftplugin/mail.mnv
@@ -0,0 +1,50 @@
+" MNV filetype plugin file
+" Language: Mail
+" Maintainer: The MNV Project <https://github.com/Project-Tick/Project-Tick>
+" Last Change: 2025 Feb 20
+" Former Maintainer: Bram Moolenaar <Bram@mnv.org>
+
+" Only do this when not done yet for this buffer
+if exists("b:did_ftplugin")
+ finish
+endif
+let b:did_ftplugin = 1
+
+let b:undo_ftplugin = "setl modeline< tw< fo< comments< commentstring<"
+
+" Don't use modelines in e-mail messages, avoid trojan horses and nasty
+" "jokes" (e.g., setting 'textwidth' to 5).
+setlocal nomodeline
+
+" many people recommend keeping e-mail messages 72 chars wide
+if &tw == 0
+ setlocal tw=72
+endif
+
+" Set 'formatoptions' to break text lines and keep the comment leader ">".
+setlocal fo+=tcql
+
+" Set commentstring to quoting sign ">" so comment shortcuts can be used to
+" edit quoted parts of mail
+setlocal commentstring=>\ %s
+" Add n:> to 'comments, in case it was removed elsewhere
+setlocal comments+=n:>
+
+" .eml files are universally formatted with DOS line-endings, per RFC5322.
+" If the file was not DOS the it will be marked as changed, which is probably
+" a good thing.
+if expand('%:e') ==? 'eml'
+ let b:undo_ftplugin ..= " fileformat=" .. &fileformat
+ setlocal fileformat=dos
+endif
+
+" Add mappings, unless the user doesn't want this.
+if !exists("no_plugin_maps") && !exists("no_mail_maps")
+ " Quote text by inserting "> "
+ if !hasmapto('<Plug>MailQuote')
+ vmap <buffer> <LocalLeader>q <Plug>MailQuote
+ nmap <buffer> <LocalLeader>q <Plug>MailQuote
+ endif
+ vnoremap <buffer> <Plug>MailQuote :s/^/> /<CR>:noh<CR>``
+ nnoremap <buffer> <Plug>MailQuote :.,$s/^/> /<CR>:noh<CR>``
+endif
diff --git a/mnv/runtime/ftplugin/mailaliases.mnv b/mnv/runtime/ftplugin/mailaliases.mnv
new file mode 100644
index 0000000000..12df8cd375
--- /dev/null
+++ b/mnv/runtime/ftplugin/mailaliases.mnv
@@ -0,0 +1,18 @@
+" MNV filetype plugin file
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2008-07-09
+
+if exists("b:did_ftplugin")
+ finish
+endif
+let b:did_ftplugin = 1
+
+let s:cpo_save = &cpo
+set cpo&mnv
+
+let b:undo_ftplugin = "setl com< cms< fo<"
+
+setlocal comments=:# commentstring=#\ %s formatoptions-=t formatoptions+=croql
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/mnv/runtime/ftplugin/mailcap.mnv b/mnv/runtime/ftplugin/mailcap.mnv
new file mode 100644
index 0000000000..19f9f919c8
--- /dev/null
+++ b/mnv/runtime/ftplugin/mailcap.mnv
@@ -0,0 +1,19 @@
+" MNV filetype plugin file
+" Language: Mailcap configuration file
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2008-07-09
+
+if exists("b:did_ftplugin")
+ finish
+endif
+let b:did_ftplugin = 1
+
+let s:cpo_save = &cpo
+set cpo&mnv
+
+let b:undo_ftplugin = "setl com< cms< fo<"
+
+setlocal comments=:# commentstring=#\ %s formatoptions-=t formatoptions+=croql
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/mnv/runtime/ftplugin/make.mnv b/mnv/runtime/ftplugin/make.mnv
new file mode 100644
index 0000000000..f70fc98db4
--- /dev/null
+++ b/mnv/runtime/ftplugin/make.mnv
@@ -0,0 +1,34 @@
+" MNV filetype plugin file
+" Language: Make
+" Maintainer: The MNV Project <https://github.com/Project-Tick/Project-Tick>
+" Last Change: 2023 Aug 10
+" Former Maintainer: Bram Moolenaar <Bram@mnv.org>
+
+" Only do this when not done yet for this buffer
+if exists("b:did_ftplugin")
+ finish
+endif
+let b:did_ftplugin = 1
+
+let b:undo_ftplugin = "setl et< sts< sw< fo< com< cms< inc<"
+
+" Make sure a hard tab is used, required for most make programs
+setlocal noexpandtab softtabstop=0 shiftwidth=0
+
+" Set 'formatoptions' to break comment lines but not other lines,
+" and insert the comment leader when hitting <CR> or using "o".
+setlocal fo-=t fo+=croql
+
+" Set 'comments' to format dashed lists in comments
+setlocal com=sO:#\ -,mO:#\ \ ,b:#
+
+" Set 'commentstring' to put the marker after a #.
+setlocal commentstring=#\ %s
+
+" Including files.
+let &l:include = '^\s*include'
+
+" For matchit.mnv, suggested by Albert Netymk and Ken Takata.
+if exists("loaded_matchit")
+ let b:match_words = '^ *ifn\=\(eq\|def\)\>:^ *else\(\s\+ifn\=\(eq\|def\)\)\=\>:^ *endif\>,\<define\>:\<endef\>,^!\s*if\(n\=def\)\=\>:^!\s*else\(if\(n\=def\)\=\)\=\>:^!\s*endif\>'
+endif
diff --git a/mnv/runtime/ftplugin/man.mnv b/mnv/runtime/ftplugin/man.mnv
new file mode 100644
index 0000000000..0b5569abaa
--- /dev/null
+++ b/mnv/runtime/ftplugin/man.mnv
@@ -0,0 +1,88 @@
+" MNV filetype plugin file
+" Language: man
+" Maintainer: Jason Franklin <mnv@justemail.net>
+" Maintainer: SungHyun Nam <goweol@gmail.com>
+" Autoload Split: Bram Moolenaar
+" Last Change: 2024 Jun 06 (disabled the q mapping, #8210)
+" 2024 Jul 06 (use nnoremap, #15130)
+" 2024 Aug 23 (improve the <Plug>ManBS mapping, #15547, #15556)
+" 2025 Mar 09 (improve :Man completion for man-db, #16843)
+
+" To make the ":Man" command available before editing a manual page, source
+" this script from your startup mnvrc file.
+
+" If 'filetype' isn't "man", we must have been called to define ":Man" and not
+" to do the filetype plugin stuff.
+if &filetype == "man"
+
+ " Only do this when not done yet for this buffer
+ if exists("b:did_ftplugin")
+ finish
+ endif
+ let b:did_ftplugin = 1
+endif
+
+let s:cpo_save = &cpo
+set cpo-=C
+
+if !exists('g:ft_man_implementation')
+ if executable('mandb') > 0
+ let g:ft_man_implementation = 'man-db'
+ else
+ let g:ft_man_implementation = ''
+ endif
+endif
+
+if &filetype == "man"
+ " Allow hyphen, plus, colon, dot, and commercial at in manual page name.
+ " Parentheses are not here but in dist#man#PreGetPage()
+ setlocal iskeyword=48-57,_,a-z,A-Z,-,+,:,.,@-@
+ let b:undo_ftplugin = "setlocal iskeyword<"
+
+ " Add mappings, unless the user didn't want this.
+ if !exists("no_plugin_maps") && !exists("no_man_maps")
+ if !hasmapto('<Plug>ManBS')
+ nmap <buffer> <LocalLeader>h <Plug>ManBS
+ let b:undo_ftplugin = b:undo_ftplugin
+ \ . '|silent! nunmap <buffer> <LocalLeader>h'
+ endif
+
+ nnoremap <buffer> <silent> <Plug>ManBS :setl ma<Bar>%s/.\b//g
+ \ <Bar>setl noma<CR>`'
+
+ nnoremap <buffer> <silent> <c-]> :call dist#man#PreGetPage(v:count)<CR>
+ nnoremap <buffer> <silent> <c-t> :call dist#man#PopPage()<CR>
+
+ " Add undo commands for the maps
+ let b:undo_ftplugin = b:undo_ftplugin
+ \ . '|silent! nunmap <buffer> <Plug>ManBS'
+ \ . '|silent! nunmap <buffer> <c-]>'
+ \ . '|silent! nunmap <buffer> <c-t>'
+ endif
+
+ if exists('g:ft_man_folding_enable') && (g:ft_man_folding_enable == 1)
+ setlocal foldmethod=indent foldnestmax=1 foldenable
+ let b:undo_ftplugin = b:undo_ftplugin
+ \ . '|silent! setl fdm< fdn< fen<'
+ endif
+
+endif
+
+if exists(":Man") != 2
+ if g:ft_man_implementation ==# 'man-db'
+ com -nargs=+ -complete=customlist,dist#man#ManDbComplete Man call dist#man#GetPage(<q-mods>, <f-args>)
+ else
+ com -nargs=+ -complete=shellcmd Man call dist#man#GetPage(<q-mods>, <f-args>)
+ endif
+ nnoremap <Leader>K :call dist#man#PreGetPage(0)<CR>
+ nnoremap <Plug>ManPreGetPage :call dist#man#PreGetPage(0)<CR>
+endif
+
+if exists(":ManReload") != 2
+ com ManReload call dist#man#Reload()
+endif
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
+
+" mnv: set sw=2 ts=8 noet:
diff --git a/mnv/runtime/ftplugin/manconf.mnv b/mnv/runtime/ftplugin/manconf.mnv
new file mode 100644
index 0000000000..37542cab26
--- /dev/null
+++ b/mnv/runtime/ftplugin/manconf.mnv
@@ -0,0 +1,19 @@
+" MNV filetype plugin file
+" Language: man.conf(5) - man configuration file
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2008-07-09
+
+if exists("b:did_ftplugin")
+ finish
+endif
+let b:did_ftplugin = 1
+
+let s:cpo_save = &cpo
+set cpo&mnv
+
+let b:undo_ftplugin = "setl com< cms< fo<"
+
+setlocal comments=:# commentstring=#\ %s formatoptions-=t formatoptions+=croql
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/mnv/runtime/ftplugin/markdown.mnv b/mnv/runtime/ftplugin/markdown.mnv
new file mode 100644
index 0000000000..e66ef8037a
--- /dev/null
+++ b/mnv/runtime/ftplugin/markdown.mnv
@@ -0,0 +1,93 @@
+" MNV filetype plugin
+" Language: Markdown
+" Maintainer: Tim Pope <https://github.com/tpope/mnv-markdown>
+" Last Change: 2023 Dec 28
+" 2024 May 24 by Riley Bruins <ribru17@gmail.com> ('commentstring')
+
+if exists("b:did_ftplugin")
+ finish
+endif
+
+runtime! ftplugin/html.mnv ftplugin/html_*.mnv ftplugin/html/*.mnv
+
+let s:keepcpo= &cpo
+set cpo&mnv
+
+setlocal comments=fb:*,fb:-,fb:+,n:> commentstring=<!--\ %s\ -->
+setlocal formatoptions+=tcqln formatoptions-=r formatoptions-=o
+setlocal formatlistpat=^\\s*\\d\\+\\.\\s\\+\\\|^\\s*[-*+]\\s\\+\\\|^\\[^\\ze[^\\]]\\+\\]:\\&^.\\{4\\}
+
+if exists('b:undo_ftplugin')
+ let b:undo_ftplugin .= "|setl cms< com< fo< flp< et< ts< sts< sw<"
+else
+ let b:undo_ftplugin = "setl cms< com< fo< flp< et< ts< sts< sw<"
+endif
+
+if get(g:, 'markdown_recommended_style', 1)
+ setlocal expandtab tabstop=4 softtabstop=4 shiftwidth=4
+endif
+
+if !exists("g:no_plugin_maps") && !exists("g:no_markdown_maps")
+ nnoremap <silent><buffer> [[ :<C-U>call search('\%(^#\{1,5\}\s\+\S\\|^\S.*\n^[=-]\+$\)', "bsW")<CR>
+ nnoremap <silent><buffer> ]] :<C-U>call search('\%(^#\{1,5\}\s\+\S\\|^\S.*\n^[=-]\+$\)', "sW")<CR>
+ xnoremap <silent><buffer> [[ :<C-U>exe "normal! gv"<Bar>call search('\%(^#\{1,5\}\s\+\S\\|^\S.*\n^[=-]\+$\)', "bsW")<CR>
+ xnoremap <silent><buffer> ]] :<C-U>exe "normal! gv"<Bar>call search('\%(^#\{1,5\}\s\+\S\\|^\S.*\n^[=-]\+$\)', "sW")<CR>
+ let b:undo_ftplugin .= '|sil! nunmap <buffer> [[|sil! nunmap <buffer> ]]|sil! xunmap <buffer> [[|sil! xunmap <buffer> ]]'
+endif
+
+function! s:NotCodeBlock(lnum) abort
+ return synIDattr(synID(a:lnum, 1, 1), 'name') !=# 'markdownCodeBlock'
+endfunction
+
+function! MarkdownFold() abort
+ let line = getline(v:lnum)
+
+ if line =~# '^#\+ ' && s:NotCodeBlock(v:lnum)
+ return ">" . match(line, ' ')
+ endif
+
+ let nextline = getline(v:lnum + 1)
+ if (line =~ '^.\+$') && (nextline =~ '^=\+$') && s:NotCodeBlock(v:lnum + 1)
+ return ">1"
+ endif
+
+ if (line =~ '^.\+$') && (nextline =~ '^-\+$') && s:NotCodeBlock(v:lnum + 1)
+ return ">2"
+ endif
+
+ return "="
+endfunction
+
+function! s:HashIndent(lnum) abort
+ let hash_header = matchstr(getline(a:lnum), '^#\{1,6}')
+ if len(hash_header)
+ return hash_header
+ else
+ let nextline = getline(a:lnum + 1)
+ if nextline =~# '^=\+\s*$'
+ return '#'
+ elseif nextline =~# '^-\+\s*$'
+ return '##'
+ endif
+ endif
+endfunction
+
+function! MarkdownFoldText() abort
+ let hash_indent = s:HashIndent(v:foldstart)
+ let title = substitute(getline(v:foldstart), '^#\+\s*', '', '')
+ let foldsize = (v:foldend - v:foldstart + 1)
+ let linecount = '['.foldsize.' lines]'
+ return hash_indent.' '.title.' '.linecount
+endfunction
+
+if has("folding") && get(g:, "markdown_folding", 0)
+ setlocal foldexpr=MarkdownFold()
+ setlocal foldmethod=expr
+ setlocal foldtext=MarkdownFoldText()
+ let b:undo_ftplugin .= "|setl foldexpr< foldmethod< foldtext<"
+endif
+
+let &cpo = s:keepcpo
+unlet s:keepcpo
+
+" mnv:set sw=2:
diff --git a/mnv/runtime/ftplugin/masm.mnv b/mnv/runtime/ftplugin/masm.mnv
new file mode 100644
index 0000000000..f4121abdb0
--- /dev/null
+++ b/mnv/runtime/ftplugin/masm.mnv
@@ -0,0 +1,34 @@
+" MNV filetype plugin file
+" Language: Microsoft Macro Assembler (80x86)
+" Maintainer: Wu Yongwei <wuyongwei@gmail.com>
+" Last Change: 2025-06-09 04:40:00 +0800
+
+if exists("b:did_ftplugin")
+ finish
+endif
+let b:did_ftplugin = 1
+
+let s:cpo_save = &cpo
+set cpo&mnv
+
+let b:undo_ftplugin = "setl iskeyword< comments< commentstring<"
+
+setlocal iskeyword=@,48-57,_,36,60,62,63,@-@
+setlocal comments=:;
+setlocal commentstring=;\ %s
+
+" Matchit support
+if !exists('b:match_words')
+ let b:match_words = '^\s*\.IF\>:^\s*\.ELSEIF\>:^\s*\.ELSE\>:^\s*\.ENDIF\>,'
+ \ .. '^\s*\.REPEAT\>:^\s*\.UNTIL\(CXZ\)\?\>,'
+ \ .. '^\s*\.WHILE\>:^\s*\.ENDW\>,'
+ \ .. '^\s*IF\(1\|2\|E\|DEF\|NDEF\|B\|NB\|IDNI\?\|DIFI\?\)\?\>:^\s*ELSEIF\(1\|2\|E\|DEF\|NDEF\|B\|NB\|IDNI\?\|DIFI\?\)\?\>:^\s*ELSE\>:^\s*ENDIF\>,'
+ \ .. '\(\<MACRO\>\|^\s*%\?\s*FORC\?\>\|^\s*REPEAT\>\|^\s*WHILE\):^\s*ENDM\>,'
+ \ .. '\<PROC\>:\<ENDP\>,'
+ \ .. '\<SEGMENT\>:\<ENDS\>'
+ let b:match_ignorecase = 1
+ let b:undo_ftplugin ..= " | unlet! b:match_ignorecase b:match_words"
+endif
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/mnv/runtime/ftplugin/matlab.mnv b/mnv/runtime/ftplugin/matlab.mnv
new file mode 100644
index 0000000000..6b25c46191
--- /dev/null
+++ b/mnv/runtime/ftplugin/matlab.mnv
@@ -0,0 +1,34 @@
+" MNV filetype plugin file
+" Language: matlab
+" Maintainer: Jake Wasserman <jwasserman at gmail dot com>
+" Update By: Gabriel Dupras
+" Last Change: 2021 Aug 30
+
+" Contributors:
+" Charles Campbell
+
+if exists("b:did_ftplugin")
+ finish
+endif
+let b:did_ftplugin = 1
+
+let s:save_cpo = &cpo
+set cpo-=C
+
+if exists("loaded_matchit")
+ let s:conditionalEnd = '\%(\%(^\|;\)\s*\)\@<=end\>'
+ let b:match_words=
+ \ '\<\%(if\|switch\|for\|while\|try\)\>:\<\%(elseif\|case\|break\|continue\|else\|otherwise\|catch\)\>:' . s:conditionalEnd . ',' .
+ \ '\<function\>:\<return\>:\<endfunction\>'
+ unlet s:conditionalEnd
+endif
+
+setlocal suffixesadd=.m
+setlocal suffixes+=.asv
+setlocal commentstring=%\ %s
+
+let b:undo_ftplugin = "setlocal suffixesadd< suffixes< commentstring< "
+ \ . "| unlet! b:match_words"
+
+let &cpo = s:save_cpo
+unlet s:save_cpo
diff --git a/mnv/runtime/ftplugin/mbsync.mnv b/mnv/runtime/ftplugin/mbsync.mnv
new file mode 100644
index 0000000000..df4af59bc2
--- /dev/null
+++ b/mnv/runtime/ftplugin/mbsync.mnv
@@ -0,0 +1,13 @@
+" MNV filetype plugin file
+" Language: mbsync configuration file
+" Maintainer: Pierrick Guillaume <pguillaume@fymyte.com>
+" Last Change: 2025 Apr 13
+
+if (exists('b:did_ftplugin'))
+ finish
+endif
+let b:did_ftplugin = 1
+
+let b:undo_ftplugin = "setlocal commentstring<"
+
+setlocal commentstring=#\ %s
diff --git a/mnv/runtime/ftplugin/mediawiki.mnv b/mnv/runtime/ftplugin/mediawiki.mnv
new file mode 100644
index 0000000000..01f52bc883
--- /dev/null
+++ b/mnv/runtime/ftplugin/mediawiki.mnv
@@ -0,0 +1,49 @@
+" Language: MediaWiki
+" Maintainer: Avid Seeker <avidseeker7@protonmail.com>
+" Home: http://en.wikipedia.org/wiki/Wikipedia:Text_editor_support#MNV
+" Last Change: 2024 Jul 14
+" Credits: chikamichi
+" 2025 Apr 16 by MNV Project (set 'cpoptions' for line continuation, #17121)
+"
+
+if exists("b:did_ftplugin")
+ finish
+endif
+let b:did_ftplugin = 1
+
+let s:cpo_save = &cpo
+set cpo&mnv
+
+" Many MediaWiki wikis prefer line breaks only at the end of paragraphs
+" (like in a text processor), which results in long, wrapping lines.
+setlocal wrap linebreak
+setlocal textwidth=0
+
+setlocal formatoptions-=tc formatoptions+=l formatoptions+=roq
+setlocal matchpairs+=<:>
+
+" Treat lists, indented text and tables as comment lines and continue with the
+" same formatting in the next line (i.e. insert the comment leader) when hitting
+" <CR> or using "o".
+setlocal comments=n:#,n:*,n:\:,s:{\|,m:\|,ex:\|},s:<!--,m:\ \ \ \ ,e:-->
+setlocal commentstring=<!--\ %s\ -->
+
+" match HTML tags (taken directly from $MNV/ftplugin/html.mnv)
+if exists("loaded_matchit")
+ let b:match_ignorecase=0
+ let b:match_skip = 's:Comment'
+ let b:match_words = '<:>,' .
+ \ '<\@<=[ou]l\>[^>]*\%(>\|$\):<\@<=li\>:<\@<=/[ou]l>,' .
+ \ '<\@<=dl\>[^>]*\%(>\|$\):<\@<=d[td]\>:<\@<=/dl>,' .
+ \ '<\@<=\([^/][^ \t>]*\)[^>]*\%(>\|$\):<\@<=/\1>'
+endif
+
+" Enable folding based on ==sections==
+setlocal foldexpr=getline(v:lnum)=~'^\\(=\\+\\)[^=]\\+\\1\\(\\s*<!--.*-->\\)\\=\\s*$'?\">\".(len(matchstr(getline(v:lnum),'^=\\+'))-1):\"=\"
+setlocal foldmethod=expr
+
+let b:undo_ftplugin = "setl commentstring< comments< formatoptions< foldexpr< foldmethod<"
+let b:undo_ftplugin += " matchpairs< linebreak< wrap< textwidth<"
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/mnv/runtime/ftplugin/mermaid.mnv b/mnv/runtime/ftplugin/mermaid.mnv
new file mode 100644
index 0000000000..fc2cd5e833
--- /dev/null
+++ b/mnv/runtime/ftplugin/mermaid.mnv
@@ -0,0 +1,50 @@
+" MNV filetype plugin
+" Language: Mermaid
+" Maintainer: Craig MacEachern <https://github.com/craigmac/mnv-mermaid>
+" Last Change: 2022 Oct 13
+" 2024 Jul 18 by MNV Project (adjust comments)
+
+if exists("b:did_ftplugin")
+ finish
+endif
+
+let s:keepcpo= &cpo
+set cpo&mnv
+
+" Use mermaid live editor's style
+setlocal expandtab
+setlocal shiftwidth=2
+setlocal softtabstop=-1
+setlocal tabstop=4
+
+setlocal comments=:%%
+setlocal commentstring=%%\ %s
+" TODO: comments, formatlist stuff, based on what?
+setlocal formatoptions+=tcqln formatoptions-=r formatoptions-=o
+setlocal formatlistpat=^\\s*\\d\\+\\.\\s\\+\\\|^\\s*[-*+]\\s\\+\\\|^\\[^\\ze[^\\]]\\+\\]:\\&^.\\{4\\}
+
+if exists('b:undo_ftplugin')
+ let b:undo_ftplugin .= "|setl cms< com< fo< flp< et< ts< sts< sw<"
+else
+ let b:undo_ftplugin = "setl cms< com< fo< flp< et< ts< sts< sw<"
+endif
+
+if !exists("g:no_plugin_maps") && !exists("g:no_markdown_maps")
+ nnoremap <silent><buffer> [[ :<C-U>call search('\%(^#\{1,5\}\s\+\S\\|^\S.*\n^[=-]\+$\)', "bsW")<CR>
+ nnoremap <silent><buffer> ]] :<C-U>call search('\%(^#\{1,5\}\s\+\S\\|^\S.*\n^[=-]\+$\)', "sW")<CR>
+ xnoremap <silent><buffer> [[ :<C-U>exe "normal! gv"<Bar>call search('\%(^#\{1,5\}\s\+\S\\|^\S.*\n^[=-]\+$\)', "bsW")<CR>
+ xnoremap <silent><buffer> ]] :<C-U>exe "normal! gv"<Bar>call search('\%(^#\{1,5\}\s\+\S\\|^\S.*\n^[=-]\+$\)', "sW")<CR>
+ let b:undo_ftplugin .= '|sil! nunmap <buffer> [[|sil! nunmap <buffer> ]]|sil! xunmap <buffer> [[|sil! xunmap <buffer> ]]'
+endif
+
+" if has("folding") && get(g:, "markdown_folding", 0)
+" setlocal foldexpr=MarkdownFold()
+" setlocal foldmethod=expr
+" setlocal foldtext=MarkdownFoldText()
+" let b:undo_ftplugin .= "|setl foldexpr< foldmethod< foldtext<"
+" endif
+
+let &cpo = s:keepcpo
+unlet s:keepcpo
+
+" mnv:set sw=2:
diff --git a/mnv/runtime/ftplugin/meson.mnv b/mnv/runtime/ftplugin/meson.mnv
new file mode 100644
index 0000000000..ca729b17ae
--- /dev/null
+++ b/mnv/runtime/ftplugin/meson.mnv
@@ -0,0 +1,44 @@
+" MNV filetype plugin file
+" Language: meson
+" License: MNV License
+" Maintainer: Liam Beguin <liambeguin@gmail.com>
+" Original Author: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
+" Last Change: 2018 Nov 27
+" 2024 Jan 14 by MNV Project (browsefilter)
+
+if exists("b:did_ftplugin") | finish | endif
+let b:did_ftplugin = 1
+let s:keepcpo= &cpo
+set cpo&mnv
+
+setlocal commentstring=#\ %s
+setlocal comments=:#
+setlocal formatoptions+=croql formatoptions-=t
+
+let b:undo_ftplugin = "setl com< cms< fo<"
+
+if get(g:, "meson_recommended_style", 1)
+ setlocal expandtab
+ setlocal shiftwidth=2
+ setlocal softtabstop=2
+ let b:undo_ftplugin .= " | setl et< sts< sw<"
+endif
+
+if exists("loaded_matchit") && !exists("b:match_words")
+ let b:match_words = '\<if\>:\<elif\>:\<else\>:\<endif\>,' .
+ \ '\<foreach\>:\<break\>:\<continue\>:\<endforeach\>'
+ let b:undo_ftplugin .= " | unlet! b:match_words"
+endif
+
+if (has("gui_win32") || has("gui_gtk")) && !exists("b:browsefilter")
+ let b:browsefilter = "Meson Build Files (meson.build)\tmeson.build\n"
+ if has("win32")
+ let b:browsefilter .= "All Files (*.*)\t*\n"
+ else
+ let b:browsefilter .= "All Files (*)\t*\n"
+ endif
+ let b:undo_ftplugin .= " | unlet! b:browsefilter"
+endif
+
+let &cpo = s:keepcpo
+unlet s:keepcpo
diff --git a/mnv/runtime/ftplugin/mf.mnv b/mnv/runtime/ftplugin/mf.mnv
new file mode 100644
index 0000000000..2e280c0ad1
--- /dev/null
+++ b/mnv/runtime/ftplugin/mf.mnv
@@ -0,0 +1,86 @@
+mnv9script
+
+# MNV filetype plugin file
+# Language: METAFONT
+# Maintainer: Nicola Vitacolonna <nvitacolonna@gmail.com>
+# Former Maintainers: Nikolai Weibull <now@bitwi.se>
+# Latest Revision: 2026 Jan 10
+
+if exists("b:did_ftplugin")
+ finish
+endif
+
+b:did_ftplugin = 1
+b:undo_ftplugin = "setl com< cms< fo< sua< inc< def< ofu<"
+
+setlocal comments=:%
+setlocal commentstring=%\ %s
+setlocal formatoptions+=cjroql2
+setlocal formatoptions-=t
+setlocal omnifunc=syntaxcomplete#Complete
+setlocal suffixesadd=.mf
+
+&l:include = '\<input\>'
+&l:define = '\<\%(let\|newinternal\|interim\|def\|vardef\)\>\|\<\%(primary\|secondary\|tertiary\)def\>\s*[^ .]\+'
+
+g:omni_syntax_group_include_mf = 'mf\w\+'
+g:omni_syntax_group_exclude_mf = 'mfTodoComment'
+
+if exists("g:loaded_matchit") && !exists("b:match_words")
+ b:match_ignorecase = 0
+ b:match_skip = 'synIDattr(synID(line("."), col("."), 1), "name") =~# "mf\\(Comment\\|String\\)$"'
+ b:match_words = '\<if\>:\<else\%[if]\>:\<fi\>,'
+ .. '\<for\%(\|suffixes\|ever\)\>:\<exit\%(if\|unless\)\>:\<endfor\>,'
+ .. '\<\%(\|var\|primary\|secondary\|tertiary\)def\>:\<enddef\>,'
+ .. '\<begingroup\>:\<endgroup\>,'
+ .. '\<begin\%(logo\)\?char\>:\<endchar\>'
+ b:undo_ftplugin ..= "| unlet! b:match_ignorecase b:match_words b:match_skip"
+endif
+
+if !get(g:, 'no_mf_maps', 0) && !get(g:, 'no_plugin_maps', 0)
+ const mf_regex = {
+ 'beginsection': '^\s*\%(\%(\|var\|primary\|secondary\|tertiary\)def\|beginchar\|beginlogochar\)\>',
+ 'endsection': '^\s*\%(enddef\|endchar\)\>',
+ 'beginblock': '^\s*\%(begingroup\|if\|for\%(\|suffixes\|ever\)\)\>',
+ 'endblock': '^\s*\%(endgroup\|fi\|endfor\)\>'}
+
+ def MoveAround(count: number, what: string, flags: string)
+ search(mf_regex[what], flags .. 's') # 's' sets previous context mark
+ var i = 2
+ while i <= count
+ search(mf_regex[what], flags)
+ i += 1
+ endwhile
+ enddef
+
+ # Macros to move around
+ nnoremap <silent><buffer> [[ <scriptcmd>MoveAround(v:count1, "beginsection", "bW")<cr>
+ vnoremap <silent><buffer> [[ <scriptcmd>MoveAround(v:count1, "beginsection", "bW")<cr>
+ nnoremap <silent><buffer> ]] <scriptcmd>MoveAround(v:count1, "beginsection", "W") <cr>
+ vnoremap <silent><buffer> ]] <scriptcmd>MoveAround(v:count1, "beginsection", "W") <cr>
+ nnoremap <silent><buffer> [] <scriptcmd>MoveAround(v:count1, "endsection", "bW")<cr>
+ vnoremap <silent><buffer> [] <scriptcmd>MoveAround(v:count1, "endsection", "bW")<cr>
+ nnoremap <silent><buffer> ][ <scriptcmd>MoveAround(v:count1, "endsection", "W") <cr>
+ vnoremap <silent><buffer> ][ <scriptcmd>MoveAround(v:count1, "endsection", "W") <cr>
+ nnoremap <silent><buffer> [{ <scriptcmd>MoveAround(v:count1, "beginblock", "bW")<cr>
+ vnoremap <silent><buffer> [{ <scriptcmd>MoveAround(v:count1, "beginblock", "bW")<cr>
+ nnoremap <silent><buffer> ]} <scriptcmd>MoveAround(v:count1, "endblock", "W") <cr>
+ vnoremap <silent><buffer> ]} <scriptcmd>MoveAround(v:count1, "endblock", "W") <cr>
+
+ for mapping in ["[[", "]]", "[]", "][", "[{", "]}"]
+ b:undo_ftplugin ..= printf(" | silent! execute 'nunmap <buffer> %s'", mapping)
+ b:undo_ftplugin ..= printf(" | silent! execute 'vunmap <buffer> %s'", mapping)
+ endfor
+endif
+
+if (has('gui_win32') || has('gui_gtk')) && !exists('b:browsefilter')
+ b:browsefilter = "METAFONT Source Files (*.mf)\t*.mf\n"
+ if has("win32")
+ b:browsefilter ..= "All Files (*.*)\t*\n"
+ else
+ b:browsefilter ..= "All Files (*)\t*\n"
+ endif
+ b:undo_ftplugin ..= ' | unlet! b:browsefilter'
+endif
+
+# mnv: sw=2 fdm=marker
diff --git a/mnv/runtime/ftplugin/mlir.mnv b/mnv/runtime/ftplugin/mlir.mnv
new file mode 100644
index 0000000000..4df4593bf9
--- /dev/null
+++ b/mnv/runtime/ftplugin/mlir.mnv
@@ -0,0 +1,10 @@
+" MNV filetype plugin file
+" Language: MLIR
+
+if exists("b:did_ftplugin") | finish | endif
+let b:did_ftplugin = 1
+
+setl comments=:///,://
+setl commentstring=//\ %s
+
+let b:undo_ftplugin = "setl commentstring< comments<"
diff --git a/mnv/runtime/ftplugin/mma.mnv b/mnv/runtime/ftplugin/mma.mnv
new file mode 100644
index 0000000000..8600009b8a
--- /dev/null
+++ b/mnv/runtime/ftplugin/mma.mnv
@@ -0,0 +1,17 @@
+" MNV filetype plugin file
+" Language: Mathematica
+" Maintainer: Ian Ford <ianf@wolfram.com>
+" Last Change: 2019 Jan 22
+" 2024 May 23 by Riley Bruins <ribru17@gmail.com> ('commentstring')
+
+" Only do this when not done yet for this buffer
+if exists("b:did_ftplugin")
+ finish
+endif
+
+" Don't load another plugin for this buffer
+let b:did_ftplugin = 1
+
+let b:undo_ftplugin = "setlocal commentstring<"
+
+setlocal commentstring=\(*\ %s\ *\)
diff --git a/mnv/runtime/ftplugin/mnv.mnv b/mnv/runtime/ftplugin/mnv.mnv
new file mode 100644
index 0000000000..9daf7a20ab
--- /dev/null
+++ b/mnv/runtime/ftplugin/mnv.mnv
@@ -0,0 +1,224 @@
+" MNV filetype plugin
+" Language: MNV
+" Maintainer: Doug Kearns <dougkearns@gmail.com>
+" Former Maintainer: Bram Moolenaar <Bram@mnv.org>
+" Contributors: Riley Bruins <ribru17@gmail.com> ('commentstring')
+" @Konfekt
+" @tpope (s:Help())
+" @lacygoill
+" Last Change: 2025 Aug 07
+" 2025 Aug 06 by MNV Project (add gf maps #17881)
+" 2025 Aug 08 by MNV Project (add MNV script complete function #17871)
+" 2025 Aug 12 by MNV Project (improve mnvgoto script #17970))
+" 2025 Aug 16 by MNV Project set com depending on MNV9 or legacy script
+" 2026 Jan 26 by MNV Project set path to common MNV directories #19219
+" 2026 Feb 03 by MNV Project update s:Help to improve detecting functions #19320
+
+" Only do this when not done yet for this buffer
+if exists("b:did_ftplugin")
+ finish
+endif
+
+" Don't load another plugin for this buffer
+let b:did_ftplugin = 1
+
+let s:cpo_save = &cpo
+set cpo&mnv
+
+if !exists('*MNVFtpluginUndo')
+ func MNVFtpluginUndo()
+ setl fo< isk< com< tw< commentstring< include< define< keywordprg< omnifunc< path<
+ sil! delc -buffer MNVKeywordPrg
+ if exists('b:did_add_maps')
+ silent! nunmap <buffer> [[
+ silent! xunmap <buffer> [[
+ silent! nunmap <buffer> ]]
+ silent! xunmap <buffer> ]]
+ silent! nunmap <buffer> []
+ silent! xunmap <buffer> []
+ silent! nunmap <buffer> ][
+ silent! xunmap <buffer> ][
+ silent! nunmap <buffer> ]"
+ silent! xunmap <buffer> ]"
+ silent! nunmap <buffer> ["
+ silent! xunmap <buffer> ["
+ silent! nunmap <buffer> gf
+ silent! nunmap <buffer> <C-W>f
+ silent! nunmap <buffer> <C-W>gf
+ endif
+ unlet! b:match_ignorecase b:match_words b:match_skip b:did_add_maps
+ endfunc
+endif
+
+let b:undo_ftplugin = "call MNVFtpluginUndo()"
+
+" Set 'formatoptions' to break comment lines but not other lines,
+" and insert the comment leader when hitting <CR> or using "o".
+setlocal fo-=t fo+=croql
+
+" To allow tag lookup via CTRL-] for autoload functions, '#' must be a
+" keyword character. E.g., for netrw#Nread().
+setlocal isk+=#
+
+" Use :help to lookup the keyword under the cursor with K.
+" Distinguish between commands, options and functions.
+if !exists("*" .. expand("<SID>") .. "Help")
+ function s:Help(topic) abort
+ let topic = a:topic
+
+ " keyword is not necessarily under the cursor, see :help K
+ let line = getline('.')
+ let i = match(line, '\V' .. escape(topic, '\'), col('.') - len(topic))
+ let pre = strpart(line, 0, i)
+ let post = strpart(line, i + len(topic))
+
+ " local/global option vars
+ if topic =~# '[lg]' && pre ==# '&' && post =~# ':\k\+'
+ let topic = matchstr(post, '\k\+')
+ endif
+
+ if get(g:, 'syntax_on', 0)
+ let syn = synIDattr(synID(line('.'), col('.'), 1), 'name')
+ if syn ==# 'mnvFuncName'
+ return topic .. '()'
+ elseif syn ==# 'mnvOption' || syn ==# 'mnvOptionVarName'
+ return "'" .. topic .. "'"
+ elseif syn ==# 'mnvUserCmdAttrKey'
+ return ':command-' .. topic
+ elseif syn ==# 'mnvCommand'
+ return ':' .. topic
+ endif
+ endif
+
+ if stridx(post, '(') == 0
+ return topic .. '()'
+ elseif pre =~# '^\s*:\=$' || pre =~# '\%(\\\||\)\@<!|\s*:\=$'
+ return ':' .. topic
+ elseif pre =~# '\<v:$'
+ return 'v:' .. topic
+ elseif pre =~# '<$'
+ return '<' .. topic .. '>'
+ elseif pre =~# '\\$'
+ return '/\' .. topic
+ elseif topic ==# 'v' && post =~# ':\w\+'
+ return 'v' .. matchstr(post, ':\w\+')
+ elseif pre =~# '&\%([lg]:\)\=$'
+ return "'" .. topic .. "'"
+ else
+ return topic
+ endif
+ endfunction
+endif
+command! -buffer -nargs=1 MNVKeywordPrg :exe 'help' s:Help(<q-args>)
+setlocal keywordprg=:MNVKeywordPrg
+
+" Comments starts with # in MNV9 script. We have to guess which one to use.
+if "\n" .. getline(1, 32)->join("\n") =~# '\n\s*mnv9\%[script]\>'
+ setlocal commentstring=#\ %s
+ " Set 'comments' to format dashed lists in comments, for MNV9 script.
+ setlocal com=sO:#\ -,mO:#\ \ ,eO:##,:#\\\ ,:#
+else
+ setlocal commentstring=\"%s
+ " Set 'comments' to format dashed lists in comments, for legacy MNV script.
+ setlocal com=sO:\"\ -,mO:\"\ \ ,eO:\"\",:\"\\\ ,:\"
+endif
+
+" set 'include' to recognize import commands
+setlocal include=\\v^\\s*import\\s*(autoload)?
+
+" set 'define' to recognize export commands
+setlocal define=\\v^\\s*export\\s*(def\|const\|var\|final)
+
+if has("mnv9script")
+ " set omnifunc completion
+ setlocal omnifunc=mnvcomplete#Complete
+endif
+
+" Format comments to be up to 78 characters long
+if &tw == 0
+ setlocal tw=78
+endif
+
+" set 'path' to common MNV directories
+setlocal path-=/usr/include
+setlocal path+=pack/**,runtime/**,autoload/**,colors/**,compiler/**,ftplugin/**,indent/**,keymap/**,macros/**,plugin/**,syntax/**,after/**
+
+if !exists("no_plugin_maps") && !exists("no_mnv_maps")
+ let b:did_add_maps = 1
+
+ " Move around functions.
+ nnoremap <silent><buffer> [[ m':call search('^\s*\(fu\%[nction]\\|\(export\s\+\)\?def\)\>', "bW")<CR>
+ xnoremap <silent><buffer> [[ m':<C-U>exe "normal! gv"<Bar>call search('^\s*\(fu\%[nction]\\|\(export\s\+\)\?def\)\>', "bW")<CR>
+ nnoremap <silent><buffer> ]] m':call search('^\s*\(fu\%[nction]\\|\(export\s\+\)\?def\)\>', "W")<CR>
+ xnoremap <silent><buffer> ]] m':<C-U>exe "normal! gv"<Bar>call search('^\s*\(fu\%[nction]\\|\(export\s\+\)\?def\)\>', "W")<CR>
+ nnoremap <silent><buffer> [] m':call search('^\s*end\(f\%[unction]\\|\(export\s\+\)\?def\)\>', "bW")<CR>
+ xnoremap <silent><buffer> [] m':<C-U>exe "normal! gv"<Bar>call search('^\s*end\(f\%[unction]\\|\(export\s\+\)\?def\)\>', "bW")<CR>
+ nnoremap <silent><buffer> ][ m':call search('^\s*end\(f\%[unction]\\|\(export\s\+\)\?def\)\>', "W")<CR>
+ xnoremap <silent><buffer> ][ m':<C-U>exe "normal! gv"<Bar>call search('^\s*end\(f\%[unction]\\|\(export\s\+\)\?def\)\>', "W")<CR>
+
+ " Move around comments
+ nnoremap <silent><buffer> ]" :call search('\%(^\s*".*\n\)\@<!\%(^\s*"\)', "W")<CR>
+ xnoremap <silent><buffer> ]" :<C-U>exe "normal! gv"<Bar>call search('\%(^\s*".*\n\)\@<!\%(^\s*"\)', "W")<CR>
+ nnoremap <silent><buffer> [" :call search('\%(^\s*".*\n\)\%(^\s*"\)\@!', "bW")<CR>
+ xnoremap <silent><buffer> [" :<C-U>exe "normal! gv"<Bar>call search('\%(^\s*".*\n\)\%(^\s*"\)\@!', "bW")<CR>
+
+ " Purpose: Handle :import, :colorscheme and :packadd lines in a smarter way. {{{
+ "
+ " `:import` is followed by a filename or filepath. Find it.
+ "
+ " `:packadd` is followed by the name of a package, which we might have
+ " configured in scripts under `~/.mnv/plugin`. Find it.
+ "
+ " ---
+ "
+ " We can't handle the `:import` lines simply by setting `'includeexpr'`, because
+ " the option would be ignored if:
+ "
+ " - the name of the imported script is the same as the current one
+ " - `'path'` includes the `.` item
+ "
+ " Indeed, in that case, MNV finds the current file, and simply reloads the
+ " buffer.
+ " }}}
+ " We use the `F` variants, instead of the `f` ones, because they're smarter.
+ " See $MNVRUNTIME/autoload/mnvgoto.mnv
+ nnoremap <silent><buffer> gf :<C-U>call mnvgoto#Find('gF')<CR>
+ nnoremap <silent><buffer> <C-W>f :<C-U>call mnvgoto#Find("\<lt>C-W>F")<CR>
+ nnoremap <silent><buffer> <C-W>gf :<C-U>call mnvgoto#Find("\<lt>C-W>gF")<CR>
+endif
+
+" Let the matchit plugin know what items can be matched.
+if exists("loaded_matchit")
+ let b:match_ignorecase = 0
+ " "func" can also be used as a type:
+ " var Ref: func
+ " or to list functions:
+ " func name
+ " require a parenthesis following, then there can be an "endfunc".
+ let b:match_words =
+ \ '\<\%(fu\%[nction]\|def\)!\=\s\+\S\+\s*(:\%(\%(^\||\)\s*\)\@<=\<retu\%[rn]\>:\%(\%(^\||\)\s*\)\@<=\<\%(endf\%[unction]\|enddef\)\>,' ..
+ \ '\<\%(wh\%[ile]\|for\)\>:\%(\%(^\||\)\s*\)\@<=\<brea\%[k]\>:\%(\%(^\||\)\s*\)\@<=\<con\%[tinue]\>:\%(\%(^\||\)\s*\)\@<=\<end\%(w\%[hile]\|fo\%[r]\)\>,' ..
+ \ '\<if\>:\%(\%(^\||\)\s*\)\@<=\<el\%[seif]\>:\%(\%(^\||\)\s*\)\@<=\<en\%[dif]\>,' ..
+ \ '{:},' ..
+ \ '\<try\>:\%(\%(^\||\)\s*\)\@<=\<cat\%[ch]\>:\%(\%(^\||\)\s*\)\@<=\<fina\%[lly]\>:\%(\%(^\||\)\s*\)\@<=\<endt\%[ry]\>,' ..
+ \ '\<aug\%[roup]\s\+\%(END\>\)\@!\S:\<aug\%[roup]\s\+END\>,' ..
+ \ '\<class\>:\<endclass\>,' ..
+ \ '\<interface\>:\<endinterface\>,' ..
+ \ '\<enum\>:\<endenum\>'
+
+ " Ignore syntax region commands and settings, any 'en*' would clobber
+ " if-endif.
+ " - set spl=de,en
+ " - au! FileType javascript syntax region foldBraces start=/{/ end=/}/ …
+ " Also ignore here-doc and dictionary keys (mnvVar).
+ let b:match_skip = 'synIDattr(synID(line("."), col("."), 1), "name")
+ \ =~? "comment\\|string\\|mnvSynReg\\|mnvSet\\|mnvLetHereDoc\\|mnvVar"'
+endif
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
+
+" removed this, because 'cpoptions' is a global option.
+" setlocal cpo+=M " makes \%( match \)
+"
+" mnv: sw=2 et
diff --git a/mnv/runtime/ftplugin/modconf.mnv b/mnv/runtime/ftplugin/modconf.mnv
new file mode 100644
index 0000000000..a78346e0b4
--- /dev/null
+++ b/mnv/runtime/ftplugin/modconf.mnv
@@ -0,0 +1,29 @@
+" MNV filetype plugin file
+" Language: modules.conf(5) configuration file
+" Maintainer: This runtime file is looking for a new maintainer.
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2025-07-22 (use :hor term #17822)
+
+if exists("b:did_ftplugin")
+ finish
+endif
+let b:did_ftplugin = 1
+
+let s:cpo_save = &cpo
+set cpo&mnv
+
+let b:undo_ftplugin = "setl com< cms< inc< fo<"
+
+setlocal comments=:# commentstring=#\ %s include=^\\s*include
+setlocal formatoptions-=t formatoptions+=croql
+
+if has('unix') && executable('less') && exists(':terminal') == 2
+ command -buffer -nargs=1 ModconfKeywordPrg
+ \ silent exe ':hor term ' . 'env LESS= MANPAGER="less --pattern=''' . escape('^\s{,8}' . <q-args> . '\b', '\') . ''' --hilite-search" man ' . 'modprobe.d'
+ setlocal iskeyword+=-
+ setlocal keywordprg=:ModconfKeywordPrg
+ let b:undo_ftplugin .= '| setlocal keywordprg< iskeyword< | sil! delc -buffer ModconfKeywordPrg'
+endif
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/mnv/runtime/ftplugin/modula2.mnv b/mnv/runtime/ftplugin/modula2.mnv
new file mode 100644
index 0000000000..84776c5fcf
--- /dev/null
+++ b/mnv/runtime/ftplugin/modula2.mnv
@@ -0,0 +1,55 @@
+" MNV filetype plugin file
+" Language: Modula-2
+" Maintainer: Doug Kearns <dougkearns@gmail.com>
+" Last Change: 2024 Jan 14
+" 2024 May 23 by Riley Bruins <ribru17@gmail.com> ('commentstring')
+
+if exists("b:did_ftplugin")
+ finish
+endif
+let b:did_ftplugin = 1
+
+let s:cpo_save = &cpo
+set cpo&mnv
+
+let s:dialect = modula2#GetDialect()
+
+if s:dialect ==# "r10"
+ setlocal comments=s:(*,m:\ ,e:*),:!
+ setlocal commentstring=!\ %s
+else
+ setlocal commentstring=(*\ %s\ *)
+ setlocal comments=s:(*,m:\ ,e:*)
+endif
+setlocal formatoptions-=t formatoptions+=croql
+
+let b:undo_ftplugin = "setl com< cms< fo<"
+
+if exists("loaded_matchit") && !exists("b:match_words")
+ let b:match_ignorecase = 0
+ " the second branch of the middle pattern is intended to match CASE labels
+ let b:match_words = '\<REPEAT\>:\<UNTIL\>,' ..
+ \ '\<\%(BEGIN\|CASE\|FOR\|IF\|LOOP\|WHILE\|WITH\|RECORD\)\>' ..
+ \ ':' ..
+ \ '\<\%(ELSIF\|ELSE\)\>\|\%(^\s*\)\@<=\w\+\%(\s*\,\s*\w\+\)\=\s*\:=\@!' ..
+ \ ':' ..
+ \ '\<END\>,' ..
+ \ '(\*:\*),<\*:\*>'
+ let b:match_skip = 's:Comment\|Pragma'
+ let b:undo_ftplugin ..= " | unlet! b:match_ignorecase b:match_skip b:match_words"
+endif
+
+if (has("gui_win32") || has("gui_gtk")) && !exists("b:browsefilter")
+ let b:browsefilter = "Modula-2 Source Files (*.def, *.mod)\t*.def;*.mod\n"
+ if has("win32")
+ let b:browsefilter ..= "All Files (*.*)\t*\n"
+ else
+ let b:browsefilter ..= "All Files (*)\t*\n"
+ endif
+ let b:undo_ftplugin ..= " | unlet! b:browsefilter"
+endif
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
+
+" mnv: nowrap sw=2 sts=2 ts=8 noet:
diff --git a/mnv/runtime/ftplugin/modula3.mnv b/mnv/runtime/ftplugin/modula3.mnv
new file mode 100644
index 0000000000..3b5a9e52c0
--- /dev/null
+++ b/mnv/runtime/ftplugin/modula3.mnv
@@ -0,0 +1,47 @@
+" MNV filetype plugin file
+" Language: Modula-3
+" Maintainer: Doug Kearns <dougkearns@gmail.com>
+" Last Change: 2024 Jan 14
+" 2024 May 24 by Riley Bruins <ribru17@gmail.com> ('commentstring')
+
+if exists("b:did_ftplugin")
+ finish
+endif
+let b:did_ftplugin = 1
+
+let s:cpo_save = &cpo
+set cpo&mnv
+
+setlocal comments=s0:(*,mb:\ ,ex:*)
+setlocal commentstring=(*\ %s\ *)
+setlocal formatoptions-=t formatoptions+=croql
+setlocal suffixesadd+=.m3
+setlocal formatprg=m3pp
+
+let b:undo_ftplugin = "setlocal com< cms< fo< fp< sua<"
+
+if exists("loaded_matchit") && !exists("b:match_words")
+ let b:match_words = '\<REPEAT\>:\<UNTIL\>,' ..
+ \ '\<\%(BEGIN\|CASE\|FOR\|IF\|LOCK\|LOOP\|TRY\|TYPECASE\|WHILE\|WITH\|RECORD\|OBJECT\)\>' ..
+ \ ':' ..
+ \ '\<\%(ELSIF\|ELSE\|EXCEPT\|FINALLY\|METHODS\|OVERRIDES\)\>\|\%(^\s*\)\@<=\S.*=>' ..
+ \ ':' ..
+ \ '\<END\>,' ..
+ \ '(\*:\*),<\*:\*>'
+ let b:undo_ftplugin ..= " | unlet! b:match_words"
+endif
+
+if (has("gui_win32") || has("gui_gtk")) && !exists("b:browsefilter")
+ let b:browsefilter = "Modula-3 Source Files (*.m3, *.i3, *.mg, *ig)\t*.m3;*.i3;*.mg;*.ig\n"
+ if has("win32")
+ let b:browsefilter ..= "All Files (*.*)\t*\n"
+ else
+ let b:browsefilter ..= "All Files (*)\t*\n"
+ endif
+ let b:undo_ftplugin ..= " | unlet! b:browsefilter"
+endif
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
+
+" mnv: nowrap sw=2 sts=2 ts=8 noet:
diff --git a/mnv/runtime/ftplugin/mojo.mnv b/mnv/runtime/ftplugin/mojo.mnv
new file mode 100644
index 0000000000..61ce024bd3
--- /dev/null
+++ b/mnv/runtime/ftplugin/mojo.mnv
@@ -0,0 +1,48 @@
+" MNV filetype plugin
+" Language: Mojo
+" Maintainer: Riley Bruins <ribru17@gmail.com>
+" Last Change: 2024 Jul 07
+" 2025 Apr 16 by MNV Project (set 'cpoptions' for line continuation, #17121)
+
+if exists('b:did_ftplugin')
+ finish
+endif
+let b:did_ftplugin = 1
+
+let s:cpo_save = &cpo
+set cpo&mnv
+
+setlocal include=^\\s*\\(from\\\|import\\)
+setlocal define=^\\s*\\(\\(async\\s\\+\\)\\?def\\\|class\\)
+
+" For imports with leading .., append / and replace additional .s with ../
+let b:grandparent_match = '^\(.\.\)\(\.*\)'
+let b:grandparent_sub = '\=submatch(1)."/".repeat("../",strlen(submatch(2)))'
+
+" For imports with a single leading ., replace it with ./
+let b:parent_match = '^\.\(\.\)\@!'
+let b:parent_sub = './'
+
+" Replace any . sandwiched between word characters with /
+let b:child_match = '\(\w\)\.\(\w\)'
+let b:child_sub = '\1/\2'
+
+setlocal includeexpr=substitute(substitute(substitute(
+ \v:fname,
+ \b:grandparent_match,b:grandparent_sub,''),
+ \b:parent_match,b:parent_sub,''),
+ \b:child_match,b:child_sub,'g')
+
+setlocal suffixesadd=.mojo
+setlocal comments=b:#,fb:-
+setlocal commentstring=#\ %s
+
+let b:undo_ftplugin = 'setlocal include<'
+ \ . '|setlocal define<'
+ \ . '|setlocal includeexpr<'
+ \ . '|setlocal suffixesadd<'
+ \ . '|setlocal comments<'
+ \ . '|setlocal commentstring<'
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/mnv/runtime/ftplugin/mp.mnv b/mnv/runtime/ftplugin/mp.mnv
new file mode 100644
index 0000000000..774c01d858
--- /dev/null
+++ b/mnv/runtime/ftplugin/mp.mnv
@@ -0,0 +1,95 @@
+mnv9script
+
+# MNV filetype plugin file
+# Language: MetaPost
+# Maintainer: Nicola Vitacolonna <nvitacolonna@gmail.com>
+# Former Maintainers: Nikolai Weibull <now@bitwi.se>
+# Latest Revision: 2026 Jan 10
+
+if exists("b:did_ftplugin")
+ finish
+endif
+
+b:did_ftplugin = 1
+b:undo_ftplugin = "setl com< cms< fo< sua< inc< def< ofu<"
+
+setlocal comments=:%
+setlocal commentstring=%\ %s
+setlocal formatoptions+=cjroql2
+setlocal formatoptions-=t
+setlocal omnifunc=syntaxcomplete#Complete
+setlocal suffixesadd=.mp,.mpiv,.mpvi,.mpxl
+
+&l:include = '\<\%(input\|loadmodule\)\>' # loadmodule is from MetaFun
+&l:define = '\<\%(let\|newinternal\|interim\|def\|vardef\)\>\|\<\%(primary\|secondary\|tertiary\)def\>\s*[^ .]\+'
+
+g:omni_syntax_group_include_mp = 'mf\w\+,mp\w\+,metafun\w\+'
+g:omni_syntax_group_exclude_mp = 'mfTodoComment'
+
+var fignum: number
+
+def FixBeginfigs()
+ fignum = 1
+ g/^\s*beginfig(\d*)\s*;\(\s*%.*\)\=$/s/^.\{-};/\='beginfig(' .. fignum .. ');'/ | ++fignum
+enddef
+
+command! -buffer -nargs=0 -bar FixBeginfigs FixBeginfigs()
+
+if exists("g:loaded_matchit") && !exists("b:match_words")
+ b:match_ignorecase = 0
+ b:match_skip = 'synIDattr(synID(line("."), col("."), 1), "name") =~# "^mf\\%(Comment\\|String\\|\\)$\\|^mpTeXinsert$"'
+ b:match_words = '\<if\>:\<else\%[if]\>:\<fi\>,'
+ .. '\<for\%(\|suffixes\|ever\)\>:\<exit\%(if\|unless\)\>:\<endfor\>,'
+ .. '\<\%(\|var\|primary\|secondary\|tertiary\)def\>:\<enddef\>,'
+ .. '\<begin\(\a\+\)\>:end\1,'
+ .. '\<beginlogochar\>:\<endchar\>'
+ b:undo_ftplugin ..= "| unlet! b:match_ignorecase b:match_words b:match_skip"
+endif
+
+if !get(g:, 'no_mp_maps', 0) && !get(g:, 'no_plugin_maps', 0)
+ const mp_regex = {
+ 'beginsection': '^\s*\%(\%(\|var\|primary\|secondary\|tertiary\)def\|begin\%(fig\|char\|logochar\|glyph\|graph\)\)\>',
+ 'endsection': '^\s*\%(enddef\|end\%(fig\|char\|glyph\|graph\)\)\>',
+ 'beginblock': '^\s*\%(begingroup\|if\|for\%(\|suffixes\|ever\)\)\>',
+ 'endblock': '^\s*\%(endgroup\|fi\|endfor\)\>'}
+
+ def MoveAround(count: number, what: string, flags: string)
+ search(mp_regex[what], flags .. 's') # 's' sets previous context mark
+ var i = 2
+ while i <= count
+ search(mp_regex[what], flags)
+ i += 1
+ endwhile
+ enddef
+
+ # Macros to move around
+ nnoremap <silent><buffer> [[ <scriptcmd>MoveAround(v:count1, "beginsection", "bW")<cr>
+ vnoremap <silent><buffer> [[ <scriptcmd>MoveAround(v:count1, "beginsection", "bW")<cr>
+ nnoremap <silent><buffer> ]] <scriptcmd>MoveAround(v:count1, "beginsection", "W") <cr>
+ vnoremap <silent><buffer> ]] <scriptcmd>MoveAround(v:count1, "beginsection", "W") <cr>
+ nnoremap <silent><buffer> [] <scriptcmd>MoveAround(v:count1, "endsection", "bW")<cr>
+ vnoremap <silent><buffer> [] <scriptcmd>MoveAround(v:count1, "endsection", "bW")<cr>
+ nnoremap <silent><buffer> ][ <scriptcmd>MoveAround(v:count1, "endsection", "W") <cr>
+ vnoremap <silent><buffer> ][ <scriptcmd>MoveAround(v:count1, "endsection", "W") <cr>
+ nnoremap <silent><buffer> [{ <scriptcmd>MoveAround(v:count1, "beginblock", "bW")<cr>
+ vnoremap <silent><buffer> [{ <scriptcmd>MoveAround(v:count1, "beginblock", "bW")<cr>
+ nnoremap <silent><buffer> ]} <scriptcmd>MoveAround(v:count1, "endblock", "W") <cr>
+ vnoremap <silent><buffer> ]} <scriptcmd>MoveAround(v:count1, "endblock", "W") <cr>
+
+ for mapping in ["[[", "]]", "[]", "][", "[{", "]}"]
+ b:undo_ftplugin ..= printf(" | silent! execute 'nunmap <buffer> %s'", mapping)
+ b:undo_ftplugin ..= printf(" | silent! execute 'vunmap <buffer> %s'", mapping)
+ endfor
+endif
+
+if (has('gui_win32') || has('gui_gtk')) && !exists('b:browsefilter')
+ b:browsefilter = "MetaPost Source Files (*.mp)\t*.mp\n"
+ if has("win32")
+ b:browsefilter ..= "All Files (*.*)\t*\n"
+ else
+ b:browsefilter ..= "All Files (*)\t*\n"
+ endif
+ b:undo_ftplugin ..= ' | unlet! b:browsefilter'
+endif
+
+# mnv: sw=2 fdm=marker
diff --git a/mnv/runtime/ftplugin/mplayerconf.mnv b/mnv/runtime/ftplugin/mplayerconf.mnv
new file mode 100644
index 0000000000..d95fb4d2b0
--- /dev/null
+++ b/mnv/runtime/ftplugin/mplayerconf.mnv
@@ -0,0 +1,20 @@
+" MNV filetype plugin file
+" Language: mplayer(1) configuration file
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2008-07-09
+
+if exists("b:did_ftplugin")
+ finish
+endif
+let b:did_ftplugin = 1
+
+let s:cpo_save = &cpo
+set cpo&mnv
+
+let b:undo_ftplugin = "setl com< cms< inc< fo<"
+
+setlocal comments=:# commentstring=#\ %s include=^\\s*include
+setlocal formatoptions-=t formatoptions+=croql
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/mnv/runtime/ftplugin/mrxvtrc.mnv b/mnv/runtime/ftplugin/mrxvtrc.mnv
new file mode 100644
index 0000000000..71cd0fcfd8
--- /dev/null
+++ b/mnv/runtime/ftplugin/mrxvtrc.mnv
@@ -0,0 +1,22 @@
+" Created : Wed 26 Apr 2006 01:20:53 AM CDT
+" Modified : Fri 28 Apr 2006 03:24:01 AM CDT
+" Author : Gautam Iyer <gi1242@users.sourceforge.net>
+" Description : ftplugin for mrxvtrc
+
+if exists("b:did_ftplugin")
+ finish
+endif
+let b:did_ftplugin = 1
+
+let b:undo_ftplugin = "setl com< cms< fo<"
+
+" Really any line that does not match an option is a comment. But use '!' for
+" compatibility with x-defaults files, and "#" (preferred) for compatibility
+" with all other config files.
+"
+" Comments beginning with "#" are preferred because MNV will not flag the
+" first word as a spelling error if it is not capitalised. The '!' used as
+" comment leaders makes MNV think that every comment line is a new sentence.
+
+setlocal comments=:!,:# commentstring=#\ %s
+setlocal formatoptions-=t formatoptions+=croql
diff --git a/mnv/runtime/ftplugin/msmessages.mnv b/mnv/runtime/ftplugin/msmessages.mnv
new file mode 100644
index 0000000000..b03ad72558
--- /dev/null
+++ b/mnv/runtime/ftplugin/msmessages.mnv
@@ -0,0 +1,45 @@
+" MNV filetype plugin file
+" Language: MS Message files (*.mc)
+" Maintainer: Kevin Locke <kwl7@cornell.edu>
+" Last Change: 2008 April 09
+" 2024 Jan 14 by MNV Project (browsefilter)
+" Location: http://kevinlocke.name/programs/mnv/syntax/msmessages.mnv
+
+" Based on c.mnv
+
+" Only do this when not done yet for this buffer
+if exists("b:did_ftplugin")
+ finish
+endif
+
+" Don't load another plugin for this buffer
+let b:did_ftplugin = 1
+
+" Using line continuation here.
+let s:cpo_save = &cpo
+set cpo-=C
+
+let b:undo_ftplugin = "setl fo< com< cms< | unlet! b:browsefilter"
+
+" Set 'formatoptions' to format all lines, including comments
+setlocal fo-=ct fo+=roql
+
+" Comments includes both ";" which describes a "comment" which will be
+" converted to C code and variants on "; //" which will remain comments
+" in the generated C code
+setlocal comments=:;,:;//,:;\ //,s:;\ /*\ ,m:;\ \ *\ ,e:;\ \ */
+setlocal commentstring=;\ //\ %s
+
+" Win32 and GTK can filter files in the browse dialog
+if (has("gui_win32") || has("gui_gtk")) && !exists("b:browsefilter")
+ let b:browsefilter = "MS Message Files (*.mc)\t*.mc\n" .
+ \ "Resource Files (*.rc)\t*.rc\n"
+ if has("win32")
+ let b:browsefilter .= "All Files (*.*)\t*\n"
+ else
+ let b:browsefilter .= "All Files (*)\t*\n"
+ endif
+endif
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/mnv/runtime/ftplugin/mss.mnv b/mnv/runtime/ftplugin/mss.mnv
new file mode 100644
index 0000000000..03a5bf8772
--- /dev/null
+++ b/mnv/runtime/ftplugin/mss.mnv
@@ -0,0 +1,16 @@
+" MNV filetype plugin file
+" Language: Vivado mss file
+" Last Change: 2024 Oct 22
+" Document: https://docs.amd.com/r/2020.2-English/ug1400-vitis-embedded/Microprocessor-Software-Specification-MSS
+" Maintainer: Wu, Zhenyu <wuzhenyu@ustc.edu>
+
+if exists("b:did_ftplugin")
+ finish
+endif
+let b:did_ftplugin = 1
+
+setlocal comments=b:#,fb:-
+setlocal commentstring=#\ %s
+
+let b:match_words = '\<BEGIN\>:\<END\>'
+let b:undo_ftplugin = "setl com< cms< | unlet b:match_words"
diff --git a/mnv/runtime/ftplugin/muttrc.mnv b/mnv/runtime/ftplugin/muttrc.mnv
new file mode 100644
index 0000000000..d68ad6b8f6
--- /dev/null
+++ b/mnv/runtime/ftplugin/muttrc.mnv
@@ -0,0 +1,31 @@
+" MNV filetype plugin file
+" Language: mutt RC File
+" Maintainer: This runtime file is looking for a new maintainer.
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2025-07-22 (use :hor term #17822)
+
+if exists("b:did_ftplugin")
+ finish
+endif
+let b:did_ftplugin = 1
+
+let s:cpo_save = &cpo
+set cpo&mnv
+
+let b:undo_ftplugin = "setl com< cms< inc< fo<"
+
+setlocal comments=:# commentstring=#\ %s
+setlocal formatoptions-=t formatoptions+=croql
+
+let &l:include = '^\s*source\>'
+
+if has('unix') && executable('less') && exists(':terminal') == 2
+ command -buffer -nargs=1 MuttrcKeywordPrg
+ \ silent exe 'hor term ' . 'env LESS= MANPAGER="less --pattern=''' . escape('^\s+' . <q-args> . '\b', '\') . ''' --hilite-search" man ' . 'muttrc'
+ setlocal iskeyword+=-
+ setlocal keywordprg=:MuttrcKeywordPrg
+ let b:undo_ftplugin .= '| setlocal keywordprg< iskeyword< | sil! delc -buffer MuttrcKeywordPrg'
+endif
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/mnv/runtime/ftplugin/mysql.mnv b/mnv/runtime/ftplugin/mysql.mnv
new file mode 100644
index 0000000000..8c51aff06c
--- /dev/null
+++ b/mnv/runtime/ftplugin/mysql.mnv
@@ -0,0 +1,9 @@
+" MNV filetype plugin
+" Language: MySQL
+" Maintainer: Riley Bruins <ribru17@gmail.com>
+" Last Change: 2024 Aug 12
+if exists("b:did_ftplugin")
+ finish
+endif
+
+runtime ftplugin/sql.mnv
diff --git a/mnv/runtime/ftplugin/nanorc.mnv b/mnv/runtime/ftplugin/nanorc.mnv
new file mode 100644
index 0000000000..96bb88cdc4
--- /dev/null
+++ b/mnv/runtime/ftplugin/nanorc.mnv
@@ -0,0 +1,19 @@
+" MNV filetype plugin file
+" Language: nanorc(5) - GNU nano configuration file
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2008-07-09
+
+if exists("b:did_ftplugin")
+ finish
+endif
+let b:did_ftplugin = 1
+
+let s:cpo_save = &cpo
+set cpo&mnv
+
+let b:undo_ftplugin = "setl com< cms< fo<"
+
+setlocal comments=:# commentstring=#\ %s formatoptions-=t formatoptions+=croql
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/mnv/runtime/ftplugin/neomuttrc.mnv b/mnv/runtime/ftplugin/neomuttrc.mnv
new file mode 100644
index 0000000000..32499a983e
--- /dev/null
+++ b/mnv/runtime/ftplugin/neomuttrc.mnv
@@ -0,0 +1,23 @@
+" MNV filetype plugin file
+" Language: NeoMutt RC File
+" Previous Maintainer: Guillaume Brogi <gui-gui@netcourrier.com>
+" Latest Revision: 2017-09-17
+" Original version copied from ftplugin/muttrc.mnv
+
+if exists("b:did_ftplugin")
+ finish
+endif
+let b:did_ftplugin = 1
+
+let s:cpo_save = &cpo
+set cpo&mnv
+
+let b:undo_ftplugin = "setl com< cms< inc< fo<"
+
+setlocal comments=:# commentstring=#\ %s
+setlocal formatoptions-=t formatoptions+=croql
+
+let &l:include = '^\s*source\>'
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/mnv/runtime/ftplugin/netrc.mnv b/mnv/runtime/ftplugin/netrc.mnv
new file mode 100644
index 0000000000..298667223c
--- /dev/null
+++ b/mnv/runtime/ftplugin/netrc.mnv
@@ -0,0 +1,20 @@
+" MNV filetype plugin file
+" Language: netrc(5) configuration file
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2008-07-09
+" Last Change: 2023 Feb 27 by Keith Smiley
+
+if exists("b:did_ftplugin")
+ finish
+endif
+let b:did_ftplugin = 1
+
+let s:cpo_save = &cpo
+set cpo&mnv
+
+let b:undo_ftplugin = "setl com< cms< fo<"
+
+setlocal comments=b:# commentstring=#\ %s formatoptions-=tcroq formatoptions+=l
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/mnv/runtime/ftplugin/nginx.mnv b/mnv/runtime/ftplugin/nginx.mnv
new file mode 100644
index 0000000000..41111e6f3e
--- /dev/null
+++ b/mnv/runtime/ftplugin/nginx.mnv
@@ -0,0 +1,9 @@
+" MNV filetype plugin
+" Language: nginx.conf
+" Maintainer: Chris Aumann <me@chr4.org>
+" Last Change: Apr 15, 2017
+" 2023 Aug 28 by MNV Project (undo_ftplugin)
+
+setlocal commentstring=#\ %s
+
+let b:undo_ftplugin = "setlocal commentstring<"
diff --git a/mnv/runtime/ftplugin/nickel.mnv b/mnv/runtime/ftplugin/nickel.mnv
new file mode 100644
index 0000000000..a809df1d18
--- /dev/null
+++ b/mnv/runtime/ftplugin/nickel.mnv
@@ -0,0 +1,13 @@
+" MNV filetype plugin
+" Language: nickel
+" Maintainer: Riley Bruins <ribru17@gmail.com>
+" Last Change: 2026 Mar 01
+
+if exists('b:did_ftplugin')
+ finish
+endif
+let b:did_ftplugin = 1
+
+setl comments=:# commentstring=#\ %s
+
+let b:undo_ftplugin = 'setl com< cms<'
diff --git a/mnv/runtime/ftplugin/nim.mnv b/mnv/runtime/ftplugin/nim.mnv
new file mode 100644
index 0000000000..48f7e6fe1b
--- /dev/null
+++ b/mnv/runtime/ftplugin/nim.mnv
@@ -0,0 +1,13 @@
+" MNV filetype plugin
+" Language: nim
+" Maintainer: Riley Bruins <ribru17@gmail.com>
+" Last Change: 2024 May 19
+
+if exists('b:did_ftplugin')
+ finish
+endif
+let b:did_ftplugin = 1
+
+setl comments=exO:]#,fs1:#[,mb:*,ex:]#,:# commentstring=#\ %s
+
+let b:undo_ftplugin = 'setl com< cms<'
diff --git a/mnv/runtime/ftplugin/nix.mnv b/mnv/runtime/ftplugin/nix.mnv
new file mode 100644
index 0000000000..d8b3727021
--- /dev/null
+++ b/mnv/runtime/ftplugin/nix.mnv
@@ -0,0 +1,21 @@
+" MNV filetype plugin
+" Language: nix
+" Maintainer: Keith Smiley <keithbsmiley@gmail.com>
+" Last Change: 2023 Jul 22
+" 2025 Apr 18 by MNV Project (set 'iskeyword' and b:match_words #17154)
+
+" Only do this when not done yet for this buffer
+if exists("b:did_ftplugin")
+ finish
+endif
+
+" Don't load another plugin for this buffer
+let b:did_ftplugin = 1
+
+let b:undo_ftplugin = "setl commentstring< comments< iskeyword< | unlet! b:match_words"
+
+let b:match_words = "\<if\>:\<then\>:\<else\>,\<let\>:\<in\>"
+
+setlocal comments=:#
+setlocal commentstring=#\ %s
+setlocal iskeyword+=-
diff --git a/mnv/runtime/ftplugin/nroff.mnv b/mnv/runtime/ftplugin/nroff.mnv
new file mode 100644
index 0000000000..fea60a7316
--- /dev/null
+++ b/mnv/runtime/ftplugin/nroff.mnv
@@ -0,0 +1,51 @@
+" MNV filetype plugin
+" Language: roff(7)
+" Maintainer: Aman Verma
+" Homepage: https://github.com/a-vrma/mnv-nroff-ftplugin
+" Document: https://www.gnu.org/software/groff/manual/groff.html
+" Previous Maintainer: Chris Spiegel <cspiegel@gmail.com>
+" Last Changes:
+" 2024 May 24 by Riley Bruins <ribru17@gmail.com> ('commentstring' #14843)
+" 2025 Feb 12 by Wu, Zhenyu <wuzhenyu@ustc.edu> (matchit configuration #16619)
+" 2025 Apr 16 by Eisuke Kawashima (cpoptions #17121)
+" 2025 Apr 24 by Eisuke Kawashima (move options from syntax to ftplugin #17174)
+" 2025 Jun 18 by MNV Project: update commentstring option (#17516)
+
+if exists("b:did_ftplugin")
+ finish
+endif
+let b:did_ftplugin = 1
+
+let s:cpo_save = &cpo
+set cpo&mnv
+
+setlocal commentstring=.\\\"\ %s
+setlocal comments=:.\\\",:\\\",:'\\\",:'''
+setlocal sections+=Sh
+setlocal define=.\s*de
+
+if get(b:, 'preprocs_as_sections')
+ setlocal sections=EQTSPS[\ G1GS
+endif
+
+let b:undo_ftplugin = 'setlocal commentstring< comments< sections& define<'
+
+if get(b:, 'nroff_is_groff')
+ " groff_ms exdented paragraphs are not in the default paragraphs list.
+ setlocal paragraphs+=XP
+ let b:undo_ftplugin .= ' paragraphs&'
+endif
+
+if exists('loaded_matchit')
+ let b:match_words = '^\.\s*ie\>:^\.\s*el\>'
+ \ . ',^\.\s*LB\>:^\.\s*LI\>:^\.\s*LE\>'
+ \ . ',^\.\s*TS\>:^\.\s*TE\>'
+ \ . ',^\.\s*PS\>:^\.\s*P[EF]\>'
+ \ . ',^\.\s*EQ\>:^\.\s*EN\>'
+ \ . ',^\.\s*[\>:^\.\s*]\>'
+ \ . ',^\.\s*FS\>:^\.\s*FE\>'
+ let b:undo_ftplugin .= "| unlet b:match_words"
+endif
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/mnv/runtime/ftplugin/nsis.mnv b/mnv/runtime/ftplugin/nsis.mnv
new file mode 100644
index 0000000000..f877b171a1
--- /dev/null
+++ b/mnv/runtime/ftplugin/nsis.mnv
@@ -0,0 +1,43 @@
+" MNV ftplugin file
+" Language: NSIS script
+" Maintainer: Ken Takata
+" URL: https://github.com/k-takata/mnv-nsis
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Last Change: 2021-10-18
+
+if exists("b:did_ftplugin")
+ finish
+endif
+
+let s:cpo_save = &cpo
+set cpo&mnv
+
+let b:did_ftplugin = 1
+
+let b:undo_ftplugin = "setl com< cms< fo< def< inc<"
+
+setlocal comments=s1:/*,mb:*,ex:*/,b:#,:; commentstring=;\ %s
+setlocal formatoptions-=t formatoptions+=croql
+setlocal define=^\\s*!define\\%(\\%(utc\\)\\=date\\|math\\)\\=
+setlocal include=^\\s*!include\\%(/NONFATAL\\)\\=
+
+if exists("loaded_matchit")
+ let b:match_ignorecase = 1
+ let b:match_words =
+ \ '\${\%(If\|IfNot\|Unless\)}:\${\%(Else\|ElseIf\|ElseIfNot\|ElseUnless\)}:\${\%(EndIf\|EndUnless\)},' .
+ \ '\${Select}:\${EndSelect},' .
+ \ '\${Switch}:\${EndSwitch},' .
+ \ '\${\%(Do\|DoWhile\|DoUntil\)}:\${\%(Loop\|LoopWhile\|LoopUntil\)},' .
+ \ '\${\%(For\|ForEach\)}:\${Next},' .
+ \ '\<Function\>:\<FunctionEnd\>,' .
+ \ '\<Section\>:\<SectionEnd\>,' .
+ \ '\<SectionGroup\>:\<SectionGroupEnd\>,' .
+ \ '\<PageEx\>:\<PageExEnd\>,' .
+ \ '\${MementoSection}:\${MementoSectionEnd},' .
+ \ '!if\%(\%(macro\)\?n\?def\)\?\>:!else\>:!endif\>,' .
+ \ '!macro\>:!macroend\>'
+ let b:undo_ftplugin .= " | unlet! b:match_ignorecase b:match_words"
+endif
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/mnv/runtime/ftplugin/nu.mnv b/mnv/runtime/ftplugin/nu.mnv
new file mode 100644
index 0000000000..0e63e35206
--- /dev/null
+++ b/mnv/runtime/ftplugin/nu.mnv
@@ -0,0 +1,17 @@
+" MNV filetype plugin
+" Language: Nushell
+" Maintainer: El Kasztano
+" URL: https://github.com/elkasztano/nushell-syntax-mnv
+" License: MIT <https://opensource.org/license/mit>
+" Last Change: 2025 Sep 05
+
+if exists("b:did_ftplugin")
+ finish
+endif
+let b:did_ftplugin = 1
+
+setlocal commentstring=#\ %s
+setlocal comments-=://
+setlocal formatoptions=tcroql
+
+let b:undo_ftplugin = "setl fo< cms< com<"
diff --git a/mnv/runtime/ftplugin/objc.mnv b/mnv/runtime/ftplugin/objc.mnv
new file mode 100644
index 0000000000..57873adee5
--- /dev/null
+++ b/mnv/runtime/ftplugin/objc.mnv
@@ -0,0 +1,13 @@
+" MNV filetype plugin file
+" Language: Objective C
+" Maintainer: The MNV Project <https://github.com/Project-Tick/Project-Tick>
+" Last Change: 2023 Aug 10
+" Former Maintainer: Bram Moolenaar <Bram@mnv.org>
+
+" Only do this when not done yet for this buffer
+if exists("b:did_ftplugin")
+ finish
+endif
+
+" Behaves just like C
+runtime! ftplugin/c.mnv ftplugin/c_*.mnv ftplugin/c/*.mnv
diff --git a/mnv/runtime/ftplugin/objcpp.mnv b/mnv/runtime/ftplugin/objcpp.mnv
new file mode 100644
index 0000000000..da13c18dab
--- /dev/null
+++ b/mnv/runtime/ftplugin/objcpp.mnv
@@ -0,0 +1 @@
+runtime! ftplugin/objc.mnv
diff --git a/mnv/runtime/ftplugin/objdump.mnv b/mnv/runtime/ftplugin/objdump.mnv
new file mode 100644
index 0000000000..e15265244a
--- /dev/null
+++ b/mnv/runtime/ftplugin/objdump.mnv
@@ -0,0 +1,14 @@
+" MNV filetype plugin file
+" Language: Objdump
+" Maintainer: Colin Kennedy <colinvfx@gmail.com>
+" Last Change: 2023 October 25
+
+if exists("b:did_ftplugin")
+ finish
+endif
+
+let b:did_ftplugin = 1
+
+let b:undo_ftplugin = "setlocal cms<"
+
+setlocal commentstring=#\ %s
diff --git a/mnv/runtime/ftplugin/obse.mnv b/mnv/runtime/ftplugin/obse.mnv
new file mode 100644
index 0000000000..f4d22932af
--- /dev/null
+++ b/mnv/runtime/ftplugin/obse.mnv
@@ -0,0 +1,71 @@
+" MNV filetype plugin file
+" Language: Oblivion Language (obl)
+" Original Creator: Kat <katisntgood@gmail.com>
+" Maintainer: Kat <katisntgood@gmail.com>
+" Created: 2021 Aug 08
+" Last Change: 2022 Nov 13
+" 2024 May 23 by Riley Bruins <ribru17@gmail.com> ('commentstring')
+
+if exists("b:did_ftplugin")
+ finish
+endif
+
+let s:cpo_save = &cpo
+set cpo&mnv
+
+let b:undo_ftplugin = "setl com< cms<"
+
+noremap <script> <buffer> <silent> [[ <nop>
+noremap <script> <buffer> <silent> ]] <nop>
+
+noremap <script> <buffer> <silent> [] <nop>
+noremap <script> <buffer> <silent> ][ <nop>
+
+setlocal commentstring=;\ %s
+setlocal comments=:;
+
+function s:NextSection(type, backwards, visual)
+ if a:visual
+ normal! gv
+ endif
+
+ if a:type == 1
+ let pattern = '\v(\n\n^\S|%^)'
+ let flags = 'e'
+ elseif a:type == 2
+ let pattern = '\v^\S.*'
+ let flags = ''
+ endif
+
+ if a:backwards
+ let dir = '?'
+ else
+ let dir = '/'
+ endif
+
+ execute 'silent normal! ' . dir . pattern . dir . flags . "\r"
+endfunction
+
+noremap <script> <buffer> <silent> ]]
+ \ :call <SID>NextSection(1, 0, 0)<cr>
+
+noremap <script> <buffer> <silent> [[
+ \ :call <SID>NextSection(1, 1, 0)<cr>
+
+noremap <script> <buffer> <silent> ][
+ \ :call <SID>NextSection(2, 0, 0)<cr>
+
+noremap <script> <buffer> <silent> []
+ \ :call <SID>NextSection(2, 1, 0)<cr>
+
+vnoremap <script> <buffer> <silent> ]]
+ \ :<c-u>call <SID>NextSection(1, 0, 1)<cr>
+vnoremap <script> <buffer> <silent> [[
+ \ :<c-u>call <SID>NextSection(1, 1, 1)<cr>
+vnoremap <script> <buffer> <silent> ][
+ \ :<c-u>call <SID>NextSection(2, 0, 1)<cr>
+vnoremap <script> <buffer> <silent> []
+ \ :<c-u>call <SID>NextSection(2, 1, 1)<cr>
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/mnv/runtime/ftplugin/ocaml.mnv b/mnv/runtime/ftplugin/ocaml.mnv
new file mode 100644
index 0000000000..8c5d17891c
--- /dev/null
+++ b/mnv/runtime/ftplugin/ocaml.mnv
@@ -0,0 +1,645 @@
+" Language: OCaml
+" Maintainer: David Baelde <firstname.name@ens-lyon.org>
+" Mike Leary <leary@nwlink.com>
+" Markus Mottl <markus.mottl@gmail.com>
+" Pierre Vittet <pierre-vittet@pvittet.com>
+" Stefano Zacchiroli <zack@bononia.it>
+" Vincent Aravantinos <firstname.name@imag.fr>
+" Riley Bruins <ribru17@gmail.com> ('commentstring')
+" URL: https://github.com/ocaml/mnv-ocaml
+" Last Change:
+" 2013 Oct 27 - Added commentstring (MM)
+" 2013 Jul 26 - load default compiler settings (MM)
+" 2013 Jul 24 - removed superfluous efm-setting (MM)
+" 2013 Jul 22 - applied fixes supplied by Hirotaka Hamada (MM)
+" 2024 May 23 - added space in commentstring (RB)
+
+if exists("b:did_ftplugin")
+ finish
+endif
+let b:did_ftplugin=1
+
+" Use standard compiler settings unless user wants otherwise
+if !exists("current_compiler")
+ :compiler ocaml
+endif
+
+" some macro
+if exists('*fnameescape')
+ function! s:Fnameescape(s)
+ return fnameescape(a:s)
+ endfun
+else
+ function! s:Fnameescape(s)
+ return escape(a:s," \t\n*?[{`$\\%#'\"|!<")
+ endfun
+endif
+
+" Error handling -- helps moving where the compiler wants you to go
+let s:cposet=&cpoptions
+set cpo&mnv
+
+" Comment string
+setlocal comments=sr:(*\ ,mb:\ ,ex:*)
+setlocal comments^=sr:(**,mb:\ \ ,ex:*)
+setlocal commentstring=(*\ %s\ *)
+
+" Add mappings, unless the user didn't want this.
+if !exists("no_plugin_maps") && !exists("no_ocaml_maps")
+ " (un)commenting
+ if !hasmapto('<Plug>Comment')
+ nmap <buffer> <LocalLeader>c <Plug>LUncomOn
+ xmap <buffer> <LocalLeader>c <Plug>BUncomOn
+ nmap <buffer> <LocalLeader>C <Plug>LUncomOff
+ xmap <buffer> <LocalLeader>C <Plug>BUncomOff
+ endif
+
+ nnoremap <buffer> <Plug>LUncomOn gI(* <End> *)<ESC>
+ nnoremap <buffer> <Plug>LUncomOff :s/^(\* \(.*\) \*)/\1/<CR>:noh<CR>
+ xnoremap <buffer> <Plug>BUncomOn <ESC>:'<,'><CR>`<O<ESC>0i(*<ESC>`>o<ESC>0i*)<ESC>`<
+ xnoremap <buffer> <Plug>BUncomOff <ESC>:'<,'><CR>`<dd`>dd`<
+
+ nmap <buffer> <LocalLeader>s <Plug>OCamlSwitchEdit
+ nmap <buffer> <LocalLeader>S <Plug>OCamlSwitchNewWin
+
+ nmap <buffer> <LocalLeader>t <Plug>OCamlPrintType
+ xmap <buffer> <LocalLeader>t <Plug>OCamlPrintType
+endif
+
+" Let % jump between structure elements (due to Issac Trotts)
+let b:mw = '\<let\>:\<and\>:\(\<in\>\|;;\)'
+let b:mw = b:mw . ',\<if\>:\<then\>:\<else\>'
+let b:mw = b:mw . ',\<\(for\|while\)\>:\<do\>:\<done\>'
+let b:mw = b:mw . ',\<\(object\|sig\|struct\|begin\)\>:\<end\>'
+let b:mw = b:mw . ',\<\(match\|try\)\>:\<with\>'
+let b:match_words = b:mw
+
+let b:match_ignorecase=0
+
+function! s:OcpGrep(bang,args) abort
+ let grepprg = &l:grepprg
+ let grepformat = &l:grepformat
+ let shellpipe = &shellpipe
+ try
+ let &l:grepprg = "ocp-grep -c never"
+ setlocal grepformat=%f:%l:%m
+ if &shellpipe ==# '2>&1| tee' || &shellpipe ==# '|& tee'
+ let &shellpipe = "| tee"
+ endif
+ execute 'grep! '.a:args
+ if empty(a:bang) && !empty(getqflist())
+ return 'cfirst'
+ else
+ return ''
+ endif
+ finally
+ let &l:grepprg = grepprg
+ let &l:grepformat = grepformat
+ let &shellpipe = shellpipe
+ endtry
+endfunction
+command! -bar -bang -complete=file -nargs=+ Ocpgrep exe s:OcpGrep(<q-bang>, <q-args>)
+
+" switching between interfaces (.mli) and implementations (.ml)
+if !exists("g:did_ocaml_switch")
+ let g:did_ocaml_switch = 1
+ nnoremap <Plug>OCamlSwitchEdit :<C-u>call OCaml_switch(0)<CR>
+ nnoremap <Plug>OCamlSwitchNewWin :<C-u>call OCaml_switch(1)<CR>
+ fun OCaml_switch(newwin)
+ if (match(bufname(""), "\\.mli$") >= 0)
+ let fname = s:Fnameescape(substitute(bufname(""), "\\.mli$", ".ml", ""))
+ if (a:newwin == 1)
+ exec "new " . fname
+ else
+ exec "arge " . fname
+ endif
+ elseif (match(bufname(""), "\\.ml$") >= 0)
+ let fname = s:Fnameescape(bufname("")) . "i"
+ if (a:newwin == 1)
+ exec "new " . fname
+ else
+ exec "arge " . fname
+ endif
+ endif
+ endfun
+endif
+
+" Folding support
+
+" Get the modeline because folding depends on indentation
+let lnum = search('^\s*(\*:o\?caml:', 'n')
+let s:modeline = lnum? getline(lnum): ""
+
+" Get the indentation params
+let s:m = matchstr(s:modeline,'default\s*=\s*\d\+')
+if s:m != ""
+ let s:idef = matchstr(s:m,'\d\+')
+elseif exists("g:omlet_indent")
+ let s:idef = g:omlet_indent
+else
+ let s:idef = 2
+endif
+let s:m = matchstr(s:modeline,'struct\s*=\s*\d\+')
+if s:m != ""
+ let s:i = matchstr(s:m,'\d\+')
+elseif exists("g:omlet_indent_struct")
+ let s:i = g:omlet_indent_struct
+else
+ let s:i = s:idef
+endif
+
+" Set the folding method
+if exists("g:ocaml_folding")
+ setlocal foldmethod=expr
+ setlocal foldexpr=OMLetFoldLevel(v:lnum)
+endif
+
+let b:undo_ftplugin = "setlocal efm< foldmethod< foldexpr<"
+ \ . "| unlet! b:mw b:match_words b:match_ignorecase"
+
+
+" - Only definitions below, executed once -------------------------------------
+
+if exists("*OMLetFoldLevel")
+ let &cpoptions = s:cposet
+ unlet s:cposet
+ finish
+endif
+
+function s:topindent(lnum)
+ let l = a:lnum
+ while l > 0
+ if getline(l) =~ '\s*\%(\<struct\>\|\<sig\>\|\<object\>\)'
+ return indent(l)
+ endif
+ let l = l-1
+ endwhile
+ return -s:i
+endfunction
+
+function OMLetFoldLevel(l)
+
+ " This is for not merging blank lines around folds to them
+ if getline(a:l) !~ '\S'
+ return -1
+ endif
+
+ " We start folds for modules, classes, and every toplevel definition
+ if getline(a:l) =~ '^\s*\%(\<val\>\|\<module\>\|\<class\>\|\<type\>\|\<method\>\|\<initializer\>\|\<inherit\>\|\<exception\>\|\<external\>\)'
+ exe 'return ">' (indent(a:l)/s:i)+1 '"'
+ endif
+
+ " Toplevel let are detected thanks to the indentation
+ if getline(a:l) =~ '^\s*let\>' && indent(a:l) == s:i+s:topindent(a:l)
+ exe 'return ">' (indent(a:l)/s:i)+1 '"'
+ endif
+
+ " We close fold on end which are associated to struct, sig or object.
+ " We use syntax information to do that.
+ if getline(a:l) =~ '^\s*end\>' && synIDattr(synID(a:l, indent(a:l)+1, 0), "name") != "ocamlKeyword"
+ return (indent(a:l)/s:i)+1
+ endif
+
+ " Folds end on ;;
+ if getline(a:l) =~ '^\s*;;'
+ exe 'return "<' (indent(a:l)/s:i)+1 '"'
+ endif
+
+ " Comments around folds aren't merged to them.
+ if synIDattr(synID(a:l, indent(a:l)+1, 0), "name") == "ocamlComment"
+ return -1
+ endif
+
+ return '='
+endfunction
+
+" MNV support for OCaml .annot files
+"
+" Last Change: 2007 Jul 17
+" Maintainer: Vincent Aravantinos <vincent.aravantinos@gmail.com>
+" License: public domain
+"
+" Originally inspired by 'ocaml-dtypes.mnv' by Stefano Zacchiroli.
+" The source code is quite radically different for we not use python anymore.
+" However this plugin should have the exact same behaviour, that's why the
+" following lines are the quite exact copy of Stefano's original plugin :
+"
+" <<
+" Executing Ocaml_print_type(<mode>) function will display in the MNV bottom
+" line(s) the type of an ocaml value getting it from the corresponding .annot
+" file (if any). If MNV is in visual mode, <mode> should be "visual" and the
+" selected ocaml value correspond to the highlighted text, otherwise (<mode>
+" can be anything else) it corresponds to the literal found at the current
+" cursor position.
+"
+" Typing '<LocalLeader>t' (LocalLeader defaults to '\', see :h LocalLeader)
+" will cause " Ocaml_print_type function to be invoked with the right
+" argument depending on the current mode (visual or not).
+" >>
+"
+" If you find something not matching this behaviour, please signal it.
+"
+" Differences are:
+" - no need for python support
+" + plus : more portable
+" + minus: no more lazy parsing, it looks very fast however
+"
+" - ocamlbuild support, ie.
+" + the plugin finds the _build directory and looks for the
+" corresponding file inside;
+" + if the user decides to change the name of the _build directory thanks
+" to the '-build-dir' option of ocamlbuild, the plugin will manage in
+" most cases to find it out (most cases = if the source file has a unique
+" name among your whole project);
+" + if ocamlbuild is not used, the usual behaviour holds; ie. the .annot
+" file should be in the same directory as the source file;
+" + for mnv plugin programmers:
+" the variable 'b:_build_dir' contains the inferred path to the build
+" directory, even if this one is not named '_build'.
+"
+" Bonus :
+" - latin1 accents are handled
+" - lists are handled, even on multiple lines, you don't need the visual mode
+" (the cursor must be on the first bracket)
+" - parenthesized expressions, arrays, and structures (ie. '(...)', '[|...|]',
+" and '{...}') are handled the same way
+
+ " Copied from Stefano's original plugin :
+ " <<
+ " .annot ocaml file representation
+ "
+ " File format (copied verbatim from caml-types.el)
+ "
+ " file ::= block *
+ " block ::= position <SP> position <LF> annotation *
+ " position ::= filename <SP> num <SP> num <SP> num
+ " annotation ::= keyword open-paren <LF> <SP> <SP> data <LF> close-paren
+ "
+ " <SP> is a space character (ASCII 0x20)
+ " <LF> is a line-feed character (ASCII 0x0A)
+ " num is a sequence of decimal digits
+ " filename is a string with the lexical conventions of O'Caml
+ " open-paren is an open parenthesis (ASCII 0x28)
+ " close-paren is a closed parenthesis (ASCII 0x29)
+ " data is any sequence of characters where <LF> is always followed by
+ " at least two space characters.
+ "
+ " - in each block, the two positions are respectively the start and the
+ " end of the range described by the block.
+ " - in a position, the filename is the name of the file, the first num
+ " is the line number, the second num is the offset of the beginning
+ " of the line, the third num is the offset of the position itself.
+ " - the char number within the line is the difference between the third
+ " and second nums.
+ "
+ " For the moment, the only possible keyword is \"type\"."
+ " >>
+
+
+" 1. Finding the annotation file even if we use ocamlbuild
+
+ " In: two strings representing paths
+ " Out: one string representing the common prefix between the two paths
+ function! s:Find_common_path (p1,p2)
+ let temp = a:p2
+ while matchstr(a:p1,temp) == ''
+ let temp = substitute(temp,'/[^/]*$','','')
+ endwhile
+ return temp
+ endfun
+
+ " After call:
+ "
+ " Following information have been put in s:annot_file_list, using
+ " annot_file_name name as key:
+ " - annot_file_path :
+ " path to the .annot file corresponding to the
+ " source file (dealing with ocamlbuild stuff)
+ " - _build_path:
+ " path to the build directory even if this one is
+ " not named '_build'
+ " - date_of_last annot:
+ " Set to 0 until we load the file. It contains the
+ " date at which the file has been loaded.
+ function! s:Locate_annotation()
+ let annot_file_name = s:Fnameescape(expand('%:t:r')).'.annot'
+ if !exists ("s:annot_file_list[annot_file_name]")
+ silent exe 'cd' s:Fnameescape(expand('%:p:h'))
+ " 1st case : the annot file is in the same directory as the buffer (no ocamlbuild)
+ let annot_file_path = findfile(annot_file_name,'.')
+ if annot_file_path != ''
+ let annot_file_path = getcwd().'/'.annot_file_path
+ let _build_path = ''
+ else
+ " 2nd case : the buffer and the _build directory are in the same directory
+ " ..
+ " / \
+ " / \
+ " _build .ml
+ "
+ let _build_path = finddir('_build','.')
+ if _build_path != ''
+ let _build_path = getcwd().'/'._build_path
+ let annot_file_path = findfile(annot_file_name,'_build')
+ if annot_file_path != ''
+ let annot_file_path = getcwd().'/'.annot_file_path
+ endif
+ else
+ " 3rd case : the _build directory is in a directory higher in the file hierarchy
+ " (it can't be deeper by ocamlbuild requirements)
+ " ..
+ " / \
+ " / \
+ " _build ...
+ " \
+ " \
+ " .ml
+ "
+ let _build_path = finddir('_build',';')
+ if _build_path != ''
+ let project_path = substitute(_build_path,'/_build$','','')
+ let path_relative_to_project = s:Fnameescape(substitute(expand('%:p:h'),project_path.'/','',''))
+ let annot_file_path = findfile(annot_file_name,project_path.'/_build/'.path_relative_to_project)
+ else
+ let annot_file_path = findfile(annot_file_name,'**')
+ "4th case : what if the user decided to change the name of the _build directory ?
+ " -> we relax the constraints, it should work in most cases
+ if annot_file_path != ''
+ " 4a. we suppose the renamed _build directory is in the current directory
+ let _build_path = matchstr(annot_file_path,'^[^/]*')
+ if annot_file_path != ''
+ let annot_file_path = getcwd().'/'.annot_file_path
+ let _build_path = getcwd().'/'._build_path
+ endif
+ else
+ let annot_file_name = ''
+ "(Pierre Vittet: I have commented 4b because this was crashing
+ "my mnv (it produced infinite loop))
+ "
+ " 4b. anarchy : the renamed _build directory may be higher in the hierarchy
+ " this will work if the file for which we are looking annotations has a unique name in the whole project
+ " if this is not the case, it may still work, but no warranty here
+ "let annot_file_path = findfile(annot_file_name,'**;')
+ "let project_path = s:Find_common_path(annot_file_path,expand('%:p:h'))
+ "let _build_path = matchstr(annot_file_path,project_path.'/[^/]*')
+ endif
+ endif
+ endif
+ endif
+
+ if annot_file_path == ''
+ throw 'E484: no annotation file found'
+ endif
+
+ silent exe 'cd' '-'
+ let s:annot_file_list[annot_file_name]= [annot_file_path, _build_path, 0]
+ endif
+ endfun
+
+ " This variable contains a dictionary of lists. Each element of the dictionary
+ " represents an annotation system. An annotation system is a list with:
+ " - annotation file name as its key
+ " - annotation file path as first element of the contained list
+ " - build path as second element of the contained list
+ " - annot_file_last_mod (contain the date of .annot file) as third element
+ let s:annot_file_list = {}
+
+" 2. Finding the type information in the annotation file
+
+ " a. The annotation file is opened in mnv as a buffer that
+ " should be (almost) invisible to the user.
+
+ " After call:
+ " The current buffer is now the one containing the .annot file.
+ " We manage to keep all this hidden to the user's eye.
+ function! s:Enter_annotation_buffer(annot_file_path)
+ let s:current_pos = getpos('.')
+ let s:current_hidden = &l:hidden
+ set hidden
+ let s:current_buf = bufname('%')
+ if bufloaded(a:annot_file_path)
+ silent exe 'keepj keepalt' 'buffer' s:Fnameescape(a:annot_file_path)
+ else
+ silent exe 'keepj keepalt' 'view' s:Fnameescape(a:annot_file_path)
+ endif
+ call setpos(".", [0, 0 , 0 , 0])
+ endfun
+
+ " After call:
+ " The original buffer has been restored in the exact same state as before.
+ function! s:Exit_annotation_buffer()
+ silent exe 'keepj keepalt' 'buffer' s:Fnameescape(s:current_buf)
+ let &l:hidden = s:current_hidden
+ call setpos('.',s:current_pos)
+ endfun
+
+ " After call:
+ " The annot file is loaded and assigned to a buffer.
+ " This also handles the modification date of the .annot file, eg. after a
+ " compilation (return an updated annot_file_list).
+ function! s:Load_annotation(annot_file_name)
+ let annot = s:annot_file_list[a:annot_file_name]
+ let annot_file_path = annot[0]
+ let annot_file_last_mod = 0
+ if exists("annot[2]")
+ let annot_file_last_mod = annot[2]
+ endif
+ if bufloaded(annot_file_path) && annot_file_last_mod < getftime(annot_file_path)
+ " if there is a more recent file
+ let nr = bufnr(annot_file_path)
+ silent exe 'keepj keepalt' 'bunload' nr
+ endif
+ if !bufloaded(annot_file_path)
+ call s:Enter_annotation_buffer(annot_file_path)
+ setlocal nobuflisted
+ setlocal bufhidden=hide
+ setlocal noswapfile
+ setlocal buftype=nowrite
+ call s:Exit_annotation_buffer()
+ let annot[2] = getftime(annot_file_path)
+ " List updated with the new date
+ let s:annot_file_list[a:annot_file_name] = annot
+ endif
+ endfun
+
+ "b. 'search' and 'match' work to find the type information
+
+ "In: - lin1,col1: position of expression first char
+ " - lin2,col2: position of expression last char
+ "Out: - the pattern to be looked for to find the block
+ " Must be called in the source buffer (use of line2byte)
+ function! s:Block_pattern(lin1,lin2,col1,col2)
+ let start_num1 = a:lin1
+ let start_num2 = line2byte(a:lin1) - 1
+ let start_num3 = start_num2 + a:col1
+ let path = '"\(\\"\|[^"]\)\+"'
+ let start_pos = path.' '.start_num1.' '.start_num2.' '.start_num3
+ let end_num1 = a:lin2
+ let end_num2 = line2byte(a:lin2) - 1
+ let end_num3 = end_num2 + a:col2
+ let end_pos = path.' '.end_num1.' '.end_num2.' '.end_num3
+ return '^'.start_pos.' '.end_pos."$"
+ " rq: the '^' here is not totally correct regarding the annot file "grammar"
+ " but currently the annotation file respects this, and it's a little bit faster with the '^';
+ " can be removed safely.
+ endfun
+
+ "In: (the cursor position should be at the start of an annotation)
+ "Out: the type information
+ " Must be called in the annotation buffer (use of search)
+ function! s:Match_data()
+ " rq: idem as previously, in the following, the '^' at start of patterns is not necessary
+ keepj while search('^type($','ce',line(".")) == 0
+ keepj if search('^.\{-}($','e') == 0
+ throw "no_annotation"
+ endif
+ keepj if searchpair('(','',')') == 0
+ throw "malformed_annot_file"
+ endif
+ endwhile
+ let begin = line(".") + 1
+ keepj if searchpair('(','',')') == 0
+ throw "malformed_annot_file"
+ endif
+ let end = line(".") - 1
+ return join(getline(begin,end),"\n")
+ endfun
+
+ "In: the pattern to look for in order to match the block
+ "Out: the type information (calls s:Match_data)
+ " Should be called in the annotation buffer
+ function! s:Extract_type_data(block_pattern, annot_file_name)
+ let annot_file_path = s:annot_file_list[a:annot_file_name][0]
+ call s:Enter_annotation_buffer(annot_file_path)
+ try
+ if search(a:block_pattern,'e') == 0
+ throw "no_annotation"
+ endif
+ call cursor(line(".") + 1,1)
+ let annotation = s:Match_data()
+ finally
+ call s:Exit_annotation_buffer()
+ endtry
+ return annotation
+ endfun
+
+ "c. link this stuff with what the user wants
+ " ie. get the expression selected/under the cursor
+
+ let s:ocaml_word_char = '\w|[\xc0-\xff]|'''
+
+ "In: the current mode (eg. "visual", "normal", etc.)
+ "Out: the borders of the expression we are looking for the type
+ function! s:Match_borders(mode)
+ if a:mode == "visual"
+ let cur = getpos(".")
+ normal `<
+ let col1 = col(".")
+ let lin1 = line(".")
+ normal `>
+ let col2 = col(".")
+ let lin2 = line(".")
+ call cursor(cur[1],cur[2])
+ return [lin1,lin2,col1-1,col2]
+ else
+ let cursor_line = line(".")
+ let cursor_col = col(".")
+ let line = getline('.')
+ if line[cursor_col-1:cursor_col] == '[|'
+ let [lin2,col2] = searchpairpos('\[|','','|\]','n')
+ return [cursor_line,lin2,cursor_col-1,col2+1]
+ elseif line[cursor_col-1] == '['
+ let [lin2,col2] = searchpairpos('\[','','\]','n')
+ return [cursor_line,lin2,cursor_col-1,col2]
+ elseif line[cursor_col-1] == '('
+ let [lin2,col2] = searchpairpos('(','',')','n')
+ return [cursor_line,lin2,cursor_col-1,col2]
+ elseif line[cursor_col-1] == '{'
+ let [lin2,col2] = searchpairpos('{','','}','n')
+ return [cursor_line,lin2,cursor_col-1,col2]
+ else
+ let [lin1,col1] = searchpos('\v%('.s:ocaml_word_char.'|\.)*','ncb')
+ let [lin2,col2] = searchpos('\v%('.s:ocaml_word_char.'|\.)*','nce')
+ if col1 == 0 || col2 == 0
+ throw "no_expression"
+ endif
+ return [cursor_line,cursor_line,col1-1,col2]
+ endif
+ endif
+ endfun
+
+ "In: the current mode (eg. "visual", "normal", etc.)
+ "Out: the type information (calls s:Extract_type_data)
+ function! s:Get_type(mode, annot_file_name)
+ let [lin1,lin2,col1,col2] = s:Match_borders(a:mode)
+ return s:Extract_type_data(s:Block_pattern(lin1,lin2,col1,col2), a:annot_file_name)
+ endfun
+
+ "In: A string destined to be printed in the 'echo buffer'. It has line
+ "break and 2 space at each line beginning.
+ "Out: A string destined to be yanked, without space and double space.
+ function s:unformat_ocaml_type(res)
+ "Remove end of line.
+ let res = substitute (a:res, "\n", "", "g" )
+ "remove double space
+ let res =substitute(res , " ", " ", "g")
+ "remove space at beginning of string.
+ let res = substitute(res, "^ *", "", "g")
+ return res
+ endfunction
+
+ "d. main
+ "In: the current mode (eg. "visual", "normal", etc.)
+ "After call: the type information is displayed
+ if !exists("*Ocaml_get_type")
+ function Ocaml_get_type(mode)
+ let annot_file_name = s:Fnameescape(expand('%:t:r')).'.annot'
+ call s:Locate_annotation()
+ call s:Load_annotation(annot_file_name)
+ let res = s:Get_type(a:mode, annot_file_name)
+ " Copy result in the unnamed buffer
+ let @" = s:unformat_ocaml_type(res)
+ return res
+ endfun
+ endif
+
+ if !exists("*Ocaml_get_type_or_not")
+ function Ocaml_get_type_or_not(mode)
+ let t=reltime()
+ try
+ let res = Ocaml_get_type(a:mode)
+ return res
+ catch
+ return ""
+ endtry
+ endfun
+ endif
+
+ if !exists("*Ocaml_print_type")
+ function Ocaml_print_type(mode)
+ if expand("%:e") == "mli"
+ echohl ErrorMsg | echo "No annotations for interface (.mli) files" | echohl None
+ return
+ endif
+ try
+ echo Ocaml_get_type(a:mode)
+ catch /E484:/
+ echohl ErrorMsg | echo "No type annotations (.annot) file found" | echohl None
+ catch /no_expression/
+ echohl ErrorMsg | echo "No expression found under the cursor" | echohl None
+ catch /no_annotation/
+ echohl ErrorMsg | echo "No type annotation found for the given text" | echohl None
+ catch /malformed_annot_file/
+ echohl ErrorMsg | echo "Malformed .annot file" | echohl None
+ endtry
+ endfun
+ endif
+
+" Maps
+ nnoremap <silent> <Plug>OCamlPrintType :<C-U>call Ocaml_print_type("normal")<CR>
+ xnoremap <silent> <Plug>OCamlPrintType :<C-U>call Ocaml_print_type("visual")<CR>`<
+
+let &cpoptions = s:cposet
+unlet s:cposet
+
+" mnv:sw=2 fdm=indent
diff --git a/mnv/runtime/ftplugin/occam.mnv b/mnv/runtime/ftplugin/occam.mnv
new file mode 100644
index 0000000000..883fc1f5b9
--- /dev/null
+++ b/mnv/runtime/ftplugin/occam.mnv
@@ -0,0 +1,56 @@
+" MNV filetype plugin file
+" Language: occam
+" Copyright: Christian Jacobsen <clj3@kent.ac.uk>, Mario Schweigler <ms44@kent.ac.uk>
+" Maintainer: Mario Schweigler <ms44@kent.ac.uk>
+" Last Change: 23 April 2003
+" 2024 Jan 14 by MNV Project (browsefilter)
+" 2025 Jun 08 by Riley Bruins <ribru17@gmail.com> ('commentstring')
+
+" Only do this when not done yet for this buffer
+if exists("b:did_ftplugin")
+ finish
+endif
+let b:did_ftplugin = 1
+let s:keepcpo= &cpo
+set cpo&mnv
+
+"{{{ Indent settings
+" Set shift width for indent
+setlocal shiftwidth=2
+" Set the tab key size to two spaces
+setlocal softtabstop=2
+" Let tab keys always be expanded to spaces
+setlocal expandtab
+"}}}
+
+"{{{ Formatting
+" Break comment lines and insert comment leader in this case
+setlocal formatoptions-=t formatoptions+=cql
+setlocal comments+=:--
+setlocal commentstring=--\ %s
+" Maximum length of comments is 78
+setlocal textwidth=78
+"}}}
+
+"{{{ File browsing filters
+" Win32 and GTK can filter files in the browse dialog
+if (has("gui_win32") || has("gui_gtk")) && !exists("b:browsefilter")
+ let b:browsefilter = "All Occam Files (*.occ, *.inc)\t*.occ;*.inc\n" .
+ \ "Occam Include Files (*.inc)\t*.inc\n" .
+ \ "Occam Source Files (*.occ)\t*.occ\n"
+ if has("win32")
+ let b:browsefilter .= "All Files (*.*)\t*\n"
+ else
+ let b:browsefilter .= "All Files (*)\t*\n"
+ endif
+endif
+"}}}
+
+"{{{ Undo settings
+let b:undo_ftplugin = "setlocal shiftwidth< softtabstop< expandtab<"
+ \ . " formatoptions< comments< commentstring< textwidth<"
+ \ . "| unlet! b:browsefilter"
+"}}}
+
+let &cpo = s:keepcpo
+unlet s:keepcpo
diff --git a/mnv/runtime/ftplugin/octave.mnv b/mnv/runtime/ftplugin/octave.mnv
new file mode 100644
index 0000000000..73efd8c5ff
--- /dev/null
+++ b/mnv/runtime/ftplugin/octave.mnv
@@ -0,0 +1,67 @@
+" MNV filetype plugin file
+" Language: GNU Octave
+" Maintainer: Doug Kearns <dougkearns@gmail.com>
+" Last Change: 2024 Jan 14
+
+if exists("b:did_ftplugin")
+ finish
+endif
+let b:did_ftplugin = 1
+
+let s:cpo_save = &cpo
+set cpo&mnv
+
+" TODO: update Matlab ftplugin and source it as the base file?
+
+setlocal comments=s:%{,m:\ ,e:%},s:#{,m:\ ,e:#},:%,:#
+setlocal commentstring=#\ %s
+setlocal formatoptions-=t formatoptions+=croql
+
+setlocal keywordprg=info\ octave\ --vi-keys\ --index-search
+
+if exists("loaded_matchit") && !exists("b:match_words")
+ let b:match_words = '\<unwind_protect\>:\<unwind_protect_cleanup\>:\<end_unwind_protect\>'
+ if exists("octave_use_matlab_end")
+ let b:match_words ..= ',' ..
+ \ '\<\%(classdef\|enumeration\|events\|for\|function\|if\|methods\|parfor\|properties\|switch\|while\|try\)\>' ..
+ \ ':' ..
+ \ '\<\%(elseif\|else\|case\|otherwise\|break\|continue\|catch\)\>' ..
+ \ ':' ..
+ \ '\<end\>'
+ else
+ let b:match_words ..= ',' ..
+ \ '\<classdef\>:\<endclassdef\>,' ..
+ \ '\<enumeration\>:\<endenumeration\>,' ..
+ \ '\<events\>:\<endevents\>,' ..
+ \ '\<do\>:\<\%(break\|continue\)\>:\<until\>' ..
+ \ '\<for\>:\<\%(break\|continue\)\>:\<endfor\>,' ..
+ \ '\<function\>:\<return\>:\<endfunction\>,' ..
+ \ '\<if\>:\<\%(elseif\|else\)\>:\<endif\>,' ..
+ \ '\<methods\>:\<endmethods\>,' ..
+ \ '\<parfor\>:\<endparfor\>,' ..
+ \ '\<properties\>:\<endproperties\>,' ..
+ \ '\<switch\>:\<\%(case\|otherwise\)\>:\<endswitch\>,' ..
+ \ '\<while\>:\<\%(break\|continue\)\>:\<endwhile\>,' ..
+ \ '\<try\>:\<catch\>:\<end_try_catch\>'
+ endif
+ " only match in statement position
+ let s:statement_start = escape('\%(\%(^\|;\)\s*\)\@<=', '\')
+ let b:match_words = substitute(b:match_words, '\\<', s:statement_start, 'g')
+endif
+
+if (has("gui_win32") || has("gui_gtk")) && !exists("b:browsefilter")
+ let b:browsefilter = "GNU Octave Source Files (*.m)\t*.m\n"
+ if has("win32")
+ let b:browsefilter ..= "All Files (*.*)\t*\n"
+ else
+ let b:browsefilter ..= "All Files (*)\t*\n"
+ endif
+endif
+
+let b:undo_ftplugin = "setl com< cms< fo< kp< " ..
+ \ "| unlet! b:browsefilter b:match_words"
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
+
+" mnv: nowrap sw=2 sts=2 ts=8 noet:
diff --git a/mnv/runtime/ftplugin/odin.mnv b/mnv/runtime/ftplugin/odin.mnv
new file mode 100644
index 0000000000..d740664922
--- /dev/null
+++ b/mnv/runtime/ftplugin/odin.mnv
@@ -0,0 +1,21 @@
+mnv9script
+
+# MNV filetype plugin file
+# Language: Odin
+# Maintainer: Maxim Kim <habamax@gmail.com>
+# Website: https://github.com/habamax/mnv-odin
+# Last Change: 2024 Jan 15
+# 2024-May 23 by Riley Bruins <ribru17@gmail.com> ('commentstring')
+
+if exists("b:did_ftplugin")
+ finish
+endif
+b:did_ftplugin = 1
+
+b:undo_ftplugin = 'setlocal commentstring<'
+ \ .. '| setlocal comments<'
+ \ .. '| setlocal suffixesadd<'
+
+setlocal suffixesadd=.odin
+setlocal commentstring=//\ %s
+setlocal comments=s1:/*,mb:*,ex:*/,://
diff --git a/mnv/runtime/ftplugin/ondir.mnv b/mnv/runtime/ftplugin/ondir.mnv
new file mode 100644
index 0000000000..dddae7fb7f
--- /dev/null
+++ b/mnv/runtime/ftplugin/ondir.mnv
@@ -0,0 +1,18 @@
+" MNV filetype plugin file
+" Language: ondir <https://github.com/alecthomas/ondir>
+" Maintainer: Jon Parise <jon@indelible.org>
+
+if exists('b:did_ftplugin')
+ finish
+endif
+
+let s:cpo_save = &cpoptions
+
+setlocal comments=:# commentstring=#\ %s
+
+let b:undo_ftplugin = 'setl comments< commentstring<'
+
+let &cpoptions = s:cpo_save
+unlet s:cpo_save
+
+" mnv: et ts=4 sw=2 sts=2:
diff --git a/mnv/runtime/ftplugin/opencl.mnv b/mnv/runtime/ftplugin/opencl.mnv
new file mode 100644
index 0000000000..0d44d52dba
--- /dev/null
+++ b/mnv/runtime/ftplugin/opencl.mnv
@@ -0,0 +1,12 @@
+" MNV filetype plugin file
+" Language: OpenCL
+" Maintainer: Wu, Zhenyu <wuzhenyu@ustc.edu>
+" Last Change: 2024 Nov 19
+
+if exists("b:did_ftplugin") | finish | endif
+let b:did_ftplugin = 1
+
+setlocal comments=sO:*\ -,mO:*\ \ ,exO:*/,s1:/*,mb:*,ex:*/,:///,://
+setlocal commentstring=/*\ %s\ */ define& include&
+
+let b:undo_ftplugin = "setl commentstring< comments<"
diff --git a/mnv/runtime/ftplugin/openscad.mnv b/mnv/runtime/ftplugin/openscad.mnv
new file mode 100644
index 0000000000..ceeaf712ca
--- /dev/null
+++ b/mnv/runtime/ftplugin/openscad.mnv
@@ -0,0 +1,14 @@
+" MNV filetype plugin file
+" Language: OpenSCAD (https://openscad.org)
+" Maintainer: Zachary Scheiman <me@zacharyscheiman.com>
+" Last Change: 2025 Aug 3
+
+if exists('b:did_ftplugin')
+ finish
+endif
+let b:did_ftplugin = 1
+
+" Comments in openscad follow C/C++ syntax
+setlocal commentstring=//\ %s
+
+let b:undo_ftplugin = 'setl commentstring<'
diff --git a/mnv/runtime/ftplugin/openvpn.mnv b/mnv/runtime/ftplugin/openvpn.mnv
new file mode 100644
index 0000000000..a1c658c8f9
--- /dev/null
+++ b/mnv/runtime/ftplugin/openvpn.mnv
@@ -0,0 +1,15 @@
+" MNV filetype plugin
+" Language: OpenVPN
+" Maintainer: ObserverOfTime <chronobserver@disroot.org>
+" Last Change: 2022 Oct 16
+" 2024 May 23 by Riley Bruins <ribru17@gmail.com> ('commentstring')
+
+if exists('b:did_ftplugin')
+ finish
+endif
+let b:did_ftplugin = 1
+
+setlocal iskeyword+=-,.,/
+setlocal comments=:#,:; commentstring=#\ %s
+
+let b:undo_ftplugin = 'setl isk< com< cms<'
diff --git a/mnv/runtime/ftplugin/org.mnv b/mnv/runtime/ftplugin/org.mnv
new file mode 100644
index 0000000000..2f3d233330
--- /dev/null
+++ b/mnv/runtime/ftplugin/org.mnv
@@ -0,0 +1,39 @@
+" MNV filetype plugin file
+" Language: Org
+" Previous Maintainer: Luca Saccarola <github.e41mv@aleeas.com>
+" Maintainer: This runtime file is looking for a new maintainer.
+" Last Change: 2025 Aug 05
+
+
+if exists("b:did_ftplugin")
+ finish
+endif
+let b:did_ftplugin = 1
+
+if exists('b:undo_ftplugin')
+ let b:undo_ftplugin .= "|setl cms< com< fo< flp<"
+else
+ let b:undo_ftplugin = "setl cms< com< fo< flp<"
+endif
+
+setl commentstring=#\ %s
+setl comments=fb:*,fb:-,fb:+,b:#,b:\:
+
+setl formatoptions+=nql
+setl formatlistpat=^\\s*\\(\\(\\d\\|\\a\\)\\+[.)]\\|[+-]\\)\\s\\+
+
+function OrgFoldExpr()
+ let l:depth = match(getline(v:lnum), '\(^\*\+\)\@<=\( .*$\)\@=')
+ if l:depth > 0 && synIDattr(synID(v:lnum, 1, 1), 'name') =~# '\m^orgHeadline'
+ return ">" . l:depth
+ endif
+ return "="
+endfunction
+
+if has("folding") && get(g:, 'org_folding', 0)
+ setl foldexpr=OrgFoldExpr()
+ setl foldmethod=expr
+ let b:undo_ftplugin .= "|setl foldexpr< foldmethod<"
+endif
+
+" mnv: ts=8 sts=2 sw=2 et
diff --git a/mnv/runtime/ftplugin/pamconf.mnv b/mnv/runtime/ftplugin/pamconf.mnv
new file mode 100644
index 0000000000..67cde6e7c8
--- /dev/null
+++ b/mnv/runtime/ftplugin/pamconf.mnv
@@ -0,0 +1,19 @@
+" MNV filetype plugin file
+" Language: pam(8) configuration file
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2008-07-09
+
+if exists("b:did_ftplugin")
+ finish
+endif
+let b:did_ftplugin = 1
+
+let s:cpo_save = &cpo
+set cpo&mnv
+
+let b:undo_ftplugin = "setl com< cms< fo<"
+
+setlocal comments=:# commentstring=#\ %s formatoptions-=t formatoptions+=croql
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/mnv/runtime/ftplugin/pascal.mnv b/mnv/runtime/ftplugin/pascal.mnv
new file mode 100644
index 0000000000..681e3217cf
--- /dev/null
+++ b/mnv/runtime/ftplugin/pascal.mnv
@@ -0,0 +1,55 @@
+" MNV filetype plugin file
+" Language: Pascal
+" Maintainer: Doug Kearns <dougkearns@gmail.com>
+" Previous Maintainer: Dan Sharp
+" Last Change: 2024 Jan 14
+" 2024 May 23 by Riley Bruins <ribru17@gmail.com> ('commentstring')
+
+if exists("b:did_ftplugin") | finish | endif
+let b:did_ftplugin = 1
+
+let s:cpo_save = &cpo
+set cpo&mnv
+
+set comments=s:(*,m:\ ,e:*),s:{,m:\ ,e:}
+set commentstring={\ %s\ }
+
+if exists("pascal_delphi")
+ set comments+=:///
+endif
+
+if !exists("pascal_traditional")
+ set commentstring=//\ %s
+ set comments+=://
+endif
+
+setlocal formatoptions-=t formatoptions+=croql
+
+if exists("loaded_matchit")
+ let b:match_ignorecase = 1 " (Pascal is case-insensitive)
+
+ let b:match_words = '\<\%(asm\|begin\|case\|\%(\%(=\|packed\)\s*\)\@<=\%(class\|object\)\|\%(=\s*\)\@<=interface\|record\|try\)\>'
+ let b:match_words .= ':\%(^\s*\)\@<=\%(except\|finally\|else\|otherwise\)\>'
+ let b:match_words .= ':\<end\>\.\@!'
+
+ let b:match_words .= ',\<repeat\>:\<until\>'
+ " let b:match_words .= ',\<if\>:\<else\>' " FIXME - else clashing with middle else. It seems like a debatable use anyway.
+ let b:match_words .= ',\<unit\>:\<\%(\%(^\s*\)\@<=interface\|implementation\|initialization\|finalization\)\>:\<end\.'
+endif
+
+if (has("gui_win32") || has("gui_gtk")) && !exists("b:browsefilter")
+ let b:browsefilter = "Pascal Source Files (*.pas, *.pp, *.inc)\t*.pas;*.pp;*.inc\n"
+ if has("win32")
+ let b:browsefilter ..= "All Files (*.*)\t*\n"
+ else
+ let b:browsefilter ..= "All Files (*)\t*\n"
+ endif
+endif
+
+let b:undo_ftplugin = "setl fo< cms< com< " ..
+ \ "| unlet! b:browsefilter b:match_words b:match_ignorecase"
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
+
+" mnv: nowrap sw=2 sts=2 ts=8 noet:
diff --git a/mnv/runtime/ftplugin/passwd.mnv b/mnv/runtime/ftplugin/passwd.mnv
new file mode 100644
index 0000000000..3e6680ac7a
--- /dev/null
+++ b/mnv/runtime/ftplugin/passwd.mnv
@@ -0,0 +1,19 @@
+" MNV filetype plugin file
+" Language: passwd(5) password file
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2008-07-09
+
+if exists("b:did_ftplugin")
+ finish
+endif
+let b:did_ftplugin = 1
+
+let s:cpo_save = &cpo
+set cpo&mnv
+
+let b:undo_ftplugin = "setl com< cms< fo<"
+
+setlocal comments= commentstring= formatoptions-=tcroq formatoptions+=l
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/mnv/runtime/ftplugin/pbtxt.mnv b/mnv/runtime/ftplugin/pbtxt.mnv
new file mode 100644
index 0000000000..6a94a11dbe
--- /dev/null
+++ b/mnv/runtime/ftplugin/pbtxt.mnv
@@ -0,0 +1,17 @@
+" MNV filetype plugin file
+" Language: Protobuf Text Format
+" Maintainer: Lakshay Garg <lakshayg@outlook.in>
+" Last Change: 2020 Nov 17
+" 2023 Aug 28 by MNV Project (undo_ftplugin)
+" Homepage: https://github.com/lakshayg/mnv-pbtxt
+
+if exists("b:did_ftplugin")
+ finish
+endif
+let b:did_ftplugin = 1
+
+setlocal commentstring=#\ %s
+
+let b:undo_ftplugin = "setlocal commentstring<"
+
+" mnv: nowrap sw=2 sts=2 ts=8 noet
diff --git a/mnv/runtime/ftplugin/pdf.mnv b/mnv/runtime/ftplugin/pdf.mnv
new file mode 100644
index 0000000000..a4a6183f0c
--- /dev/null
+++ b/mnv/runtime/ftplugin/pdf.mnv
@@ -0,0 +1,90 @@
+" MNV filetype plugin file
+" Language: PDF
+" Maintainer: Tim Pope <mnvNOSPAM@tpope.info>
+" Last Change: 2007 Dec 16
+" 2024 May 23 by Riley Bruins <ribru17@gmail.com> ('commentstring')
+
+if exists("b:did_ftplugin")
+ finish
+endif
+let b:did_ftplugin = 1
+
+setlocal commentstring=%\ %s
+setlocal comments=:%
+let b:undo_ftplugin = "setlocal cms< com< | unlet! b:match_words"
+
+if exists("g:loaded_matchit")
+ let b:match_words = '\<\%(\d\+\s\+\d\+\s\+\)obj\>:\<endobj\>,\<stream$:\<endstream\>,\<xref\>:\<trailer\>,<<:>>'
+endif
+
+if exists("g:no_plugin_maps") || exists("g:no_pdf_maps") || v:version < 700
+ finish
+endif
+
+if !exists("b:pdf_tagstack")
+ let b:pdf_tagstack = []
+endif
+
+let b:undo_ftplugin .= " | silent! nunmap <buffer> <C-]> | silent! nunmap <buffer> <C-T>"
+nnoremap <silent><buffer> <C-]> :call <SID>Tag()<CR>
+" Inline, so the error from an empty tag stack will be simple.
+nnoremap <silent><buffer> <C-T> :if len(b:pdf_tagstack) > 0 <Bar> call setpos('.',remove(b:pdf_tagstack, -1)) <Bar> else <Bar> exe "norm! \<Lt>C-T>" <Bar> endif<CR>
+
+function! s:Tag()
+ call add(b:pdf_tagstack,getpos('.'))
+ if getline('.') =~ '^\d\+$' && getline(line('.')-1) == 'startxref'
+ return s:dodigits(getline('.'))
+ elseif getline('.') =~ '/Prev\s\+\d\+\>\%(\s\+\d\)\@!' && expand("<cword>") =~ '^\d\+$'
+ return s:dodigits(expand("<cword>"))
+ elseif getline('.') =~ '^\d\{10\} \d\{5\} '
+ return s:dodigits(matchstr(getline('.'),'^\d\+'))
+ else
+ let line = getline(".")
+ let lastend = 0
+ let pat = '\<\d\+\s\+\d\+\s\+R\>'
+ while lastend >= 0
+ let beg = match(line,'\C'.pat,lastend)
+ let end = matchend(line,'\C'.pat,lastend)
+ if beg < col(".") && end >= col(".")
+ return s:doobject(matchstr(line,'\C'.pat,lastend))
+ endif
+ let lastend = end
+ endwhile
+ return s:notag()
+ endif
+endfunction
+
+function! s:doobject(string)
+ let first = matchstr(a:string,'^\s*\zs\d\+')
+ let second = matchstr(a:string,'^\s*\d\+\s\+\zs\d\+')
+ norm! m'
+ if first != '' && second != ''
+ let oldline = line('.')
+ let oldcol = col('.')
+ 1
+ if !search('^\s*'.first.'\s\+'.second.'\s\+obj\>')
+ exe oldline
+ exe 'norm! '.oldcol.'|'
+ return s:notag()
+ endif
+ endif
+endfunction
+
+function! s:dodigits(digits)
+ let digits = 0 + substitute(a:digits,'^0*','','')
+ norm! m'
+ if digits <= 0
+ norm! 1go
+ else
+ " Go one character before the destination and advance. This method
+ " lands us after a newline rather than before, if that is our target.
+ exe "goto ".(digits)."|norm! 1 "
+ endif
+endfunction
+
+function! s:notag()
+ silent! call remove(b:pdf_tagstack,-1)
+ echohl ErrorMsg
+ echo "E426: tag not found"
+ echohl NONE
+endfunction
diff --git a/mnv/runtime/ftplugin/perl.mnv b/mnv/runtime/ftplugin/perl.mnv
new file mode 100644
index 0000000000..8653df3658
--- /dev/null
+++ b/mnv/runtime/ftplugin/perl.mnv
@@ -0,0 +1,118 @@
+" MNV filetype plugin file
+" Language: Perl
+" Maintainer: mnv-perl <mnv-perl@googlegroups.com> (need to be subscribed to post)
+" Homepage: https://github.com/mnv-perl/mnv-perl
+" Bugs/requests: https://github.com/mnv-perl/mnv-perl/issues
+" License: MNV License (see :help license)
+" Last Change: 2021 Nov 10
+" 2023 Sep 07 by MNV Project (safety check: don't execute perl
+" from current directory)
+" 2024 Jan 14 by MNV Project (browsefilter)
+" 2024 May 24 by Riley Bruins <ribru17@gmail.com> ('commentstring')
+
+if exists("b:did_ftplugin") | finish | endif
+let b:did_ftplugin = 1
+
+" Make sure the continuation lines below do not cause problems in
+" compatibility mode.
+let s:save_cpo = &cpo
+set cpo-=C
+
+setlocal formatoptions-=t
+setlocal formatoptions+=crqol
+setlocal keywordprg=perldoc\ -f
+
+setlocal comments=:#
+setlocal commentstring=#\ %s
+
+" Provided by Ned Konz <ned at bike-nomad dot com>
+"---------------------------------------------
+setlocal include=\\<\\(use\\\|require\\)\\>
+" '+' is removed to support plugins in Catalyst or DBIx::Class
+" where the leading plus indicates a fully-qualified module name.
+setlocal includeexpr=substitute(substitute(substitute(substitute(v:fname,'+','',''),'::','/','g'),'->\*','',''),'$','.pm','')
+setlocal define=[^A-Za-z_]
+setlocal iskeyword+=:
+
+" The following line changes a global variable but is necessary to make
+" gf and similar commands work. Thanks to Andrew Pimlott for pointing
+" out the problem.
+let s:old_isfname = &isfname
+set isfname+=:
+let s:new_isfname = &isfname
+
+augroup perl_global_options
+ au!
+ exe "au BufEnter * if &filetype == 'perl' | let &isfname = '" . s:new_isfname . "' | endif"
+ exe "au BufLeave * if &filetype == 'perl' | let &isfname = '" . s:old_isfname . "' | endif"
+augroup END
+
+" Undo the stuff we changed.
+let b:undo_ftplugin = "setlocal fo< kp< com< cms< inc< inex< def< isk<" .
+ \ " | let &isfname = '" . s:old_isfname . "'"
+
+if get(g:, 'perl_fold', 0)
+ setlocal foldmethod=syntax
+ let b:undo_ftplugin .= " | setlocal fdm<"
+endif
+
+" Set this once, globally.
+if !exists("perlpath")
+ " safety check: don't execute perl binary by default
+ if dist#mnv#IsSafeExecutable('perl', 'perl')
+ try
+ if &shellxquote != '"'
+ let perlpath = system('perl -e "print join(q/,/,@INC)"')
+ else
+ let perlpath = system("perl -e 'print join(q/,/,@INC)'")
+ endif
+ let perlpath = substitute(perlpath,',.$',',,','')
+ catch /E145:/
+ let perlpath = ".,,"
+ endtry
+ else
+ " If we can't call perl to get its path, just default to using the
+ " current directory and the directory of the current file.
+ let perlpath = ".,,"
+ endif
+endif
+
+" Append perlpath to the existing path value, if it is set. Since we don't
+" use += to do it because of the commas in perlpath, we have to handle the
+" global / local settings, too.
+if &l:path == ""
+ if &g:path == ""
+ let &l:path=perlpath
+ else
+ let &l:path=&g:path.",".perlpath
+ endif
+else
+ let &l:path=&l:path.",".perlpath
+endif
+
+let b:undo_ftplugin .= " | setlocal pa<"
+"---------------------------------------------
+
+" Change the browse dialog to show mainly Perl-related files
+if (has("gui_win32") || has("gui_gtk")) && !exists("b:browsefilter")
+ let b:browsefilter = "Perl Source Files (*.pl)\t*.pl\n" .
+ \ "Perl Modules (*.pm)\t*.pm\n" .
+ \ "Perl Documentation Files (*.pod)\t*.pod\n"
+ if has("win32")
+ let b:browsefilter .= "All Files (*.*)\t*\n"
+ else
+ let b:browsefilter .= "All Files (*)\t*\n"
+ endif
+ let b:undo_ftplugin .= " | unlet! b:browsefilter"
+endif
+
+" Proper matching for matchit plugin
+if exists("loaded_matchit") && !exists("b:match_words")
+ let b:match_skip = 's:comment\|string\|perlQQ\|perlShellCommand\|perlHereDoc\|perlSubstitution\|perlTranslation\|perlMatch\|perlFormatField'
+ let b:match_words = '\<if\>:\<elsif\>:\<else\>'
+ let b:undo_ftplugin .= " | unlet! b:match_words b:match_skip"
+endif
+
+" Restore the saved compatibility options.
+let &cpo = s:save_cpo
+unlet s:save_cpo s:old_isfname s:new_isfname
diff --git a/mnv/runtime/ftplugin/php.mnv b/mnv/runtime/ftplugin/php.mnv
new file mode 100644
index 0000000000..bb4050880d
--- /dev/null
+++ b/mnv/runtime/ftplugin/php.mnv
@@ -0,0 +1,158 @@
+" MNV filetype plugin file
+" Language: PHP
+" Maintainer: Doug Kearns <dougkearns@gmail.com>
+" Previous Maintainer: Dan Sharp
+" Last Change: 2024 Jan 14
+" Last Change: 2024 May 23 by Riley Bruins <ribru17@gmail.com> ('commentstring')
+
+if exists("b:did_ftplugin")
+ finish
+endif
+
+" Make sure the continuation lines below do not cause problems in
+" compatibility mode.
+let s:keepcpo= &cpo
+set cpo&mnv
+
+" Define some defaults in case the included ftplugins don't set them.
+let s:undo_ftplugin = ""
+let s:browsefilter = "HTML Files (*.html, *.htm)\t*.html;*.htm\n"
+if has("win32")
+ let s:browsefilter ..= "All Files (*.*)\t*\n"
+else
+ let s:browsefilter ..= "All Files (*)\t*\n"
+endif
+let s:match_words = ""
+
+runtime! ftplugin/html.mnv ftplugin/html_*.mnv ftplugin/html/*.mnv
+let b:did_ftplugin = 1
+
+" Override our defaults if these were set by an included ftplugin.
+if exists("b:undo_ftplugin")
+" let b:undo_ftplugin = "setlocal comments< commentstring< formatoptions< omnifunc<"
+ let s:undo_ftplugin = b:undo_ftplugin
+endif
+if exists("b:browsefilter")
+" let b:undo_ftplugin ..= " | unlet! b:browsefilter b:html_set_browsefilter"
+ let s:browsefilter = b:browsefilter
+endif
+if exists("b:match_words")
+" let b:undo_ftplugin ..= " | unlet! b:match_ignorecase b:match_words b:html_set_match_words"
+ let s:match_words = b:match_words
+endif
+if exists("b:match_skip")
+ unlet b:match_skip
+endif
+
+setlocal comments=s1:/*,mb:*,ex:*/,://,:#
+setlocal commentstring=/*\ %s\ */
+setlocal formatoptions+=l formatoptions-=t
+
+if get(g:, "php_autocomment", 1)
+ setlocal formatoptions+=croq
+ " NOTE: set g:PHP_autoformatcomment = 0 to prevent the indent plugin from
+ " overriding this 'comments' value
+ setlocal comments-=:#
+ " space after # comments to exclude attributes
+ setlocal comments+=b:#
+endif
+
+if exists('&omnifunc')
+ setlocal omnifunc=phpcomplete#CompletePHP
+endif
+
+setlocal suffixesadd=.php
+
+" ###
+" Provided by Mikolaj Machowski <mikmach at wp dot pl>
+setlocal include=\\\(require\\\|include\\\)\\\(_once\\\)\\\?
+" Disabled changing 'iskeyword', it breaks a command such as "*"
+" setlocal iskeyword+=$
+
+let b:undo_ftplugin = "setlocal include< suffixesadd<"
+
+if exists("loaded_matchit") && exists("b:html_set_match_words")
+ let b:match_ignorecase = 1
+ let b:match_words = 'PhpMatchWords()'
+
+ if !exists("*PhpMatchWords")
+ function! PhpMatchWords()
+ " The PHP syntax file uses the Delimiter syntax group for the phpRegion
+ " matchgroups, without a "php" prefix, so use the stack to test for the
+ " outer phpRegion group. This also means the closing ?> tag which is
+ " outside of the matched region just uses the Delimiter group for the
+ " end match.
+ let stack = synstack(line('.'), col('.'))
+ let php_region = !empty(stack) && synIDattr(stack[0], "name") =~# '\<php'
+ if php_region || getline(".") =~ '.\=\%.c\&?>'
+ let b:match_skip = "PhpMatchSkip('html')"
+ return '<?php\|<?=\=:?>,' ..
+ \ '\<if\>:\<elseif\>:\<else\>:\<endif\>,' ..
+ \ '\<switch\>:\<case\>:\<break\>:\<continue\>:\<endswitch\>,' ..
+ \ '\<while\>.\{-})\s*\::\<break\>:\<continue\>:\<endwhile\>,' ..
+ \ '\<do\>:\<break\>:\<continue\>:\<while\>,' ..
+ \ '\<for\>:\<break\>:\<continue\>:\<endfor\>,' ..
+ \ '\<foreach\>:\<break\>:\<continue\>:\<endforeach\>,' ..
+ \ '\%(<<<\s*\)\@<=''\=\(\h\w*\)''\=:^\s*\1\>'
+
+ " TODO: these probably aren't worth adding and really need syntax support
+ " '<\_s*script\_s*language\_s*=\_s*[''"]\=\_s*php\_s*[''"]\=\_s*>:<\_s*\_s*/\_s*script\_s*>,' ..
+ " '<%:%>,' ..
+ else
+ let b:match_skip = "PhpMatchSkip('php')"
+ return s:match_words
+ endif
+ endfunction
+ endif
+ if !exists("*PhpMatchSkip")
+ function! PhpMatchSkip(skip)
+ let name = synIDattr(synID(line('.'), col('.'), 1), 'name')
+ if a:skip == "html"
+ " ?> in line comments will also be correctly matched as Delimiter
+ return name =~? 'comment\|string' || name !~? 'php\|delimiter'
+ else " php
+ return name =~? 'comment\|string\|php'
+ endif
+ endfunction
+ endif
+ let b:undo_ftplugin ..= " | unlet! b:match_skip"
+endif
+" ###
+
+" Change the :browse e filter to primarily show PHP-related files.
+if (has("gui_win32") || has("gui_gtk")) && exists("b:html_set_browsefilter")
+ let b:browsefilter = "PHP Files (*.php)\t*.php\n" ..
+ \ "PHP Test Files (*.phpt)\t*.phpt\n" ..
+ \ s:browsefilter
+endif
+
+if !exists("no_plugin_maps") && !exists("no_php_maps")
+ " Section jumping: [[ and ]] provided by Antony Scriven <adscriven at gmail dot com>
+ let s:function = '\%(abstract\s\+\|final\s\+\|private\s\+\|protected\s\+\|public\s\+\|static\s\+\)*function'
+ let s:class = '\%(abstract\s\+\|final\s\+\)*class'
+ let s:section = escape('^\s*\zs\%(' .. s:function .. '\|' .. s:class .. '\|interface\|trait\|enum\)\>', "|")
+
+ function! s:Jump(pattern, count, flags)
+ normal! m'
+ for i in range(a:count)
+ if !search(a:pattern, a:flags)
+ break
+ endif
+ endfor
+ endfunction
+
+ for mode in ["n", "o", "x"]
+ exe mode .. "noremap <buffer> <silent> ]] <Cmd>call <SID>Jump('" .. s:section .. "', v:count1, 'W')<CR>"
+ exe mode .. "noremap <buffer> <silent> [[ <Cmd>call <SID>Jump('" .. s:section .. "', v:count1, 'bW')<CR>"
+ let b:undo_ftplugin ..= " | sil! exe '" .. mode .. "unmap <buffer> ]]'" ..
+ \ " | sil! exe '" .. mode .. "unmap <buffer> [['"
+ endfor
+endif
+
+let b:undo_ftplugin ..= " | " .. s:undo_ftplugin
+
+" Restore the saved compatibility options.
+let &cpo = s:keepcpo
+unlet s:keepcpo
+
+" mnv: nowrap sw=2 sts=2 ts=8 noet:
diff --git a/mnv/runtime/ftplugin/pinfo.mnv b/mnv/runtime/ftplugin/pinfo.mnv
new file mode 100644
index 0000000000..9626e5933e
--- /dev/null
+++ b/mnv/runtime/ftplugin/pinfo.mnv
@@ -0,0 +1,19 @@
+" MNV filetype plugin file
+" Language: pinfo(1) configuration file
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2008-07-09
+
+if exists("b:did_ftplugin")
+ finish
+endif
+let b:did_ftplugin = 1
+
+let s:cpo_save = &cpo
+set cpo&mnv
+
+let b:undo_ftplugin = "setl com< cms< fo<"
+
+setlocal comments=:# commentstring=#\ %s formatoptions-=t formatoptions+=croql
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/mnv/runtime/ftplugin/pkl.mnv b/mnv/runtime/ftplugin/pkl.mnv
new file mode 100644
index 0000000000..61bcdc0e2e
--- /dev/null
+++ b/mnv/runtime/ftplugin/pkl.mnv
@@ -0,0 +1,16 @@
+" MNV filetype plugin
+" Language: Pkl
+" Maintainer: Riley Bruins <ribru17@gmail.com>
+" Last Change: 2025 Jul 14
+" 2025 Oct 03 by MNV Project Add foldmethod #18274
+
+if exists('b:did_ftplugin')
+ finish
+endif
+let b:did_ftplugin = 1
+
+setlocal comments=sO:*\ -,mO:*\ \ ,exO:*/,s1:/*,mb:*,ex:*/,:///,://
+setlocal commentstring=//\ %s
+setlocal foldmethod=syntax
+
+let b:undo_ftplugin = 'setl com< cms< fdm<'
diff --git a/mnv/runtime/ftplugin/plaintex.mnv b/mnv/runtime/ftplugin/plaintex.mnv
new file mode 100644
index 0000000000..4366f0e8e6
--- /dev/null
+++ b/mnv/runtime/ftplugin/plaintex.mnv
@@ -0,0 +1,37 @@
+" plain TeX filetype plugin
+" Language: plain TeX (ft=plaintex)
+" Maintainer: Benji Fisher, Ph.D. <benji@member.AMS.org>
+" Version: 1.1
+" Last Change: Wed 19 Apr 2006
+
+" Only do this when not done yet for this buffer.
+if exists("b:did_ftplugin")
+ finish
+endif
+
+" Start with initex. This will also define b:did_ftplugin and b:undo_ftplugin .
+source $MNVRUNTIME/ftplugin/initex.mnv
+
+" Avoid problems if running in 'compatible' mode.
+let s:save_cpo = &cpo
+set cpo&mnv
+
+let b:undo_ftplugin .= "| unlet! b:match_ignorecase b:match_skip b:match_words"
+
+" Allow "[d" to be used to find a macro definition:
+let &l:define .= '\|\\new\(count\|dimen\|skip\|muskip\|box\|toks\|read\|write'
+ \ . '\|fam\|insert\)'
+
+" The following lines enable the macros/matchit.mnv plugin for
+" extended matching with the % key.
+" There is no default meaning for \(...\) etc., but many users define one.
+if exists("loaded_matchit")
+ let b:match_ignorecase = 0
+ \ | let b:match_skip = 'r:\\\@<!\%(\\\\\)*%'
+ \ | let b:match_words = '(:),\[:],{:},\\(:\\),\\\[:\\],\\{:\\}'
+endif " exists("loaded_matchit")
+
+let &cpo = s:save_cpo
+unlet s:save_cpo
+
+" mnv:sts=2:sw=2:
diff --git a/mnv/runtime/ftplugin/plsql.mnv b/mnv/runtime/ftplugin/plsql.mnv
new file mode 100644
index 0000000000..96be4b8020
--- /dev/null
+++ b/mnv/runtime/ftplugin/plsql.mnv
@@ -0,0 +1,17 @@
+" MNV ftplugin file
+" Language: Oracle Procedural SQL (PL/SQL)
+" Maintainer: Lee Lindley (lee dot lindley at gmail dot com)
+" Previous Maintainer: Jeff Lanzarotta (jefflanzarotta at yahoo dot com)
+" Previous Maintainer: C. Laurence Gonsalves (clgonsal@kami.com)
+" URL: https://github.com/lee-lindley/mnv_plsql_syntax
+" Last Change: Feb 19, 2025
+" History: Enno Konfekt move handling of optional syntax folding from syntax
+" file to ftplugin
+
+if exists("b:did_ftplugin") | finish | endif
+let b:did_ftplugin = 1
+
+if get(g:,"plsql_fold",0) == 1
+ setlocal foldmethod=syntax
+ let b:undo_ftplugin = "setl fdm< "
+endif
diff --git a/mnv/runtime/ftplugin/pod.mnv b/mnv/runtime/ftplugin/pod.mnv
new file mode 100644
index 0000000000..a8daaebcbc
--- /dev/null
+++ b/mnv/runtime/ftplugin/pod.mnv
@@ -0,0 +1,76 @@
+" MNV filetype plugin file
+" Language: Perl POD format
+" Maintainer: mnv-perl <mnv-perl@googlegroups.com> (need to be subscribed to post)
+" Author: Doug Kearns <dougkearns@gmail.com>
+" Homepage: https://github.com/mnv-perl/mnv-perl
+" Bugs/requests: https://github.com/mnv-perl/mnv-perl/issues
+" License: MNV License (see :help license)
+" Last Change: 2023 Jul 05
+" Last Change: 2021 Oct 19
+" 2024 Jan 14 by MNV Project (browsefilter)
+
+if exists("b:did_ftplugin")
+ finish
+endif
+let b:did_ftplugin = 1
+
+let s:save_cpo = &cpo
+set cpo-=C
+
+setlocal comments=fb:=for\ comment
+setlocal commentstring==for\ comment\ %s
+
+let b:undo_ftplugin = "setl com< cms<"
+
+if exists("loaded_matchit") && !exists("b:match_words")
+ let b:match_words =
+ \ '^=pod\>:^=cut\>,' .
+ \ '^=begin\s\+\(\S\+\):^=end\s\+\1,' .
+ \ '^=over\>:^=item\>:^=back\>,' .
+ \ '[IBCLEFSXZ]<<\%(\s\+\|$\)\@=:\%(\s\+\|^\)\@<=>>,' .
+ \ '[IBCLEFSXZ]<:>'
+ let b:undo_ftplugin .= " | unlet! b:match_words"
+endif
+
+if (has("gui_win32") || has("gui_gtk")) && !exists("b:browsefilter")
+ let b:browsefilter = "POD Source Files (*.pod)\t*.pod\n" .
+ \ "Perl Source Files (*.pl)\t*.pl\n" .
+ \ "Perl Modules (*.pm)\t*.pm\n"
+ if has("win32")
+ let b:browsefilter .= "All Files (*.*)\t*\n"
+ else
+ let b:browsefilter .= "All Files (*)\t*\n"
+ endif
+ let b:undo_ftplugin .= " | unlet! b:browsefilter"
+endif
+
+function s:jumpToSection(direction)
+ let flags = a:direction == "backward" ? "bsWz" : "sWz"
+ if has("syntax_items")
+ let skip = "synIDattr(synID(line('.'), col('.'), 1), 'name') !~# '\\<podCommand\\>'"
+ else
+ let skip = ""
+ endif
+ for i in range(v:count1)
+ call search('^=\a', flags, 0, 0, skip)
+ endfor
+endfunction
+
+if !exists("no_plugin_maps") && !exists("no_pod_maps")
+ for s:mode in ["n", "o", "x"]
+ for s:lhs in ["]]", "]["]
+ execute s:mode . "noremap <silent> <buffer> " . s:lhs . " <Cmd>call <SID>jumpToSection('forward')<CR>"
+ let b:undo_ftplugin .= " | silent! execute '" . s:mode . "unmap <buffer> " . s:lhs . "'"
+ endfor
+ for s:lhs in ["[[", "[]"]
+ execute s:mode . "noremap <silent> <buffer> " . s:lhs . " <Cmd>call <SID>jumpToSection('backward')<CR>"
+ let b:undo_ftplugin .= " | silent! execute '" . s:mode . "unmap <buffer> " . s:lhs . "'"
+ endfor
+ endfor
+ unlet s:mode s:lhs
+endif
+
+let &cpo = s:save_cpo
+unlet s:save_cpo
+
+" mnv: set expandtab:
diff --git a/mnv/runtime/ftplugin/poefilter.mnv b/mnv/runtime/ftplugin/poefilter.mnv
new file mode 100644
index 0000000000..e6f66e72e9
--- /dev/null
+++ b/mnv/runtime/ftplugin/poefilter.mnv
@@ -0,0 +1,13 @@
+" MNV filetype plugin
+" Language: PoE item filter
+" Maintainer: ObserverOfTime <chronobserver@disroot.org>
+" Last Change: 2022 Oct 07
+
+if exists('b:did_ftplugin')
+ finish
+endif
+let b:did_ftplugin = 1
+
+setlocal comments=:# commentstring=#\ %s
+
+let b:undo_ftplugin = 'setl com< cms<'
diff --git a/mnv/runtime/ftplugin/poke.mnv b/mnv/runtime/ftplugin/poke.mnv
new file mode 100644
index 0000000000..f3075d0c83
--- /dev/null
+++ b/mnv/runtime/ftplugin/poke.mnv
@@ -0,0 +1,36 @@
+" MNV filetype plugin file
+" Language: GNU Poke
+" Maintainer: Doug Kearns <dougkearns@gmail.com>
+" Last Change: 2024 Jan 14
+
+if exists("b:did_ftplugin")
+ finish
+endif
+let b:did_ftplugin = 1
+
+let s:cpo_save = &cpo
+set cpo&mnv
+
+setlocal comments=sO:*\ -,mO:*\ \ ,exO:*/,s1:/*,mb:*,ex:*/,://
+setlocal commentstring=//\ %s
+setlocal formatoptions-=t formatoptions+=croql
+
+setlocal include=load
+setlocal suffixesadd=.pk
+
+let b:undo_ftplugin = "setl fo< com< cms< inc< sua<"
+
+if (has("gui_win32") || has("gui_gtk")) && !exists("b:browsefilter")
+ let b:browsefilter = "Poke Files (*.pk)\t*.pk\n"
+ if has("win32")
+ let b:browsefilter ..= "All Files (*.*)\t*\n"
+ else
+ let b:browsefilter ..= "All Files (*)\t*\n"
+ endif
+ let b:undo_ftplugin ..= " | unlet! b:browsefilter"
+endif
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
+
+" mnv: nowrap sw=2 sts=2 ts=8
diff --git a/mnv/runtime/ftplugin/postscr.mnv b/mnv/runtime/ftplugin/postscr.mnv
new file mode 100644
index 0000000000..17ae39a181
--- /dev/null
+++ b/mnv/runtime/ftplugin/postscr.mnv
@@ -0,0 +1,45 @@
+" MNV filetype plugin file
+" Language: PostScript
+" Maintainer: Mike Williams <mrw@eandem.co.uk>
+" Last Change: 24th April 2012
+" 2024 Jan 14 by MNV Project (browsefilter)
+" 2025 Jun 08 by Riley Bruins <ribru17@gmail.com> ('commentstring')
+
+" Only do this when not done yet for this buffer
+if exists("b:did_ftplugin")
+ finish
+endif
+
+" Don't load another plugin for this buffer
+let b:did_ftplugin = 1
+
+let s:cpo_save = &cpo
+set cpo&mnv
+
+" PS comment formatting
+setlocal comments=b:%
+setlocal commentstring=%\ %s
+setlocal formatoptions-=t formatoptions+=rol
+
+" Define patterns for the matchit macro
+if !exists("b:match_words")
+ let b:match_ignorecase = 0
+ let b:match_words = '<<:>>,\<begin\>:\<end\>,\<save\>:\<restore\>,\<gsave\>:\<grestore\>'
+endif
+
+" Define patterns for the browse file filter
+if (has("gui_win32") || has("gui_gtk")) && !exists("b:browsefilter")
+ let b:browsefilter = "PostScript Files (*.ps)\t*.ps\n" .
+ \ "EPS Files (*.eps)\t*.eps\n"
+ if has("win32")
+ let b:browsefilter .= "All Files (*.*)\t*\n"
+ else
+ let b:browsefilter .= "All Files (*)\t*\n"
+ endif
+endif
+
+let b:undo_ftplugin = "setlocal comments< commentstring< formatoptions<"
+ \ . "| unlet! b:browsefilter b:match_ignorecase b:match_words"
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/mnv/runtime/ftplugin/pq.mnv b/mnv/runtime/ftplugin/pq.mnv
new file mode 100644
index 0000000000..c08c682c16
--- /dev/null
+++ b/mnv/runtime/ftplugin/pq.mnv
@@ -0,0 +1,16 @@
+" MNV filetype plugin
+" Language: Power Query M
+" Maintainer: Anarion Dunedain <anarion80@gmail.com>
+" Last Change: 2025 Apr 3
+
+if exists('b:did_ftplugin')
+ finish
+endif
+
+let b:did_ftplugin = 1
+
+setlocal comments=sO:*\ -,mO:*\ \ ,exO:*/,s1:/*,mb:*,ex:*/,://
+
+setlocal commentstring=//\ %s
+
+let b:undo_ftplugin = 'setl com< cms<'
diff --git a/mnv/runtime/ftplugin/prisma.mnv b/mnv/runtime/ftplugin/prisma.mnv
new file mode 100644
index 0000000000..caa1af1f97
--- /dev/null
+++ b/mnv/runtime/ftplugin/prisma.mnv
@@ -0,0 +1,13 @@
+" MNV filetype plugin
+" Language: prisma
+" Maintainer: Riley Bruins <ribru17@gmail.com>
+" Last Change: 2024 May 19
+
+if exists('b:did_ftplugin')
+ finish
+endif
+let b:did_ftplugin = 1
+
+setl comments=:///,:// commentstring=//\ %s
+
+let b:undo_ftplugin = 'setl com< cms<'
diff --git a/mnv/runtime/ftplugin/procmail.mnv b/mnv/runtime/ftplugin/procmail.mnv
new file mode 100644
index 0000000000..af05decbad
--- /dev/null
+++ b/mnv/runtime/ftplugin/procmail.mnv
@@ -0,0 +1,21 @@
+" MNV filetype plugin file
+" Language: procmail(1) configuration file
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2008-07-09
+
+if exists("b:did_ftplugin")
+ finish
+endif
+let b:did_ftplugin = 1
+
+let s:cpo_save = &cpo
+set cpo&mnv
+
+let b:undo_ftplugin = "setl com< cms< inc< fo<"
+
+setlocal comments=:# commentstring=#\ %s formatoptions-=t formatoptions+=croql
+
+let &l:include = '^\s*INCLUDERC\>'
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/mnv/runtime/ftplugin/prolog.mnv b/mnv/runtime/ftplugin/prolog.mnv
new file mode 100644
index 0000000000..17ba09e9d0
--- /dev/null
+++ b/mnv/runtime/ftplugin/prolog.mnv
@@ -0,0 +1,20 @@
+" MNV filetype plugin file
+" Language: Prolog
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2008-07-09
+
+if exists("b:did_ftplugin")
+ finish
+endif
+let b:did_ftplugin = 1
+
+let s:cpo_save = &cpo
+set cpo&mnv
+
+let b:undo_ftplugin = "setl com< cms< fo<"
+
+setlocal comments=s1:/*,mb:*,ex:*/,:% commentstring=%\ %s
+setlocal formatoptions-=t formatoptions+=croql
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/mnv/runtime/ftplugin/proto.mnv b/mnv/runtime/ftplugin/proto.mnv
new file mode 100644
index 0000000000..3604ee0fb2
--- /dev/null
+++ b/mnv/runtime/ftplugin/proto.mnv
@@ -0,0 +1,18 @@
+" MNV filetype plugin
+" Language: Protobuf
+" Maintainer: David Pedersen <limero@me.com>
+" Last Change: 2024 Dec 09
+
+if exists('b:did_ftplugin')
+ finish
+endif
+let b:did_ftplugin = 1
+
+setlocal formatoptions-=t formatoptions+=croql
+
+setlocal comments=s1:/*,mb:*,ex:*/,://
+setlocal commentstring=//\ %s
+
+let b:undo_ftplugin = "setlocal formatoptions< comments< commentstring<"
+
+" mnv: sw=2 sts=2 et
diff --git a/mnv/runtime/ftplugin/protocols.mnv b/mnv/runtime/ftplugin/protocols.mnv
new file mode 100644
index 0000000000..9429d72592
--- /dev/null
+++ b/mnv/runtime/ftplugin/protocols.mnv
@@ -0,0 +1,19 @@
+" MNV filetype plugin file
+" Language: protocols(5) - Internet protocols definition file
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2008-07-09
+
+if exists("b:did_ftplugin")
+ finish
+endif
+let b:did_ftplugin = 1
+
+let s:cpo_save = &cpo
+set cpo&mnv
+
+let b:undo_ftplugin = "setl com< cms< fo<"
+
+setlocal comments=:# commentstring=#\ %s formatoptions-=t formatoptions+=croql
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/mnv/runtime/ftplugin/ps1.mnv b/mnv/runtime/ftplugin/ps1.mnv
new file mode 100644
index 0000000000..b79e6a1597
--- /dev/null
+++ b/mnv/runtime/ftplugin/ps1.mnv
@@ -0,0 +1,64 @@
+" MNV filetype plugin file
+" Language: Windows PowerShell
+" URL: https://github.com/PProvost/mnv-ps1
+" Last Change: 2021 Apr 02
+" 2024 Jan 14 by MNV Project (browsefilter)
+" 2024 May 23 by Riley Bruins <ribru17@gmail.com> ('commentstring')
+" 2024 Sep 19 by Konfekt (simplify keywordprg #15696)
+" 2025 Jul 22 by phanium (use :hor term #17822)
+
+" Only do this when not done yet for this buffer
+if exists("b:did_ftplugin") | finish | endif
+
+" Don't load another plug-in for this buffer
+let b:did_ftplugin = 1
+
+let s:cpo_save = &cpo
+set cpo&mnv
+
+setlocal tw=0
+setlocal commentstring=#\ %s
+setlocal formatoptions=tcqro
+" Enable autocompletion of hyphenated PowerShell commands,
+" e.g. Get-Content or Get-ADUser
+setlocal iskeyword+=-
+
+" Change the browse dialog on Win32 and GTK to show mainly PowerShell-related files
+if (has("gui_win32") || has("gui_gtk")) && !exists("b:browsefilter")
+ let b:browsefilter =
+ \ "All PowerShell Files (*.ps1, *.psd1, *.psm1, *.ps1xml)\t*.ps1;*.psd1;*.psm1;*.ps1xml\n" .
+ \ "PowerShell Script Files (*.ps1)\t*.ps1\n" .
+ \ "PowerShell Module Files (*.psd1, *.psm1)\t*.psd1;*.psm1\n" .
+ \ "PowerShell XML Files (*.ps1xml)\t*.ps1xml\n"
+ if has("win32")
+ let b:browsefilter .= "All Files (*.*)\t*\n"
+ else
+ let b:browsefilter .= "All Files (*)\t*\n"
+ endif
+endif
+
+" Undo the stuff we changed
+let b:undo_ftplugin = "setlocal tw< cms< fo< iskeyword<" .
+ \ " | unlet! b:browsefilter"
+
+" Look up keywords by Get-Help:
+" check for PowerShell Core in Windows, Linux or MacOS
+if executable('pwsh') | let s:pwsh_cmd = 'pwsh'
+ " on Windows Subsystem for Linux, check for PowerShell Core in Windows
+elseif exists('$WSLENV') && executable('pwsh.exe') | let s:pwsh_cmd = 'pwsh.exe'
+ " check for PowerShell <= 5.1 in Windows
+elseif executable('powershell.exe') | let s:pwsh_cmd = 'powershell.exe'
+endif
+
+if exists('s:pwsh_cmd')
+ if exists(':terminal') == 2
+ command! -buffer -nargs=1 GetHelp silent exe 'hor term ' . s:pwsh_cmd . ' -NoLogo -NoProfile -NonInteractive -ExecutionPolicy RemoteSigned -Command Get-Help -Full "<args>"' . (executable('less') ? ' | less' : '')
+ else
+ command! -buffer -nargs=1 GetHelp echo system(s:pwsh_cmd . ' -NoLogo -NoProfile -NonInteractive -ExecutionPolicy RemoteSigned -Command Get-Help -Full <args>')
+ endif
+ setlocal keywordprg=:GetHelp
+ let b:undo_ftplugin ..= " | setl kp< | sil! delc -buffer GetHelp"
+endif
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/mnv/runtime/ftplugin/ps1xml.mnv b/mnv/runtime/ftplugin/ps1xml.mnv
new file mode 100644
index 0000000000..062552a1e6
--- /dev/null
+++ b/mnv/runtime/ftplugin/ps1xml.mnv
@@ -0,0 +1,40 @@
+" MNV filetype plugin file
+" Language: Windows PowerShell
+" URL: https://github.com/PProvost/mnv-ps1
+" Last Change: 2021 Apr 02
+" 2024 Jan 14 by MNV Project (browsefilter)
+" 2024 May 23 by Riley Bruins <ribru17@gmail.com> ('commentstring')
+
+" Only do this when not done yet for this buffer
+if exists("b:did_ftplugin") | finish | endif
+
+" Don't load another plug-in for this buffer
+let b:did_ftplugin = 1
+
+let s:cpo_save = &cpo
+set cpo&mnv
+
+setlocal tw=0
+setlocal commentstring=#\ %s
+setlocal formatoptions=tcqro
+
+" Change the browse dialog on Win32 and GTK to show mainly PowerShell-related files
+if (has("gui_win32") || has("gui_gtk")) && !exists("b:browsefilter")
+ let b:browsefilter =
+ \ "All PowerShell Files (*.ps1, *.psd1, *.psm1, *.ps1xml)\t*.ps1;*.psd1;*.psm1;*.ps1xml\n" .
+ \ "PowerShell Script Files (*.ps1)\t*.ps1\n" .
+ \ "PowerShell Module Files (*.psd1, *.psm1)\t*.psd1;*.psm1\n" .
+ \ "PowerShell XML Files (*.ps1xml)\t*.ps1xml\n"
+ if has("win32")
+ let b:browsefilter .= "All Files (*.*)\t*\n"
+ else
+ let b:browsefilter .= "All Files (*)\t*\n"
+ endif
+endif
+
+" Undo the stuff we changed
+let b:undo_ftplugin = "setlocal tw< cms< fo<" .
+ \ " | unlet! b:browsefilter"
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/mnv/runtime/ftplugin/ptx.mnv b/mnv/runtime/ftplugin/ptx.mnv
new file mode 100644
index 0000000000..19c2e5fe79
--- /dev/null
+++ b/mnv/runtime/ftplugin/ptx.mnv
@@ -0,0 +1,16 @@
+" MNV filetype plugin file
+" Language: Nvidia PTX (Parellel Thread Execution)
+" Maintainer: Yinzuo Jiang <jiangyinzuo@foxmail.com>
+" Last Change: 2024-12-05
+
+if exists("b:did_ftplugin")
+ finish
+endif
+
+let b:did_ftplugin = 1
+
+" Comments in PTX follow C/C++ syntax
+" See: https://docs.nvidia.com/cuda/parallel-thread-execution/#syntax
+setlocal commentstring=//\ %s
+
+let b:undo_ftplugin = 'setl commentstring<'
diff --git a/mnv/runtime/ftplugin/purescript.mnv b/mnv/runtime/ftplugin/purescript.mnv
new file mode 100644
index 0000000000..de77961ae8
--- /dev/null
+++ b/mnv/runtime/ftplugin/purescript.mnv
@@ -0,0 +1,14 @@
+" MNV filetype plugin
+" Language: purescript
+" Maintainer: Riley Bruins <ribru17@gmail.com>
+" Last Change: 2024 May 19
+
+if exists('b:did_ftplugin')
+ finish
+endif
+let b:did_ftplugin = 1
+
+setl comments=s1f:{-,mb:\ ,ex:-},:--\ \|,:--
+setl commentstring=--\ %s
+
+let b:undo_ftplugin = 'setl com< cms<'
diff --git a/mnv/runtime/ftplugin/pymanifest.mnv b/mnv/runtime/ftplugin/pymanifest.mnv
new file mode 100644
index 0000000000..067270e2bd
--- /dev/null
+++ b/mnv/runtime/ftplugin/pymanifest.mnv
@@ -0,0 +1,13 @@
+" MNV filetype plugin
+" Language: PyPA manifest
+" Maintainer: ObserverOfTime <chronobserver@disroot.org>
+" Last Change: 2023 Aug 08
+
+if exists('b:did_ftplugin')
+ finish
+endif
+let b:did_ftplugin = 1
+
+setl comments=:# commentstring=#\ %s
+
+let b:undo_ftplugin = 'setl com< cms<'
diff --git a/mnv/runtime/ftplugin/pyrex.mnv b/mnv/runtime/ftplugin/pyrex.mnv
new file mode 100644
index 0000000000..21e6acb45c
--- /dev/null
+++ b/mnv/runtime/ftplugin/pyrex.mnv
@@ -0,0 +1,32 @@
+" MNV filetype plugin file
+" Language: Pyrex
+" Maintainer: Marco Barisione <marco.bari@people.it>
+" URL: http://marcobari.altervista.org/pyrex_mnv.html
+" Last Change: 2012 May 18
+" 2024 Jan 14 by MNV Project (browsefilter)
+
+" Only do this when not done yet for this buffer
+if exists("b:did_ftplugin")
+ finish
+endif
+let s:keepcpo= &cpo
+set cpo&mnv
+
+" Behaves just like Python
+runtime! ftplugin/python.mnv ftplugin/python_*.mnv ftplugin/python/*.mnv
+
+if (has("gui_win32") || has("gui_gtk")) && !exists("b:browsefilter")
+ let b:browsefilter = "Pyrex files (*.pyx, *.pxd)\t*.pyx;*.pxd\n" .
+ \ "Python Files (*.py)\t*.py\n" .
+ \ "C Source Files (*.c)\t*.c\n" .
+ \ "C Header Files (*.h)\t*.h\n" .
+ \ "C++ Source Files (*.cpp, *.c++)\t*.cpp;*.c++\n"
+ if has("win32")
+ let b:browsefilter .= "All Files (*.*)\t*\n"
+ else
+ let b:browsefilter .= "All Files (*)\t*\n"
+ endif
+endif
+
+let &cpo = s:keepcpo
+unlet s:keepcpo
diff --git a/mnv/runtime/ftplugin/python.mnv b/mnv/runtime/ftplugin/python.mnv
new file mode 100644
index 0000000000..64f16e7909
--- /dev/null
+++ b/mnv/runtime/ftplugin/python.mnv
@@ -0,0 +1,200 @@
+" MNV filetype plugin file
+" Language: python
+" Maintainer: Tom Picton <tom@tompicton.com>
+" Previous Maintainer: James Sully <sullyj3@gmail.com>
+" Previous Maintainer: Johannes Zellner <johannes@zellner.org>
+" Repository: https://github.com/tpict/mnv-ftplugin-python
+" Last Change: 2024/05/13
+" 2024 Nov 30 use pytest compiler (#16130)
+
+if exists("b:did_ftplugin") | finish | endif
+let b:did_ftplugin = 1
+let s:keepcpo= &cpo
+set cpo&mnv
+
+setlocal cinkeys-=0#
+setlocal indentkeys-=0#
+setlocal include=^\\s*\\(from\\\|import\\)
+setlocal define=^\\s*\\(\\(async\\s\\+\\)\\?def\\\|class\\)
+
+" For imports with leading .., append / and replace additional .s with ../
+let b:grandparent_match = '^\(.\.\)\(\.*\)'
+let b:grandparent_sub = '\=submatch(1)."/".repeat("../",strlen(submatch(2)))'
+
+" For imports with a single leading ., replace it with ./
+let b:parent_match = '^\.\(\.\)\@!'
+let b:parent_sub = './'
+
+" Replace any . sandwiched between word characters with /
+let b:child_match = '\(\w\)\.\(\w\)'
+let b:child_sub = '\1/\2'
+
+setlocal includeexpr=substitute(substitute(substitute(
+ \v:fname,
+ \b:grandparent_match,b:grandparent_sub,''),
+ \b:parent_match,b:parent_sub,''),
+ \b:child_match,b:child_sub,'g')
+
+setlocal suffixesadd=.py
+setlocal comments=b:#,fb:-
+setlocal commentstring=#\ %s
+
+if has('python3')
+ setlocal omnifunc=python3complete#Complete
+elseif has('python')
+ setlocal omnifunc=pythoncomplete#Complete
+endif
+
+set wildignore+=*.pyc
+
+let b:next_toplevel='\v%$\|^(class\|def\|async def)>'
+let b:prev_toplevel='\v^(class\|def\|async def)>'
+let b:next_endtoplevel='\v%$\|\S.*\n+(def\|class)'
+let b:prev_endtoplevel='\v\S.*\n+(def\|class)'
+let b:next='\v%$\|^\s*(class\|def\|async def)>'
+let b:prev='\v^\s*(class\|def\|async def)>'
+let b:next_end='\v\S\n*(%$\|^(\s*\n*)*(class\|def\|async def)\|^\S)'
+let b:prev_end='\v\S\n*(^(\s*\n*)*(class\|def\|async def)\|^\S)'
+
+if !exists('g:no_plugin_maps') && !exists('g:no_python_maps')
+ execute "nnoremap <silent> <buffer> ]] :<C-U>call <SID>Python_jump('n', '". b:next_toplevel."', 'W', v:count1)<cr>"
+ execute "nnoremap <silent> <buffer> [[ :<C-U>call <SID>Python_jump('n', '". b:prev_toplevel."', 'Wb', v:count1)<cr>"
+ execute "nnoremap <silent> <buffer> ][ :<C-U>call <SID>Python_jump('n', '". b:next_endtoplevel."', 'W', v:count1, 0)<cr>"
+ execute "nnoremap <silent> <buffer> [] :<C-U>call <SID>Python_jump('n', '". b:prev_endtoplevel."', 'Wb', v:count1, 0)<cr>"
+ execute "nnoremap <silent> <buffer> ]m :<C-U>call <SID>Python_jump('n', '". b:next."', 'W', v:count1)<cr>"
+ execute "nnoremap <silent> <buffer> [m :<C-U>call <SID>Python_jump('n', '". b:prev."', 'Wb', v:count1)<cr>"
+ execute "nnoremap <silent> <buffer> ]M :<C-U>call <SID>Python_jump('n', '". b:next_end."', 'W', v:count1, 0)<cr>"
+ execute "nnoremap <silent> <buffer> [M :<C-U>call <SID>Python_jump('n', '". b:prev_end."', 'Wb', v:count1, 0)<cr>"
+
+ execute "onoremap <silent> <buffer> ]] :call <SID>Python_jump('o', '". b:next_toplevel."', 'W', v:count1)<cr>"
+ execute "onoremap <silent> <buffer> [[ :call <SID>Python_jump('o', '". b:prev_toplevel."', 'Wb', v:count1)<cr>"
+ execute "onoremap <silent> <buffer> ][ :call <SID>Python_jump('o', '". b:next_endtoplevel."', 'W', v:count1, 0)<cr>"
+ execute "onoremap <silent> <buffer> [] :call <SID>Python_jump('o', '". b:prev_endtoplevel."', 'Wb', v:count1, 0)<cr>"
+ execute "onoremap <silent> <buffer> ]m :call <SID>Python_jump('o', '". b:next."', 'W', v:count1)<cr>"
+ execute "onoremap <silent> <buffer> [m :call <SID>Python_jump('o', '". b:prev."', 'Wb', v:count1)<cr>"
+ execute "onoremap <silent> <buffer> ]M :call <SID>Python_jump('o', '". b:next_end."', 'W', v:count1, 0)<cr>"
+ execute "onoremap <silent> <buffer> [M :call <SID>Python_jump('o', '". b:prev_end."', 'Wb', v:count1, 0)<cr>"
+
+ execute "xnoremap <silent> <buffer> ]] :call <SID>Python_jump('x', '". b:next_toplevel."', 'W', v:count1)<cr>"
+ execute "xnoremap <silent> <buffer> [[ :call <SID>Python_jump('x', '". b:prev_toplevel."', 'Wb', v:count1)<cr>"
+ execute "xnoremap <silent> <buffer> ][ :call <SID>Python_jump('x', '". b:next_endtoplevel."', 'W', v:count1, 0)<cr>"
+ execute "xnoremap <silent> <buffer> [] :call <SID>Python_jump('x', '". b:prev_endtoplevel."', 'Wb', v:count1, 0)<cr>"
+ execute "xnoremap <silent> <buffer> ]m :call <SID>Python_jump('x', '". b:next."', 'W', v:count1)<cr>"
+ execute "xnoremap <silent> <buffer> [m :call <SID>Python_jump('x', '". b:prev."', 'Wb', v:count1)<cr>"
+ execute "xnoremap <silent> <buffer> ]M :call <SID>Python_jump('x', '". b:next_end."', 'W', v:count1, 0)<cr>"
+ execute "xnoremap <silent> <buffer> [M :call <SID>Python_jump('x', '". b:prev_end."', 'Wb', v:count1, 0)<cr>"
+endif
+
+if !exists('*<SID>Python_jump')
+ fun! <SID>Python_jump(mode, motion, flags, count, ...) range
+ let l:startofline = (a:0 >= 1) ? a:1 : 1
+
+ if a:mode == 'x'
+ normal! gv
+ endif
+
+ if l:startofline == 1
+ normal! 0
+ endif
+
+ let cnt = a:count
+ mark '
+ while cnt > 0
+ call search(a:motion, a:flags)
+ let cnt = cnt - 1
+ endwhile
+
+ if l:startofline == 1
+ normal! ^
+ endif
+ endfun
+endif
+
+if has("browsefilter") && !exists("b:browsefilter")
+ let b:browsefilter = "Python Files (*.py)\t*.py\n"
+ if has("win32")
+ let b:browsefilter .= "All Files (*.*)\t*\n"
+ else
+ let b:browsefilter .= "All Files (*)\t*\n"
+ endif
+endif
+
+if !exists("g:python_recommended_style") || g:python_recommended_style != 0
+ " As suggested by PEP8.
+ setlocal expandtab tabstop=4 softtabstop=4 shiftwidth=4
+endif
+
+" Use pydoc for keywordprg.
+" Unix users preferentially get pydoc3, then pydoc2.
+" Windows doesn't have a standalone pydoc executable in $PATH by default, nor
+" does it have separate python2/3 executables, so Windows users just get
+" whichever version corresponds to their installed Python version.
+if executable('python3')
+ setlocal keywordprg=python3\ -m\ pydoc
+elseif executable('python')
+ setlocal keywordprg=python\ -m\ pydoc
+endif
+
+if expand('%:t') =~# '\v^test_.*\.py$|_test\.py$' && executable('pytest')
+ compiler pytest
+ let &l:makeprg .= ' %:S'
+endif
+
+" Script for filetype switching to undo the local stuff we may have changed
+let b:undo_ftplugin = 'setlocal cinkeys<'
+ \ . '|setlocal comments<'
+ \ . '|setlocal commentstring<'
+ \ . '|setlocal expandtab<'
+ \ . '|setlocal include<'
+ \ . '|setlocal includeexpr<'
+ \ . '|setlocal indentkeys<'
+ \ . '|setlocal keywordprg<'
+ \ . '|setlocal omnifunc<'
+ \ . '|setlocal shiftwidth<'
+ \ . '|setlocal softtabstop<'
+ \ . '|setlocal suffixesadd<'
+ \ . '|setlocal tabstop<'
+ \ . '|setlocal makeprg<'
+ \ . '|silent! nunmap <buffer> [M'
+ \ . '|silent! nunmap <buffer> [['
+ \ . '|silent! nunmap <buffer> []'
+ \ . '|silent! nunmap <buffer> [m'
+ \ . '|silent! nunmap <buffer> ]M'
+ \ . '|silent! nunmap <buffer> ]['
+ \ . '|silent! nunmap <buffer> ]]'
+ \ . '|silent! nunmap <buffer> ]m'
+ \ . '|silent! ounmap <buffer> [M'
+ \ . '|silent! ounmap <buffer> [['
+ \ . '|silent! ounmap <buffer> []'
+ \ . '|silent! ounmap <buffer> [m'
+ \ . '|silent! ounmap <buffer> ]M'
+ \ . '|silent! ounmap <buffer> ]['
+ \ . '|silent! ounmap <buffer> ]]'
+ \ . '|silent! ounmap <buffer> ]m'
+ \ . '|silent! xunmap <buffer> [M'
+ \ . '|silent! xunmap <buffer> [['
+ \ . '|silent! xunmap <buffer> []'
+ \ . '|silent! xunmap <buffer> [m'
+ \ . '|silent! xunmap <buffer> ]M'
+ \ . '|silent! xunmap <buffer> ]['
+ \ . '|silent! xunmap <buffer> ]]'
+ \ . '|silent! xunmap <buffer> ]m'
+ \ . '|unlet! b:browsefilter'
+ \ . '|unlet! b:child_match'
+ \ . '|unlet! b:child_sub'
+ \ . '|unlet! b:grandparent_match'
+ \ . '|unlet! b:grandparent_sub'
+ \ . '|unlet! b:next'
+ \ . '|unlet! b:next_end'
+ \ . '|unlet! b:next_endtoplevel'
+ \ . '|unlet! b:next_toplevel'
+ \ . '|unlet! b:parent_match'
+ \ . '|unlet! b:parent_sub'
+ \ . '|unlet! b:prev'
+ \ . '|unlet! b:prev_end'
+ \ . '|unlet! b:prev_endtoplevel'
+ \ . '|unlet! b:prev_toplevel'
+ \ . '|unlet! b:undo_ftplugin'
+
+let &cpo = s:keepcpo
+unlet s:keepcpo
diff --git a/mnv/runtime/ftplugin/qb64.mnv b/mnv/runtime/ftplugin/qb64.mnv
new file mode 100644
index 0000000000..3b6df98002
--- /dev/null
+++ b/mnv/runtime/ftplugin/qb64.mnv
@@ -0,0 +1,26 @@
+" MNV filetype plugin file
+" Language: QB64
+" Maintainer: Doug Kearns <dougkearns@gmail.com>
+
+if exists("b:did_ftplugin")
+ finish
+endif
+
+let s:cpo_save = &cpo
+set cpo&mnv
+
+runtime! ftplugin/basic.mnv
+
+let s:not_end = '\%(end\s\+\)\@<!'
+
+let b:match_words ..= ',' ..
+ \ s:not_end .. '\<declare\>:\<end\s\+declare\>,' ..
+ \ '\<select\s\+everycase\>:\%(select\s\+\)\@<!\<case\%(\s\+\%(else\|is\)\)\=\>:\<end\s\+select\>,' ..
+ \ '$IF\>:$\%(ELSEIF\|ELSE\)\>:$END\s*IF\>'
+
+unlet s:not_end
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
+
+" mnv: nowrap sw=2 sts=2 ts=8 noet fdm=marker:
diff --git a/mnv/runtime/ftplugin/qf.mnv b/mnv/runtime/ftplugin/qf.mnv
new file mode 100644
index 0000000000..283994cd7c
--- /dev/null
+++ b/mnv/runtime/ftplugin/qf.mnv
@@ -0,0 +1,18 @@
+" MNV filetype plugin file
+" Language: MNV's quickfix window
+" Maintainer: Lech Lorens <Lech.Lorens@gmail.com>
+" Last Change: 2019 Jul 15
+
+if exists("b:did_ftplugin")
+ finish
+endif
+
+" Don't load another plugin for this buffer
+let b:did_ftplugin = 1
+
+if !get(g:, 'qf_disable_statusline')
+ let b:undo_ftplugin = "set stl<"
+
+ " Display the command that produced the list in the quickfix window:
+ setlocal stl=%t%{exists('w:quickfix_title')?\ '\ '.w:quickfix_title\ :\ ''}\ %=%-15(%l,%c%V%)\ %P
+endif
diff --git a/mnv/runtime/ftplugin/qml.mnv b/mnv/runtime/ftplugin/qml.mnv
new file mode 100644
index 0000000000..1c09f22fcc
--- /dev/null
+++ b/mnv/runtime/ftplugin/qml.mnv
@@ -0,0 +1,38 @@
+" MNV filetype plugin file
+" Language: QML
+" Maintainer: Chase Knowlden <haroldknowlden@gmail.com>
+" Last Change: 2023 Aug 16
+" 2023 Aug 23 by MNV Project (browsefilter)
+" 2024 May 23 by Riley Bruins <ribru17@gmail.com> ('commentstring')
+
+if exists( 'b:did_ftplugin' )
+ finish
+endif
+let b:did_ftplugin = 1
+
+let s:cpoptions_save = &cpoptions
+set cpoptions&mnv
+
+" command for undo
+let b:undo_ftplugin = "setlocal formatoptions< comments< commentstring<"
+
+if (has("gui_win32") || has("gui_gtk")) && !exists("b:browsefilter")
+ let b:browsefilter =
+ \ "QML Files (*.qml, *.qbs)\t*.qml;*.qbs\n"
+ if has("win32")
+ let b:browsefilter .= "All Files (*.*)\t*\n"
+ else
+ let b:browsefilter .= "All Files (*)\t*\n"
+ endif
+ let b:undo_ftplugin .= " | unlet! b:browsefilter"
+endif
+
+" Set 'comments' to format dashed lists in comments.
+setlocal comments=sO:*\ -,mO:*\ \ ,exO:*/,s1:/*,mb:*,ex:*/,://
+setlocal commentstring=//\ %s
+
+setlocal formatoptions-=t
+setlocal formatoptions+=croql
+
+let &cpoptions = s:cpoptions_save
+unlet s:cpoptions_save
diff --git a/mnv/runtime/ftplugin/quake.mnv b/mnv/runtime/ftplugin/quake.mnv
new file mode 100644
index 0000000000..cc7921e244
--- /dev/null
+++ b/mnv/runtime/ftplugin/quake.mnv
@@ -0,0 +1,19 @@
+" MNV filetype plugin file
+" Language: Quake[1-3] configuration file
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2008-07-09
+
+if exists("b:did_ftplugin")
+ finish
+endif
+let b:did_ftplugin = 1
+
+let s:cpo_save = &cpo
+set cpo&mnv
+
+let b:undo_ftplugin = "setl com< cms< fo<"
+
+setlocal comments=:// commentstring=//\ %s formatoptions-=t formatoptions+=croql
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/mnv/runtime/ftplugin/quarto.mnv b/mnv/runtime/ftplugin/quarto.mnv
new file mode 100644
index 0000000000..bce9ecbbda
--- /dev/null
+++ b/mnv/runtime/ftplugin/quarto.mnv
@@ -0,0 +1,5 @@
+if exists("b:did_ftplugin")
+ finish
+endif
+
+runtime ftplugin/rmd.mnv
diff --git a/mnv/runtime/ftplugin/r.mnv b/mnv/runtime/ftplugin/r.mnv
new file mode 100644
index 0000000000..9ac7cc9977
--- /dev/null
+++ b/mnv/runtime/ftplugin/r.mnv
@@ -0,0 +1,37 @@
+" MNV filetype plugin file
+" Language: R
+" Maintainer: This runtime file is looking for a new maintainer.
+" Former Maintainer: Jakson Alves de Aquino <jalvesaq@gmail.com>
+" Former Repository: https://github.com/jalvesaq/R-MNV-runtime
+" Last Change: 2024 Feb 28 by MNV Project
+
+" Only do this when not yet done for this buffer
+if exists("b:did_ftplugin")
+ finish
+endif
+
+" Don't load another plugin for this buffer
+let b:did_ftplugin = 1
+
+let s:cpo_save = &cpo
+set cpo&mnv
+
+setlocal iskeyword=@,48-57,_,.
+setlocal formatoptions-=t
+setlocal commentstring=#\ %s
+setlocal comments=:#',:###,:##,:#
+
+if (has("gui_win32") || has("gui_gtk")) && !exists("b:browsefilter")
+ let b:browsefilter = "R Source Files (*.R)\t*.R\n" .
+ \ "Files that include R (*.Rnw, *.Rd, *.Rmd, *.Rrst, *.qmd)\t*.Rnw;*.Rd;*.Rmd;*.Rrst;*.qmd\n"
+ if has("win32")
+ let b:browsefilter .= "All Files (*.*)\t*\n"
+ else
+ let b:browsefilter .= "All Files (*)\t*\n"
+ endif
+endif
+
+let b:undo_ftplugin = "setl cms< com< fo< isk< | unlet! b:browsefilter"
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/mnv/runtime/ftplugin/racc.mnv b/mnv/runtime/ftplugin/racc.mnv
new file mode 100644
index 0000000000..b58cec030d
--- /dev/null
+++ b/mnv/runtime/ftplugin/racc.mnv
@@ -0,0 +1,20 @@
+" MNV filetype plugin file
+" Language: Racc input file
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2008-07-09
+
+if exists("b:did_ftplugin")
+ finish
+endif
+let b:did_ftplugin = 1
+
+let s:cpo_save = &cpo
+set cpo&mnv
+
+let b:undo_ftplugin = "setl com< cms< fo<"
+
+setlocal comments=s1:/*,mb:*,ex:*/,:# commentstring=#\ %s
+setlocal formatoptions-=t formatoptions+=croql
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/mnv/runtime/ftplugin/racket.mnv b/mnv/runtime/ftplugin/racket.mnv
new file mode 100644
index 0000000000..e46b28b87b
--- /dev/null
+++ b/mnv/runtime/ftplugin/racket.mnv
@@ -0,0 +1,89 @@
+" MNV filetype plugin
+" Language: Racket
+" Maintainer: D. Ben Knoble <ben.knoble+github@gmail.com>
+" Previous Maintainer: Will Langstroth <will@langstroth.com>
+" URL: https://github.com/benknoble/mnv-racket
+" Last Change: 2025 Aug 09
+" 2026 Mar 31 by MNV project: use shellescape for the K mapping
+" 2026 Apr 01 by MNV project: make K mapping more robust for shell injection
+
+if exists("b:did_ftplugin")
+ finish
+endif
+let b:did_ftplugin = 1
+
+let s:cpo_save = &cpo
+set cpo&mnv
+
+" quick hack to allow adding values
+setlocal iskeyword=@,!,#-',*-:,<-Z,a-z,~,_,94
+
+setlocal shiftwidth=2 softtabstop=2
+
+" Enable auto begin new comment line when continuing from an old comment line
+setlocal comments=:;;;;,:;;;,:;;,:;
+setlocal formatoptions+=r
+
+setlocal commentstring=;;\ %s
+
+setlocal formatprg=raco\ fmt
+
+" Undo our settings when the filetype changes away from Racket
+" (this should be amended if settings/mappings are added above!)
+let b:undo_ftplugin =
+ \ "setlocal iskeyword< shiftwidth< softtabstop< comments< formatoptions< formatprg<"
+ \. " | setlocal commentstring<"
+
+if !exists("no_plugin_maps") && !exists("no_racket_maps")
+ " Simply setting keywordprg like this works:
+ " setlocal keywordprg=raco\ docs
+ " but then mnv says:
+ " "press ENTER or type a command to continue"
+ " We avoid the annoyance of having to hit enter by remapping K directly.
+ function s:RacketDoc(word) abort
+ execute 'silent !raco docs --' shellescape(a:word, v:true)
+ redraw!
+ endfunction
+ nnoremap <buffer> <Plug>RacketDoc :call <SID>RacketDoc(expand('<cword>'))<CR>
+ nmap <buffer> K <Plug>RacketDoc
+
+ " For the visual mode K mapping, it's slightly more convoluted to get the
+ " selected text:
+ function! s:Racket_visual_doc()
+ try
+ let l:old_a = @a
+ normal! gv"ay
+ call system("raco docs -- ". string(shellescape(@a)))
+ redraw!
+ return @a
+ finally
+ let @a = l:old_a
+ endtry
+ endfunction
+
+ xnoremap <buffer> <Plug>RacketDoc :call <SID>Racket_visual_doc()<cr>
+ xmap <buffer> K <Plug>RacketDoc
+
+ let b:undo_ftplugin .=
+ \ " | silent! execute 'nunmap <buffer> K'"
+ \. " | silent! execute 'xunmap <buffer> K'"
+endif
+
+if (has("gui_win32") || has("gui_gtk")) && !exists("b:browsefilter")
+ let b:browsefilter =
+ \ "Racket Source Files (*.rkt, *.rktl)\t*.rkt;*.rktl\n"
+ if has("win32")
+ let b:browsefilter .= "All Files (*.*)\t*\n"
+ else
+ let b:browsefilter .= "All Files (*)\t*\n"
+ endif
+ let b:undo_ftplugin .= " | unlet! b:browsefilter"
+endif
+
+if exists("loaded_matchit") && !exists("b:match_words")
+ let b:match_words = '#|:|#'
+ let b:undo_ftplugin .= " | unlet! b:match_words"
+endif
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/mnv/runtime/ftplugin/raku.mnv b/mnv/runtime/ftplugin/raku.mnv
new file mode 100644
index 0000000000..d6fb6fa553
--- /dev/null
+++ b/mnv/runtime/ftplugin/raku.mnv
@@ -0,0 +1,128 @@
+" MNV filetype plugin file
+" Language: Raku
+" Maintainer: mnv-perl <mnv-perl@googlegroups.com> (need to be subscribed to post)
+" Homepage: https://github.com/Raku/mnv-raku
+" Bugs/requests: https://github.com/Raku/mnv-raku/issues
+" Last Change: 2021 Apr 16
+" 2024 May 23 by Riley Bruins <ribru17@gmail.com> ('commentstring')
+" Contributors: Hinrik Örn Sigurðsson <hinrik.sig@gmail.com>
+"
+" Based on ftplugin/perl.mnv by Dan Sharp <dwsharp at hotmail dot com>
+
+if exists("b:did_ftplugin") | finish | endif
+let b:did_ftplugin = 1
+
+" Make sure the continuation lines below do not cause problems in
+" compatibility mode.
+let s:save_cpo = &cpo
+set cpo-=C
+
+setlocal formatoptions-=t
+setlocal formatoptions+=crqol
+setlocal keywordprg=p6doc
+
+setlocal comments=:#\|,:#=,:#
+setlocal commentstring=#\ %s
+
+" Provided by Ned Konz <ned at bike-nomad dot com>
+"---------------------------------------------
+setlocal include=\\<\\(use\\\|require\\)\\>
+setlocal includeexpr=substitute(v:fname,'::','/','g')
+setlocal suffixesadd=.rakumod,.rakudoc,.pm6,.pm
+setlocal define=[^A-Za-z_]
+
+" The following line changes a global variable but is necessary to make
+" gf and similar commands work. Thanks to Andrew Pimlott for pointing out
+" the problem. If this causes a problem for you, add an
+" after/ftplugin/raku.mnv file that contains
+" set isfname-=:
+set isfname+=:
+setlocal iskeyword=@,48-57,_,192-255,-
+
+" Raku exposes its CompUnits through $*REPO, but mapping module names to
+" compunit paths is nontrivial. Probably it's more convenient to rely on
+" people using zef, which has a handy store of sources for modules it has
+" installed.
+func s:compareReverseFtime(a, b)
+ let atime = getftime(a:a)
+ let btime = getftime(a:b)
+ return atime > btime ? -1 : atime == btime ? 0 : 1
+endfunc
+
+let &l:path = "lib,."
+if exists('$RAKULIB')
+ let &l:path = &l:path . "," . $RAKULIB
+endif
+let &l:path = &l:path . "," . join(
+ \ sort(glob("~/.zef/store/*/*/lib", 0, 1), "s:compareReverseFtime"),
+ \ ',')
+
+" Convert ascii-based ops into their single-character unicode equivalent
+if get(g:, 'raku_unicode_abbrevs', 0)
+ iabbrev <buffer> !(<) ⊄
+ iabbrev <buffer> !(<=) ⊈
+ iabbrev <buffer> !(>) ⊅
+ iabbrev <buffer> !(>=) ⊉
+ iabbrev <buffer> !(cont) ∌
+ iabbrev <buffer> !(elem) ∉
+ iabbrev <buffer> != ≠
+ iabbrev <buffer> (&) ∩
+ iabbrev <buffer> (+) ⊎
+ iabbrev <buffer> (-) ∖
+ iabbrev <buffer> (.) ⊍
+ iabbrev <buffer> (<) ⊂
+ iabbrev <buffer> (<+) ≼
+ iabbrev <buffer> (<=) ⊆
+ iabbrev <buffer> (>) ⊃
+ iabbrev <buffer> (>+) ≽
+ iabbrev <buffer> (>=) ⊇
+ iabbrev <buffer> (\|) ∪
+ iabbrev <buffer> (^) ⊖
+ iabbrev <buffer> (atomic) ⚛
+ iabbrev <buffer> (cont) ∋
+ iabbrev <buffer> (elem) ∈
+ iabbrev <buffer> * ×
+ iabbrev <buffer> **0 ⁰
+ iabbrev <buffer> **1 ¹
+ iabbrev <buffer> **2 ²
+ iabbrev <buffer> **3 ³
+ iabbrev <buffer> **4 ⁴
+ iabbrev <buffer> **5 ⁵
+ iabbrev <buffer> **6 ⁶
+ iabbrev <buffer> **7 ⁷
+ iabbrev <buffer> **8 ⁸
+ iabbrev <buffer> **9 ⁹
+ iabbrev <buffer> ... …
+ iabbrev <buffer> / ÷
+ iabbrev <buffer> << «
+ iabbrev <buffer> <<[=]<< «=«
+ iabbrev <buffer> <<[=]>> «=»
+ iabbrev <buffer> <= ≤
+ iabbrev <buffer> =~= ≅
+ iabbrev <buffer> >= ≥
+ iabbrev <buffer> >> »
+ iabbrev <buffer> >>[=]<< »=«
+ iabbrev <buffer> >>[=]>> »=»
+ iabbrev <buffer> Inf ∞
+ iabbrev <buffer> atomic-add-fetch ⚛+=
+ iabbrev <buffer> atomic-assign ⚛=
+ iabbrev <buffer> atomic-fetch ⚛
+ iabbrev <buffer> atomic-dec-fetch --⚛
+ iabbrev <buffer> atomic-fetch-dec ⚛--
+ iabbrev <buffer> atomic-fetch-inc ⚛++
+ iabbrev <buffer> atomic-inc-fetch ++⚛
+ iabbrev <buffer> atomic-sub-fetch ⚛−=
+ iabbrev <buffer> e 𝑒
+ iabbrev <buffer> o ∘
+ iabbrev <buffer> pi π
+ iabbrev <buffer> set() ∅
+ iabbrev <buffer> tau τ
+endif
+
+" Undo the stuff we changed.
+let b:undo_ftplugin = "setlocal fo< com< cms< inc< inex< def< isf< isk< kp< path<" .
+ \ " | unlet! b:browsefilter"
+
+" Restore the saved compatibility options.
+let &cpo = s:save_cpo
+unlet s:save_cpo
diff --git a/mnv/runtime/ftplugin/rasi.mnv b/mnv/runtime/ftplugin/rasi.mnv
new file mode 100644
index 0000000000..7df7635c0f
--- /dev/null
+++ b/mnv/runtime/ftplugin/rasi.mnv
@@ -0,0 +1,25 @@
+" MNV filetype plugin file
+" Language: RASI
+" Maintainer: Pierrick Guillaume <pierguill@gmail.com>
+" Last Change: 2024 May 21
+
+if exists("b:did_ftplugin")
+ finish
+endif
+let b:did_ftplugin = 1
+
+let s:cpo_save = &cpo
+set cpo&mnv
+
+let b:undo_ftplugin = "setl com< cms< isk< inc<"
+
+setlocal comments=s1:/*,mb:*,ex:*/
+setlocal commentstring=//\ %s
+setlocal iskeyword+=-
+
+let &l:include = '^\s*@import\s\+\%(url(\)\='
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
+
+" mnv: ts=8
diff --git a/mnv/runtime/ftplugin/readline.mnv b/mnv/runtime/ftplugin/readline.mnv
new file mode 100644
index 0000000000..fcf5d97f28
--- /dev/null
+++ b/mnv/runtime/ftplugin/readline.mnv
@@ -0,0 +1,49 @@
+" MNV filetype plugin file
+" Language: readline(3) configuration file
+" Maintainer: Doug Kearns <dougkearns@gmail.com>
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Last Change: 2024 Sep 19 (simplify keywordprg #15696)
+" 2024 Jul 22 by MNV project (use :hor term #17822)
+
+if exists("b:did_ftplugin")
+ finish
+endif
+let b:did_ftplugin = 1
+
+let s:cpo_save = &cpo
+set cpo&mnv
+
+setlocal comments=:#
+setlocal commentstring=#\ %s
+setlocal formatoptions-=t formatoptions+=croql
+
+let b:undo_ftplugin = "setl com< cms< fo<"
+
+if exists("loaded_matchit") && !exists("b:match_words")
+ let b:match_ignorecase = 0
+ let b:match_words = '$if:$else:$endif'
+ let b:undo_ftplugin ..= " | unlet! b:match_ignorecase b:match_words"
+endif
+
+if (has("gui_win32") || has("gui_gtk")) && !exists("b:browsefilter")
+ let b:browsefilter = "Readline Intialization Files (inputrc, .inputrc)\tinputrc;*.inputrc\n"
+ if has("win32")
+ let b:browsefilter ..= "All Files (*.*)\t*\n"
+ else
+ let b:browsefilter ..= "All Files (*)\t*\n"
+ endif
+ let b:undo_ftplugin ..= " | unlet! b:browsefilter"
+endif
+
+if has('unix') && executable('less') && exists(':terminal') == 2
+ command -buffer -nargs=1 ReadlineKeywordPrg
+ \ silent exe 'hor term ' . 'env LESS= MANPAGER="less --pattern=''' . escape('^\s+' . <q-args> . '\b', '\') . ''' --hilite-search" man ' . '3 readline'
+ setlocal iskeyword+=-
+ setlocal keywordprg=:ReadlineKeywordPrg
+ let b:undo_ftplugin .= '| setlocal keywordprg< iskeyword< | sil! delc -buffer ReadlineKeywordPrg'
+endif
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
+
+" mnv: nowrap sw=2 sts=2 ts=8 noet:
diff --git a/mnv/runtime/ftplugin/registry.mnv b/mnv/runtime/ftplugin/registry.mnv
new file mode 100644
index 0000000000..20873b849d
--- /dev/null
+++ b/mnv/runtime/ftplugin/registry.mnv
@@ -0,0 +1,41 @@
+" MNV filetype plugin file
+" Language: Windows Registry export with regedit (*.reg)
+" Maintainer: Cade Forester <ahx2323@gmail.com>
+" Latest Revision: 2014-01-09
+" 2024 Jan 14 by MNV Project (browsefilter)
+
+if exists("b:did_ftplugin")
+ finish
+endif
+let b:did_ftplugin = 1
+
+let s:cpo_save = &cpo
+set cpo&mnv
+
+let b:undo_ftplugin =
+ \ 'setlocal ' .
+ \ 'comments< '.
+ \ 'commentstring< ' .
+ \ 'formatoptions<'
+
+
+if ( has( 'gui_win32' ) || has( 'gui_gtk' ) )
+\ && !exists( 'b:browsefilter' )
+ let b:browsefilter =
+ \ "registry files (*.reg)\t*.reg\n"
+ if has("win32")
+ let b:browsefilter .= "All Files (*.*)\t*\n"
+ else
+ let b:browsefilter .= "All Files (*)\t*\n"
+ endif
+ let b:undo_ftplugin .= " | unlet! b:browsefilter"
+endif
+
+setlocal comments=:;
+setlocal commentstring=;\ %s
+
+setlocal formatoptions-=t
+setlocal formatoptions+=croql
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/mnv/runtime/ftplugin/remind.mnv b/mnv/runtime/ftplugin/remind.mnv
new file mode 100644
index 0000000000..9456b020c9
--- /dev/null
+++ b/mnv/runtime/ftplugin/remind.mnv
@@ -0,0 +1,14 @@
+" MNV filetype plugin file
+" Language: Remind - a sophisticated calendar and alarm
+" Maintainer: Joe Reynolds <joereynolds952@gmail.com>
+" Latest Revision: 2025 April 08
+" License: MNV (see :h license)
+
+if exists("b:did_ftplugin")
+ finish
+endif
+let b:did_ftplugin = 1
+
+setlocal comments=:# commentstring=#\ %s
+
+let b:undo_ftplugin = "setl cms< com<"
diff --git a/mnv/runtime/ftplugin/requirements.mnv b/mnv/runtime/ftplugin/requirements.mnv
new file mode 100644
index 0000000000..4b8ee941ba
--- /dev/null
+++ b/mnv/runtime/ftplugin/requirements.mnv
@@ -0,0 +1,47 @@
+" the Requirements File Format syntax support for MNV
+" Version: 1.8.0
+" Author: raimon <raimon49@hotmail.com>
+" Upstream: https://github.com/raimon49/requirements.txt.mnv
+" License: MIT LICENSE
+" The MIT License (MIT)
+"
+" Copyright (c) 2015 raimon
+"
+" Permission is hereby granted, free of charge, to any person obtaining a copy
+" of this software and associated documentation files (the "Software"), to deal
+" in the Software without restriction, including without limitation the rights
+" to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+" copies of the Software, and to permit persons to whom the Software is
+" furnished to do so, subject to the following conditions:
+"
+" The above copyright notice and this permission notice shall be included in all
+" copies or substantial portions of the Software.
+"
+" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+" IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+" FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+" AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+" LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+" OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+" SOFTWARE.
+if exists("b:did_ftplugin")
+ finish
+endif
+let b:did_ftplugin = 1
+
+let s:save_cpoptions = &cpoptions
+set cpoptions&mnv
+
+let b:undo_ftplugin = "setl iskeyword< commentstring<"
+" pip options contain "-"
+setlocal iskeyword+=-
+setlocal commentstring=#\ %s
+
+if !exists('current_compiler')
+ let b:undo_ftplugin ..= "| compiler make"
+ compiler pip_compile
+endif
+
+let &cpoptions = s:save_cpoptions
+unlet s:save_cpoptions
+" mnv: et sw=4 ts=4 sts=4:
diff --git a/mnv/runtime/ftplugin/rescript.mnv b/mnv/runtime/ftplugin/rescript.mnv
new file mode 100644
index 0000000000..a1b6bd0572
--- /dev/null
+++ b/mnv/runtime/ftplugin/rescript.mnv
@@ -0,0 +1,13 @@
+" MNV filetype plugin
+" Language: rescript
+" Maintainer: Riley Bruins <ribru17@gmail.com>
+" Last Change: 2024 May 21
+
+if exists('b:did_ftplugin')
+ finish
+endif
+let b:did_ftplugin = 1
+
+setl comments=sO:*\ -,mO:*\ \ ,exO:*/,s1:/*,mb:*,ex:*/,:// commentstring=//\ %s
+
+let b:undo_ftplugin = 'setl com< cms<'
diff --git a/mnv/runtime/ftplugin/reva.mnv b/mnv/runtime/ftplugin/reva.mnv
new file mode 100644
index 0000000000..40fc70c366
--- /dev/null
+++ b/mnv/runtime/ftplugin/reva.mnv
@@ -0,0 +1,28 @@
+" MNV ftplugin file
+" Language: Reva Forth
+" Version: 7.1
+" Last Change: 2025 Jun 08
+" Maintainer: Ron Aaron <ron@ronware.org>
+" URL: https://github.com/ronaaron/reva
+" Filetypes: *.rf *.frt
+" NOTE: Forth allows any non-whitespace in a name, so you need to do:
+" setlocal iskeyword=!,@,33-35,%,$,38-64,A-Z,91-96,a-z,123-126,128-255
+"
+" This goes with the syntax/reva.mnv file.
+
+" Only do this when not done yet for this buffer
+if exists("b:did_ftplugin")
+ finish
+endif
+
+" Don't load another plugin for this buffer
+let b:did_ftplugin = 1
+
+setlocal sts=4 sw=4
+setlocal com=s1:/*,mb:*,ex:*/,:\|,:\\
+setlocal cms=//\ %s
+setlocal fo=tcrqol
+setlocal matchpairs+=\::;
+setlocal iskeyword=!,@,33-35,%,$,38-64,A-Z,91-96,a-z,123-126,128-255
+
+let b:undo_ftplugin = "setlocal sts< sw< com< cms< fo< mps< isk<"
diff --git a/mnv/runtime/ftplugin/rhelp.mnv b/mnv/runtime/ftplugin/rhelp.mnv
new file mode 100644
index 0000000000..7536659ffb
--- /dev/null
+++ b/mnv/runtime/ftplugin/rhelp.mnv
@@ -0,0 +1,35 @@
+" MNV filetype plugin file
+" Language: R help file
+" Maintainer: This runtime file is looking for a new maintainer.
+" Former Maintainer: Jakson Alves de Aquino <jalvesaq@gmail.com>
+" Former Repository: https://github.com/jalvesaq/R-MNV-runtime
+" Last Change: 2024 Feb 28 by MNV Project
+
+" Only do this when not yet done for this buffer
+if exists("b:did_ftplugin")
+ finish
+endif
+
+" Don't load another plugin for this buffer
+let b:did_ftplugin = 1
+
+let s:cpo_save = &cpo
+set cpo&mnv
+
+setlocal iskeyword=@,48-57,_,.
+
+if (has("gui_win32") || has("gui_gtk")) && !exists("b:browsefilter")
+ let b:browsefilter = "R Source Files (*.R, *.Rnw, *.Rd, *.Rmd, *.Rrst, *.qmd)\t*.R;*.Rnw;*.Rd;*.Rmd;*.Rrst;*.qmd\n"
+ if has("win32")
+ let b:browsefilter .= "All Files (*.*)\t*\n"
+ else
+ let b:browsefilter .= "All Files (*)\t*\n"
+ endif
+endif
+
+let b:undo_ftplugin = "setl isk< | unlet! b:browsefilter"
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
+
+" mnv: sw=2
diff --git a/mnv/runtime/ftplugin/rmd.mnv b/mnv/runtime/ftplugin/rmd.mnv
new file mode 100644
index 0000000000..155403543c
--- /dev/null
+++ b/mnv/runtime/ftplugin/rmd.mnv
@@ -0,0 +1,87 @@
+" MNV filetype plugin file
+" Language: R Markdown file
+" Maintainer: This runtime file is looking for a new maintainer.
+" Former Maintainer: Jakson Alves de Aquino <jalvesaq@gmail.com>
+" Former Repository: https://github.com/jalvesaq/R-MNV-runtime
+" Last Change:
+" 2024 Feb 28 by MNV Project
+" 2024 Sep 23 by MNV Project: properly restore fex option
+" Original work by Alex Zvoleff (adjusted from R help for rmd by Michel Kuhlmann)
+
+" Only do this when not yet done for this buffer
+if exists("b:did_ftplugin")
+ finish
+endif
+
+if exists('g:rmd_include_html') && g:rmd_include_html
+ runtime! ftplugin/html.mnv ftplugin/html_*.mnv ftplugin/html/*.mnv
+endif
+
+setlocal comments=fb:*,fb:-,fb:+,n:>
+setlocal commentstring=#\ %s
+setlocal formatoptions+=tcqln
+setlocal formatlistpat=^\\s*\\d\\+\\.\\s\\+\\\|^\\s*[-*+]\\s\\+
+setlocal iskeyword=@,48-57,_,.
+
+let s:cpo_save = &cpo
+set cpo&mnv
+
+function FormatRmd()
+ if search("^[ \t]*```[ ]*{r", "bncW") > search("^[ \t]*```$", "bncW")
+ setlocal comments=:#',:###,:##,:#
+ else
+ setlocal comments=fb:*,fb:-,fb:+,n:>
+ endif
+ return 1
+endfunction
+
+let s:last_line = 0
+function SetRmdCommentStr()
+ if line('.') == s:last_line
+ return
+ endif
+ let s:last_line = line('.')
+
+ if (search("^[ \t]*```[ ]*{r", "bncW") > search("^[ \t]*```$", "bncW")) || ((search('^---$', 'Wn') || search('^\.\.\.$', 'Wn')) && search('^---$', 'bnW'))
+ set commentstring=#\ %s
+ else
+ set commentstring=<!--\ %s\ -->
+ endif
+endfunction
+
+" If you do not want both 'comments' and 'commentstring' dynamically defined,
+" put in your mnvrc: let g:rmd_dynamic_comments = 0
+if !exists("g:rmd_dynamic_comments") || (exists("g:rmd_dynamic_comments") && g:rmd_dynamic_comments == 1)
+ setlocal formatexpr=FormatRmd()
+ augroup RmdCStr
+ autocmd!
+ autocmd CursorMoved <buffer> call SetRmdCommentStr()
+ augroup END
+endif
+
+" Enables pandoc if it is installed
+unlet! b:did_ftplugin
+runtime ftplugin/pandoc.mnv
+
+" Don't load another plugin for this buffer
+let b:did_ftplugin = 1
+
+if (has("gui_win32") || has("gui_gtk")) && !exists("b:browsefilter")
+ let b:browsefilter = "R Source Files (*.R, *.Rnw, *.Rd, *.Rmd, *.Rrst, *.qmd)\t*.R;*.Rnw;*.Rd;*.Rmd;*.Rrst;*.qmd\n"
+ if has("win32")
+ let b:browsefilter .= "All Files (*.*)\t*\n"
+ else
+ let b:browsefilter .= "All Files (*)\t*\n"
+ endif
+endif
+
+if exists('b:undo_ftplugin')
+ let b:undo_ftplugin .= " | setl cms< com< fo< flp< isk< fex< | unlet! b:browsefilter"
+else
+ let b:undo_ftplugin = "setl cms< com< fo< flp< isk< fex< | unlet! b:browsefilter"
+endif
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
+
+" mnv: sw=2
diff --git a/mnv/runtime/ftplugin/rnc.mnv b/mnv/runtime/ftplugin/rnc.mnv
new file mode 100644
index 0000000000..9ebf0caefe
--- /dev/null
+++ b/mnv/runtime/ftplugin/rnc.mnv
@@ -0,0 +1,19 @@
+" MNV filetype plugin file
+" Language: Relax NG compact syntax
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2008-07-09
+
+if exists("b:did_ftplugin")
+ finish
+endif
+let b:did_ftplugin = 1
+
+let s:cpo_save = &cpo
+set cpo&mnv
+
+let b:undo_ftplugin = "setl com< cms< fo<"
+
+setlocal comments=:# commentstring=#\ %s formatoptions-=t formatoptions+=croql
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/mnv/runtime/ftplugin/rnoweb.mnv b/mnv/runtime/ftplugin/rnoweb.mnv
new file mode 100644
index 0000000000..270ae1968e
--- /dev/null
+++ b/mnv/runtime/ftplugin/rnoweb.mnv
@@ -0,0 +1,63 @@
+" MNV filetype plugin file
+" Language: Rnoweb
+" Maintainer: This runtime file is looking for a new maintainer.
+" Former Maintainer: Jakson Alves de Aquino <jalvesaq@gmail.com>
+" Former Repository: https://github.com/jalvesaq/R-MNV-runtime
+" Last Change: 2024 Feb 28 by MNV Project
+
+" Only do this when not yet done for this buffer
+if exists("b:did_ftplugin")
+ finish
+endif
+
+let s:cpo_save = &cpo
+set cpo&mnv
+
+runtime! ftplugin/tex.mnv
+
+" Don't load another plugin for this buffer
+let b:did_ftplugin = 1
+
+" Enables MNV-Latex-Suite, LaTeX-Box if installed
+runtime ftplugin/tex_*.mnv
+
+setlocal iskeyword=@,48-57,_,.
+setlocal suffixesadd=.bib,.tex
+setlocal comments=b:%,b:#,b:##,b:###,b:#'
+
+if (has("gui_win32") || has("gui_gtk")) && !exists("b:browsefilter")
+ let b:browsefilter = "R Source Files (*.R, *.Rnw, *.Rd, *.Rmd, *.Rrst, *.qmd)\t*.R;*.Rnw;*.Rd;*.Rmd;*.Rrst;*.qmd\n"
+ if has("win32")
+ let b:browsefilter .= "All Files (*.*)\t*\n"
+ else
+ let b:browsefilter .= "All Files (*)\t*\n"
+ endif
+endif
+
+function SetRnwCommentStr()
+ if (search("^\s*<<.*>>=", "bncW") > search("^@", "bncW"))
+ set commentstring=#\ %s
+ else
+ set commentstring=%\ %s
+ endif
+endfunction
+
+" If you do not want both 'comments' and 'commentstring' dynamically defined,
+" put in your mnvrc: let g:rnw_dynamic_comments = 0
+if !exists("g:rnw_dynamic_comments") || (exists("g:rnw_dynamic_comments") && g:rnw_dynamic_comments == 1)
+ augroup RnwCStr
+ autocmd!
+ autocmd CursorMoved <buffer> call SetRnwCommentStr()
+ augroup END
+endif
+
+if exists('b:undo_ftplugin')
+ let b:undo_ftplugin .= " | setl isk< sua< com< cms< | unlet! b:browsefilter"
+else
+ let b:undo_ftplugin = "setl isk< sua< com< cms< | unlet! b:browsefilter"
+endif
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
+
+" mnv: sw=2
diff --git a/mnv/runtime/ftplugin/roc.mnv b/mnv/runtime/ftplugin/roc.mnv
new file mode 100644
index 0000000000..c66510874d
--- /dev/null
+++ b/mnv/runtime/ftplugin/roc.mnv
@@ -0,0 +1,14 @@
+" Roc filetype plugin file
+" Language: Roc
+" Maintainer: nat-418 <93013864+nat-418@users.noreply.github.com>
+" Latest Revision: 2024-04-5
+
+if exists("b:did_ftplugin")
+ finish
+endif
+let b:did_ftplugin = 1
+
+setlocal comments=:##,:#
+setlocal commentstring=#\ %s
+
+let b:undo_ftplugin = "setl com< cms<"
diff --git a/mnv/runtime/ftplugin/routeros.mnv b/mnv/runtime/ftplugin/routeros.mnv
new file mode 100644
index 0000000000..82d4847475
--- /dev/null
+++ b/mnv/runtime/ftplugin/routeros.mnv
@@ -0,0 +1,34 @@
+" MNV filetype plugin file
+" Language: MikroTik RouterOS Script
+" Maintainer: zainin <z@wintr.dev>
+" Last Change: 2021 Nov 14
+" 2024 Jan 14 by MNV Project (browsefilter)
+
+if exists("b:did_ftplugin")
+ finish
+endif
+let b:did_ftplugin = 1
+
+let s:save_cpo = &cpo
+set cpo-=C
+
+setlocal comments=:#
+setlocal commentstring=#\ %s
+setlocal formatoptions-=t formatoptions+=croql
+
+let b:undo_ftplugin = "setlocal com< cms< fo<"
+
+if (has("gui_win32") || has("gui_gtk")) && !exists("b:browsefilter")
+ let b:browsefilter = "RouterOS Script Files (*.rsc)\t*.rsc\n"
+ if has("win32")
+ let b:browsefilter ..= "All Files (*.*)\t*\n"
+ else
+ let b:browsefilter ..= "All Files (*)\t*\n"
+ endif
+ let b:undo_ftplugin ..= " | unlet! b:browsefilter"
+endif
+
+let &cpo = s:save_cpo
+unlet! s:save_cpo
+
+" mnv: nowrap sw=2 sts=2 ts=8 noet:
diff --git a/mnv/runtime/ftplugin/rpl.mnv b/mnv/runtime/ftplugin/rpl.mnv
new file mode 100644
index 0000000000..ab5b8adbdb
--- /dev/null
+++ b/mnv/runtime/ftplugin/rpl.mnv
@@ -0,0 +1,23 @@
+" MNV filetype plugin file
+" Language: RPL/2
+" Maintainer: Joël BERTRAND <rpl2@free.fr>
+" Last Change: 2025 Jun 08
+" Version: 0.1
+
+" Only do this when not done yet for this buffer
+if exists("b:did_ftplugin")
+ finish
+endif
+
+" Don't load another plugin for this buffer
+let b:did_ftplugin = 1
+
+" Set 'formatoptions' to break comment lines but not other lines,
+" and insert the comment leader when hitting <CR> or using "o".
+setlocal fo-=t fo+=croql
+
+" Set 'comments' to format dashed lists in comments.
+setlocal comments=sO:*\ -,mO:*\ \ ,exO:*/,s1:/*,mb:*,ex:*/,://
+setlocal commentstring=//\ %s
+
+let b:undo_ftplugin = "setlocal fo< comments< commentstring<"
diff --git a/mnv/runtime/ftplugin/rrst.mnv b/mnv/runtime/ftplugin/rrst.mnv
new file mode 100644
index 0000000000..99490aa860
--- /dev/null
+++ b/mnv/runtime/ftplugin/rrst.mnv
@@ -0,0 +1,61 @@
+" MNV filetype plugin file
+" Language: reStructuredText documentation format with R code
+" Maintainer: This runtime file is looking for a new maintainer.
+" Former Maintainer: Jakson Alves de Aquino <jalvesaq@gmail.com>
+" Former Repository: https://github.com/jalvesaq/R-MNV-runtime
+" Last Change:
+" 2024 Feb 28 by MNV Project
+" 2024 Sep 23 by MNV Project: properly restore fex option
+" Original work by Alex Zvoleff
+
+" Only do this when not yet done for this buffer
+if exists("b:did_ftplugin")
+ finish
+endif
+
+" Don't load another plugin for this buffer
+let b:did_ftplugin = 1
+
+let s:cpo_save = &cpo
+set cpo&mnv
+
+setlocal comments=fb:*,fb:-,fb:+,n:>
+setlocal commentstring=#\ %s
+setlocal formatoptions+=tcqln
+setlocal formatlistpat=^\\s*\\d\\+\\.\\s\\+\\\|^\\s*[-*+]\\s\\+
+setlocal iskeyword=@,48-57,_,.
+
+function FormatRrst()
+ if search('^\.\. {r', "bncW") > search('^\.\. \.\.$', "bncW")
+ setlocal comments=:#',:###,:##,:#
+ else
+ setlocal comments=fb:*,fb:-,fb:+,n:>
+ endif
+ return 1
+endfunction
+
+" If you do not want 'comments' dynamically defined, put in your mnvrc:
+" let g:rrst_dynamic_comments = 0
+if !exists("g:rrst_dynamic_comments") || (exists("g:rrst_dynamic_comments") && g:rrst_dynamic_comments == 1)
+ setlocal formatexpr=FormatRrst()
+endif
+
+if (has("gui_win32") || has("gui_gtk")) && !exists("b:browsefilter")
+ let b:browsefilter = "R Source Files (*.R, *.Rnw, *.Rd, *.Rmd, *.Rrst, *.qmd)\t*.R;*.Rnw;*.Rd;*.Rmd;*.Rrst;*.qmd\n"
+ if has("win32")
+ let b:browsefilter .= "All Files (*.*)\t*\n"
+ else
+ let b:browsefilter .= "All Files (*)\t*\n"
+ endif
+endif
+
+if exists('b:undo_ftplugin')
+ let b:undo_ftplugin .= " | setl cms< com< fo< flp< isk< fex< | unlet! b:browsefilter"
+else
+ let b:undo_ftplugin = "setl cms< com< fo< flp< isk< fex< | unlet! b:browsefilter"
+endif
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
+
+" mnv: sw=2
diff --git a/mnv/runtime/ftplugin/rst.mnv b/mnv/runtime/ftplugin/rst.mnv
new file mode 100644
index 0000000000..32da87fa2a
--- /dev/null
+++ b/mnv/runtime/ftplugin/rst.mnv
@@ -0,0 +1,52 @@
+" reStructuredText filetype plugin file
+" Language: reStructuredText documentation format
+" Maintainer: Marshall Ward <marshall.ward@gmail.com>
+" Original Maintainer: Nikolai Weibull <now@bitwi.se>
+" Website: https://github.com/marshallward/mnv-restructuredtext
+" Latest Revision: 2020-03-31
+" 2025 Oct 13 by MNV project: update b:undo_ftplugin #18566
+" 2026 Jan 11 by MNV project: set suffixesadd #19149
+
+if exists("b:did_ftplugin")
+ finish
+endif
+let b:did_ftplugin = 1
+
+let s:cpo_save = &cpo
+set cpo&mnv
+
+"Disable folding
+if !exists('g:rst_fold_enabled')
+ let g:rst_fold_enabled = 0
+endif
+
+let b:undo_ftplugin = "setlocal comments< commentstring< expandtab< formatoptions< suffixesadd<"
+
+setlocal comments=fb:.. commentstring=..\ %s expandtab
+setlocal formatoptions+=tcroql
+setlocal suffixesadd=.rst
+
+" reStructuredText standard recommends that tabs be expanded to 8 spaces
+" The choice of 3-space indentation is to provide slightly better support for
+" directives (..) and ordered lists (1.), although it can cause problems for
+" many other cases.
+"
+" More sophisticated indentation rules should be revisited in the future.
+
+if exists("g:rst_style") && g:rst_style != 0
+ setlocal expandtab shiftwidth=3 softtabstop=3 tabstop=8
+ let b:undo_ftplugin .= " | setlocal softtabstop< shiftwidth< tabstop<"
+endif
+
+if g:rst_fold_enabled != 0
+ setlocal foldmethod=expr
+ setlocal foldexpr=RstFold#GetRstFold()
+ setlocal foldtext=RstFold#GetRstFoldText()
+ augroup RstFold
+ autocmd TextChanged,InsertLeave <buffer> unlet! b:RstFoldCache
+ augroup END
+ let b:undo_ftplugin .= " | setlocal foldexpr< foldmethod< foldtext<"
+endif
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/mnv/runtime/ftplugin/ruby.mnv b/mnv/runtime/ftplugin/ruby.mnv
new file mode 100644
index 0000000000..0a4976a4da
--- /dev/null
+++ b/mnv/runtime/ftplugin/ruby.mnv
@@ -0,0 +1,461 @@
+" MNV filetype plugin
+" Language: Ruby
+" Maintainer: Tim Pope <mnvNOSPAM@tpope.org>
+" URL: https://github.com/mnv-ruby/mnv-ruby
+" Last Change: 2023 Dec 31
+" 2024 Jan 14 by MNV Project (browsefilter)
+
+if (exists("b:did_ftplugin"))
+ finish
+endif
+let b:did_ftplugin = 1
+
+let s:cpo_save = &cpo
+set cpo&mnv
+
+if has("gui_running") && !has("gui_win32")
+ setlocal keywordprg=ri\ -T\ -f\ bs
+else
+ setlocal keywordprg=ri
+endif
+
+" Matchit support
+if exists("loaded_matchit") && !exists("b:match_words")
+ let b:match_ignorecase = 0
+
+ let b:match_words =
+ \ '{\|\<\%(if\|unless\|case\|while\|until\|for\|do\|class\|module\|def\|=\@<!begin\)\>=\@!' .
+ \ ':' .
+ \ '\<\%(else\|elsif\|ensure\|when\|rescue\|break\|redo\|next\|retry\)\>' .
+ \ ':' .
+ \ '}\|\%(^\|[^.\:@$=]\)\@<=\<end\:\@!\>' .
+ \ ',^=begin\>:^=end\>,' .
+ \ ',\[:\],(:)'
+
+ let b:match_skip =
+ \ "synIDattr(synID(line('.'),col('.'),0),'name') =~ '" .
+ \ "\\<ruby\\%(String\\|.\+Delimiter\\|Character\\|.\+Escape\\|" .
+ \ "Regexp\\|Interpolation\\|Comment\\|Documentation\\|" .
+ \ "ConditionalModifier\\|RepeatModifier\\|RescueModifier\\|OptionalDo\\|" .
+ \ "MethodName\\|BlockArgument\\|KeywordAsMethod\\|ClassVariable\\|" .
+ \ "InstanceVariable\\|GlobalVariable\\|Symbol\\)\\>'"
+endif
+
+setlocal formatoptions-=t formatoptions+=croql
+
+setlocal include=^\\s*\\<\\(load\\>\\\|require\\>\\\|autoload\\s*:\\=[\"']\\=\\h\\w*[\"']\\=,\\)
+setlocal suffixesadd=.rb
+
+if exists("&ofu") && has("ruby")
+ setlocal omnifunc=rubycomplete#Complete
+endif
+
+" TODO:
+"setlocal define=^\\s*def
+
+setlocal comments=b:#
+setlocal commentstring=#\ %s
+
+if !exists('g:ruby_version_paths')
+ let g:ruby_version_paths = {}
+endif
+
+let s:path_split = has('win32') ? ';' : ':'
+
+function! s:query_path(root) abort
+ " Disabled by default for security reasons.
+ if !get(g:, 'ruby_exec', get(g:, 'plugin_exec', 0)) || empty(a:root)
+ return map(split($RUBYLIB, s:path_split), 'v:val ==# "." ? "" : v:val')
+ endif
+ let code = "print $:.join %q{,}"
+ if &shellxquote == "'"
+ let args = ' --disable-gems -e "' . code . '"'
+ else
+ let args = " --disable-gems -e '" . code . "'"
+ endif
+
+ let cd = haslocaldir() ? 'lcd' : exists(':tcd') && haslocaldir(-1) ? 'tcd' : 'cd'
+ let cwd = fnameescape(getcwd())
+ try
+ exe cd fnameescape(a:root)
+ for dir in split($PATH, s:path_split)
+ if dir !=# '.' && executable(dir . '/ruby') == 1
+ let exepath = dir . '/ruby'
+ break
+ endif
+ endfor
+ if exists('l:exepath')
+ let path = split(system(exepath . args),',')
+ if v:shell_error
+ let path = []
+ endif
+ else
+ let path = []
+ endif
+ exe cd cwd
+ return path
+ finally
+ exe cd cwd
+ endtry
+endfunction
+
+function! s:build_path(path) abort
+ let path = join(map(copy(a:path), 'v:val ==# "." ? "" : v:val'), ',')
+ if &g:path =~# '\v^%(\.,)=%(/%(usr|emx)/include,)=,$'
+ let path = path . ',.,,'
+ elseif &g:path =~# ',\.,,$'
+ let path = &g:path[0:-4] . path . ',.,,'
+ elseif &g:path =~# ',,$'
+ let path = &g:path[0:-2] . path . ',,'
+ else
+ let path = substitute(&g:path, '[^,]\zs$', ',', '') . path
+ endif
+ return path
+endfunction
+
+if !exists('b:ruby_version') && !exists('g:ruby_path') && isdirectory(expand('%:p:h'))
+ let s:version_file = findfile('.ruby-version', '.;')
+ if !empty(s:version_file) && filereadable(s:version_file)
+ let b:ruby_version = get(readfile(s:version_file, '', 1), '')
+ if !has_key(g:ruby_version_paths, b:ruby_version)
+ let g:ruby_version_paths[b:ruby_version] = s:query_path(fnamemodify(s:version_file, ':p:h'))
+ endif
+ endif
+endif
+
+if exists("g:ruby_path")
+ let s:ruby_path = type(g:ruby_path) == type([]) ? join(g:ruby_path, ',') : g:ruby_path
+elseif has_key(g:ruby_version_paths, get(b:, 'ruby_version', ''))
+ let s:ruby_paths = g:ruby_version_paths[b:ruby_version]
+ let s:ruby_path = s:build_path(s:ruby_paths)
+else
+ if !exists('g:ruby_default_path')
+ if has("ruby") && has("win32")
+ ruby ::MNV::command( 'let g:ruby_default_path = split("%s",",")' % $:.join(%q{,}) )
+ else
+ let g:ruby_default_path = s:query_path($HOME)
+ endif
+ endif
+ let s:ruby_paths = g:ruby_default_path
+ let s:ruby_path = s:build_path(s:ruby_paths)
+endif
+
+if stridx(&l:path, s:ruby_path) == -1
+ let &l:path = s:ruby_path
+endif
+if exists('s:ruby_paths') && stridx(&l:tags, join(map(copy(s:ruby_paths),'v:val."/tags"'),',')) == -1
+ let &l:tags = &tags . ',' . join(map(copy(s:ruby_paths),'v:val."/tags"'),',')
+endif
+
+if (has("gui_win32") || has("gui_gtk")) && !exists("b:browsefilter")
+ let b:browsefilter = "Ruby Source Files (*.rb)\t*.rb\n"
+ if has("win32")
+ let b:browsefilter .= "All Files (*.*)\t*\n"
+ else
+ let b:browsefilter .= "All Files (*)\t*\n"
+ endif
+endif
+
+let b:undo_ftplugin = "setl inc= sua= path= tags= fo< com< cms< kp="
+ \."| unlet! b:browsefilter b:match_ignorecase b:match_words b:match_skip"
+ \."| if exists('&ofu') && has('ruby') | setl ofu< | endif"
+
+if get(g:, 'ruby_recommended_style', 1)
+ setlocal shiftwidth=2 softtabstop=2 expandtab
+ let b:undo_ftplugin .= ' | setl sw< sts< et<'
+endif
+
+" To activate, :set ballooneval
+if exists('+balloonexpr') && get(g:, 'ruby_balloonexpr')
+ setlocal balloonexpr=RubyBalloonexpr()
+ let b:undo_ftplugin .= "| setl bexpr="
+endif
+
+function! s:map(mode, flags, map) abort
+ let from = matchstr(a:map, '\S\+')
+ if empty(mapcheck(from, a:mode))
+ exe a:mode.'map' '<buffer>' a:flags a:map
+ let b:undo_ftplugin .= '|sil! '.a:mode.'unmap <buffer> '.from
+ endif
+endfunction
+
+cmap <buffer><script><expr> <Plug><ctag> substitute(RubyCursorTag(),'^$',"\022\027",'')
+cmap <buffer><script><expr> <Plug><cfile> substitute(RubyCursorFile(),'^$',"\022\006",'')
+let b:undo_ftplugin .= "| sil! cunmap <buffer> <Plug><ctag>| sil! cunmap <buffer> <Plug><cfile>"
+
+if !exists("g:no_plugin_maps") && !exists("g:no_ruby_maps")
+ nmap <buffer><script> <SID>: :<C-U>
+ nmap <buffer><script> <SID>c: :<C-U><C-R>=v:count ? v:count : ''<CR>
+ cmap <buffer> <SID><cfile> <Plug><cfile>
+ cmap <buffer> <SID><ctag> <Plug><ctag>
+
+ nnoremap <silent> <buffer> [m :<C-U>call <SID>searchsyn('\<def\>',['rubyDefine'],'b','n')<CR>
+ nnoremap <silent> <buffer> ]m :<C-U>call <SID>searchsyn('\<def\>',['rubyDefine'],'','n')<CR>
+ nnoremap <silent> <buffer> [M :<C-U>call <SID>searchsyn('\<end\>',['rubyDefine'],'b','n')<CR>
+ nnoremap <silent> <buffer> ]M :<C-U>call <SID>searchsyn('\<end\>',['rubyDefine'],'','n')<CR>
+ xnoremap <silent> <buffer> [m :<C-U>call <SID>searchsyn('\<def\>',['rubyDefine'],'b','v')<CR>
+ xnoremap <silent> <buffer> ]m :<C-U>call <SID>searchsyn('\<def\>',['rubyDefine'],'','v')<CR>
+ xnoremap <silent> <buffer> [M :<C-U>call <SID>searchsyn('\<end\>',['rubyDefine'],'b','v')<CR>
+ xnoremap <silent> <buffer> ]M :<C-U>call <SID>searchsyn('\<end\>',['rubyDefine'],'','v')<CR>
+
+ nnoremap <silent> <buffer> [[ :<C-U>call <SID>searchsyn('\<\%(class\<Bar>module\)\>',['rubyModule','rubyClass'],'b','n')<CR>
+ nnoremap <silent> <buffer> ]] :<C-U>call <SID>searchsyn('\<\%(class\<Bar>module\)\>',['rubyModule','rubyClass'],'','n')<CR>
+ nnoremap <silent> <buffer> [] :<C-U>call <SID>searchsyn('\<end\>',['rubyModule','rubyClass'],'b','n')<CR>
+ nnoremap <silent> <buffer> ][ :<C-U>call <SID>searchsyn('\<end\>',['rubyModule','rubyClass'],'','n')<CR>
+ xnoremap <silent> <buffer> [[ :<C-U>call <SID>searchsyn('\<\%(class\<Bar>module\)\>',['rubyModule','rubyClass'],'b','v')<CR>
+ xnoremap <silent> <buffer> ]] :<C-U>call <SID>searchsyn('\<\%(class\<Bar>module\)\>',['rubyModule','rubyClass'],'','v')<CR>
+ xnoremap <silent> <buffer> [] :<C-U>call <SID>searchsyn('\<end\>',['rubyModule','rubyClass'],'b','v')<CR>
+ xnoremap <silent> <buffer> ][ :<C-U>call <SID>searchsyn('\<end\>',['rubyModule','rubyClass'],'','v')<CR>
+
+ let b:undo_ftplugin = b:undo_ftplugin
+ \."| sil! exe 'unmap <buffer> [[' | sil! exe 'unmap <buffer> ]]' | sil! exe 'unmap <buffer> []' | sil! exe 'unmap <buffer> ]['"
+ \."| sil! exe 'unmap <buffer> [m' | sil! exe 'unmap <buffer> ]m' | sil! exe 'unmap <buffer> [M' | sil! exe 'unmap <buffer> ]M'"
+
+ if maparg('im','x') == '' && maparg('im','o') == '' && maparg('am','x') == '' && maparg('am','o') == ''
+ onoremap <silent> <buffer> im :<C-U>call <SID>wrap_i('[m',']M')<CR>
+ onoremap <silent> <buffer> am :<C-U>call <SID>wrap_a('[m',']M')<CR>
+ xnoremap <silent> <buffer> im :<C-U>call <SID>wrap_i('[m',']M')<CR>
+ xnoremap <silent> <buffer> am :<C-U>call <SID>wrap_a('[m',']M')<CR>
+ let b:undo_ftplugin = b:undo_ftplugin
+ \."| sil! exe 'ounmap <buffer> im' | sil! exe 'ounmap <buffer> am'"
+ \."| sil! exe 'xunmap <buffer> im' | sil! exe 'xunmap <buffer> am'"
+ endif
+
+ if maparg('iM','x') == '' && maparg('iM','o') == '' && maparg('aM','x') == '' && maparg('aM','o') == ''
+ onoremap <silent> <buffer> iM :<C-U>call <SID>wrap_i('[[','][')<CR>
+ onoremap <silent> <buffer> aM :<C-U>call <SID>wrap_a('[[','][')<CR>
+ xnoremap <silent> <buffer> iM :<C-U>call <SID>wrap_i('[[','][')<CR>
+ xnoremap <silent> <buffer> aM :<C-U>call <SID>wrap_a('[[','][')<CR>
+ let b:undo_ftplugin = b:undo_ftplugin
+ \."| sil! exe 'ounmap <buffer> iM' | sil! exe 'ounmap <buffer> aM'"
+ \."| sil! exe 'xunmap <buffer> iM' | sil! exe 'xunmap <buffer> aM'"
+ endif
+
+ call s:map('c', '', '<C-R><C-F> <Plug><cfile>')
+
+ cmap <buffer><script><expr> <SID>tagzv &foldopen =~# 'tag' ? '<Bar>norm! zv' : ''
+ call s:map('n', '<script><silent>', '<C-]> <SID>:exe v:count1."tag <SID><ctag>"<SID>tagzv<CR>')
+ call s:map('n', '<script><silent>', 'g<C-]> <SID>:exe "tjump <SID><ctag>"<SID>tagzv<CR>')
+ call s:map('n', '<script><silent>', 'g] <SID>:exe "tselect <SID><ctag>"<SID>tagzv<CR>')
+ call s:map('n', '<script><silent>', '<C-W>] <SID>:exe v:count1."stag <SID><ctag>"<SID>tagzv<CR>')
+ call s:map('n', '<script><silent>', '<C-W><C-]> <SID>:exe v:count1."stag <SID><ctag>"<SID>tagzv<CR>')
+ call s:map('n', '<script><silent>', '<C-W>g<C-]> <SID>:exe "stjump <SID><ctag>"<SID>tagzv<CR>')
+ call s:map('n', '<script><silent>', '<C-W>g] <SID>:exe "stselect <SID><ctag>"<SID>tagzv<CR>')
+ call s:map('n', '<script><silent>', '<C-W>} <SID>:exe v:count1."ptag <SID><ctag>"<CR>')
+ call s:map('n', '<script><silent>', '<C-W>g} <SID>:exe "ptjump <SID><ctag>"<CR>')
+
+ call s:map('n', '<script><silent>', 'gf <SID>c:find <SID><cfile><CR>')
+ call s:map('n', '<script><silent>', '<C-W>f <SID>c:sfind <SID><cfile><CR>')
+ call s:map('n', '<script><silent>', '<C-W><C-F> <SID>c:sfind <SID><cfile><CR>')
+ call s:map('n', '<script><silent>', '<C-W>gf <SID>c:tabfind <SID><cfile><CR>')
+endif
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
+
+if exists("g:did_ruby_ftplugin_functions")
+ finish
+endif
+let g:did_ruby_ftplugin_functions = 1
+
+function! RubyBalloonexpr() abort
+ if !exists('s:ri_found')
+ let s:ri_found = executable('ri')
+ endif
+ if s:ri_found
+ let line = getline(v:beval_lnum)
+ let b = matchstr(strpart(line,0,v:beval_col),'\%(\w\|[:.]\)*$')
+ let a = substitute(matchstr(strpart(line,v:beval_col),'^\w*\%([?!]\|\s*=\)\?'),'\s\+','','g')
+ let str = b.a
+ let before = strpart(line,0,v:beval_col-strlen(b))
+ let after = strpart(line,v:beval_col+strlen(a))
+ if str =~ '^\.'
+ let str = substitute(str,'^\.','#','g')
+ if before =~ '\]\s*$'
+ let str = 'Array'.str
+ elseif before =~ '}\s*$'
+ " False positives from blocks here
+ let str = 'Hash'.str
+ elseif before =~ "[\"'`]\\s*$" || before =~ '\$\d\+\s*$'
+ let str = 'String'.str
+ elseif before =~ '\$\d\+\.\d\+\s*$'
+ let str = 'Float'.str
+ elseif before =~ '\$\d\+\s*$'
+ let str = 'Integer'.str
+ elseif before =~ '/\s*$'
+ let str = 'Regexp'.str
+ else
+ let str = substitute(str,'^#','.','')
+ endif
+ endif
+ let str = substitute(str,'.*\.\s*to_f\s*\.\s*','Float#','')
+ let str = substitute(str,'.*\.\s*to_i\%(nt\)\=\s*\.\s*','Integer#','')
+ let str = substitute(str,'.*\.\s*to_s\%(tr\)\=\s*\.\s*','String#','')
+ let str = substitute(str,'.*\.\s*to_sym\s*\.\s*','Symbol#','')
+ let str = substitute(str,'.*\.\s*to_a\%(ry\)\=\s*\.\s*','Array#','')
+ let str = substitute(str,'.*\.\s*to_proc\s*\.\s*','Proc#','')
+ if str !~ '^\w'
+ return ''
+ endif
+ silent! let res = substitute(system("ri -f rdoc -T \"".str.'"'),'\n$','','')
+ if res =~ '^Nothing known about' || res =~ '^Bad argument:' || res =~ '^More than one method'
+ return ''
+ endif
+ return res
+ else
+ return ""
+ endif
+endfunction
+
+function! s:searchsyn(pattern, syn, flags, mode) abort
+ let cnt = v:count1
+ norm! m'
+ if a:mode ==# 'v'
+ norm! gv
+ endif
+ let i = 0
+ call map(a:syn, 'hlID(v:val)')
+ while i < cnt
+ let i = i + 1
+ let line = line('.')
+ let col = col('.')
+ let pos = search(a:pattern,'W'.a:flags)
+ while pos != 0 && index(a:syn, s:synid()) < 0
+ let pos = search(a:pattern,'W'.a:flags)
+ endwhile
+ if pos == 0
+ call cursor(line,col)
+ return
+ endif
+ endwhile
+endfunction
+
+function! s:synid() abort
+ return synID(line('.'),col('.'),0)
+endfunction
+
+function! s:wrap_i(back,forward) abort
+ execute 'norm! k'
+ execute 'norm '.a:forward
+ let line = line('.')
+ execute 'norm '.a:back
+ if line('.') == line - 1
+ return s:wrap_a(a:back,a:forward)
+ endif
+ execute 'norm! jV'
+ execute 'norm '.a:forward
+ execute 'norm! k'
+endfunction
+
+function! s:wrap_a(back,forward) abort
+ execute 'norm '.a:forward
+ if line('.') < line('$') && getline(line('.')+1) ==# ''
+ let after = 1
+ endif
+ execute 'norm '.a:back
+ while getline(line('.')-1) =~# '^\s*#' && line('.')
+ -
+ endwhile
+ if exists('after')
+ execute 'norm! V'
+ execute 'norm '.a:forward
+ execute 'norm! j'
+ elseif line('.') > 1 && getline(line('.')-1) =~# '^\s*$'
+ execute 'norm! kV'
+ execute 'norm '.a:forward
+ else
+ execute 'norm! V'
+ execute 'norm '.a:forward
+ endif
+endfunction
+
+function! RubyCursorIdentifier() abort
+ let asciicode = '\%(\w\|[]})\"'."'".']\)\@<!\%(?\%(\\M-\\C-\|\\C-\\M-\|\\M-\\c\|\\c\\M-\|\\c\|\\C-\|\\M-\)\=\%(\\\o\{1,3}\|\\x\x\{1,2}\|\\\=\S\)\)'
+ let number = '\%(\%(\w\|[]})\"'."'".']\s*\)\@<!-\)\=\%(\<[[:digit:]_]\+\%(\.[[:digit:]_]\+\)\=\%([Ee][[:digit:]_]\+\)\=\>\|\<0[xXbBoOdD][[:xdigit:]_]\+\>\)\|'.asciicode
+ let operator = '\%(\[\]\|<<\|<=>\|[!<>]=\=\|===\=\|[!=]\~\|>>\|\*\*\|\.\.\.\=\|=>\|[~^&|*/%+-]\)'
+ let method = '\%(\.[_a-zA-Z]\w*\s*=>\@!\|\<[_a-zA-Z]\w*\>[?!]\=\)'
+ let global = '$\%([!$&"'."'".'*+,./:;<=>?@\`~]\|-\=\w\+\>\)'
+ let symbolizable = '\%(\%(@@\=\)\w\+\>\|'.global.'\|'.method.'\|'.operator.'\)'
+ let pattern = '\C\s*\%('.number.'\|\%(:\@<!:\)\='.symbolizable.'\)'
+ let [lnum, col] = searchpos(pattern,'bcn',line('.'))
+ let raw = matchstr(getline('.')[col-1 : ],pattern)
+ let stripped = substitute(substitute(raw,'\s\+=$','=',''),'^\s*[:.]\=','','')
+ return stripped == '' ? expand("<cword>") : stripped
+endfunction
+
+function! RubyCursorTag() abort
+ return substitute(RubyCursorIdentifier(), '^[$@]*', '', '')
+endfunction
+
+function! RubyCursorFile() abort
+ let isfname = &isfname
+ try
+ set isfname+=:
+ let cfile = expand('<cfile>')
+ finally
+ let isfname = &isfname
+ endtry
+ let pre = matchstr(strpart(getline('.'), 0, col('.')-1), '.*\f\@<!')
+ let post = matchstr(strpart(getline('.'), col('.')), '\f\@!.*')
+ if s:synid() ==# hlID('rubyConstant')
+ let cfile = substitute(cfile,'\.\w\+[?!=]\=$','','')
+ let cfile = substitute(cfile,'^::','','')
+ let cfile = substitute(cfile,'::','/','g')
+ let cfile = substitute(cfile,'\(\u\+\)\(\u\l\)','\1_\2', 'g')
+ let cfile = substitute(cfile,'\(\l\|\d\)\(\u\)','\1_\2', 'g')
+ return tolower(cfile) . '.rb'
+ elseif getline('.') =~# '^\s*require_relative\s*\(["'']\).*\1\s*$'
+ let cfile = expand('%:p:h') . '/' . matchstr(getline('.'),'\(["'']\)\zs.\{-\}\ze\1')
+ let cfile .= cfile !~# '\.rb$' ? '.rb' : ''
+ elseif getline('.') =~# '^\s*\%(require[( ]\|load[( ]\|autoload[( ]:\w\+,\)\s*\%(::\)\=File\.expand_path(\(["'']\)\.\./.*\1,\s*__FILE__)\s*$'
+ let target = matchstr(getline('.'),'\(["'']\)\.\.\zs/.\{-\}\ze\1')
+ let cfile = expand('%:p:h') . target
+ let cfile .= cfile !~# '\.rb$' ? '.rb' : ''
+ elseif getline('.') =~# '^\s*\%(require \|load \|autoload :\w\+,\)\s*\(["'']\).*\1\s*$'
+ let cfile = matchstr(getline('.'),'\(["'']\)\zs.\{-\}\ze\1')
+ let cfile .= cfile !~# '\.rb$' ? '.rb' : ''
+ elseif pre.post =~# '\<File.expand_path[( ].*[''"]\{2\}, *__FILE__\>' && cfile =~# '^\.\.'
+ let cfile = expand('%:p:h') . strpart(cfile, 2)
+ else
+ return substitute(cfile, '\C\v^(.*):(\d+)%(:in)=$', '+\2 \1', '')
+ endif
+ let cwdpat = '^\M' . substitute(getcwd(), '[\/]', '\\[\\/]', 'g').'\ze\[\/]'
+ let cfile = substitute(cfile, cwdpat, '.', '')
+ if fnameescape(cfile) !=# cfile
+ return '+ '.fnameescape(cfile)
+ else
+ return cfile
+ endif
+endfunction
+
+"
+" Instructions for enabling "matchit" support:
+"
+" 1. Look for the latest "matchit" plugin at
+"
+" http://www.mnv.org/scripts/script.php?script_id=39
+"
+" It is also packaged with MNV, in the $MNVRUNTIME/macros directory.
+"
+" 2. Copy "matchit.txt" into a "doc" directory (e.g. $HOME/.mnv/doc).
+"
+" 3. Copy "matchit.mnv" into a "plugin" directory (e.g. $HOME/.mnv/plugin).
+"
+" 4. Ensure this file (ftplugin/ruby.mnv) is installed.
+"
+" 5. Ensure you have this line in your $HOME/.mnvrc:
+" filetype plugin on
+"
+" 6. Restart MNV and create the matchit documentation:
+"
+" :helptags ~/.mnv/doc
+"
+" Now you can do ":help matchit", and you should be able to use "%" on Ruby
+" keywords. Try ":echo b:match_words" to be sure.
+"
+" Thanks to Mark J. Reed for the instructions. See ":help mnvrc" for the
+" locations of plugin directories, etc., as there are several options, and it
+" differs on Windows. Email gsinclair@soyabean.com.au if you need help.
+"
+
+" mnv: nowrap sw=2 sts=2 ts=8:
diff --git a/mnv/runtime/ftplugin/rust.mnv b/mnv/runtime/ftplugin/rust.mnv
new file mode 100644
index 0000000000..bb71e85396
--- /dev/null
+++ b/mnv/runtime/ftplugin/rust.mnv
@@ -0,0 +1,243 @@
+" Language: Rust
+" Description: MNV ftplugin for Rust
+" Maintainer: Chris Morgan <me@chrismorgan.info>
+" Last Change: 2024 Mar 17
+" 2024 May 23 by Riley Bruins <ribru17@gmail.com ('commentstring')
+" 2025 Dec 09 update 'textwidth# to 100 #18892
+" For bugs, patches and license go to https://github.com/rust-lang/rust.mnv
+
+if exists("b:did_ftplugin")
+ finish
+endif
+let b:did_ftplugin = 1
+
+" vint: -ProhibitAbbreviationOption
+let s:save_cpo = &cpo
+set cpo&mnv
+" vint: +ProhibitAbbreviationOption
+
+if get(b:, 'current_compiler', '') ==# ''
+ if strlen(findfile('Cargo.toml', '.;')) > 0
+ compiler cargo
+ else
+ compiler rustc
+ endif
+endif
+
+" Variables {{{1
+
+" The rust source code at present seems to typically omit a leader on /*!
+" comments, so we'll use that as our default, but make it easy to switch.
+" This does not affect indentation at all (I tested it with and without
+" leader), merely whether a leader is inserted by default or not.
+if get(g:, 'rust_bang_comment_leader', 0)
+ " Why is the `,s0:/*,mb:\ ,ex:*/` there, you ask? I don't understand why,
+ " but without it, */ gets indented one space even if there were no
+ " leaders. I'm fairly sure that's a MNV bug.
+ setlocal comments=s1:/*,mb:*,ex:*/,s0:/*,mb:\ ,ex:*/,:///,://!,://
+else
+ setlocal comments=s0:/*!,ex:*/,s1:/*,mb:*,ex:*/,:///,://!,://
+endif
+setlocal commentstring=//\ %s
+setlocal formatoptions-=t formatoptions+=croqnl
+" j was only added in 7.3.541, so stop complaints about its nonexistence
+silent! setlocal formatoptions+=j
+
+" smartindent will be overridden by indentexpr if filetype indent is on, but
+" otherwise it's better than nothing.
+setlocal smartindent nocindent
+
+if get(g:, 'rust_recommended_style', 1)
+ let b:rust_set_style = 1
+ setlocal shiftwidth=4 softtabstop=4 expandtab
+ setlocal textwidth=100
+endif
+
+setlocal include=\\v^\\s*(pub\\s+)?use\\s+\\zs(\\f\|:)+
+setlocal includeexpr=rust#IncludeExpr(v:fname)
+
+setlocal suffixesadd=.rs
+
+if exists("g:ftplugin_rust_source_path")
+ let &l:path=g:ftplugin_rust_source_path . ',' . &l:path
+endif
+
+if exists("g:loaded_delimitMate")
+ if exists("b:delimitMate_excluded_regions")
+ let b:rust_original_delimitMate_excluded_regions = b:delimitMate_excluded_regions
+ endif
+
+ augroup rust.mnv.DelimitMate
+ autocmd!
+
+ autocmd User delimitMate_map :call rust#delimitmate#onMap()
+ autocmd User delimitMate_unmap :call rust#delimitmate#onUnmap()
+ augroup END
+endif
+
+" Integration with auto-pairs (https://github.com/jiangmiao/auto-pairs)
+if exists("g:AutoPairsLoaded") && !get(g:, 'rust_keep_autopairs_default', 0)
+ let b:AutoPairs = {'(':')', '[':']', '{':'}','"':'"', '`':'`'}
+endif
+
+if has("folding") && get(g:, 'rust_fold', 0)
+ let b:rust_set_foldmethod=1
+ setlocal foldmethod=syntax
+ if g:rust_fold == 2
+ setlocal foldlevel<
+ else
+ setlocal foldlevel=99
+ endif
+endif
+
+if has('conceal') && get(g:, 'rust_conceal', 0)
+ let b:rust_set_conceallevel=1
+ setlocal conceallevel=2
+endif
+
+" Motion Commands {{{1
+if !exists("g:no_plugin_maps") && !exists("g:no_rust_maps")
+ " Bind motion commands to support hanging indents
+ nnoremap <silent> <buffer> [[ :call rust#Jump('n', 'Back')<CR>
+ nnoremap <silent> <buffer> ]] :call rust#Jump('n', 'Forward')<CR>
+ xnoremap <silent> <buffer> [[ :call rust#Jump('v', 'Back')<CR>
+ xnoremap <silent> <buffer> ]] :call rust#Jump('v', 'Forward')<CR>
+ onoremap <silent> <buffer> [[ :call rust#Jump('o', 'Back')<CR>
+ onoremap <silent> <buffer> ]] :call rust#Jump('o', 'Forward')<CR>
+endif
+
+" Commands {{{1
+
+" See |:RustRun| for docs
+command! -nargs=* -complete=file -bang -buffer RustRun call rust#Run(<bang>0, <q-args>)
+
+" See |:RustExpand| for docs
+command! -nargs=* -complete=customlist,rust#CompleteExpand -bang -buffer RustExpand call rust#Expand(<bang>0, <q-args>)
+
+" See |:RustEmitIr| for docs
+command! -nargs=* -buffer RustEmitIr call rust#Emit("llvm-ir", <q-args>)
+
+" See |:RustEmitAsm| for docs
+command! -nargs=* -buffer RustEmitAsm call rust#Emit("asm", <q-args>)
+
+" See |:RustPlay| for docs
+command! -range=% -buffer RustPlay :call rust#Play(<count>, <line1>, <line2>, <f-args>)
+
+" See |:RustFmt| for docs
+command! -bar -buffer RustFmt call rustfmt#Format()
+
+" See |:RustFmtRange| for docs
+command! -range -buffer RustFmtRange call rustfmt#FormatRange(<line1>, <line2>)
+
+" See |:RustInfo| for docs
+command! -bar -buffer RustInfo call rust#debugging#Info()
+
+" See |:RustInfoToClipboard| for docs
+command! -bar -buffer RustInfoToClipboard call rust#debugging#InfoToClipboard()
+
+" See |:RustInfoToFile| for docs
+command! -bar -nargs=1 -buffer RustInfoToFile call rust#debugging#InfoToFile(<f-args>)
+
+" See |:RustTest| for docs
+command! -buffer -nargs=* -count -bang RustTest call rust#Test(<q-mods>, <count>, <bang>0, <q-args>)
+
+if !exists("b:rust_last_rustc_args") || !exists("b:rust_last_args")
+ let b:rust_last_rustc_args = []
+ let b:rust_last_args = []
+endif
+
+" Cleanup {{{1
+
+let b:undo_ftplugin = "
+ \ compiler make |
+ \ setlocal formatoptions< comments< commentstring< include< includeexpr< suffixesadd<
+ \|if exists('b:rust_set_style')
+ \|setlocal tabstop< shiftwidth< softtabstop< expandtab< textwidth<
+ \|endif
+ \|if exists('b:rust_original_delimitMate_excluded_regions')
+ \|let b:delimitMate_excluded_regions = b:rust_original_delimitMate_excluded_regions
+ \|unlet b:rust_original_delimitMate_excluded_regions
+ \|else
+ \|unlet! b:delimitMate_excluded_regions
+ \|endif
+ \|if exists('b:rust_set_foldmethod')
+ \|setlocal foldmethod< foldlevel<
+ \|unlet b:rust_set_foldmethod
+ \|endif
+ \|if exists('b:rust_set_conceallevel')
+ \|setlocal conceallevel<
+ \|unlet b:rust_set_conceallevel
+ \|endif
+ \|unlet! b:rust_last_rustc_args b:rust_last_args
+ \|delcommand -buffer RustRun
+ \|delcommand -buffer RustExpand
+ \|delcommand -buffer RustEmitIr
+ \|delcommand -buffer RustEmitAsm
+ \|delcommand -buffer RustPlay
+ \|delcommand -buffer RustFmt
+ \|delcommand -buffer RustFmtRange
+ \|delcommand -buffer RustInfo
+ \|delcommand -buffer RustInfoToClipboard
+ \|delcommand -buffer RustInfoToFile
+ \|delcommand -buffer RustTest
+ \|silent! nunmap <buffer> [[
+ \|silent! nunmap <buffer> ]]
+ \|silent! xunmap <buffer> [[
+ \|silent! xunmap <buffer> ]]
+ \|silent! ounmap <buffer> [[
+ \|silent! ounmap <buffer> ]]
+ \|setlocal matchpairs-=<:>
+ \|unlet b:match_skip
+ \"
+
+" }}}1
+
+" Code formatting on save
+augroup rust.mnv.PreWrite
+ autocmd!
+ autocmd BufWritePre *.rs silent! call rustfmt#PreWrite()
+augroup END
+
+setlocal matchpairs+=<:>
+" For matchit.mnv (rustArrow stops `Fn() -> X` messing things up)
+let b:match_skip = 's:comment\|string\|rustCharacter\|rustArrow'
+
+command! -buffer -nargs=+ Cargo call cargo#cmd(<q-args>)
+command! -buffer -nargs=* Cbuild call cargo#build(<q-args>)
+command! -buffer -nargs=* Ccheck call cargo#check(<q-args>)
+command! -buffer -nargs=* Cclean call cargo#clean(<q-args>)
+command! -buffer -nargs=* Cdoc call cargo#doc(<q-args>)
+command! -buffer -nargs=+ Cnew call cargo#new(<q-args>)
+command! -buffer -nargs=* Cinit call cargo#init(<q-args>)
+command! -buffer -nargs=* Crun call cargo#run(<q-args>)
+command! -buffer -nargs=* Ctest call cargo#test(<q-args>)
+command! -buffer -nargs=* Cbench call cargo#bench(<q-args>)
+command! -buffer -nargs=* Cupdate call cargo#update(<q-args>)
+command! -buffer -nargs=* Csearch call cargo#search(<q-args>)
+command! -buffer -nargs=* Cpublish call cargo#publish(<q-args>)
+command! -buffer -nargs=* Cinstall call cargo#install(<q-args>)
+command! -buffer -nargs=* Cruntarget call cargo#runtarget(<q-args>)
+
+let b:undo_ftplugin .= '
+ \|delcommand -buffer Cargo
+ \|delcommand -buffer Cbuild
+ \|delcommand -buffer Ccheck
+ \|delcommand -buffer Cclean
+ \|delcommand -buffer Cdoc
+ \|delcommand -buffer Cnew
+ \|delcommand -buffer Cinit
+ \|delcommand -buffer Crun
+ \|delcommand -buffer Ctest
+ \|delcommand -buffer Cbench
+ \|delcommand -buffer Cupdate
+ \|delcommand -buffer Csearch
+ \|delcommand -buffer Cpublish
+ \|delcommand -buffer Cinstall
+ \|delcommand -buffer Cruntarget'
+
+" vint: -ProhibitAbbreviationOption
+let &cpo = s:save_cpo
+unlet s:save_cpo
+" vint: +ProhibitAbbreviationOption
+
+" mnv: set et sw=4 sts=4 ts=8:
diff --git a/mnv/runtime/ftplugin/samba.mnv b/mnv/runtime/ftplugin/samba.mnv
new file mode 100644
index 0000000000..82edb027c2
--- /dev/null
+++ b/mnv/runtime/ftplugin/samba.mnv
@@ -0,0 +1,14 @@
+" MNV filetype plugin
+" Language: smb.conf(5) configuration file
+" Maintainer: Matt Perry <matt@mattperry.com>
+" Last Change: 2025 Feb 13
+
+if exists('b:did_ftplugin')
+ finish
+endif
+let b:did_ftplugin = 1
+
+setlocal comments=:;,:# commentstring=#\ %s
+setlocal formatoptions-=t formatoptions+=croql
+
+let b:undo_ftplugin = 'setl com< cms< fo<'
diff --git a/mnv/runtime/ftplugin/sass.mnv b/mnv/runtime/ftplugin/sass.mnv
new file mode 100644
index 0000000000..6d3206a59a
--- /dev/null
+++ b/mnv/runtime/ftplugin/sass.mnv
@@ -0,0 +1,42 @@
+" MNV filetype plugin
+" Language: Sass
+" Maintainer: Tim Pope <mnvNOSPAM@tpope.org>
+" Last Change: 2023 Dec 28
+
+" Only do this when not done yet for this buffer
+if exists("b:did_ftplugin")
+ finish
+endif
+let b:did_ftplugin = 1
+
+let b:undo_ftplugin = "setl com< cms< def< inc< inex< ofu< sua<"
+
+setlocal comments=://
+setlocal commentstring=//\ %s
+setlocal includeexpr=SassIncludeExpr(v:fname)
+setlocal omnifunc=csscomplete#CompleteCSS
+setlocal suffixesadd=.sass,.scss,.css
+if &filetype =~# '\<s[ac]ss]\>'
+ setlocal iskeyword+=-
+ setlocal iskeyword+=$
+ setlocal iskeyword+=%
+ let b:undo_ftplugin .= ' isk<'
+endif
+
+if get(g:, 'sass_recommended_style', 1)
+ setlocal shiftwidth=2 softtabstop=2 expandtab
+ let b:undo_ftplugin .= ' sw< sts< et<'
+endif
+
+let &l:define = '^\C\v\s*%(\@function|\@mixin|\=)|^\s*%(\$[[:alnum:]-]+:|[%.][:alnum:]-]+\s*%(\{|$))@='
+let &l:include = '^\s*@import\s\+\%(url(\)\=["'']\='
+
+function! SassIncludeExpr(file) abort
+ let partial = substitute(a:file, '\%(.*/\|^\)\zs', '_', '')
+ if !empty(findfile(partial))
+ return partial
+ endif
+ return a:file
+endfunction
+
+" mnv:set sw=2:
diff --git a/mnv/runtime/ftplugin/sbt.mnv b/mnv/runtime/ftplugin/sbt.mnv
new file mode 100644
index 0000000000..dc114a6ddb
--- /dev/null
+++ b/mnv/runtime/ftplugin/sbt.mnv
@@ -0,0 +1,14 @@
+" MNV filetype plugin file
+" Language: sbt
+" Maintainer: Steven Dobay <stevendobay at protonmail.com>
+" License: Same as MNV
+" Last Change: 2017.04.30
+" ----------------------------------------------------------------------------
+
+if exists('b:did_ftplugin') || &cp
+ finish
+endif
+
+runtime! ftplugin/scala.mnv
+
+let b:did_ftplugin = 1
diff --git a/mnv/runtime/ftplugin/scala.mnv b/mnv/runtime/ftplugin/scala.mnv
new file mode 100644
index 0000000000..fe4641a5e1
--- /dev/null
+++ b/mnv/runtime/ftplugin/scala.mnv
@@ -0,0 +1,38 @@
+" MNV filetype plugin file
+" Language: Scala
+" Maintainer: Derek Wyatt
+" URL: https://github.com/derekwyatt/mnv-scala
+" License: Same as MNV
+" Last Change: 11 August 2021
+" 2023 Aug 28 by MNV Project (undo_ftplugin)
+" ----------------------------------------------------------------------------
+
+if exists('b:did_ftplugin') || &cp
+ finish
+endif
+let b:did_ftplugin = 1
+
+" j is fairly new in MNV, so don't complain if it's not there
+setlocal formatoptions-=t formatoptions+=croqnl
+silent! setlocal formatoptions+=j
+
+" Just like c.mnv, but additionally doesn't wrap text onto /** line when
+" formatting. Doesn't bungle bulleted lists when formatting.
+if get(g:, 'scala_scaladoc_indent', 0)
+ setlocal comments=sO:*\ -,mO:*\ \ ,exO:*/,s2:/**,mb:*,ex:*/,s1:/*,mb:*,ex:*/,://
+else
+ setlocal comments=sO:*\ -,mO:*\ \ ,exO:*/,s1:/**,mb:*,ex:*/,s1:/*,mb:*,ex:*/,://
+endif
+setlocal commentstring=//\ %s
+
+setlocal shiftwidth=2 softtabstop=2 expandtab
+
+setlocal include=^\\s*import
+setlocal includeexpr=substitute(v:fname,'\\.','/','g')
+
+setlocal path+=src/main/scala,src/test/scala
+setlocal suffixesadd=.scala
+
+let b:undo_ftplugin = "setlocal cms< com< et< fo< inc< inex< pa< sts< sua< sw<"
+
+" mnv:set sw=2 sts=2 ts=8 et:
diff --git a/mnv/runtime/ftplugin/scdoc.mnv b/mnv/runtime/ftplugin/scdoc.mnv
new file mode 100644
index 0000000000..f8846892af
--- /dev/null
+++ b/mnv/runtime/ftplugin/scdoc.mnv
@@ -0,0 +1,23 @@
+" scdoc filetype plugin
+" Maintainer: Gregory Anders <contact@gpanders.com>
+" Last Updated: 2022 May 09
+" 2024 May 23 by Riley Bruins <ribru17@gmail.com> ('commentstring')
+" Upstream: https://github.com/gpanders/mnv-scdoc
+
+" Only do this when not done yet for this buffer
+if exists('b:did_ftplugin')
+ finish
+endif
+
+" Don't load another plugin for this buffer
+let b:did_ftplugin = 1
+
+setlocal comments=b:;
+setlocal commentstring=;\ %s
+setlocal formatoptions+=t
+setlocal noexpandtab
+setlocal shiftwidth=0
+setlocal softtabstop=0
+setlocal textwidth=80
+
+let b:undo_ftplugin = 'setl com< cms< fo< et< sw< sts< tw<'
diff --git a/mnv/runtime/ftplugin/scheme.mnv b/mnv/runtime/ftplugin/scheme.mnv
new file mode 100644
index 0000000000..e76b696aaf
--- /dev/null
+++ b/mnv/runtime/ftplugin/scheme.mnv
@@ -0,0 +1,61 @@
+" MNV filetype plugin file
+" Language: Scheme (R7RS)
+" Last Change: 2024 Jun 21
+" 2024 May 23 by Riley Bruins <ribru17@gmail.com> ('commentstring')
+" Author: Evan Hanson <evhan@foldling.org>
+" Maintainer: Evan Hanson <evhan@foldling.org>
+" Previous Maintainer: Sergey Khorev <sergey.khorev@gmail.com>
+" Repository: https://git.foldling.org/mnv-scheme.git
+" URL: https://foldling.org/mnv/ftplugin/scheme.mnv
+
+if exists('b:did_ftplugin')
+ finish
+endif
+
+let s:cpo = &cpo
+set cpo&mnv
+
+setl lisp
+setl comments=:;;;;,:;;;,:;;,:;,sr:#\|,mb:\|,ex:\|#
+setl commentstring=;\ %s
+setl define=^\\s*(def\\k*
+setl iskeyword=33,35-39,42-43,45-58,60-90,94,95,97-122,126
+setl formatoptions-=t
+
+let b:undo_ftplugin = 'setl lisp< comments< commentstring< define< iskeyword< formatoptions<'
+
+setl lispwords+=case
+setl lispwords+=define
+setl lispwords+=define-library
+setl lispwords+=define-record-type
+setl lispwords+=define-syntax
+setl lispwords+=define-values
+setl lispwords+=do
+setl lispwords+=guard
+setl lispwords+=lambda
+setl lispwords+=let
+setl lispwords+=let*
+setl lispwords+=let*-values
+setl lispwords+=let-syntax
+setl lispwords+=let-values
+setl lispwords+=letrec
+setl lispwords+=letrec*
+setl lispwords+=letrec-syntax
+setl lispwords+=parameterize
+setl lispwords+=set!
+setl lispwords+=syntax-rules
+setl lispwords+=unless
+setl lispwords+=when
+
+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.mnv
+endif
+
+unlet b:did_scheme_ftplugin
+let b:did_ftplugin = 1
+let &cpo = s:cpo
+unlet s:cpo
diff --git a/mnv/runtime/ftplugin/screen.mnv b/mnv/runtime/ftplugin/screen.mnv
new file mode 100644
index 0000000000..80c8fe076f
--- /dev/null
+++ b/mnv/runtime/ftplugin/screen.mnv
@@ -0,0 +1,19 @@
+" MNV filetype plugin file
+" Language: screen(1) configuration file
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2008-07-09
+
+if exists("b:did_ftplugin")
+ finish
+endif
+let b:did_ftplugin = 1
+
+let s:cpo_save = &cpo
+set cpo&mnv
+
+let b:undo_ftplugin = "setl com< cms< fo<"
+
+setlocal comments=:# commentstring=#\ %s formatoptions-=t formatoptions+=croql
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/mnv/runtime/ftplugin/scss.mnv b/mnv/runtime/ftplugin/scss.mnv
new file mode 100644
index 0000000000..6c54467298
--- /dev/null
+++ b/mnv/runtime/ftplugin/scss.mnv
@@ -0,0 +1,13 @@
+" MNV filetype plugin
+" Language: SCSS
+" Maintainer: Tim Pope <mnvNOSPAM@tpope.org>
+" Last Change: 2016 Aug 29
+
+if exists("b:did_ftplugin")
+ finish
+endif
+
+runtime! ftplugin/sass.mnv
+setlocal comments=s1:/*,mb:*,ex:*/,://
+
+" mnv:set sw=2:
diff --git a/mnv/runtime/ftplugin/sed.mnv b/mnv/runtime/ftplugin/sed.mnv
new file mode 100644
index 0000000000..c5ad6e7b64
--- /dev/null
+++ b/mnv/runtime/ftplugin/sed.mnv
@@ -0,0 +1,33 @@
+" MNV filetype plugin file
+" Language: sed
+" Maintainer: Doug Kearns <dougkearns@gmail.com>
+" Last Change: 2024 Jan 14
+
+if exists("b:did_ftplugin")
+ finish
+endif
+let b:did_ftplugin = 1
+
+let s:cpo_save = &cpo
+set cpo&mnv
+
+setlocal comments=:#
+setlocal commentstring=#\ %s
+setlocal formatoptions-=t formatoptions+=croql
+
+let b:undo_ftplugin = "setl com< cms< fo<"
+
+if (has("gui_win32") || has("gui_gtk")) && !exists("b:browsefilter")
+ let b:browsefilter = "sed Script Files (*.sed)\t*.sed\n"
+ if has("win32")
+ let b:browsefilter ..= "All Files (*.*)\t*\n"
+ else
+ let b:browsefilter ..= "All Files (*)\t*\n"
+ endif
+ let b:undo_ftplugin ..= " | unlet! b:browsefilter"
+endif
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
+
+" mnv: nowrap sw=2 sts=2 ts=8
diff --git a/mnv/runtime/ftplugin/sensors.mnv b/mnv/runtime/ftplugin/sensors.mnv
new file mode 100644
index 0000000000..f4a99c984b
--- /dev/null
+++ b/mnv/runtime/ftplugin/sensors.mnv
@@ -0,0 +1,19 @@
+" MNV filetype plugin file
+" Language: sensors.conf(5) - libsensors configuration file
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2008-07-09
+
+if exists("b:did_ftplugin")
+ finish
+endif
+let b:did_ftplugin = 1
+
+let s:cpo_save = &cpo
+set cpo&mnv
+
+let b:undo_ftplugin = "setl com< cms< fo<"
+
+setlocal comments=:# commentstring=#\ %s formatoptions-=t formatoptions+=croql
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/mnv/runtime/ftplugin/services.mnv b/mnv/runtime/ftplugin/services.mnv
new file mode 100644
index 0000000000..2f789b7f65
--- /dev/null
+++ b/mnv/runtime/ftplugin/services.mnv
@@ -0,0 +1,19 @@
+" MNV filetype plugin file
+" Language: services(5) - Internet network services list
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2008-07-09
+
+if exists("b:did_ftplugin")
+ finish
+endif
+let b:did_ftplugin = 1
+
+let s:cpo_save = &cpo
+set cpo&mnv
+
+let b:undo_ftplugin = "setl com< cms< fo<"
+
+setlocal comments=:# commentstring=#\ %s formatoptions-=t formatoptions+=croql
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/mnv/runtime/ftplugin/setserial.mnv b/mnv/runtime/ftplugin/setserial.mnv
new file mode 100644
index 0000000000..79d18da982
--- /dev/null
+++ b/mnv/runtime/ftplugin/setserial.mnv
@@ -0,0 +1,19 @@
+" MNV filetype plugin file
+" Language: setserial(8) configuration file
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2008-07-09
+
+if exists("b:did_ftplugin")
+ finish
+endif
+let b:did_ftplugin = 1
+
+let s:cpo_save = &cpo
+set cpo&mnv
+
+let b:undo_ftplugin = "setl com< cms< fo<"
+
+setlocal comments=:# commentstring=#\ %s formatoptions-=t formatoptions+=croql
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/mnv/runtime/ftplugin/sexplib.mnv b/mnv/runtime/ftplugin/sexplib.mnv
new file mode 100644
index 0000000000..5af3a8d953
--- /dev/null
+++ b/mnv/runtime/ftplugin/sexplib.mnv
@@ -0,0 +1,18 @@
+" MNV filetype plugin file
+" Language: Sexplib
+" Maintainer: Markus Mottl <markus.mottl@gmail.com>
+" URL: https://github.com/ocaml/mnv-ocaml
+" Last Change:
+" 2023 Aug 28 - Added undo_ftplugin (MNV Project)
+" 2017 Apr 12 - First version (MM)
+
+if exists("b:did_ftplugin")
+ finish
+endif
+let b:did_ftplugin=1
+
+" Comment string
+setl commentstring=;\ %s
+setl comments=:;
+
+let b:undo_ftplugin = "setl cms< com<"
diff --git a/mnv/runtime/ftplugin/sgml.mnv b/mnv/runtime/ftplugin/sgml.mnv
new file mode 100644
index 0000000000..b710be0ab8
--- /dev/null
+++ b/mnv/runtime/ftplugin/sgml.mnv
@@ -0,0 +1,47 @@
+" MNV filetype plugin file
+" Language: sgml
+"
+" This runtime file is looking for a new maintainer.
+"
+" Former maintainer: Dan Sharp
+" Last Change: 2009 Jan 20
+" 2024 Jan 14 by MNV Project (browsefilter)
+
+if exists("b:did_ftplugin") | finish | endif
+
+" Make sure the continuation lines below do not cause problems in
+" compatibility mode.
+let s:save_cpo = &cpo
+set cpo-=C
+
+" Define some defaults in case the included ftplugins don't set them.
+let s:undo_ftplugin = ""
+let s:browsefilter = "XML Files (*.xml)\t*.xml\n"
+if has("win32")
+ let s:browsefilter .= "All Files (*.*)\t*\n"
+else
+ let s:browsefilter .= "All Files (*)\t*\n"
+endif
+
+runtime! ftplugin/xml.mnv ftplugin/xml_*.mnv ftplugin/xml/*.mnv
+let b:did_ftplugin = 1
+
+" Override our defaults if these were set by an included ftplugin.
+if exists("b:undo_ftplugin")
+ let s:undo_ftplugin = b:undo_ftplugin
+endif
+if exists("b:browsefilter")
+ let s:browsefilter = b:browsefilter
+endif
+
+" Change the :browse e filter to primarily show xml-related files.
+if (has("gui_win32") || has("gui_gtk")) && !exists("b:browsefilter")
+ let b:browsefilter="SGML Files (*.sgml,*.sgm)\t*.sgm*\n" . s:browsefilter
+endif
+
+" Undo the stuff we changed.
+let b:undo_ftplugin = "unlet! b:browsefilter | " . s:undo_ftplugin
+
+" Restore the saved compatibility options.
+let &cpo = s:save_cpo
+unlet s:save_cpo
diff --git a/mnv/runtime/ftplugin/sh.mnv b/mnv/runtime/ftplugin/sh.mnv
new file mode 100644
index 0000000000..571b65afbb
--- /dev/null
+++ b/mnv/runtime/ftplugin/sh.mnv
@@ -0,0 +1,80 @@
+" MNV filetype plugin file
+" Language: sh
+" Maintainer: Doug Kearns <dougkearns@gmail.com>
+" Previous Maintainer: Dan Sharp
+" Contributor: Enno Nagel <ennonagel+mnv@gmail.com>
+" Eisuke Kawashima
+" Last Change: 2024 Sep 19 by MNV Project (compiler shellcheck)
+" 2024 Dec 29 by MNV Project (improve setting shellcheck compiler)
+" 2025 Mar 09 by MNV Project (set b:match_skip)
+" 2025 Jul 22 by phanium (use :hor term #17822)
+
+if exists("b:did_ftplugin")
+ finish
+endif
+let b:did_ftplugin = 1
+
+let s:save_cpo = &cpo
+set cpo-=C
+
+setlocal comments=b:#
+setlocal commentstring=#\ %s
+setlocal formatoptions-=t formatoptions+=croql
+
+let b:undo_ftplugin = "setl com< cms< fo<"
+
+" Shell: thanks to Johannes Zellner
+if exists("loaded_matchit") && !exists("b:match_words")
+ let b:match_ignorecase = 0
+ let s:sol = '\%(;\s*\|^\s*\)\@<=' " start of line
+ let b:match_words =
+ \ s:sol .. 'if\>:' .. s:sol.'elif\>:' .. s:sol.'else\>:' .. s:sol .. 'fi\>,' ..
+ \ s:sol .. '\%(for\|while\)\>:' .. s:sol .. 'done\>,' ..
+ \ s:sol .. 'case\>:' .. s:sol .. 'esac\>'
+ unlet s:sol
+ let b:match_skip = "synIDattr(synID(line('.'),col('.'),0),'name') =~ 'shSnglCase'"
+ let b:undo_ftplugin ..= " | unlet! b:match_ignorecase b:match_words b:match_skip"
+endif
+
+if (has("gui_win32") || has("gui_gtk")) && !exists("b:browsefilter")
+ let b:browsefilter = "Bourne Shell Scripts (*.sh)\t*.sh\n" ..
+ \ "Korn Shell Scripts (*.ksh)\t*.ksh\n" ..
+ \ "Bash Shell Scripts (*.bash)\t*.bash\n"
+ if has("win32")
+ let b:browsefilter ..= "All Files (*.*)\t*\n"
+ else
+ let b:browsefilter ..= "All Files (*)\t*\n"
+ endif
+ let b:undo_ftplugin ..= " | unlet! b:browsefilter"
+endif
+
+let s:is_sh = get(b:, "is_sh", get(g:, "is_sh", 0))
+let s:is_bash = get(b:, "is_bash", get(g:, "is_bash", 0))
+let s:is_kornshell = get(b:, "is_kornshell", get(g:, "is_kornshell", 0))
+
+if s:is_bash
+ if exists(':terminal') == 2
+ command! -buffer -nargs=1 ShKeywordPrg silent exe ':hor term bash -c "help "<args>" 2>/dev/null || man "<args>""'
+ else
+ command! -buffer -nargs=1 ShKeywordPrg echo system('bash -c "help <args>" 2>/dev/null || MANPAGER= man "<args>"')
+ endif
+ setlocal keywordprg=:ShKeywordPrg
+ let b:undo_ftplugin ..= " | setl kp< | sil! delc -buffer ShKeywordPrg"
+endif
+
+if (s:is_sh || s:is_bash || s:is_kornshell) && executable('shellcheck')
+ if !exists('current_compiler')
+ compiler shellcheck
+ let b:undo_ftplugin ..= ' | compiler make'
+ endif
+elseif s:is_bash
+ if !exists('current_compiler')
+ compiler bash
+ let b:undo_ftplugin ..= ' | compiler make'
+ endif
+endif
+
+let &cpo = s:save_cpo
+unlet s:save_cpo s:is_sh s:is_bash s:is_kornshell
+
+" mnv: nowrap sw=2 sts=2 ts=8 noet:
diff --git a/mnv/runtime/ftplugin/shaderslang.mnv b/mnv/runtime/ftplugin/shaderslang.mnv
new file mode 100644
index 0000000000..6f8d30ed27
--- /dev/null
+++ b/mnv/runtime/ftplugin/shaderslang.mnv
@@ -0,0 +1,54 @@
+" MNV filetype plugin file
+" Language: Slang
+" Maintainer: Austin Shijo <epestr@proton.me>
+" Last Change: 2025 Jan 05
+
+" Only do this when not done yet for this buffer
+if exists("b:did_ftplugin")
+ finish
+endif
+
+" Don't load another plugin for this buffer
+let b:did_ftplugin = 1
+
+" Using line continuation here.
+let s:cpo_save = &cpo
+set cpo-=C
+
+let b:undo_ftplugin = "setl fo< com< cms< inc<"
+
+" Set 'formatoptions' to break comment lines but not other lines,
+" and insert the comment leader when hitting <CR> or using "o".
+setlocal fo-=t fo+=croql
+
+" Set comment string (Slang uses C-style comments)
+setlocal commentstring=//\ %s
+
+" Set 'comments' to format dashed lists in comments
+setlocal comments=sO:*\ -,mO:*\ \ ,exO:*/,s1:/*,mb:*,ex:*/,:///,://
+
+" When the matchit plugin is loaded, this makes the % command skip parens and
+" braces in comments properly, and adds support for shader-specific keywords
+if exists("loaded_matchit")
+ " Add common shader control structures
+ let b:match_words = '{\|^\s*\<\(if\|for\|while\|switch\|struct\|class\)\>:}\|^\s*\<break\>,' ..
+ \ '^\s*#\s*if\(\|def\|ndef\)\>:^\s*#\s*elif\>:^\s*#\s*else\>:^\s*#\s*endif\>,' ..
+ \ '\[:\]'
+ let b:match_skip = 's:comment\|string\|character\|special'
+ let b:match_ignorecase = 0
+ let b:undo_ftplugin ..= " | unlet! b:match_skip b:match_words b:match_ignorecase"
+endif
+
+" Win32 and GTK can filter files in the browse dialog
+if (has("gui_win32") || has("gui_gtk")) && !exists("b:browsefilter")
+ let b:browsefilter = "Slang Source Files (*.slang)\t*.slang\n"
+ if has("win32")
+ let b:browsefilter ..= "All Files (*.*)\t*\n"
+ else
+ let b:browsefilter ..= "All Files (*)\t*\n"
+ endif
+ let b:undo_ftplugin ..= " | unlet! b:browsefilter"
+endif
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/mnv/runtime/ftplugin/sieve.mnv b/mnv/runtime/ftplugin/sieve.mnv
new file mode 100644
index 0000000000..ab5813ea0f
--- /dev/null
+++ b/mnv/runtime/ftplugin/sieve.mnv
@@ -0,0 +1,23 @@
+" MNV filetype plugin file
+" Language: Sieve filtering language input file
+" Maintainer: This runtime file is looking for a new maintainer.
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2025 Feb 20
+" 2026 Jan 09 by MNV Project: preserve line endings for existing files #19144
+
+if exists("b:did_ftplugin")
+ finish
+endif
+let b:did_ftplugin = 1
+
+let b:undo_ftplugin = "setl com< cms< fo< ff<"
+
+setlocal comments=s1:/*,mb:*,ex:*/,:# commentstring=#\ %s
+setlocal formatoptions-=t formatoptions+=croql
+
+" https://datatracker.ietf.org/doc/html/rfc5228#section-2.2 says
+" "newlines (CRLF, never just CR or LF)"
+" Use CRLF for new files only; preserve existing line endings
+if expand('%:p') !=# '' && !filereadable(expand('%:p'))
+ setlocal fileformat=dos
+endif
diff --git a/mnv/runtime/ftplugin/skhd.mnv b/mnv/runtime/ftplugin/skhd.mnv
new file mode 100644
index 0000000000..802f2ab79d
--- /dev/null
+++ b/mnv/runtime/ftplugin/skhd.mnv
@@ -0,0 +1,20 @@
+" MNV filetype plugin file
+" Language: skhd(simple hotkey daemon for macOS) configuration file
+" Maintainer: Kiyoon Kim <https://github.com/kiyoon>
+" Last Change: 2026 Jan 23
+
+if exists("b:did_ftplugin")
+ finish
+endif
+let b:did_ftplugin = 1
+
+let s:cpo_save = &cpo
+set cpo&mnv
+
+setlocal comments=:# commentstring=#\ %s
+setlocal formatoptions-=t formatoptions+=croql
+
+let b:undo_ftplugin = "setl com< cms< fo<"
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/mnv/runtime/ftplugin/slint.mnv b/mnv/runtime/ftplugin/slint.mnv
new file mode 100644
index 0000000000..41613ed54e
--- /dev/null
+++ b/mnv/runtime/ftplugin/slint.mnv
@@ -0,0 +1,15 @@
+" MNV filetype plugin
+" Language: slint
+" Maintainer: Riley Bruins <ribru17@gmail.com>
+" Last Change: 2024 May 19
+
+if exists('b:did_ftplugin')
+ finish
+endif
+let b:did_ftplugin = 1
+
+" Set 'comments' to format dashed lists in comments.
+" Also include ///, used for Doxygen.
+setl comments=sO:*\ -,mO:*\ \ ,exO:*/,s1:/*,mb:*,ex:*/,:///,:// commentstring=//\ %s
+
+let b:undo_ftplugin = 'setl com< cms<'
diff --git a/mnv/runtime/ftplugin/slpconf.mnv b/mnv/runtime/ftplugin/slpconf.mnv
new file mode 100644
index 0000000000..87ec058d21
--- /dev/null
+++ b/mnv/runtime/ftplugin/slpconf.mnv
@@ -0,0 +1,20 @@
+" MNV filetype plugin file
+" Language: RFC 2614 - An API for Service Location configuration file
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2008-07-09
+
+if exists("b:did_ftplugin")
+ finish
+endif
+let b:did_ftplugin = 1
+
+let s:cpo_save = &cpo
+set cpo&mnv
+
+let b:undo_ftplugin = "setl com< cms< fo<"
+
+setlocal comments=:#,:; commentstring=#\ %s
+setlocal formatoptions-=t formatoptions+=croql
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/mnv/runtime/ftplugin/slpreg.mnv b/mnv/runtime/ftplugin/slpreg.mnv
new file mode 100644
index 0000000000..f3a04e78ae
--- /dev/null
+++ b/mnv/runtime/ftplugin/slpreg.mnv
@@ -0,0 +1,20 @@
+" MNV filetype plugin file
+" Language: RFC 2614 - An API for Service Location registration file
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2008-07-09
+
+if exists("b:did_ftplugin")
+ finish
+endif
+let b:did_ftplugin = 1
+
+let s:cpo_save = &cpo
+set cpo&mnv
+
+let b:undo_ftplugin = "setl com< cms< fo<"
+
+setlocal comments=:#,:; commentstring=#\ %s
+setlocal formatoptions-=t formatoptions+=croql
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/mnv/runtime/ftplugin/slpspi.mnv b/mnv/runtime/ftplugin/slpspi.mnv
new file mode 100644
index 0000000000..06102df277
--- /dev/null
+++ b/mnv/runtime/ftplugin/slpspi.mnv
@@ -0,0 +1,20 @@
+" MNV filetype plugin file
+" Language: RFC 2614 - An API for Service Location SPI file
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2008-07-09
+
+if exists("b:did_ftplugin")
+ finish
+endif
+let b:did_ftplugin = 1
+
+let s:cpo_save = &cpo
+set cpo&mnv
+
+let b:undo_ftplugin = "setl com< cms< fo<"
+
+setlocal comments=:#,:; commentstring=#\ %s
+setlocal formatoptions-=t formatoptions+=croql
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/mnv/runtime/ftplugin/sml.mnv b/mnv/runtime/ftplugin/sml.mnv
new file mode 100644
index 0000000000..6735806dc8
--- /dev/null
+++ b/mnv/runtime/ftplugin/sml.mnv
@@ -0,0 +1,41 @@
+" MNV filetype plugin file
+" Language: SML
+" Filenames: *.sml *.sig
+" Maintainer: tocariimaa <tocariimaa@firemail.cc>
+" Last Change: 2025 Nov 04
+" 2026 Jan 19 by MNV Project: add 'include' setting
+
+if exists('b:did_ftplugin')
+ finish
+endif
+let b:did_ftplugin = 1
+
+let s:cpo_save = &cpo
+set cpo&mnv
+
+let b:undo_ftplugin = 'setl com< cms< fo< inc<'
+
+setlocal formatoptions+=croql formatoptions-=t
+setlocal commentstring=(*\ %s\ *)
+setlocal comments=sr:(*,mb:*,ex:*)
+setlocal include=^\\s*use\\>
+
+if exists('loaded_matchit')
+ let b:match_ignorecase = 0
+ let b:match_words = '\<\%(abstype\|let\|local\|sig\|struct\)\>:\<\%(in\|with\)\>:\<end\>'
+ let b:undo_ftplugin ..= ' | unlet! b:match_ignorecase b:match_words'
+endif
+
+if (has("gui_win32") || has("gui_gtk")) && !exists("b:browsefilter")
+ let b:browsefilter = "SML Source Files (*.sml)\t*.sml\n" ..
+ \ "SML Signature Files (*.sig)\t*.sig\n"
+ if has("win32")
+ let b:browsefilter ..= "All Files (*.*)\t*\n"
+ else
+ let b:browsefilter ..= "All Files (*)\t*\n"
+ endif
+ let b:undo_ftplugin ..= " | unlet! b:browsefilter"
+endif
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/mnv/runtime/ftplugin/snakemake.mnv b/mnv/runtime/ftplugin/snakemake.mnv
new file mode 100644
index 0000000000..a2b11c2b20
--- /dev/null
+++ b/mnv/runtime/ftplugin/snakemake.mnv
@@ -0,0 +1,13 @@
+" MNV filetype plugin
+" Language: snakemake
+" Maintainer: Riley Bruins <ribru17@gmail.com>
+" Last Change: 2024 Jun 13
+
+if exists('b:did_ftplugin')
+ finish
+endif
+let b:did_ftplugin = 1
+
+setl comments=:# commentstring=#\ %s
+
+let b:undo_ftplugin = 'setl com< cms<'
diff --git a/mnv/runtime/ftplugin/solidity.mnv b/mnv/runtime/ftplugin/solidity.mnv
new file mode 100644
index 0000000000..ccfd512554
--- /dev/null
+++ b/mnv/runtime/ftplugin/solidity.mnv
@@ -0,0 +1,15 @@
+" MNV filetype plugin file
+" Language: Solidity
+" Maintainer: Cothi (jiungdev@gmail.com)
+" Original Author: tomlion (https://github.com/tomlion/mnv-solidity)
+" Last Change: 2022 Sep 27
+" 2023 Aug 22 MNV Project (did_ftplugin, undo_ftplugin)
+
+if exists("b:did_ftplugin")
+ finish
+endif
+let b:did_ftplugin = 1
+
+setlocal commentstring=//\ %s
+
+let b:undo_ftplugin = "setlocal commentstring<"
diff --git a/mnv/runtime/ftplugin/solution.mnv b/mnv/runtime/ftplugin/solution.mnv
new file mode 100644
index 0000000000..c4e8cc2ba0
--- /dev/null
+++ b/mnv/runtime/ftplugin/solution.mnv
@@ -0,0 +1,41 @@
+" MNV filetype plugin file
+" Language: Microsoft Visual Studio Solution
+" Maintainer: Doug Kearns <dougkearns@gmail.com>
+" Last Change: 2024 Jan 14
+
+if exists("b:did_ftplugin")
+ finish
+endif
+let b:did_ftplugin = 1
+
+let s:cpo_save = &cpo
+set cpo&mnv
+
+setlocal comments=:#
+setlocal commentstring=#\ %s
+
+let b:undo_ftplugin = "setl com< cms<"
+
+if exists("loaded_matchit") && !exists("b:match_words")
+ let b:match_words =
+ \ '\<Project\>:\<EndProject\>,' ..
+ \ '\<ProjectSection\>:\<EndProjectSection\>,' ..
+ \ '\<Global\>:\<EndGlobal\>,' ..
+ \ '\<GlobalSection\>:\<EndGlobalSection\>'
+ let b:undo_ftplugin ..= " | unlet! b:match_words"
+endif
+
+if (has("gui_win32") || has("gui_gtk")) && !exists("b:browsefilter")
+ let b:browsefilter = "Microsoft Visual Studio Solution Files(*.sln)\t*.sln\n"
+ if has("win32")
+ let b:browsefilter ..= "All Files (*.*)\t*\n"
+ else
+ let b:browsefilter ..= "All Files (*)\t*\n"
+ endif
+ let b:undo_ftplugin ..= " | unlet! b:browsefilter"
+endif
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
+
+" mnv: nowrap sw=2 sts=2 ts=8 noet:
diff --git a/mnv/runtime/ftplugin/soy.mnv b/mnv/runtime/ftplugin/soy.mnv
new file mode 100644
index 0000000000..7761a39312
--- /dev/null
+++ b/mnv/runtime/ftplugin/soy.mnv
@@ -0,0 +1,14 @@
+" MNV filetype plugin
+" Language: Soy (Closure Templates)
+" Maintainer: Riley Bruins <ribru17@gmail.com>
+" Last Change: 2025 Oct 24
+
+if exists('b:did_ftplugin')
+ finish
+endif
+let b:did_ftplugin = 1
+
+setlocal comments=sO:*\ -,mO:*\ \ ,exO:*/,s1:/*,mb:*,ex:*/,://
+setlocal commentstring=//\ %s
+
+let b:undo_ftplugin = "setlocal comments< commentstring<"
diff --git a/mnv/runtime/ftplugin/spajson.mnv b/mnv/runtime/ftplugin/spajson.mnv
new file mode 100644
index 0000000000..e252ff7467
--- /dev/null
+++ b/mnv/runtime/ftplugin/spajson.mnv
@@ -0,0 +1,14 @@
+" MNV filetype plugin
+" Language: SPA JSON
+" Maintainer: David Mandelberg <david@mandelberg.org>
+" Last Change: 2025 Mar 22
+
+if exists('b:did_ftplugin')
+ finish
+endif
+let b:did_ftplugin = 1
+
+setlocal comments=:###,:##,:#
+setlocal commentstring=#\ %s
+
+let b:undo_ftplugin = "setlocal comments< commentstring<"
diff --git a/mnv/runtime/ftplugin/spec.mnv b/mnv/runtime/ftplugin/spec.mnv
new file mode 100644
index 0000000000..3a590d2da5
--- /dev/null
+++ b/mnv/runtime/ftplugin/spec.mnv
@@ -0,0 +1,225 @@
+" Plugin to update the %changelog section of RPM spec files
+" Filename: spec.mnv
+" Maintainer: Igor Gnatenko i.gnatenko.brain@gmail.com
+" Former Maintainer: Gustavo Niemeyer <niemeyer@conectiva.com> (until March 2014)
+" Last Change: 2015 Jun 01
+" Update by Zdenek Dohnal, 2022 May 17
+" 2024 Sep 10 by MNV Project: add epoch support for spec changelog, #15537
+" 2024 Oct 07 by MNV Project: add comment support, #15817
+
+if exists("b:did_ftplugin")
+ finish
+endif
+let b:did_ftplugin = 1
+
+let s:cpo_save = &cpo
+set cpo&mnv
+
+setlocal comments=b:#
+setlocal commentstring=#\ %s
+
+let b:undo_ftplugin = "setlocal comments< commentstring<"
+
+if !exists("no_plugin_maps") && !exists("no_spec_maps")
+ if !hasmapto("<Plug>SpecChangelog")
+ map <buffer> <LocalLeader>c <Plug>SpecChangelog
+ endif
+endif
+
+if !hasmapto("call <SID>SpecChangelog(\"\")<CR>")
+ noremap <buffer> <unique> <script> <Plug>SpecChangelog :call <SID>SpecChangelog("")<CR>
+endif
+
+if !exists("*s:GetRelVer")
+ function! s:GetRelVer()
+ if has('python')
+python << PYEND
+import sys, datetime, shutil, tempfile
+import mnv
+
+try:
+ import rpm
+except ImportError:
+ pass
+else:
+ specfile = mnv.current.buffer.name
+ if specfile:
+ rpm.delMacro("dist")
+ spec = rpm.spec(specfile)
+ headers = spec.sourceHeader
+ version = headers["Version"]
+ release = headers["Release"]
+ mnv.command("let ver = '" + version + "'")
+ mnv.command("let rel = '" + release + "'")
+PYEND
+ endif
+ endfunction
+endif
+
+if !exists("*s:SpecChangelog")
+ function s:SpecChangelog(format)
+ if strlen(a:format) == 0
+ if !exists("g:spec_chglog_format")
+ let email = input("Name <email address>: ")
+ let g:spec_chglog_format = "%a %b %d %Y " . l:email
+ echo "\r"
+ endif
+ let format = g:spec_chglog_format
+ else
+ if !exists("g:spec_chglog_format")
+ let g:spec_chglog_format = a:format
+ endif
+ let format = a:format
+ endif
+ let line = 0
+ let name = ""
+ let epoch = ""
+ let ver = ""
+ let rel = ""
+ let nameline = -1
+ let epochline = -1
+ let verline = -1
+ let relline = -1
+ let chgline = -1
+ while (line <= line("$"))
+ let linestr = getline(line)
+ if name == "" && linestr =~? '^Name:'
+ let nameline = line
+ let name = substitute(strpart(linestr,5), '^[ ]*\([^ ]\+\)[ ]*$','\1','')
+ elseif epoch == "" && linestr =~? '^Epoch:'
+ let epochline = line
+ let epoch = substitute(strpart(linestr,6), '^[ ]*\([^ ]\+\)[ ]*$','\1','')
+ elseif ver == "" && linestr =~? '^Version:'
+ let verline = line
+ let ver = substitute(strpart(linestr,8), '^[ ]*\([^ ]\+\)[ ]*$','\1','')
+ elseif rel == "" && linestr =~? '^Release:'
+ let relline = line
+ let rel = substitute(strpart(linestr,8), '^[ ]*\([^ ]\+\)[ ]*$','\1','')
+ elseif linestr =~? '^%changelog'
+ let chgline = line
+ execute line
+ break
+ endif
+ let line = line+1
+ endwhile
+ if nameline != -1 && verline != -1 && relline != -1
+ let include_release_info = exists("g:spec_chglog_release_info")
+ let name = s:ParseRpmVars(name, nameline)
+ let epoch = s:ParseRpmVars(epoch, epochline)
+ let ver = s:ParseRpmVars(ver, verline)
+ let rel = s:ParseRpmVars(rel, relline)
+ else
+ let include_release_info = 0
+ endif
+
+ call s:GetRelVer()
+
+ if chgline == -1
+ let option = confirm("Can't find %changelog. Create one? ","&End of file\n&Here\n&Cancel",3)
+ if option == 1
+ call append(line("$"),"")
+ call append(line("$"),"%changelog")
+ execute line("$")
+ let chgline = line(".")
+ elseif option == 2
+ call append(line("."),"%changelog")
+ normal j
+ let chgline = line(".")
+ endif
+ endif
+ if chgline != -1
+ let tmptime = v:lc_time
+ language time C
+ if strlen(epoch)
+ let ver = epoch.":".ver
+ endif
+ let parsed_format = "* ".strftime(format)." - ".ver."-".rel
+ execute "language time" tmptime
+ let release_info = "+ ".name."-".ver."-".rel
+ let wrong_format = 0
+ let wrong_release = 0
+ let insert_line = 0
+ if getline(chgline+1) != parsed_format
+ let wrong_format = 1
+ endif
+ if include_release_info && getline(chgline+2) != release_info
+ let wrong_release = 1
+ endif
+ if wrong_format || wrong_release
+ if include_release_info && !wrong_release && !exists("g:spec_chglog_never_increase_release")
+ let option = confirm("Increase release? ","&Yes\n&No",1)
+ if option == 1
+ execute relline
+ normal 
+ let rel = substitute(strpart(getline(relline),8), '^[ ]*\([^ ]\+\)[ ]*$','\1','')
+ let release_info = "+ ".name."-".ver."-".rel
+ endif
+ endif
+ let n = 0
+ call append(chgline+n, parsed_format)
+ if include_release_info
+ let n = n + 1
+ call append(chgline+n, release_info)
+ endif
+ let n = n + 1
+ call append(chgline+n,"- ")
+ let n = n + 1
+ call append(chgline+n,"")
+ let insert_line = chgline+n
+ else
+ let line = chgline
+ if !exists("g:spec_chglog_prepend")
+ while !(getline(line+2) =~ '^\( *\|\*.*\)$')
+ let line = line+1
+ endwhile
+ endif
+ call append(line+1,"- ")
+ let insert_line = line+2
+ endif
+ execute insert_line
+ startinsert!
+ endif
+ endfunction
+endif
+
+if !exists("*s:ParseRpmVars")
+ function s:ParseRpmVars(str, strline)
+ let end = -1
+ let ret = ""
+ while (1)
+ let start = match(a:str, "\%{", end+1)
+ if start == -1
+ let ret = ret . strpart(a:str, end+1)
+ break
+ endif
+ let ret = ret . strpart(a:str, end+1, start-(end+1))
+ let end = match(a:str, "}", start)
+ if end == -1
+ let ret = ret . strpart(a:str, start)
+ break
+ endif
+ let varname = strpart(a:str, start+2, end-(start+2))
+ execute a:strline
+ let definestr = "^[ \t]*%\\(define\\|global\\)[ \t]\\+".varname."[ \t]\\+\\(.*\\)$"
+ let linenum = search(definestr, "bW")
+ if linenum != 0
+ let ret = ret . substitute(getline(linenum), definestr, "\\2", "")
+ endif
+ endwhile
+ return ret
+ endfunction
+endif
+
+" The following lines, along with the macros/matchit.mnv plugin,
+" make it easy to navigate the different sections of a spec file
+" with the % key (thanks to Max Ischenko).
+
+let b:match_ignorecase = 0
+let b:match_words =
+ \ '^Name:^%description:^%clean:^%(?:auto)?setup:^%build:^%install:^%files:' .
+ \ '^%package:^%preun:^%postun:^%changelog'
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
+
+let b:undo_ftplugin ..= " | unlet! b:match_ignorecase b:match_words"
diff --git a/mnv/runtime/ftplugin/sql.mnv b/mnv/runtime/ftplugin/sql.mnv
new file mode 100644
index 0000000000..b18c36dda3
--- /dev/null
+++ b/mnv/runtime/ftplugin/sql.mnv
@@ -0,0 +1,550 @@
+" SQL filetype plugin file
+" Language: SQL (Common for Oracle, Microsoft SQL Server, Sybase)
+" Version: 12.0
+" Maintainer: David Fishburn <dfishburn dot mnv at gmail dot com>
+" Last Change: 2017 Mar 07
+" 2024 Jan 14 by MNV Project: browsefilter
+" 2024 May 18 by MNV Project: set comment options
+" 2024 Aug 14 by MNV Project: remove redundant code
+" Download: http://mnv.sourceforge.net/script.php?script_id=454
+
+" For more details please use:
+" :h sql.txt
+"
+" This file should only contain values that are common to all SQL languages
+" Oracle, Microsoft SQL Server, Sybase ASA/ASE, MySQL, and so on
+" If additional features are required create:
+" mnvfiles/after/ftplugin/sql.mnv (Windows)
+" .mnv/after/ftplugin/sql.mnv (Unix)
+" to override and add any of your own settings.
+
+
+" This file also creates a command, SQLSetType, which allows you to change
+" SQL dialects on the fly. For example, if I open an Oracle SQL file, it
+" is color highlighted appropriately. If I open an Informix SQL file, it
+" will still be highlighted according to Oracles settings. By running:
+" :SQLSetType sqlinformix
+"
+" All files called sqlinformix.mnv will be loaded from the indent and syntax
+" directories. This allows you to easily flip SQL dialects on a per file
+" basis. NOTE: you can also use completion:
+" :SQLSetType <tab>
+"
+" To change the default dialect, add the following to your mnvrc:
+" let g:sql_type_default = 'sqlanywhere'
+"
+" This file also creates a command, SQLGetType, which allows you to
+" determine what the current dialect is in use.
+" :SQLGetType
+"
+" History
+"
+" Version 12.0 (April 2013)
+"
+" NF: Added support for "BEGIN TRY ... END TRY ... BEGIN CATCH ... END CATCH
+" BF: This plugin is designed to be used with other plugins to enable the
+" SQL completion with Perl, Python, Java, ... The loading mechanism
+" was not checking if the SQL objects were created, which can lead to
+" the plugin not loading the SQL support.
+"
+" Version 11.0 (May 2013)
+"
+" NF: Updated to use SyntaxComplete's new regex support for syntax groups.
+"
+" Version 10.0 (Dec 2012)
+"
+" NF: Changed all maps to use noremap instead of must map
+" NF: Changed all visual maps to use xnoremap instead of vnoremap as they
+" should only be used in visual mode and not select mode.
+" BF: Most of the maps were using doubled up backslashes before they were
+" changed to using the search() function, which meant they no longer
+" worked.
+"
+" Version 9.0
+"
+" NF: Completes 'b:undo_ftplugin'
+" BF: Correctly set cpoptions when creating script
+"
+" Version 8.0
+"
+" NF: Improved the matchit plugin regex (Talek)
+"
+" Version 7.0
+"
+" NF: Calls the sqlcomplete#ResetCacheSyntax() function when calling
+" SQLSetType.
+"
+" Version 6.0
+"
+" NF: Adds the command SQLGetType
+"
+" Version 5.0
+"
+" NF: Adds the ability to choose the keys to control SQL completion, just add
+" the following to your .mnvrc:
+" let g:ftplugin_sql_omni_key = '<C-C>'
+" let g:ftplugin_sql_omni_key_right = '<Right>'
+" let g:ftplugin_sql_omni_key_left = '<Left>'
+"
+" BF: format-options - Auto-wrap comments using textwidth was turned off
+" by mistake.
+
+
+" Only do this when not done yet for this buffer
+" This ftplugin can be used with other ftplugins. So ensure loading
+" happens if all elements of this plugin have not yet loaded.
+if exists("b:did_ftplugin")
+ finish
+endif
+
+" Don't load another plugin for this buffer
+let b:did_ftplugin = 1
+
+let s:save_cpo = &cpo
+set cpo&mnv
+
+let b:undo_ftplugin = "setl comments< commentstring< formatoptions< define< omnifunc<" .
+ \ " | unlet! b:browsefilter b:match_words"
+
+" Disable autowrapping for code, but enable for comments
+" t Auto-wrap text using textwidth
+" c Auto-wrap comments using textwidth, inserting the current comment
+" leader automatically.
+setlocal formatoptions-=t
+setlocal formatoptions+=c
+
+setlocal comments=:-- commentstring=--\ %s
+
+" Functions/Commands to allow the user to change SQL syntax dialects
+" through the use of :SQLSetType <tab> for completion.
+" This works with both MNV 6 and 7.
+
+if !exists("*SQL_SetType")
+ " NOTE: You cannot use function! since this file can be
+ " sourced from within this function. That will result in
+ " an error reported by MNV.
+ function SQL_GetList(ArgLead, CmdLine, CursorPos)
+
+ if !exists('s:sql_list')
+ " Grab a list of files that contain "sql" in their names
+ let list_indent = globpath(&runtimepath, 'indent/*sql*')
+ let list_syntax = globpath(&runtimepath, 'syntax/*sql*')
+ let list_ftplugin = globpath(&runtimepath, 'ftplugin/*sql*')
+
+ let sqls = "\n".list_indent."\n".list_syntax."\n".list_ftplugin."\n"
+
+ " Strip out everything (path info) but the filename
+ " Regex
+ " From between two newline characters
+ " Non-greedily grab all characters
+ " Followed by a valid filename \w\+\.\w\+ (sql.mnv)
+ " Followed by a newline, but do not include the newline
+ "
+ " Replace it with just the filename (get rid of PATH)
+ "
+ " Recursively, since there are many filenames that contain
+ " the word SQL in the indent, syntax and ftplugin directory
+ let sqls = substitute( sqls,
+ \ '[\n]\%(.\{-}\)\(\w\+\.\w\+\)\n\@=',
+ \ '\1\n',
+ \ 'g'
+ \ )
+
+ " Remove duplicates, since sqlanywhere.mnv can exist in the
+ " syntax, indent and ftplugin directory, yet we only want
+ " to display the option once
+ let index = match(sqls, '.\{-}\ze\n')
+ while index > -1
+ " Get the first filename
+ let file = matchstr(sqls, '.\{-}\ze\n', index)
+ " Recursively replace any *other* occurrence of that
+ " filename with nothing (ie remove it)
+ let sqls = substitute(sqls, '\%>'.(index+strlen(file)).'c\<'.file.'\>\n', '', 'g')
+ " Move on to the next filename
+ let index = match(sqls, '.\{-}\ze\n', (index+strlen(file)+1))
+ endwhile
+
+ " Sort the list if using version 7
+ if v:version >= 700
+ let mylist = split(sqls, "\n")
+ let mylist = sort(mylist)
+ let sqls = join(mylist, "\n")
+ endif
+
+ let s:sql_list = sqls
+ endif
+
+ return s:sql_list
+
+ endfunction
+
+ function SQL_SetType(name)
+
+ " User has decided to override default SQL scripts and
+ " specify a vendor specific version
+ " (ie Oracle, Informix, SQL Anywhere, ...)
+ " So check for an remove any settings that prevent the
+ " scripts from being executed, and then source the
+ " appropriate MNV scripts.
+ if exists("b:did_ftplugin")
+ unlet b:did_ftplugin
+ endif
+ if exists("b:current_syntax")
+ " echomsg 'SQLSetType - clearing syntax'
+ syntax clear
+ if exists("b:current_syntax")
+ unlet b:current_syntax
+ endif
+ endif
+ if exists("b:did_indent")
+ " echomsg 'SQLSetType - clearing indent'
+ unlet b:did_indent
+ " Set these values to their defaults
+ setlocal indentkeys&
+ setlocal indentexpr&
+ endif
+
+ " Ensure the name is in the correct format
+ let new_sql_type = substitute(a:name,
+ \ '\s*\([^\.]\+\)\(\.\w\+\)\?', '\L\1', '')
+
+ " Do not specify a buffer local variable if it is
+ " the default value
+ if new_sql_type == 'sql'
+ let new_sql_type = 'sqloracle'
+ endif
+ let b:sql_type_override = new_sql_type
+
+ " Remove any cached SQL since a new syntax will have different
+ " items and groups
+ if !exists('g:loaded_sql_completion') || g:loaded_sql_completion >= 100
+ call sqlcomplete#ResetCacheSyntax()
+ endif
+
+ " MNV will automatically source the correct files if we
+ " change the filetype. You cannot do this with setfiletype
+ " since that command will only execute if a filetype has
+ " not already been set. In this case we want to override
+ " the existing filetype.
+ let &filetype = 'sql'
+
+ if b:sql_compl_savefunc != ""
+ " We are changing the filetype to SQL from some other filetype
+ " which had OMNI completion defined. We need to activate the
+ " SQL completion plugin in order to cache some of the syntax items
+ " while the syntax rules for SQL are active.
+ call sqlcomplete#PreCacheSyntax()
+ endif
+ endfunction
+ command! -nargs=* -complete=custom,SQL_GetList SQLSetType :call SQL_SetType(<q-args>)
+
+endif
+
+" Functions/Commands to allow the user determine current SQL syntax dialect
+" This works with both MNV 6 and 7.
+
+if !exists("*SQL_GetType")
+ function SQL_GetType()
+ if exists('b:sql_type_override')
+ echomsg "Current SQL dialect in use:".b:sql_type_override
+ else
+ echomsg "Current SQL dialect in use:".g:sql_type_default
+ endif
+ endfunction
+ command! -nargs=0 SQLGetType :call SQL_GetType()
+endif
+
+if exists("b:sql_type_override")
+ " echo 'sourcing buffer ftplugin/'.b:sql_type_override.'.mnv'
+ if globpath(&runtimepath, 'ftplugin/'.b:sql_type_override.'.mnv') != ''
+ exec 'runtime ftplugin/'.b:sql_type_override.'.mnv'
+ " else
+ " echomsg 'ftplugin/'.b:sql_type_override.' not exist, using default'
+ endif
+elseif exists("g:sql_type_default")
+ " echo 'sourcing global ftplugin/'.g:sql_type_default.'.mnv'
+ if globpath(&runtimepath, 'ftplugin/'.g:sql_type_default.'.mnv') != ''
+ exec 'runtime ftplugin/'.g:sql_type_default.'.mnv'
+ " else
+ " echomsg 'ftplugin/'.g:sql_type_default.'.mnv not exist, using default'
+ endif
+endif
+
+" Win32 and GTK can filter files in the browse dialog
+if (has("gui_win32") || has("gui_gtk")) && !exists("b:browsefilter")
+ let b:browsefilter = "SQL Files (*.sql)\t*.sql\n"
+ if has("win32")
+ let b:browsefilter .= "All Files (*.*)\t*\n"
+ else
+ let b:browsefilter .= "All Files (*)\t*\n"
+ endif
+endif
+
+" Some standard expressions for use with the matchit strings
+let s:notend = '\%(\<end\s\+\)\@<!'
+let s:when_no_matched_or_others = '\%(\<when\>\%(\s\+\%(\%(\<not\>\s\+\)\?<matched\>\)\|\<others\>\)\@!\)'
+let s:or_replace = '\%(or\s\+replace\s\+\)\?'
+
+" Define patterns for the matchit macro
+if !exists("b:match_words")
+ " SQL is generally case insensitive
+ let b:match_ignorecase = 1
+
+ " Handle the following:
+ " if
+ " elseif | elsif
+ " else [if]
+ " end if
+ "
+ " [while condition] loop
+ " leave
+ " break
+ " continue
+ " exit
+ " end loop
+ "
+ " for
+ " leave
+ " break
+ " continue
+ " exit
+ " end loop
+ "
+ " do
+ " statements
+ " doend
+ "
+ " case
+ " when
+ " when
+ " default
+ " end case
+ "
+ " merge
+ " when not matched
+ " when matched
+ "
+ " EXCEPTION
+ " WHEN column_not_found THEN
+ " WHEN OTHERS THEN
+ "
+ " begin try
+ " end try
+ " begin catch
+ " end catch
+ "
+ " create[ or replace] procedure|function|event
+ " \ '^\s*\<\%(do\|for\|while\|loop\)\>.*:'.
+
+ " For ColdFusion support
+ setlocal matchpairs+=<:>
+ let b:match_words = &matchpairs .
+ \ ',\%(\<begin\)\%(\s\+\%(try\|catch\)\>\)\@!:\<end\>\W*$,'.
+ \
+ \ '\<begin\s\+try\>:'.
+ \ '\<end\s\+try\>:'.
+ \ '\<begin\s\+catch\>:'.
+ \ '\<end\s\+catch\>,'.
+ \
+ \ s:notend . '\<if\>:'.
+ \ '\<elsif\>\|\<elseif\>\|\<else\>:'.
+ \ '\<end\s\+if\>,'.
+ \
+ \ '\(^\s*\)\@<=\(\<\%(do\|for\|while\|loop\)\>.*\):'.
+ \ '\%(\<exit\>\|\<leave\>\|\<break\>\|\<continue\>\):'.
+ \ '\%(\<doend\>\|\%(\<end\s\+\%(for\|while\|loop\>\)\)\),'.
+ \
+ \ '\%('. s:notend . '\<case\>\):'.
+ \ '\%('.s:when_no_matched_or_others.'\):'.
+ \ '\%(\<when\s\+others\>\|\<end\s\+case\>\),' .
+ \
+ \ '\<merge\>:' .
+ \ '\<when\s\+not\s\+matched\>:' .
+ \ '\<when\s\+matched\>,' .
+ \
+ \ '\%(\<create\s\+' . s:or_replace . '\)\?'.
+ \ '\%(function\|procedure\|event\):'.
+ \ '\<returns\?\>'
+ " \ '\<begin\>\|\<returns\?\>:'.
+ " \ '\<end\>\(;\)\?\s*$'
+ " \ '\<exception\>:'.s:when_no_matched_or_others.
+ " \ ':\<when\s\+others\>,'.
+ "
+ " \ '\%(\<exception\>\|\%('. s:notend . '\<case\>\)\):'.
+ " \ '\%(\<default\>\|'.s:when_no_matched_or_others.'\):'.
+ " \ '\%(\%(\<when\s\+others\>\)\|\<end\s\+case\>\),' .
+endif
+
+" Define how to find the macro definition of a variable using the various
+" [d, [D, [_CTRL_D and so on features
+" Match these values ignoring case
+" ie DECLARE varname INTEGER
+let &l:define = '\c\<\(VARIABLE\|DECLARE\|IN\|OUT\|INOUT\)\>'
+
+
+" Mappings to move to the next BEGIN ... END block
+" \W - no characters or digits
+nnoremap <buffer> <silent> ]] :call search('\c^\s*begin\>', 'W' )<CR>
+nnoremap <buffer> <silent> [[ :call search('\c^\s*begin\>', 'bW' )<CR>
+nnoremap <buffer> <silent> ][ :call search('\c^\s*end\W*$', 'W' )<CR>
+nnoremap <buffer> <silent> [] :call search('\c^\s*end\W*$', 'bW' )<CR>
+xnoremap <buffer> <silent> ]] :<C-U>exec "normal! gv"<Bar>call search('\c^\s*begin\>', 'W' )<CR>
+xnoremap <buffer> <silent> [[ :<C-U>exec "normal! gv"<Bar>call search('\c^\s*begin\>', 'bW' )<CR>
+xnoremap <buffer> <silent> ][ :<C-U>exec "normal! gv"<Bar>call search('\c^\s*end\W*$', 'W' )<CR>
+xnoremap <buffer> <silent> [] :<C-U>exec "normal! gv"<Bar>call search('\c^\s*end\W*$', 'bW' )<CR>
+
+
+" By default only look for CREATE statements, but allow
+" the user to override
+if !exists('g:ftplugin_sql_statements')
+ let g:ftplugin_sql_statements = 'create'
+endif
+
+" Predefined SQL objects what are used by the below mappings using
+" the ]} style maps.
+" This global variable allows the users to override its value
+" from within their mnvrc.
+" Note, you cannot use \?, since these patterns can be used to search
+" backwards, you must use \{,1}
+if !exists('g:ftplugin_sql_objects')
+ let g:ftplugin_sql_objects = 'function,procedure,event,' .
+ \ '\(existing\\|global\s\+temporary\s\+\)\{,1}' .
+ \ 'table,trigger' .
+ \ ',schema,service,publication,database,datatype,domain' .
+ \ ',index,subscription,synchronization,view,variable'
+endif
+
+" Key to trigger SQL completion
+if !exists('g:ftplugin_sql_omni_key')
+ let g:ftplugin_sql_omni_key = '<C-C>'
+endif
+" Key to trigger drill into column list
+if !exists('g:ftplugin_sql_omni_key_right')
+ let g:ftplugin_sql_omni_key_right = '<Right>'
+endif
+" Key to trigger drill out of column list
+if !exists('g:ftplugin_sql_omni_key_left')
+ let g:ftplugin_sql_omni_key_left = '<Left>'
+endif
+
+" Replace all ,'s with bars, except ones with numbers after them.
+" This will most likely be a \{,1} string.
+let s:ftplugin_sql_objects =
+ \ '\c^\s*' .
+ \ '\(\(' .
+ \ substitute(g:ftplugin_sql_statements, ',\d\@!', '\\\\|', 'g') .
+ \ '\)\s\+\(or\s\+replace\s\+\)\{,1}\)\{,1}' .
+ \ '\<\(' .
+ \ substitute(g:ftplugin_sql_objects, ',\d\@!', '\\\\|', 'g') .
+ \ '\)\>'
+
+" Mappings to move to the next CREATE ... block
+exec "nnoremap <buffer> <silent> ]} :call search('".s:ftplugin_sql_objects."', 'W')<CR>"
+exec "nnoremap <buffer> <silent> [{ :call search('".s:ftplugin_sql_objects."', 'bW')<CR>"
+" Could not figure out how to use a :call search() string in visual mode
+" without it ending visual mode
+" Unfortunately, this will add a entry to the search history
+exec 'xnoremap <buffer> <silent> ]} /'.s:ftplugin_sql_objects.'<CR>'
+exec 'xnoremap <buffer> <silent> [{ ?'.s:ftplugin_sql_objects.'<CR>'
+
+" Mappings to move to the next COMMENT
+"
+" Had to double the \ for the \| separator since this has a special
+" meaning on maps
+let b:comment_leader = '\(--\\|\/\/\\|\*\\|\/\*\\|\*\/\)'
+" Find the start of the next comment
+let b:comment_start = '^\(\s*'.b:comment_leader.'.*\n\)\@<!'.
+ \ '\(\s*'.b:comment_leader.'\)'
+" Find the end of the previous comment
+let b:comment_end = '\(^\s*'.b:comment_leader.'.*\n\)'.
+ \ '\(^\s*'.b:comment_leader.'\)\@!'
+" Skip over the comment
+let b:comment_jump_over = "call search('".
+ \ '^\(\s*'.b:comment_leader.'.*\n\)\@<!'.
+ \ "', 'W')"
+let b:comment_skip_back = "call search('".
+ \ '^\(\s*'.b:comment_leader.'.*\n\)\@<!'.
+ \ "', 'bW')"
+" Move to the start and end of comments
+exec 'nnoremap <silent><buffer> ]" :call search('."'".b:comment_start."'".', "W" )<CR>'
+exec 'nnoremap <silent><buffer> [" :call search('."'".b:comment_end."'".', "W" )<CR>'
+exec 'xnoremap <silent><buffer> ]" :<C-U>exec "normal! gv"<Bar>call search('."'".b:comment_start."'".', "W" )<CR>'
+exec 'xnoremap <silent><buffer> [" :<C-U>exec "normal! gv"<Bar>call search('."'".b:comment_end."'".', "W" )<CR>'
+
+" Comments can be of the form:
+" /*
+" *
+" */
+" or
+" --
+" or
+" //
+setlocal comments=s1:/*,mb:*,ex:*/,:--,://
+
+" Set completion with CTRL-X CTRL-O to autoloaded function.
+if exists('&omnifunc')
+ " Since the SQL completion plugin can be used in conjunction
+ " with other completion filetypes it must record the previous
+ " OMNI function prior to setting up the SQL OMNI function
+ let b:sql_compl_savefunc = &omnifunc
+
+ " Source it to determine its version
+ runtime autoload/sqlcomplete.mnv
+ " This is used by the sqlcomplete.mnv plugin
+ " Source it for its global functions
+ runtime autoload/syntaxcomplete.mnv
+
+ setlocal omnifunc=sqlcomplete#Complete
+ " Prevent the intellisense plugin from loading
+ let b:sql_vis = 1
+ if !exists('g:omni_sql_no_default_maps')
+ let regex_extra = ''
+ if exists('g:loaded_syntax_completion') && exists('g:loaded_sql_completion')
+ if g:loaded_syntax_completion > 120 && g:loaded_sql_completion > 140
+ let regex_extra = '\\w*'
+ endif
+ endif
+ " Static maps which use populate the completion list
+ " using MNV's syntax highlighting rules
+ exec 'inoremap <buffer> '.g:ftplugin_sql_omni_key.'a <C-\><C-O>:call sqlcomplete#Map("syntax")<CR><C-X><C-O>'
+ exec 'inoremap <buffer> '.g:ftplugin_sql_omni_key.'k <C-\><C-O>:call sqlcomplete#Map("sqlKeyword'.regex_extra.'")<CR><C-X><C-O>'
+ exec 'inoremap <buffer> '.g:ftplugin_sql_omni_key.'f <C-\><C-O>:call sqlcomplete#Map("sqlFunction'.regex_extra.'")<CR><C-X><C-O>'
+ exec 'inoremap <buffer> '.g:ftplugin_sql_omni_key.'o <C-\><C-O>:call sqlcomplete#Map("sqlOption'.regex_extra.'")<CR><C-X><C-O>'
+ exec 'inoremap <buffer> '.g:ftplugin_sql_omni_key.'T <C-\><C-O>:call sqlcomplete#Map("sqlType'.regex_extra.'")<CR><C-X><C-O>'
+ exec 'inoremap <buffer> '.g:ftplugin_sql_omni_key.'s <C-\><C-O>:call sqlcomplete#Map("sqlStatement'.regex_extra.'")<CR><C-X><C-O>'
+ " Dynamic maps which use populate the completion list
+ " using the dbext.mnv plugin
+ exec 'inoremap <buffer> '.g:ftplugin_sql_omni_key.'t <C-\><C-O>:call sqlcomplete#Map("table")<CR><C-X><C-O>'
+ exec 'inoremap <buffer> '.g:ftplugin_sql_omni_key.'p <C-\><C-O>:call sqlcomplete#Map("procedure")<CR><C-X><C-O>'
+ exec 'inoremap <buffer> '.g:ftplugin_sql_omni_key.'v <C-\><C-O>:call sqlcomplete#Map("view")<CR><C-X><C-O>'
+ exec 'inoremap <buffer> '.g:ftplugin_sql_omni_key.'c <C-\><C-O>:call sqlcomplete#Map("column")<CR><C-X><C-O>'
+ exec 'inoremap <buffer> '.g:ftplugin_sql_omni_key.'l <C-\><C-O>:call sqlcomplete#Map("column_csv")<CR><C-X><C-O>'
+ " The next 3 maps are only to be used while the completion window is
+ " active due to the <CR> at the beginning of the map
+ exec 'inoremap <buffer> '.g:ftplugin_sql_omni_key.'L <C-Y><C-\><C-O>:call sqlcomplete#Map("column_csv")<CR><C-X><C-O>'
+ " <C-Right> is not recognized on most Unix systems, so only create
+ " these additional maps on the Windows platform.
+ " If you would like to use these maps, choose a different key and make
+ " the same map in your mnvrc.
+ " if has('win32')
+ exec 'inoremap <buffer> '.g:ftplugin_sql_omni_key_right.' <C-R>=sqlcomplete#DrillIntoTable()<CR>'
+ exec 'inoremap <buffer> '.g:ftplugin_sql_omni_key_left.' <C-R>=sqlcomplete#DrillOutOfColumns()<CR>'
+ " endif
+ " Remove any cached items useful for schema changes
+ exec 'inoremap <buffer> '.g:ftplugin_sql_omni_key.'R <C-\><C-O>:call sqlcomplete#Map("resetCache")<CR><C-X><C-O>'
+ endif
+
+ if b:sql_compl_savefunc != ""
+ " We are changing the filetype to SQL from some other filetype
+ " which had OMNI completion defined. We need to activate the
+ " SQL completion plugin in order to cache some of the syntax items
+ " while the syntax rules for SQL are active.
+ call sqlcomplete#ResetCacheSyntax()
+ call sqlcomplete#PreCacheSyntax()
+ endif
+endif
+
+let &cpo = s:save_cpo
+unlet s:save_cpo
+
+" mnv:sw=4:
diff --git a/mnv/runtime/ftplugin/squirrel.mnv b/mnv/runtime/ftplugin/squirrel.mnv
new file mode 100644
index 0000000000..16d759a4c6
--- /dev/null
+++ b/mnv/runtime/ftplugin/squirrel.mnv
@@ -0,0 +1,17 @@
+" MNV filetype plugin
+" Language: Squirrel
+" Maintainer: Riley Bruins <ribru17@gmail.com>
+" Last Change: 2024 Jul 06
+
+if exists('b:did_ftplugin')
+ finish
+endif
+let b:did_ftplugin = 1
+
+" Set 'comments' to format dashed lists in comments.
+" Also include ///, used for Doxygen.
+setlocal comments=sO:*\ -,mO:*\ \ ,exO:*/,s1:/*,mb:*,ex:*/,:///,://
+
+setlocal commentstring=//\ %s
+
+let b:undo_ftplugin = 'setl com< cms<'
diff --git a/mnv/runtime/ftplugin/ssa.mnv b/mnv/runtime/ftplugin/ssa.mnv
new file mode 100644
index 0000000000..cf2b62a33c
--- /dev/null
+++ b/mnv/runtime/ftplugin/ssa.mnv
@@ -0,0 +1,13 @@
+" MNV filetype plugin
+" Language: SubStation Alpha
+" Maintainer: ObserverOfTime <chronobserver@disroot.org>
+" Last Change: 2022 Oct 10
+
+if exists('b:did_ftplugin')
+ finish
+endif
+let b:did_ftplugin = 1
+
+setlocal comments=:;,:!: commentstring=;\ %s
+
+let b:undo_ftplugin = 'setl com< cms<'
diff --git a/mnv/runtime/ftplugin/sshconfig.mnv b/mnv/runtime/ftplugin/sshconfig.mnv
new file mode 100644
index 0000000000..e9b295eac6
--- /dev/null
+++ b/mnv/runtime/ftplugin/sshconfig.mnv
@@ -0,0 +1,27 @@
+" MNV filetype plugin file
+" Language: OpenSSH client configuration file
+" Maintainer: This runtime file is looking for a new maintainer.
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2026-03-11 (`less -I`)
+
+if exists("b:did_ftplugin")
+ finish
+endif
+let b:did_ftplugin = 1
+
+let s:cpo_save = &cpo
+set cpo&mnv
+
+setlocal comments=:# commentstring=#\ %s formatoptions-=t formatoptions+=croql
+let b:undo_ftplugin = 'setlocal com< cms< fo<'
+
+if has('unix') && executable('less') && exists(':terminal') == 2
+ command -buffer -nargs=1 SshconfigKeywordPrg
+ \ silent exe 'hor term ' . 'env LESS= MANPAGER="less -I --pattern=''' . escape('^\s+' . <q-args> . '$', '\') . ''' --hilite-search" man ' . 'ssh_config'
+ setlocal iskeyword+=-
+ setlocal keywordprg=:SshconfigKeywordPrg
+ let b:undo_ftplugin .= '| setlocal keywordprg< iskeyword< | sil! delc -buffer SshconfigKeywordPrg'
+endif
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/mnv/runtime/ftplugin/sshdconfig.mnv b/mnv/runtime/ftplugin/sshdconfig.mnv
new file mode 100644
index 0000000000..04f05e5ecc
--- /dev/null
+++ b/mnv/runtime/ftplugin/sshdconfig.mnv
@@ -0,0 +1,10 @@
+" MNV filetype plugin file
+" Language: OpenSSH server configuration file
+" Maintainer: Yinzuo Jiang <jiangyinzuo@foxmail.com>
+" Latest Revision: 2024-05-17
+
+if exists("b:did_ftplugin")
+ finish
+endif
+
+runtime! ftplugin/conf.mnv
diff --git a/mnv/runtime/ftplugin/stylus.mnv b/mnv/runtime/ftplugin/stylus.mnv
new file mode 100644
index 0000000000..9aaaa17117
--- /dev/null
+++ b/mnv/runtime/ftplugin/stylus.mnv
@@ -0,0 +1,54 @@
+" MNV filetype plugin
+" Language: Stylus
+" Maintainer: Marc Harter
+" Credits: Tim Pope
+
+" Only do this when not done yet for this buffer
+if exists("b:did_ftplugin")
+ finish
+endif
+
+let s:save_cpo = &cpo
+set cpo-=C
+
+" Define some defaults in case the included ftplugins don't set them.
+let s:undo_ftplugin = ""
+let s:browsefilter = "All Files (*.*)\t*.*\n"
+
+runtime! ftplugin/html.mnv ftplugin/html_*.mnv ftplugin/html/*.mnv
+unlet! b:did_ftplugin
+
+" Override our defaults if these were set by an included ftplugin.
+if exists("b:undo_ftplugin")
+ let s:undo_ftplugin = b:undo_ftplugin
+ unlet b:undo_ftplugin
+endif
+if exists("b:browsefilter")
+ let s:browsefilter = b:browsefilter
+ unlet b:browsefilter
+endif
+
+" Change the browse dialog on Win32 to show mainly Styl-related files
+if has("gui_win32")
+ let b:browsefilter="Stylus Files (*.styl)\t*.styl\n" . s:browsefilter
+endif
+
+setlocal comments= commentstring=//\ %s
+setlocal suffixesadd=.styl
+setlocal formatoptions+=r
+
+" Add '-' and '#' to the what makes up a keyword.
+" This means that 'e' and 'w' work properly now, for properties
+" and valid variable names.
+setl iskeyword+=#,-
+
+" Add a Stylus command (to see if it's valid)
+command -buffer Stylus !clear; cat % |stylus
+
+
+let b:undo_ftplugin = "setl sua< isk< cms< com< fo< "
+ \ " | unlet! b:browsefilter b:match_words | " . s:undo_ftplugin
+
+let &cpo = s:save_cpo
+
+" mnv:set sw=2:
diff --git a/mnv/runtime/ftplugin/sudoers.mnv b/mnv/runtime/ftplugin/sudoers.mnv
new file mode 100644
index 0000000000..e8c0ebf597
--- /dev/null
+++ b/mnv/runtime/ftplugin/sudoers.mnv
@@ -0,0 +1,27 @@
+" MNV filetype plugin file
+" Language: sudoers(5) configuration files
+" Maintainer: This runtime file is looking for a new maintainer.
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2025-07-22 (use :hor term #17822)
+
+if exists("b:did_ftplugin")
+ finish
+endif
+let b:did_ftplugin = 1
+
+let s:cpo_save = &cpo
+set cpo&mnv
+
+let b:undo_ftplugin = "setl com< cms< fo<"
+
+setlocal comments=:# commentstring=#\ %s formatoptions-=t formatoptions+=croql
+
+if has('unix') && executable('less') && exists(':terminal') == 2
+ command -buffer -nargs=1 SudoersKeywordPrg
+ \ silent exe ':hor term ' . 'env LESS= MANPAGER="less --pattern=''' . escape('\b' . <q-args> . '\b', '\') . ''' --hilite-search" man ' . 'sudoers'
+ setlocal keywordprg=:SudoersKeywordPrg
+ let b:undo_ftplugin .= '| setlocal keywordprg< | sil! delc -buffer SudoersKeywordPrg'
+endif
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/mnv/runtime/ftplugin/svelte.mnv b/mnv/runtime/ftplugin/svelte.mnv
new file mode 100644
index 0000000000..9099e4bcad
--- /dev/null
+++ b/mnv/runtime/ftplugin/svelte.mnv
@@ -0,0 +1,40 @@
+" MNV filetype plugin
+" Language: svelte
+" Maintainer: Igor Lacerda <igorlafarsi@gmail.com>
+" Last Change: 2025 Apr 06
+
+if exists('b:did_ftplugin')
+ finish
+endif
+let b:did_ftplugin = 1
+
+let s:cpo_sav = &cpo
+set cpo&mnv
+
+setlocal matchpairs+=<:>
+setlocal commentstring=<!--\ %s\ -->
+setlocal comments=s:<!--,m:\ \ \ \ ,e:-->
+
+let b:undo_ftplugin = 'setlocal comments< commentstring< matchpairs<'
+
+if exists('&omnifunc')
+ setlocal omnifunc=htmlcomplete#CompleteTags
+ call htmlcomplete#DetectOmniFlavor()
+ let b:undo_ftplugin ..= " | setlocal omnifunc<"
+endif
+
+if exists("loaded_matchit") && !exists("b:match_words")
+ let b:match_ignorecase = 1
+ let b:match_words = '<:>,' .
+ \ '<\@<=[ou]l\>[^>]*\%(>\|$\):<\@<=li\>:<\@<=/[ou]l>,' .
+ \ '<\@<=dl\>[^>]*\%(>\|$\):<\@<=d[td]\>:<\@<=/dl>,' .
+ \ '<\@<=\([^/][^ \t>]*\)[^>]*\%(>\|$\):<\@<=/\1>,' .
+ \ '{#\(if\|each\)[^}]*}:{\:else[^}]*}:{\/\(if\|each\)},' .
+ \ '{#await[^}]*}:{\:then[^}]*}:{\:catch[^}]*}:{\/await},' .
+ \ '{#snippet[^}]*}:{\/snippet},' .
+ \ '{#key[^}]*}:{\/key}'
+ let b:html_set_match_words = 1
+ let b:undo_ftplugin ..= " | unlet! b:match_ignorecase b:match_words b:html_set_match_words"
+endif
+let &cpo = s:cpo_sav
+unlet! s:cpo_sav
diff --git a/mnv/runtime/ftplugin/svg.mnv b/mnv/runtime/ftplugin/svg.mnv
new file mode 100644
index 0000000000..22875aa0ab
--- /dev/null
+++ b/mnv/runtime/ftplugin/svg.mnv
@@ -0,0 +1,47 @@
+" MNV filetype plugin file
+" Language: svg
+"
+" This runtime file is looking for a new maintainer.
+"
+" Former maintainer: Dan Sharp
+" Last Change: 2009 Jan 20
+" 2024 Jan 14 by MNV Project (browsefilter)
+
+if exists("b:did_ftplugin") | finish | endif
+
+" Make sure the continuation lines below do not cause problems in
+" compatibility mode.
+let s:save_cpo = &cpo
+set cpo-=C
+
+" Define some defaults in case the included ftplugins don't set them.
+let s:undo_ftplugin = ""
+let s:browsefilter = "XML Files (*.xml)\t*.xml\n"
+if has("win32")
+ let s:browsefilter .= "All Files (*.*)\t*\n"
+else
+ let s:browsefilter .= "All Files (*)\t*\n"
+endif
+
+runtime! ftplugin/xml.mnv ftplugin/xml_*.mnv ftplugin/xml/*.mnv
+let b:did_ftplugin = 1
+
+" Override our defaults if these were set by an included ftplugin.
+if exists("b:undo_ftplugin")
+ let s:undo_ftplugin = b:undo_ftplugin
+endif
+if exists("b:browsefilter")
+ let s:browsefilter = b:browsefilter
+endif
+
+" Change the :browse e filter to primarily show xml-related files.
+if (has("gui_win32") || has("gui_gtk")) && !exists("b:browsefilter")
+ let b:browsefilter="SVG Files (*.svg)\t*.svg\n" . s:browsefilter
+endif
+
+" Undo the stuff we changed.
+let b:undo_ftplugin = "unlet! b:browsefilter | " . s:undo_ftplugin
+
+" Restore the saved compatibility options.
+let &cpo = s:save_cpo
+unlet s:save_cpo
diff --git a/mnv/runtime/ftplugin/sway.mnv b/mnv/runtime/ftplugin/sway.mnv
new file mode 100644
index 0000000000..6aa1506afc
--- /dev/null
+++ b/mnv/runtime/ftplugin/sway.mnv
@@ -0,0 +1,15 @@
+" MNV filetype plugin
+" Language: Sway
+" Maintainer: Riley Bruins <ribru17@gmail.com>
+" Last Change: 2024 Nov 01
+
+if exists('b:did_ftplugin')
+ finish
+endif
+let b:did_ftplugin = 1
+
+setl commentstring=//\ %s
+" From Rust comments
+setl comments=s0:/*!,ex:*/,s1:/*,mb:*,ex:*/,:///,://!,://
+
+let b:undo_ftplugin = 'setl com< cms<'
diff --git a/mnv/runtime/ftplugin/swayconfig.mnv b/mnv/runtime/ftplugin/swayconfig.mnv
new file mode 100644
index 0000000000..bdf97c2e2b
--- /dev/null
+++ b/mnv/runtime/ftplugin/swayconfig.mnv
@@ -0,0 +1,16 @@
+" MNV filetype plugin file
+" Language: sway config file
+" Original Author: James Eapen <james.eapen@vai.org>
+" Maintainer: James Eapen <james.eapen@vai.org>
+" Version: 0.1
+" Last Change: 2022 June 07
+
+if exists("b:did_ftplugin")
+ finish
+endif
+
+let b:did_ftplugin = 1
+
+let b:undo_ftplugin = "setlocal cms<"
+
+setlocal commentstring=#\ %s
diff --git a/mnv/runtime/ftplugin/swift.mnv b/mnv/runtime/ftplugin/swift.mnv
new file mode 100644
index 0000000000..5a80c8e313
--- /dev/null
+++ b/mnv/runtime/ftplugin/swift.mnv
@@ -0,0 +1,23 @@
+" This source file is part of the Swift.org open source project
+"
+" Copyright (c) 2014 - 2020 Apple Inc. and the Swift project authors
+" Licensed under Apache License v2.0 with Runtime Library Exception
+"
+" See https://swift.org/LICENSE.txt for license information
+" See https://swift.org/CONTRIBUTORS.txt for the list of Swift project authors
+"
+" MNV maintainer: Emir SARI <bitigchi@me.com>
+" Last Change: 2021 Jan 08
+
+" Only do this when not done yet for this buffer
+if exists("b:did_ftplugin")
+ finish
+endif
+
+let b:did_ftplugin = 1
+let b:undo_ftplugin = "setlocal comments< expandtab< tabstop< shiftwidth< smartindent<"
+
+setlocal comments=s1:/*,mb:*,ex:*/,:///,://
+setlocal expandtab
+setlocal sw=4 sts=4
+setlocal smartindent
diff --git a/mnv/runtime/ftplugin/swiftgyb.mnv b/mnv/runtime/ftplugin/swiftgyb.mnv
new file mode 100644
index 0000000000..e849f70ea1
--- /dev/null
+++ b/mnv/runtime/ftplugin/swiftgyb.mnv
@@ -0,0 +1,11 @@
+" This source file is part of the Swift.org open source project
+"
+" Copyright (c) 2014 - 2020 Apple Inc. and the Swift project authors
+" Licensed under Apache License v2.0 with Runtime Library Exception
+"
+" See https://swift.org/LICENSE.txt for license information
+" See https://swift.org/CONTRIBUTORS.txt for the list of Swift project authors
+"
+" MNV maintainer: Emir SARI <bitigchi@me.com>
+
+runtime! ftplugin/swift.mnv
diff --git a/mnv/runtime/ftplugin/swig.mnv b/mnv/runtime/ftplugin/swig.mnv
new file mode 100644
index 0000000000..60b24838bc
--- /dev/null
+++ b/mnv/runtime/ftplugin/swig.mnv
@@ -0,0 +1,16 @@
+" MNV filetype plugin file
+" Language: SWIG
+" Maintainer: Julien Marrec <julien.marrec 'at' gmail com>
+" Last Change: 2023 November 23
+" 2025 July 14 by MNV project: set 'comment'/'commentstring' options
+
+" Only do this when not done yet for this buffer
+if exists("b:did_ftplugin")
+ finish
+endif
+let b:did_ftplugin = 1
+
+let b:undo_ftplugin = "setlocal iskeyword< comments< commentstring<"
+setlocal iskeyword+=%
+setlocal comments=sO:*\ -,mO:*\ \ ,exO:*/,s1:/*,mb:*,ex:*/,://
+setlocal commentstring=//\ %s
diff --git a/mnv/runtime/ftplugin/sysctl.mnv b/mnv/runtime/ftplugin/sysctl.mnv
new file mode 100644
index 0000000000..096594c9bb
--- /dev/null
+++ b/mnv/runtime/ftplugin/sysctl.mnv
@@ -0,0 +1,20 @@
+" MNV filetype plugin file
+" Language: sysctl.conf(5) configuration file
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2008-07-09
+
+if exists("b:did_ftplugin")
+ finish
+endif
+let b:did_ftplugin = 1
+
+let s:cpo_save = &cpo
+set cpo&mnv
+
+let b:undo_ftplugin = "setl com< cms< fo<"
+
+setlocal comments=:;,:# commentstring=#\ %s
+setlocal formatoptions-=t formatoptions+=croql
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/mnv/runtime/ftplugin/sysml.mnv b/mnv/runtime/ftplugin/sysml.mnv
new file mode 100644
index 0000000000..a3f4bb8434
--- /dev/null
+++ b/mnv/runtime/ftplugin/sysml.mnv
@@ -0,0 +1,12 @@
+" MNV filetype plugin
+" Language: SysML
+" Author: Daumantas Kavolis <daumantas.kavolis@sensmetry.com>
+" Last Change: 2025-10-03
+
+" Only do this when not done yet for this buffer
+if exists("b:did_ftplugin")
+ finish
+endif
+
+" Behaves mostly just like KerML, only differs by keywords
+runtime! ftplugin/kerml.mnv
diff --git a/mnv/runtime/ftplugin/systemd.mnv b/mnv/runtime/ftplugin/systemd.mnv
new file mode 100644
index 0000000000..95126bcc21
--- /dev/null
+++ b/mnv/runtime/ftplugin/systemd.mnv
@@ -0,0 +1,30 @@
+" MNV filetype plugin file
+" Language: systemd.unit(5)
+" Keyword Lookup Support: Enno Nagel <enno.nagel+mnv@gmail.com>
+" Latest Revision: 2024-10-02 (small fixes to &keywordprg)
+
+if exists("b:did_ftplugin")
+ finish
+endif
+" Looks a lot like dosini files.
+runtime! ftplugin/dosini.mnv
+
+if has('unix') && executable('less') && exists(':terminal') == 2
+ command! -buffer -nargs=1 SystemdKeywordPrg silent exe 'term ++close ' KeywordLookup_systemd(<q-args>)
+ silent! function KeywordLookup_systemd(keyword) abort
+ let matches = matchlist(getline(search('\v^\s*\[\s*.+\s*\]\s*$', 'nbWz')), '\v^\s*\[\s*(\k+).*\]\s*$')
+ if len(matches) > 1
+ let section = matches[1]
+ return 'env LESS= MANPAGER="less --pattern=''(^|,)\\s+' . a:keyword . '=$'' --hilite-search" man ' . 'systemd.' . section
+ else
+ return 'env LESS= MANPAGER="less --pattern=''(^|,)\\s+' . a:keyword . '=$'' --hilite-search" man ' . 'systemd'
+ endif
+ endfunction
+ setlocal iskeyword+=-
+ setlocal keywordprg=:SystemdKeywordPrg
+ if !exists('b:undo_ftplugin') || empty(b:undo_ftplugin)
+ let b:undo_ftplugin = 'setlocal keywordprg< iskeyword< | sil! delc -buffer SystemdKeywordPrg'
+ else
+ let b:undo_ftplugin .= '| setlocal keywordprg< iskeyword< | sil! delc -buffer SystemdKeywordPrg'
+ endif
+endif
diff --git a/mnv/runtime/ftplugin/systemverilog.mnv b/mnv/runtime/ftplugin/systemverilog.mnv
new file mode 100644
index 0000000000..2bb042e60f
--- /dev/null
+++ b/mnv/runtime/ftplugin/systemverilog.mnv
@@ -0,0 +1,45 @@
+" MNV filetype plugin file
+" Language: SystemVerilog
+" Maintainer: kocha <kocha.lsifrontend@gmail.com>
+" Last Change: 07-May-2021
+" 2026 Feb 13 by MNV project: correct matchit covergroup block #19394
+
+if exists("b:did_ftplugin")
+ finish
+endif
+
+" Behaves just like Verilog
+runtime! ftplugin/verilog.mnv
+
+let s:cpo_save = &cpo
+set cpo&mnv
+
+" Add SystemVerilog keywords for matchit plugin.
+if exists("loaded_matchit")
+ let b:match_words =
+ \ '\<begin\>:\<end\>,' .
+ \ '\<case\>\|\<casex\>\|\<casez\>:\<endcase\>,' .
+ \ '\<module\>:\<endmodule\>,' .
+ \ '\<if\>:`\@<!\<else\>,' .
+ \ '\<function\>:\<endfunction\>,' .
+ \ '`ifn\?def\>:`elsif\>:`else\>:`endif\>,' .
+ \ '\<task\>:\<endtask\>,' .
+ \ '\<specify\>:\<endspecify\>,' .
+ \ '\<config\>:\<endconfig\>,' .
+ \ '\<generate\>:\<endgenerate\>,' .
+ \ '\<fork\>:\<join\>\|\<join_any\>\|\<join_none\>,' .
+ \ '\<primitive\>:\<endprimitive\>,' .
+ \ '\<table\>:\<endtable\>,' .
+ \ '\<checker\>:\<endchecker\>,' .
+ \ '\<class\>:\<endclass\>,' .
+ \ '\<clocking\>:\<endclocking\>,' .
+ \ '\<covergroup\>:\<endgroup\>,' .
+ \ '\<interface\>:\<endinterface\>,' .
+ \ '\<package\>:\<endpackage\>,' .
+ \ '\<program\>:\<endprogram\>,' .
+ \ '\<property\>:\<endproperty\>,' .
+ \ '\<sequence\>:\<endsequence\>'
+endif
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/mnv/runtime/ftplugin/tap.mnv b/mnv/runtime/ftplugin/tap.mnv
new file mode 100644
index 0000000000..a58e48b9ea
--- /dev/null
+++ b/mnv/runtime/ftplugin/tap.mnv
@@ -0,0 +1,27 @@
+" MNV filetype plugin file
+" Language: Verbose TAP Output
+" Maintainer: mnv-perl <mnv-perl@googlegroups.com> (need to be subscribed to post)
+" Homepage: https://github.com/mnv-perl/mnv-perl
+" Bugs/requests: https://github.com/mnv-perl/mnv-perl/issues
+" License: MNV License (see :help license)
+" Last Change: 2021 Oct 22
+
+" Only do this when not done yet for this buffer
+if exists('b:did_ftplugin')
+ finish
+endif
+let b:did_ftplugin = 1
+
+setlocal foldtext=TAPTestLine_foldtext()
+function! TAPTestLine_foldtext()
+ let line = getline(v:foldstart)
+ let sub = substitute(line, '/\*\|\*/\|{{{\d\=', '', 'g')
+ return sub
+endfunction
+
+setlocal foldminlines=5
+setlocal foldcolumn=2
+setlocal foldenable
+setlocal foldmethod=syntax
+
+let b:undo_ftplugin = 'setlocal foldtext< foldminlines< foldcolumn< foldenable< foldmethod<'
diff --git a/mnv/runtime/ftplugin/tcl.mnv b/mnv/runtime/ftplugin/tcl.mnv
new file mode 100644
index 0000000000..347f0d8576
--- /dev/null
+++ b/mnv/runtime/ftplugin/tcl.mnv
@@ -0,0 +1,43 @@
+" MNV filetype plugin file
+" Language: Tcl
+" Maintainer: Robert L Hicks <sigzero@gmail.com>
+" Latest Revision: 2009-05-01
+" 2024 Jan 14 by MNV Project (browsefilter)
+" 2024 May 23 by Riley Bruins <ribru17@gmail.com> ('commentstring')
+
+if exists("b:did_ftplugin")
+ finish
+endif
+let b:did_ftplugin = 1
+
+" Make sure the continuation lines below do not cause problems in
+" compatibility mode.
+let s:cpo_save = &cpo
+set cpo-=C
+
+setlocal comments=:#
+setlocal commentstring=#\ %s
+setlocal formatoptions+=croql
+
+" Change the browse dialog on Windows to show mainly Tcl-related files
+if (has("gui_win32") || has("gui_gtk")) && !exists("b:browsefilter")
+ let b:browsefilter = "Tcl Source Files (*.tcl)\t*.tcl\n" .
+ \ "Tcl Test Files (*.test)\t*.test\n"
+ if has("win32")
+ let b:browsefilter .= "All Files (*.*)\t*\n"
+ else
+ let b:browsefilter .= "All Files (*)\t*\n"
+ endif
+endif
+
+"-----------------------------------------------------------------------------
+
+" Undo the stuff we changed.
+let b:undo_ftplugin = "setlocal fo< com< cms< inc< inex< def< isf< kp<" .
+ \ " | unlet! b:browsefilter"
+
+" Restore the saved compatibility options.
+let &cpo = s:cpo_save
+unlet s:cpo_save
+
+" mnv: set et ts=4 sw=4 tw=78:
diff --git a/mnv/runtime/ftplugin/tcsh.mnv b/mnv/runtime/ftplugin/tcsh.mnv
new file mode 100644
index 0000000000..1aa877a420
--- /dev/null
+++ b/mnv/runtime/ftplugin/tcsh.mnv
@@ -0,0 +1,43 @@
+" MNV filetype plugin file
+" Language: tcsh
+" Maintainer: Doug Kearns <dougkearns@gmail.com>
+" Previous Maintainer: Dan Sharp
+" Last Change: 2024 Jan 14
+
+if exists("b:did_ftplugin")
+ finish
+endif
+
+let s:save_cpo = &cpo
+set cpo-=C
+
+" Define some defaults in case the included ftplugins don't set them.
+let s:undo_ftplugin = ""
+let s:browsefilter = "csh Files (*.csh)\t*.csh\n"
+if has("win32")
+ let s:browsefilter ..= "All Files (*.*)\t*\n"
+else
+ let s:browsefilter ..= "All Files (*)\t*\n"
+endif
+
+runtime! ftplugin/csh.mnv ftplugin/csh_*.mnv ftplugin/csh/*.mnv
+let b:did_ftplugin = 1
+
+" Override our defaults if these were set by an included ftplugin.
+if exists("b:undo_ftplugin")
+ let s:undo_ftplugin = b:undo_ftplugin
+endif
+if exists("b:browsefilter")
+ let s:browsefilter = b:browsefilter
+endif
+
+if (has("gui_win32") || has("gui_gtk")) &&
+ \ (!exists("b:browsefilter") || exists("b:csh_set_browsefilter"))
+ let b:browsefilter = "tcsh Scripts (*.tcsh)\t*.tcsh\n" .. s:browsefilter
+ let s:undo_ftplugin = "unlet! b:browsefilter | " .. s:undo_ftplugin
+endif
+
+let b:undo_ftplugin = s:undo_ftplugin
+
+let &cpo = s:save_cpo
+unlet s:save_cpo
diff --git a/mnv/runtime/ftplugin/tera.mnv b/mnv/runtime/ftplugin/tera.mnv
new file mode 100644
index 0000000000..c9b9624d06
--- /dev/null
+++ b/mnv/runtime/ftplugin/tera.mnv
@@ -0,0 +1,37 @@
+" MNV filetype plugin file
+" Language: Tera
+" Maintainer: Muntasir Mahmud <muntasir.joypurhat@gmail.com>
+" Last Change: 2025 Mar 08
+" 2025 Apr 16 by MNV Project (set 'cpoptions' for line continuation, #17121)
+
+if exists("b:did_ftplugin")
+ finish
+endif
+let b:did_ftplugin = 1
+
+let s:cpo_save = &cpo
+set cpo&mnv
+
+setlocal autoindent
+
+setlocal commentstring={#\ %s\ #}
+setlocal comments=s:{#,e:#}
+
+if exists("loaded_matchit")
+ let b:match_ignorecase = 0
+ let b:match_words = '{#:##\|#},{% *if:{% *else\>:{% *elif\>:{% *endif %},{% *for\>:{% *endfor %},{% *macro\>:{% *endmacro %},{% *block\>:{% *endblock %},{% *filter\>:{% *endfilter %},{% *set\>:{% *endset %},{% *raw\>:{% *endraw %},{% *with\>:{% *endwith %}'
+endif
+
+setlocal includeexpr=substitute(v:fname,'\\([^.]*\\)$','\\1','g')
+setlocal suffixesadd=.tera
+
+setlocal expandtab
+setlocal shiftwidth=2
+setlocal softtabstop=2
+
+let b:undo_ftplugin = "setlocal autoindent< commentstring< comments< " ..
+ \ "includeexpr< suffixesadd< expandtab< shiftwidth< softtabstop<"
+let b:undo_ftplugin .= "|unlet! b:match_ignorecase b:match_words"
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/mnv/runtime/ftplugin/terminfo.mnv b/mnv/runtime/ftplugin/terminfo.mnv
new file mode 100644
index 0000000000..8847816082
--- /dev/null
+++ b/mnv/runtime/ftplugin/terminfo.mnv
@@ -0,0 +1,19 @@
+" MNV filetype plugin file
+" Language: terminfo(5) definition
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2008-07-09
+
+if exists("b:did_ftplugin")
+ finish
+endif
+let b:did_ftplugin = 1
+
+let s:cpo_save = &cpo
+set cpo&mnv
+
+let b:undo_ftplugin = "setl com< cms< fo<"
+
+setlocal comments=:# commentstring=#\ %s formatoptions-=t formatoptions+=croql
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/mnv/runtime/ftplugin/terraform.mnv b/mnv/runtime/ftplugin/terraform.mnv
new file mode 100644
index 0000000000..5d5d214fd6
--- /dev/null
+++ b/mnv/runtime/ftplugin/terraform.mnv
@@ -0,0 +1,14 @@
+" MNV filetype plugin
+" Language: terraform
+" Maintainer: Janno Tjarks (janno.tjarks@mailbox.org)
+" Last Change: 2024 Jul 3
+
+if exists('b:did_ftplugin')
+ finish
+endif
+let b:did_ftplugin = 1
+
+setlocal commentstring=#\ %s
+setlocal comments=://,:#
+
+let b:undo_ftplugin = "setlocal commentstring< comments<"
diff --git a/mnv/runtime/ftplugin/tex.mnv b/mnv/runtime/ftplugin/tex.mnv
new file mode 100644
index 0000000000..4f90ce9f29
--- /dev/null
+++ b/mnv/runtime/ftplugin/tex.mnv
@@ -0,0 +1,46 @@
+" LaTeX filetype plugin
+" Language: LaTeX (ft=tex)
+" Maintainer: Benji Fisher, Ph.D. <benji@member.AMS.org>
+" Version: 1.4
+" Last Change: Wed 19 Apr 2006
+" URL: http://www.mnv.org/script.php?script_id=411
+
+" Only do this when not done yet for this buffer.
+if exists("b:did_ftplugin")
+ finish
+endif
+
+" Start with plain TeX. This will also define b:did_ftplugin .
+source $MNVRUNTIME/ftplugin/plaintex.mnv
+
+" Avoid problems if running in 'compatible' mode.
+let s:save_cpo = &cpo
+set cpo&mnv
+
+let b:undo_ftplugin .= "| setl inex<"
+
+" Allow "[d" to be used to find a macro definition:
+" Recognize plain TeX \def as well as LaTeX \newcommand and \renewcommand .
+" I may as well add the AMS-LaTeX DeclareMathOperator as well.
+let &l:define .= '\|\\\(re\)\=new\(boolean\|command\|counter\|environment\|font'
+ \ . '\|if\|length\|savebox\|theorem\(style\)\=\)\s*\*\=\s*{\='
+ \ . '\|DeclareMathOperator\s*{\=\s*'
+
+" Tell MNV how to recognize LaTeX \include{foo} and plain \input bar :
+let &l:include .= '\|\\include{'
+" On some file systems, "{" and "}" are included in 'isfname'. In case the
+" TeX file has \include{fname} (LaTeX only), strip everything except "fname".
+let &l:includeexpr = "substitute(v:fname, '^.\\{-}{\\|}.*', '', 'g')"
+
+" The following lines enable the macros/matchit.mnv plugin for
+" extended matching with the % key.
+" ftplugin/plaintex.mnv already defines b:match_skip and b:match_ignorecase
+" and matches \(, \), \[, \], \{, and \} .
+if exists("loaded_matchit")
+ let b:match_words .= ',\\begin\s*\({\a\+\*\=}\):\\end\s*\1'
+endif " exists("loaded_matchit")
+
+let &cpo = s:save_cpo
+unlet s:save_cpo
+
+" mnv:sts=2:sw=2:
diff --git a/mnv/runtime/ftplugin/text.mnv b/mnv/runtime/ftplugin/text.mnv
new file mode 100644
index 0000000000..ada10708b4
--- /dev/null
+++ b/mnv/runtime/ftplugin/text.mnv
@@ -0,0 +1,18 @@
+" MNV filetype plugin
+" Language: Text
+" Maintainer: David Barnett <daviebdawg+mnv@gmail.com>
+" Last Change: 2019 Jan 10
+
+if exists('b:did_ftplugin')
+ finish
+endif
+let b:did_ftplugin = 1
+
+let b:undo_ftplugin = 'setlocal comments< commentstring<'
+
+" We intentionally don't set formatoptions-=t since text should wrap as text.
+
+" Pseudo comment leaders to indent bulleted lists with '-' and '*'. And allow
+" for Mail quoted text with '>'.
+setlocal comments=fb:-,fb:*,n:>
+setlocal commentstring=
diff --git a/mnv/runtime/ftplugin/tf.mnv b/mnv/runtime/ftplugin/tf.mnv
new file mode 100644
index 0000000000..4503148a81
--- /dev/null
+++ b/mnv/runtime/ftplugin/tf.mnv
@@ -0,0 +1,13 @@
+" MNV filetype plugin
+" Language: tf (TinyFugue)
+" Maintainer: Riley Bruins <ribru17@gmail.com>
+" Last Change: 2024 Jul 06
+
+if exists('b:did_ftplugin')
+ finish
+endif
+let b:did_ftplugin = 1
+
+setl comments=:#,:; commentstring=;\ %s
+
+let b:undo_ftplugin = 'setl com< cms<'
diff --git a/mnv/runtime/ftplugin/thrift.mnv b/mnv/runtime/ftplugin/thrift.mnv
new file mode 100644
index 0000000000..4ca800a99b
--- /dev/null
+++ b/mnv/runtime/ftplugin/thrift.mnv
@@ -0,0 +1,17 @@
+" MNV filetype plugin file
+" Language: Apache Thrift
+" Maintainer: Yinzuo Jiang <jiangyinzuo@foxmail.com>
+" Last Change: 2024/07/29
+
+if exists("b:did_ftplugin")
+ finish
+endif
+
+let b:did_ftplugin = 1
+
+" Thrift supports shell-style, C-style multi-line as well as single-line Java/C++ style comments.
+" Reference: https://diwakergupta.github.io/thrift-missing-guide/#_language_reference
+setlocal comments=sO:*\ -,mO:*\ \ ,exO:*/,s1:/*,mb:*,ex:*/,:///,://,b:#
+setlocal commentstring=//\ %s
+
+let b:undo_ftplugin = 'setl comments< commentstring<'
diff --git a/mnv/runtime/ftplugin/tiasm.mnv b/mnv/runtime/ftplugin/tiasm.mnv
new file mode 100644
index 0000000000..24f2a83140
--- /dev/null
+++ b/mnv/runtime/ftplugin/tiasm.mnv
@@ -0,0 +1,18 @@
+" MNV filetype plugin file
+" Language: TI linear assembly language
+" Maintainer: Wu, Zhenyu <wuzhenyu@ustc.edu>
+" Last Change: 2025 Jan 08
+
+if exists("b:did_ftplugin") | finish | endif
+let b:did_ftplugin = 1
+
+setlocal comments=:;
+setlocal commentstring=;\ %s
+
+let b:undo_ftplugin = "setl commentstring< comments<"
+
+if exists("loaded_matchit")
+ let b:match_words = '^\s\+\.if\>:^\s\+\.elseif:^\s\+\.else\>:^\s\+\.endif\>,^\s\+\.group:^\s\+\.gmember:^\s\+\.endgroup,^\s\+\.loop:^\s\+\.break:^\s\+\.endloop,^\s\+\.macro:^\s\+\.mexit:^\s\+\.endm,^\s\+\.asmfunc:^\s\+\.endasmfunc,^\s\+\.c\?struct:^\s\+\.endstruct,^\s\+\.c\?union:^\s\+\.endunion,^\s\+\.c\?proc:^\s\+\.return:^\s\+\.endproc'
+ let b:match_ignorecase = 1
+ let b:undo_ftplugin ..= " | unlet! b:match_ignorecase b:match_words"
+endif
diff --git a/mnv/runtime/ftplugin/tidy.mnv b/mnv/runtime/ftplugin/tidy.mnv
new file mode 100644
index 0000000000..82fa16e931
--- /dev/null
+++ b/mnv/runtime/ftplugin/tidy.mnv
@@ -0,0 +1,36 @@
+" MNV filetype plugin file
+" Language: HTML Tidy Configuration
+" Maintainer: Doug Kearns <dougkearns@gmail.com>
+" Last Change: 2024 Jan 14
+
+if exists("b:did_ftplugin")
+ finish
+endif
+let b:did_ftplugin = 1
+
+let s:cpo_save = &cpo
+set cpo&mnv
+
+setlocal comments=:#,://
+setlocal commentstring=#\ %s
+setlocal formatoptions-=t formatoptions+=croql
+
+let b:undo_ftplugin = "setl fo< com< cms<"
+
+if (has("gui_win32") || has("gui_gtk")) && !exists("b:browsefilter")
+ let b:browsefilter = "HTML Tidy Files (tidyrc, .tidyrc, tidy.conf)\ttidyrc;.tidyrc;tidy.conf\n" .
+ \ "HTML Files (*.html, *.htm)\t*.html;*.htm\n" .
+ \ "XHTML Files (*.xhtml, *.xhtm)\t*.xhtml;*.xhtm\n" .
+ \ "XML Files (*.xml)\t*.xml\n"
+ if has("win32")
+ let b:browsefilter .= "All Files (*.*)\t*\n"
+ else
+ let b:browsefilter .= "All Files (*)\t*\n"
+ endif
+ let b:undo_ftplugin .= " | unlet! b:browsefilter"
+endif
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
+
+" mnv: nowrap sw=2 sts=2 ts=8
diff --git a/mnv/runtime/ftplugin/tmux.mnv b/mnv/runtime/ftplugin/tmux.mnv
new file mode 100644
index 0000000000..486a16b55d
--- /dev/null
+++ b/mnv/runtime/ftplugin/tmux.mnv
@@ -0,0 +1,15 @@
+" MNV filetype plugin file
+" Language: tmux(1) configuration file
+" URL: https://github.com/ericpruitt/tmux.mnv/
+" Maintainer: Eric Pruitt <eric.pruitt@gmail.com>
+" Last Changed: 2017 Mar 10
+
+if exists("b:did_ftplugin")
+ finish
+endif
+let b:did_ftplugin = 1
+
+let b:undo_ftplugin = "setlocal comments< commentstring<"
+
+setlocal comments=:#
+setlocal commentstring=#\ %s
diff --git a/mnv/runtime/ftplugin/toml.mnv b/mnv/runtime/ftplugin/toml.mnv
new file mode 100644
index 0000000000..6370b8d05d
--- /dev/null
+++ b/mnv/runtime/ftplugin/toml.mnv
@@ -0,0 +1,24 @@
+" MNV filetype plugin
+" Language: TOML
+" Homepage: https://github.com/cespare/mnv-toml
+" Maintainer: Aman Verma
+" Author: Lily Ballard <lily@ballards.net>
+" Last Change: May 5, 2025
+
+if exists('b:did_ftplugin')
+ finish
+endif
+let b:did_ftplugin = 1
+
+let s:save_cpo = &cpo
+set cpo&mnv
+let b:undo_ftplugin = 'setlocal commentstring< comments< iskeyword<'
+
+setlocal commentstring=#\ %s
+setlocal comments=:#
+setlocal iskeyword+=-
+
+let &cpo = s:save_cpo
+unlet s:save_cpo
+
+" mnv: et sw=2 sts=2
diff --git a/mnv/runtime/ftplugin/treetop.mnv b/mnv/runtime/ftplugin/treetop.mnv
new file mode 100644
index 0000000000..5ec65bb4db
--- /dev/null
+++ b/mnv/runtime/ftplugin/treetop.mnv
@@ -0,0 +1,19 @@
+" MNV filetype plugin file
+" Language: Treetop
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2011-03-14
+
+if exists("b:did_ftplugin")
+ finish
+endif
+let b:did_ftplugin = 1
+
+let s:cpo_save = &cpo
+set cpo&mnv
+
+setlocal comments=b:# commentstring=#\ %s formatoptions-=tcroq formatoptions+=l
+
+let b:undo_ftplugin = "setl com< cms< fo<"
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/mnv/runtime/ftplugin/tt2html.mnv b/mnv/runtime/ftplugin/tt2html.mnv
new file mode 100644
index 0000000000..0d67059e1e
--- /dev/null
+++ b/mnv/runtime/ftplugin/tt2html.mnv
@@ -0,0 +1,15 @@
+" MNV filetype plugin file
+" Language: TT2 embedded with HTML
+" Maintainer: mnv-perl <mnv-perl@googlegroups.com> (need to be subscribed to post)
+" Homepage: https://github.com/mnv-perl/mnv-perl
+" Bugs/requests: https://github.com/mnv-perl/mnv-perl/issues
+" License: MNV License (see :help license)
+" Last Change: 2018 Mar 28
+
+" Only do this when not done yet for this buffer
+if exists("b:did_ftplugin")
+ finish
+endif
+
+" Just use the HTML plugin for now.
+runtime! ftplugin/html.mnv ftplugin/html_*.mnv ftplugin/html/*.mnv
diff --git a/mnv/runtime/ftplugin/tutor.mnv b/mnv/runtime/ftplugin/tutor.mnv
new file mode 100644
index 0000000000..e84bdc172f
--- /dev/null
+++ b/mnv/runtime/ftplugin/tutor.mnv
@@ -0,0 +1,44 @@
+" Tutor filetype plugin
+" Language: Tutor (the new tutor plugin)
+" Maintainer: This runtime file is looking for a new maintainer.
+" Last Change: 2025 May 10
+" Contributors: Phạm Bình An <phambinhanctb2004@gmail.com>
+" Original Author: Felipe Morales <hel.sheep@gmail.com>
+" Last Change:
+" 2025 May 10 set b:undo_ftplugin
+" 2025 May 12 update b:undo_ftplugin
+
+" Base: {{{1
+call tutor#SetupMNV()
+
+" Buffer Settings: {{{1
+setlocal noreadonly
+setlocal noundofile
+
+setlocal keywordprg=:help
+setlocal iskeyword=@,-,_
+
+" The user will have to enable the folds himself, but we provide the foldexpr
+" function.
+setlocal foldmethod=manual
+setlocal foldexpr=tutor#TutorFolds()
+setlocal foldlevel=4
+
+" Load metadata if it exists: {{{1
+if filereadable(expand('%').'.json')
+ call tutor#LoadMetadata()
+endif
+
+" Mappings: {{{1
+
+call tutor#SetNormalMappings()
+
+" Checks: {{{1
+
+sign define tutorok text=✓ texthl=tutorOK
+sign define tutorbad text=✗ texthl=tutorX
+
+let b:undo_ftplugin = "setl foldmethod< foldexpr< foldlevel< undofile< keywordprg< iskeyword< |"
+ \ . "call tutor#EnableInteractive(v:false) |"
+
+" mnv: fdm=marker
diff --git a/mnv/runtime/ftplugin/twig.mnv b/mnv/runtime/ftplugin/twig.mnv
new file mode 100644
index 0000000000..5dcab9ceff
--- /dev/null
+++ b/mnv/runtime/ftplugin/twig.mnv
@@ -0,0 +1,14 @@
+" MNV filetype plugin
+" Language: twig
+" Maintainer: Riley Bruins <ribru17@gmail.com>
+" Last Change: 2025 Jul 14
+
+if exists('b:did_ftplugin')
+ finish
+endif
+let b:did_ftplugin = 1
+
+setlocal comments=s:{#,e:#}
+setlocal commentstring={#\ %s\ #}
+
+let b:undo_ftplugin = 'setl comments< commentstring<'
diff --git a/mnv/runtime/ftplugin/typescript.mnv b/mnv/runtime/ftplugin/typescript.mnv
new file mode 100644
index 0000000000..c8bb425351
--- /dev/null
+++ b/mnv/runtime/ftplugin/typescript.mnv
@@ -0,0 +1,45 @@
+" MNV filetype plugin file
+" Language: TypeScript
+" Maintainer: Doug Kearns <dougkearns@gmail.com>
+" Last Change: 2024 Jan 14
+" 2024 May 23 by Riley Bruins <ribru17@gmail.com> ('commentstring')
+
+if exists("b:did_ftplugin")
+ finish
+endif
+let b:did_ftplugin = 1
+
+let s:cpo_save = &cpo
+set cpo-=C
+
+" Set 'formatoptions' to break comment lines but not other lines,
+" and insert the comment leader when hitting <CR> or using "o".
+setlocal formatoptions-=t formatoptions+=croql
+
+" Set 'comments' to format dashed lists in comments.
+setlocal comments=sO:*\ -,mO:*\ \ ,exO:*/,s1:/*,mb:*,ex:*/,://
+
+setlocal commentstring=//\ %s
+
+setlocal suffixesadd+=.ts,.d.ts,.tsx,.js,.jsx,.cjs,.mjs
+
+let b:undo_ftplugin = "setl fo< com< cms< sua<"
+
+" Change the :browse e filter to primarily show TypeScript-related files.
+if (has("gui_win32") || has("gui_gtk")) && !exists("b:browsefilter")
+ let b:browsefilter="TypeScript Files (*.ts)\t*.ts\n" .
+ \ "TypeScript Declaration Files (*.d.ts)\t*.d.ts\n" .
+ \ "TSX Files (*.tsx)\t*.tsx\n" .
+ \ "JavaScript Files (*.js)\t*.js\n" .
+ \ "JavaScript Modules (*.es, *.cjs, *.mjs)\t*.es;*.cjs;*.mjs\n" .
+ \ "JSON Files (*.json)\t*.json\n"
+ if has("win32")
+ let b:browsefilter .= "All Files (*.*)\t*\n"
+ else
+ let b:browsefilter .= "All Files (*)\t*\n"
+ endif
+ let b:undo_ftplugin .= " | unlet! b:browsefilter"
+endif
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/mnv/runtime/ftplugin/typescriptreact.mnv b/mnv/runtime/ftplugin/typescriptreact.mnv
new file mode 100644
index 0000000000..d658687f6c
--- /dev/null
+++ b/mnv/runtime/ftplugin/typescriptreact.mnv
@@ -0,0 +1,33 @@
+" MNV filetype plugin file
+" Language: TypeScript React
+" Maintainer: Doug Kearns <dougkearns@gmail.com>
+" Last Change: 2020 Aug 09
+
+let s:match_words = ""
+let s:undo_ftplugin = ""
+
+runtime! ftplugin/typescript.mnv
+
+let s:cpo_save = &cpo
+set cpo-=C
+
+if exists("b:match_words")
+ let s:match_words = b:match_words
+endif
+if exists("b:undo_ftplugin")
+ let s:undo_ftplugin = b:undo_ftplugin
+endif
+
+" Matchit configuration
+if exists("loaded_matchit")
+ let b:match_ignorecase = 0
+ let b:match_words = s:match_words .
+ \ '<:>,' .
+ \ '<\@<=\([^ \t>/]\+\)\%(\s\+[^>]*\%([^/]>\|$\)\|>\|$\):<\@<=/\1>,' .
+ \ '<\@<=\%([^ \t>/]\+\)\%(\s\+[^/>]*\|$\):/>'
+endif
+
+let b:undo_ftplugin = "unlet! b:match_words b:match_ignorecase | " . s:undo_ftplugin
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/mnv/runtime/ftplugin/typst.mnv b/mnv/runtime/ftplugin/typst.mnv
new file mode 100644
index 0000000000..56044f5d05
--- /dev/null
+++ b/mnv/runtime/ftplugin/typst.mnv
@@ -0,0 +1,39 @@
+" MNV filetype plugin file
+" Language: Typst
+" Previous Maintainer: Gregory Anders
+" Luca Saccarola <github.e41mv@aleeas.com>
+" Maintainer: This runtime file is looking for a new maintainer.
+" Last Change: 2025 Aug 05
+" Based on: https://github.com/kaarmu/typst.mnv
+
+if exists('b:did_ftplugin')
+ finish
+endif
+let b:did_ftplugin = 1
+
+setlocal commentstring=//\ %s
+setlocal comments=s1:/*,mb:*,ex:*/,://
+setlocal formatoptions+=croqn
+" Numbered Lists
+setlocal formatlistpat=^\\s*\\d\\+[\\]:.)}\\t\ ]\\s*
+" Unordered (-), Ordered (+) and definition (/) Lists
+setlocal formatlistpat+=\\\|^\\s*[-+/\]\\s\\+
+setlocal suffixesadd=.typ
+
+let b:undo_ftplugin = 'setl cms< com< fo< flp< sua<'
+
+if get(g:, 'typst_conceal', 0)
+ setlocal conceallevel=2
+ let b:undo_ftplugin .= ' cole<'
+endif
+
+if has("folding") && get(g:, 'typst_folding', 0)
+ setlocal foldexpr=typst#foldexpr()
+ setlocal foldmethod=expr
+ let b:undo_ftplugin .= "|setl foldexpr< foldmethod<"
+endif
+
+if !exists('current_compiler')
+ compiler typst
+ let b:undo_ftplugin ..= "| compiler make"
+endif
diff --git a/mnv/runtime/ftplugin/uc.mnv b/mnv/runtime/ftplugin/uc.mnv
new file mode 100644
index 0000000000..1bc6c405c0
--- /dev/null
+++ b/mnv/runtime/ftplugin/uc.mnv
@@ -0,0 +1,14 @@
+" MNV filetype plugin
+" Language: UnrealScript
+" Maintainer: Riley Bruins <ribru17@gmail.com>
+" Last Change: 2025 Jul 19
+
+if exists('b:did_ftplugin')
+ finish
+endif
+let b:did_ftplugin = 1
+
+setl comments=sO:*\ -,mO:*\ \ ,exO:*/,s1:/*,mb:*,ex:*/,://
+setl commentstring=//\ %s
+
+let b:undo_ftplugin = 'setl com< cms<'
diff --git a/mnv/runtime/ftplugin/uci.mnv b/mnv/runtime/ftplugin/uci.mnv
new file mode 100644
index 0000000000..f9676c16e6
--- /dev/null
+++ b/mnv/runtime/ftplugin/uci.mnv
@@ -0,0 +1,21 @@
+" MNV ftplugin file
+" Language: OpenWrt Unified Configuration Interface
+" Maintainer: Colin Caine <complaints@cmcaine.co.uk>
+" Upstream: https://github.com/cmcaine/mnv-uci
+" Last Change: 2024 Apr 17
+"
+" For more information on uci, see https://openwrt.org/docs/guide-user/base-system/uci
+
+if exists("b:did_ftplugin")
+ finish
+endif
+let b:did_ftplugin = 1
+
+" UCI files are indented with tabs.
+setl noexpandtab
+setl shiftwidth=0
+setl softtabstop=0
+
+setl commentstring=#\ %s
+
+let b:undo_ftplugin = "setlocal et< cms< sts< sw<"
diff --git a/mnv/runtime/ftplugin/udevconf.mnv b/mnv/runtime/ftplugin/udevconf.mnv
new file mode 100644
index 0000000000..ccf1ca645b
--- /dev/null
+++ b/mnv/runtime/ftplugin/udevconf.mnv
@@ -0,0 +1,19 @@
+" MNV filetype plugin file
+" Language: udev(8) configuration file
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2008-07-09
+
+if exists("b:did_ftplugin")
+ finish
+endif
+let b:did_ftplugin = 1
+
+let s:cpo_save = &cpo
+set cpo&mnv
+
+let b:undo_ftplugin = "setl com< cms< fo<"
+
+setlocal comments=:# commentstring=#\ %s formatoptions-=t formatoptions+=croql
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/mnv/runtime/ftplugin/udevperm.mnv b/mnv/runtime/ftplugin/udevperm.mnv
new file mode 100644
index 0000000000..637682b481
--- /dev/null
+++ b/mnv/runtime/ftplugin/udevperm.mnv
@@ -0,0 +1,19 @@
+" MNV filetype plugin file
+" Language: udev(8) permissions file
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2008-07-09
+
+if exists("b:did_ftplugin")
+ finish
+endif
+let b:did_ftplugin = 1
+
+let s:cpo_save = &cpo
+set cpo&mnv
+
+let b:undo_ftplugin = "setl com< cms< fo<"
+
+setlocal comments=:# commentstring=#\ %s formatoptions-=t formatoptions+=croql
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/mnv/runtime/ftplugin/udevrules.mnv b/mnv/runtime/ftplugin/udevrules.mnv
new file mode 100644
index 0000000000..8d0756de1b
--- /dev/null
+++ b/mnv/runtime/ftplugin/udevrules.mnv
@@ -0,0 +1,28 @@
+" MNV filetype plugin file
+" Language: udev(8) rules file
+" Maintainer: This runtime file is looking for a new maintainer.
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2025-07-22 (use :hor term #17822)
+
+if exists("b:did_ftplugin")
+ finish
+endif
+let b:did_ftplugin = 1
+
+let s:cpo_save = &cpo
+set cpo&mnv
+
+let b:undo_ftplugin = "setl com< cms< fo<"
+
+setlocal comments=:# commentstring=#\ %s formatoptions-=t formatoptions+=croql
+
+if has('unix') && executable('less') && exists(':terminal') == 2
+ command -buffer -nargs=1 UdevrulesKeywordPrg
+ \ silent exe ':hor term ' . 'env LESS= MANPAGER="less --pattern=''' . escape('^\s{,8}' . <q-args> . '\b', '\') . ''' --hilite-search" man ' . 'udev'
+ setlocal iskeyword+=-
+ setlocal keywordprg=:UdevrulesKeywordPrg
+ let b:undo_ftplugin .= '| setlocal keywordprg< iskeyword< | sil! delc -buffer UdevrulesKeywordPrg'
+endif
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/mnv/runtime/ftplugin/unison.mnv b/mnv/runtime/ftplugin/unison.mnv
new file mode 100644
index 0000000000..4f60608619
--- /dev/null
+++ b/mnv/runtime/ftplugin/unison.mnv
@@ -0,0 +1,14 @@
+" MNV filetype plugin file
+" Language: unison
+" Maintainer: Anton Parkhomenko <anton@chuwy.me>
+" Latest Revision: 2023-08-07
+
+if exists("b:did_ftplugin")
+ finish
+endif
+let b:did_ftplugin = 1
+
+let b:undo_ftplugin = "setl cms< isk<"
+
+setlocal commentstring=--\ %s
+setlocal iskeyword+=!,'
diff --git a/mnv/runtime/ftplugin/updatedb.mnv b/mnv/runtime/ftplugin/updatedb.mnv
new file mode 100644
index 0000000000..67814bedaa
--- /dev/null
+++ b/mnv/runtime/ftplugin/updatedb.mnv
@@ -0,0 +1,19 @@
+" MNV filetype plugin file
+" Language: updatedb.conf(5) configuration file
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2008-07-09
+
+if exists("b:did_ftplugin")
+ finish
+endif
+let b:did_ftplugin = 1
+
+let s:cpo_save = &cpo
+set cpo&mnv
+
+let b:undo_ftplugin = "setl com< cms< fo<"
+
+setlocal comments=:# commentstring=#\ %s formatoptions-=t formatoptions+=croql
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/mnv/runtime/ftplugin/urlshortcut.mnv b/mnv/runtime/ftplugin/urlshortcut.mnv
new file mode 100644
index 0000000000..0d0c5d87cd
--- /dev/null
+++ b/mnv/runtime/ftplugin/urlshortcut.mnv
@@ -0,0 +1,20 @@
+" MNV filetype plugin file
+" Language: MS Windows URL shortcut file
+" Maintainer: ObserverOfTime <chronobserver@disroot.org>
+" Latest Revision: 2023-06-04
+
+if exists("b:did_ftplugin")
+ finish
+endif
+let b:did_ftplugin = 1
+
+let s:cpo_save = &cpoptions
+set cpoptions&mnv
+
+let b:undo_ftplugin = "setl com< cms< fo<"
+
+setlocal comments=:; commentstring=;\ %s
+setlocal formatoptions-=t formatoptions+=croql
+
+let &cpoptions = s:cpo_save
+unlet s:cpo_save
diff --git a/mnv/runtime/ftplugin/usd.mnv b/mnv/runtime/ftplugin/usd.mnv
new file mode 100644
index 0000000000..71330dafa7
--- /dev/null
+++ b/mnv/runtime/ftplugin/usd.mnv
@@ -0,0 +1,14 @@
+" MNV filetype plugin file
+" Language: Pixar Animation's Universal Scene Description format
+" Maintainer: Colin Kennedy <colinvfx@gmail.com>
+" Last Change: 2023 May 9
+" 2023 Aug 28 by MNV Project (undo_ftplugin)
+
+if exists("b:did_ftplugin")
+ finish
+endif
+let b:did_ftplugin = 1
+
+setlocal commentstring=#\ %s
+
+let b:undo_ftplugin = "setlocal commentstring<"
diff --git a/mnv/runtime/ftplugin/v.mnv b/mnv/runtime/ftplugin/v.mnv
new file mode 100644
index 0000000000..284baabdbb
--- /dev/null
+++ b/mnv/runtime/ftplugin/v.mnv
@@ -0,0 +1,15 @@
+" MNV filetype plugin
+" Language: v
+" Maintainer: Riley Bruins <ribru17@gmail.com>
+" Last Change: 2024 May 19
+
+if exists('b:did_ftplugin')
+ finish
+endif
+let b:did_ftplugin = 1
+
+" Set 'comments' to format dashed lists in comments.
+" Also include ///, used for Doxygen.
+setl comments=sO:*\ -,mO:*\ \ ,exO:*/,s1:/*,mb:*,ex:*/,:///,:// commentstring=//\ %s
+
+let b:undo_ftplugin = 'setl com< cms<'
diff --git a/mnv/runtime/ftplugin/vb.mnv b/mnv/runtime/ftplugin/vb.mnv
new file mode 100644
index 0000000000..b622ff9585
--- /dev/null
+++ b/mnv/runtime/ftplugin/vb.mnv
@@ -0,0 +1,75 @@
+" MNV filetype plugin file
+" Language: Visual Basic (ft=vb)
+" Maintainer: Doug Kearns <dougkearns@gmail.com>
+" Previous Maintainer: Johannes Zellner <johannes@zellner.org>
+" Last Change: 2024 Jan 14
+
+if exists("b:did_ftplugin")
+ finish
+endif
+let b:did_ftplugin = 1
+
+let s:cpo_save = &cpo
+set cpo&mnv
+
+setlocal comments=sr:'\ -,mb:'\ \ ,el:'\ \ ,:'
+setlocal commentstring='\ %s
+setlocal formatoptions-=t formatoptions+=croql
+
+let b:undo_ftplugin = "setlocal com< cms< fo<"
+
+" we need this wrapper, as call doesn't allow a count
+function! s:VbSearch(pattern, flags)
+ let cnt = v:count1
+ while cnt > 0
+ call search(a:pattern, a:flags)
+ let cnt = cnt - 1
+ endwhile
+endfunction
+
+if !exists("no_plugin_maps") && !exists("no_vb_maps")
+ nnoremap <buffer> <silent> [[ <Cmd>call <SID>VbSearch('^\s*\%(\%(private\<Bar>public\)\s\+\)\=\%(function\<Bar>sub\)', 'sbW')<CR>
+ vnoremap <buffer> <silent> [[ <Cmd>call <SID>VbSearch('^\s*\%(\%(private\<Bar>public\)\s\+\)\=\%(function\<Bar>sub\)', 'sbW')<CR>
+ nnoremap <buffer> <silent> ]] <Cmd>call <SID>VbSearch('^\s*\%(\%(private\<Bar>public\)\s\+\)\=\%(function\<Bar>sub\)', 'sW')<CR>
+ vnoremap <buffer> <silent> ]] <Cmd>call <SID>VbSearch('^\s*\%(\%(private\<Bar>public\)\s\+\)\=\%(function\<Bar>sub\)', 'sW')<CR>
+ nnoremap <buffer> <silent> [] <Cmd>call <SID>VbSearch('^\s*end\s\+\%(function\<Bar>sub\)', 'sbW')<CR>
+ vnoremap <buffer> <silent> [] <Cmd>call <SID>VbSearch('^\s*end\s\+\%(function\<Bar>sub\)', 'sbW')<CR>
+ nnoremap <buffer> <silent> ][ <Cmd>call <SID>VbSearch('^\s*end\s\+\%(function\<Bar>sub\)', 'sW')<CR>
+ vnoremap <buffer> <silent> ][ <Cmd>call <SID>VbSearch('^\s*end\s\+\%(function\<Bar>sub\)', 'sW')<CR>
+ let b:undo_ftplugin .= " | sil! exe 'nunmap <buffer> [[' | sil! exe 'vunmap <buffer> [['" .
+ \ " | sil! exe 'nunmap <buffer> ]]' | sil! exe 'vunmap <buffer> ]]'" .
+ \ " | sil! exe 'nunmap <buffer> []' | sil! exe 'vunmap <buffer> []'" .
+ \ " | sil! exe 'nunmap <buffer> ][' | sil! exe 'vunmap <buffer> ]['"
+endif
+
+" TODO: line start anchors are almost certainly overly restrictive - allow
+" after statement separators. Even in QuickBasic only block IF statements
+" were required to be at the start of a line.
+if exists("loaded_matchit") && !exists("b:match_words")
+ let b:match_ignorecase = 1
+ let b:match_words =
+ \ '\%(^\s*\)\@<=\<if\>.*\<then\>\s*\%($\|''\):\%(^\s*\)\@<=\<else\>:\%(^\s*\)\@<=\<elseif\>:\%(^\s*\)\@<=\<end\>\s\+\<if\>,' .
+ \ '\%(^\s*\)\@<=\<for\>:\%(^\s*\)\@<=\<next\>,' .
+ \ '\%(^\s*\)\@<=\<while\>:\%(^\s*\)\@<=\<wend\>,' .
+ \ '\%(^\s*\)\@<=\<do\>:\%(^\s*\)\@<=\<loop\>\s\+\<while\>,' .
+ \ '\%(^\s*\)\@<=\<select\>\s\+\<case\>:\%(^\s*\)\@<=\<case\>:\%(^\s*\)\@<=\<end\>\s\+\<select\>,' .
+ \ '\%(^\s*\)\@<=\<enum\>:\%(^\s*\)\@<=\<end\>\s\<enum\>,' .
+ \ '\%(^\s*\)\@<=\<with\>:\%(^\s*\)\@<=\<end\>\s\<with\>,' .
+ \ '\%(^\s*\)\@<=\%(\<\%(private\|public\)\>\s\+\)\=\<function\>\s\+\([^ \t(]\+\):\%(^\s*\)\@<=\<\1\>\s*=:\%(^\s*\)\@<=\<end\>\s\+\<function\>,' .
+ \ '\%(^\s*\)\@<=\%(\<\%(private\|public\)\>\s\+\)\=\<sub\>\s\+:\%(^\s*\)\@<=\<end\>\s\+\<sub\>'
+ let b:undo_ftplugin .= " | unlet! b:match_words b:match_ignorecase"
+endif
+
+if (has("gui_win32") || has("gui_gtk")) && !exists("b:browsefilter")
+ let b:browsefilter = "Visual Basic Source Files (*.bas)\t*.bas\n" .
+ \ "Visual Basic Form Files (*.frm)\t*.frm\n"
+ if has("win32")
+ let b:browsefilter .= "All Files (*.*)\t*\n"
+ else
+ let b:browsefilter .= "All Files (*)\t*\n"
+ endif
+ let b:undo_ftplugin .= " | unlet! b:browsefilter"
+endif
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/mnv/runtime/ftplugin/vdf.mnv b/mnv/runtime/ftplugin/vdf.mnv
new file mode 100644
index 0000000000..d3ac61f70e
--- /dev/null
+++ b/mnv/runtime/ftplugin/vdf.mnv
@@ -0,0 +1,14 @@
+" MNV filetype plugin
+" Language: Valve Data Format
+" Maintainer: ObserverOfTime <chronobserver@disroot.org>
+" Last Change: 2022 Sep 15
+
+if exists('b:did_ftplugin')
+ finish
+endif
+let b:did_ftplugin = 1
+
+setl comments=:// commentstring=//\ %s
+setl foldmethod=syntax
+
+let b:undo_ftplugin = 'setl com< cms< fdm<'
diff --git a/mnv/runtime/ftplugin/verilog.mnv b/mnv/runtime/ftplugin/verilog.mnv
new file mode 100644
index 0000000000..a00b0ae9ae
--- /dev/null
+++ b/mnv/runtime/ftplugin/verilog.mnv
@@ -0,0 +1,73 @@
+" MNV filetype plugin file
+" Language: Verilog HDL
+" Maintainer: Chih-Tsun Huang <cthuang@cs.nthu.edu.tw>
+" Last Change: 2017 Aug 25 by Chih-Tsun Huang
+" 2024 Jan 14 by MNV Project (browsefilter)
+" 2024 May 20 by Riley Bruins <ribru17@gmail.com> (commentstring)
+" URL: http://www.cs.nthu.edu.tw/~cthuang/mnv/ftplugin/verilog.mnv
+"
+" Credits:
+" Suggestions for improvement, bug reports by
+" Shao <shaominghai2005@163.com>
+
+" Only do this when not done yet for this buffer
+if exists("b:did_ftplugin")
+ finish
+endif
+
+" Don't load another plugin for this buffer
+let b:did_ftplugin = 1
+
+" Set 'cpoptions' to allow line continuations
+let s:cpo_save = &cpo
+set cpo&mnv
+
+" Undo the plugin effect
+let b:undo_ftplugin = "setlocal fo< com< tw< cms<"
+ \ . "| unlet! b:browsefilter b:match_ignorecase b:match_words"
+
+" Set 'formatoptions' to break comment lines but not other lines,
+" and insert the comment leader when hitting <CR> or using "o".
+setlocal fo-=t fo+=croqlm1
+
+" Set 'comments' to format dashed lists in comments.
+setlocal comments=sO:*\ -,mO:*\ \ ,exO:*/,s1:/*,mb:*,ex:*/,://
+setlocal commentstring=//\ %s
+
+" Format comments to be up to 78 characters long
+if &textwidth == 0
+ setlocal tw=78
+endif
+
+" Win32 and GTK can filter files in the browse dialog
+if (has("gui_win32") || has("gui_gtk")) && !exists("b:browsefilter")
+ let b:browsefilter = "Verilog Source Files (*.v)\t*.v\n"
+ if has("win32")
+ let b:browsefilter .= "All Files (*.*)\t*\n"
+ else
+ let b:browsefilter .= "All Files (*)\t*\n"
+ endif
+endif
+
+" Let the matchit plugin know what items can be matched.
+if exists("loaded_matchit")
+ let b:match_ignorecase=0
+ let b:match_words=
+ \ '\<begin\>:\<end\>,' .
+ \ '\<case\>\|\<casex\>\|\<casez\>:\<endcase\>,' .
+ \ '\<module\>:\<endmodule\>,' .
+ \ '\<if\>:`\@<!\<else\>,' .
+ \ '\<function\>:\<endfunction\>,' .
+ \ '`ifn\?def\>:`elsif\>:`else\>:`endif\>,' .
+ \ '\<task\>:\<endtask\>,' .
+ \ '\<specify\>:\<endspecify\>,' .
+ \ '\<config\>:\<endconfig\>,' .
+ \ '\<generate\>:\<endgenerate\>,' .
+ \ '\<fork\>:\<join\>,' .
+ \ '\<primitive\>:\<endprimitive\>,' .
+ \ '\<table\>:\<endtable\>'
+endif
+
+" Reset 'cpoptions' back to the user's setting
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/mnv/runtime/ftplugin/vhdl.mnv b/mnv/runtime/ftplugin/vhdl.mnv
new file mode 100644
index 0000000000..d48cd6c57c
--- /dev/null
+++ b/mnv/runtime/ftplugin/vhdl.mnv
@@ -0,0 +1,110 @@
+" VHDL filetype plugin
+" Language: VHDL
+" Maintainer: R.Shankar <shankar.pec?gmail.com>
+" Modified By: Gerald Lai <laigera+mnv?gmail.com>
+" Last Change: 2011 Dec 11
+" 2024 Jan 14 by MNV Project (browsefilter)
+" 2023 Aug 28 by MNV Project (undo_ftplugin, commentstring)
+
+" Only do this when not done yet for this buffer
+if exists("b:did_ftplugin")
+ finish
+endif
+
+" Don't load another plugin for this buffer
+let b:did_ftplugin = 1
+
+let s:cpo_save = &cpo
+set cpo&mnv
+
+" Set 'formatoptions' to break comment lines but not other lines,
+" and insert the comment leader when hitting <CR> or using "o".
+"setlocal fo-=t fo+=croqlm1
+
+" Set 'comments' to format dashed lists in comments.
+"setlocal comments=sO:*\ -,mO:*\ \ ,exO:*/,s1:/*,mb:*,ex:*/,://
+
+setlocal commentstring=--\ %s
+
+" Format comments to be up to 78 characters long
+"setlocal tw=75
+
+let b:undo_ftplugin = "setl cms< "
+
+" Win32 and GTK can filter files in the browse dialog
+"if (has("gui_win32") || has("gui_gtk")) && !exists("b:browsefilter")
+" if has("win32")
+" let b:browsefilter ..= "All Files (*.*)\t*\n"
+" else
+" let b:browsefilter ..= "All Files (*)\t*\n"
+" endif
+" let b:undo_ftplugin .= " | unlet! b:browsefilter"
+"endif
+
+" Let the matchit plugin know what items can be matched.
+if ! exists("b:match_words") && exists("loaded_matchit")
+ let b:match_ignorecase=1
+ let s:notend = '\%(\<end\s\+\)\@<!'
+ let b:match_words =
+ \ s:notend.'\<if\>:\<elsif\>:\<else\>:\<end\s\+if\>,'.
+ \ s:notend.'\<case\>:\<when\>:\<end\s\+case\>,'.
+ \ s:notend.'\<loop\>:\<end\s\+loop\>,'.
+ \ s:notend.'\<for\>:\<end\s\+for\>,'.
+ \ s:notend.'\<generate\>:\<end\s\+generate\>,'.
+ \ s:notend.'\<record\>:\<end\s\+record\>,'.
+ \ s:notend.'\<units\>:\<end\s\+units\>,'.
+ \ s:notend.'\<process\>:\<end\s\+process\>,'.
+ \ s:notend.'\<block\>:\<end\s\+block\>,'.
+ \ s:notend.'\<function\>:\<end\s\+function\>,'.
+ \ s:notend.'\<entity\>:\<end\s\+entity\>,'.
+ \ s:notend.'\<component\>:\<end\s\+component\>,'.
+ \ s:notend.'\<architecture\>:\<end\s\+architecture\>,'.
+ \ s:notend.'\<package\>:\<end\s\+package\>,'.
+ \ s:notend.'\<procedure\>:\<end\s\+procedure\>,'.
+ \ s:notend.'\<configuration\>:\<end\s\+configuration\>'
+ let b:undo_ftplugin .= " | unlet! b:match_ignorecase b:match_words"
+endif
+
+if !exists("no_plugin_maps") && !exists("no_vhdl_maps")
+ " count repeat
+ function! <SID>CountWrapper(cmd)
+ let i = v:count1
+ if a:cmd[0] == ":"
+ while i > 0
+ execute a:cmd
+ let i = i - 1
+ endwhile
+ else
+ execute "normal! gv\<Esc>"
+ execute "normal ".i.a:cmd
+ let curcol = col(".")
+ let curline = line(".")
+ normal! gv
+ call cursor(curline, curcol)
+ endif
+ endfunction
+
+ " explore motion
+ " keywords: "architecture", "block", "configuration", "component", "entity", "function", "package", "procedure", "process", "record", "units"
+ let b:vhdl_explore = '\%(architecture\|block\|configuration\|component\|entity\|function\|package\|procedure\|process\|record\|units\)'
+ noremap <buffer><silent>[[ :<C-u>cal <SID>CountWrapper(':cal search("\\%(--.*\\)\\@<!\\%(\\<end\\s\\+\\)\\@<!\\<".b:vhdl_explore."\\>\\c\\<Bar>\\%^","bW")')<CR>
+ noremap <buffer><silent>]] :<C-u>cal <SID>CountWrapper(':cal search("\\%(--.*\\)\\@<!\\%(\\<end\\s\\+\\)\\@<!\\<".b:vhdl_explore."\\>\\c\\<Bar>\\%$","W")')<CR>
+ noremap <buffer><silent>[] :<C-u>cal <SID>CountWrapper(':cal search("\\%(--.*\\)\\@<!\\<end\\s\\+".b:vhdl_explore."\\>\\c\\<Bar>\\%^","bW")')<CR>
+ noremap <buffer><silent>][ :<C-u>cal <SID>CountWrapper(':cal search("\\%(--.*\\)\\@<!\\<end\\s\\+".b:vhdl_explore."\\>\\c\\<Bar>\\%$","W")')<CR>
+ vnoremap <buffer><silent>[[ :<C-u>cal <SID>CountWrapper('[[')<CR>
+ vnoremap <buffer><silent>]] :<C-u>cal <SID>CountWrapper(']]')<CR>
+ vnoremap <buffer><silent>[] :<C-u>cal <SID>CountWrapper('[]')<CR>
+ vnoremap <buffer><silent>][ :<C-u>cal <SID>CountWrapper('][')<CR>
+ let b:undo_ftplugin .=
+ \ " | silent! execute 'nunmap <buffer> [['" .
+ \ " | silent! execute 'nunmap <buffer> ]]'" .
+ \ " | silent! execute 'nunmap <buffer> []'" .
+ \ " | silent! execute 'nunmap <buffer> ]['" .
+ \ " | silent! execute 'vunmap <buffer> [['" .
+ \ " | silent! execute 'vunmap <buffer> ]]'" .
+ \ " | silent! execute 'vunmap <buffer> []'" .
+ \ " | silent! execute 'vunmap <buffer> ]['"
+endif
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/mnv/runtime/ftplugin/vroom.mnv b/mnv/runtime/ftplugin/vroom.mnv
new file mode 100644
index 0000000000..2bff2a820d
--- /dev/null
+++ b/mnv/runtime/ftplugin/vroom.mnv
@@ -0,0 +1,35 @@
+" MNV filetype plugin file
+" Language: Vroom (mnv testing and executable documentation)
+" Maintainer: David Barnett (https://github.com/google/mnv-ft-vroom)
+" Last Change: 2014 Jul 23
+
+if exists('b:did_ftplugin')
+ finish
+endif
+let b:did_ftplugin = 1
+
+let s:cpo_save = &cpo
+set cpo-=C
+
+
+let b:undo_ftplugin = 'setlocal formatoptions< shiftwidth< softtabstop<' .
+ \ ' expandtab< iskeyword< comments< commentstring<'
+
+setlocal formatoptions-=t
+
+" The vroom interpreter doesn't accept anything but 2-space indent.
+setlocal shiftwidth=2
+setlocal softtabstop=2
+setlocal expandtab
+
+" To allow tag lookup and autocomplete for whole autoload functions, '#' must be
+" a keyword character. This also conforms to the behavior of ftplugin/mnv.mnv.
+setlocal iskeyword+=#
+
+" Vroom files have no comments (text is inert documentation unless indented).
+setlocal comments=
+setlocal commentstring=
+
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/mnv/runtime/ftplugin/vue.mnv b/mnv/runtime/ftplugin/vue.mnv
new file mode 100644
index 0000000000..73f99dd7b5
--- /dev/null
+++ b/mnv/runtime/ftplugin/vue.mnv
@@ -0,0 +1,32 @@
+" MNV filetype plugin file
+" Language: vue
+" Last Change:
+" 2025 Jun 09 by MNV project set comment options #17479
+
+if exists("b:did_ftplugin") | finish | endif
+let b:did_ftplugin = 1
+
+" Make sure the continuation lines below do not cause problems in
+" compatibility mode.
+let s:save_cpo = &cpo
+set cpo-=C
+
+setlocal commentstring=<!--\ %s\ -->
+setlocal comments=s:<!--,m:\ \ \ \ ,e:-->
+
+let b:undo_ftplugin = "setlocal comments< commentstring<"
+
+" Copied from ftplugin/html.mnv
+" Original thanks to Johannes Zellner and Benji Fisher.
+if exists("loaded_matchit")
+ let b:match_ignorecase = 1
+ let b:match_words = '<:>,'
+ \ .. '<\@<=[ou]l\>[^>]*\%(>\|$\):<\@<=li\>:<\@<=/[ou]l>,'
+ \ .. '<\@<=dl\>[^>]*\%(>\|$\):<\@<=d[td]\>:<\@<=/dl>,'
+ \ .. '<\@<=\([^/][^ \t>]*\)[^>]*\%(>\|$\):<\@<=/\1>'
+ let b:undo_ftplugin .= ' | unlet! b:match_words b:match_ignorecase'
+endif
+
+" Restore the saved compatibility options.
+let &cpo = s:save_cpo
+unlet s:save_cpo
diff --git a/mnv/runtime/ftplugin/wat.mnv b/mnv/runtime/ftplugin/wat.mnv
new file mode 100644
index 0000000000..e79a3ab502
--- /dev/null
+++ b/mnv/runtime/ftplugin/wat.mnv
@@ -0,0 +1,18 @@
+" MNV filetype plugin file
+" Language: WebAssembly
+" Maintainer: rhysd <lin90162@yahoo.co.jp>
+" Last Change: Nov 14, 2023
+" May 24, 2024 by Riley Bruins <ribru17@gmail.com> ('commentstring')
+" For bugs, patches and license go to https://github.com/rhysd/mnv-wasm
+
+if exists("b:did_ftplugin")
+ finish
+endif
+let b:did_ftplugin = 1
+
+setlocal comments=s:(;,e:;),:;;
+setlocal commentstring=(;\ %s\ ;)
+setlocal formatoptions-=t
+setlocal iskeyword+=$,.,/
+
+let b:undo_ftplugin = "setlocal comments< commentstring< formatoptions< iskeyword<"
diff --git a/mnv/runtime/ftplugin/wget.mnv b/mnv/runtime/ftplugin/wget.mnv
new file mode 100644
index 0000000000..bc90717a70
--- /dev/null
+++ b/mnv/runtime/ftplugin/wget.mnv
@@ -0,0 +1,33 @@
+" MNV filetype plugin file
+" Language: Wget configuration file (/etc/wgetrc ~/.wgetrc)
+" Maintainer: Doug Kearns <dougkearns@gmail.com>
+" Last Change: 2024 Jan 14
+
+if exists("b:did_ftplugin")
+ finish
+endif
+let b:did_ftplugin = 1
+
+let s:cpo_save = &cpo
+set cpo&mnv
+
+setlocal comments=:#,://
+setlocal commentstring=#\ %s
+setlocal formatoptions-=t formatoptions+=croql
+
+let b:undo_ftplugin = "setl fo< com< cms<"
+
+if (has("gui_win32") || has("gui_gtk")) && !exists("b:browsefilter")
+ let b:browsefilter = "Wget Configuration File (wgetrc, .wgetrc)\twgetrc;.wgetrc\n"
+ if has("win32")
+ let b:browsefilter ..= "All Files (*.*)\t*\n"
+ else
+ let b:browsefilter ..= "All Files (*)\t*\n"
+ endif
+ let b:undo_ftplugin ..= " | unlet! b:browsefilter"
+endif
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
+
+" mnv: nowrap sw=2 sts=2 ts=8
diff --git a/mnv/runtime/ftplugin/wget2.mnv b/mnv/runtime/ftplugin/wget2.mnv
new file mode 100644
index 0000000000..986e140cb6
--- /dev/null
+++ b/mnv/runtime/ftplugin/wget2.mnv
@@ -0,0 +1,33 @@
+" MNV filetype plugin file
+" Language: Wget2 configuration file (/etc/wget2rc ~/.wget2rc)
+" Maintainer: Doug Kearns <dougkearns@gmail.com>
+" Last Change: 2024 Jan 14
+
+if exists("b:did_ftplugin")
+ finish
+endif
+let b:did_ftplugin = 1
+
+let s:cpo_save = &cpo
+set cpo&mnv
+
+setlocal comments=:#,://
+setlocal commentstring=#\ %s
+setlocal formatoptions-=t formatoptions+=croql
+
+let b:undo_ftplugin = "setl fo< com< cms<"
+
+if (has("gui_win32") || has("gui_gtk")) && !exists("b:browsefilter")
+ let b:browsefilter = "Wget2 Configuration File (wget2rc, .wget2rc)\twget2rc;.wget2rc\n"
+ if has("win32")
+ let b:browsefilter ..= "All Files (*.*)\t*\n"
+ else
+ let b:browsefilter ..= "All Files (*)\t*\n"
+ endif
+ let b:undo_ftplugin ..= " | unlet! b:browsefilter"
+endif
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
+
+" mnv: nowrap sw=2 sts=2 ts=8
diff --git a/mnv/runtime/ftplugin/wks.mnv b/mnv/runtime/ftplugin/wks.mnv
new file mode 100644
index 0000000000..75380ab1a9
--- /dev/null
+++ b/mnv/runtime/ftplugin/wks.mnv
@@ -0,0 +1,14 @@
+" MNV filetype plugin file
+" Language: OpenEmbedded Image Creator (WIC) Kickstarter files wks
+" Maintainer: Anakin Childerhose <anakin@childerhose.ca>
+" Last Change: 2026 Mar 23
+
+if exists("b:did_ftplugin")
+ finish
+endif
+let b:did_ftplugin = 1
+
+setlocal comments=:#
+setlocal commentstring=#\ %s
+
+let b:undo_ftplugin = 'setlocal com< cms<'
diff --git a/mnv/runtime/ftplugin/xcompose.mnv b/mnv/runtime/ftplugin/xcompose.mnv
new file mode 100644
index 0000000000..4a040e2638
--- /dev/null
+++ b/mnv/runtime/ftplugin/xcompose.mnv
@@ -0,0 +1,13 @@
+" MNV filetype plugin file
+" Language: XCompose
+" Maintainer: ObserverOfTime <chronobserver@disroot.org
+" Last Change: 2023 Nov 09
+
+if exists('b:did_ftplugin')
+ finish
+endif
+let b:did_ftplugin = 1
+
+setl comments=:# commentstring=#\ %s
+
+let b:undo_ftplugin = 'setl com< cms<'
diff --git a/mnv/runtime/ftplugin/xdefaults.mnv b/mnv/runtime/ftplugin/xdefaults.mnv
new file mode 100644
index 0000000000..aaae15bf1a
--- /dev/null
+++ b/mnv/runtime/ftplugin/xdefaults.mnv
@@ -0,0 +1,21 @@
+" MNV filetype plugin file
+" Language: X resources files like ~/.Xdefaults (xrdb)
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2008 Jul 09
+" 2024 Jun 03 by Riley Bruins <ribru17@gmail.com> ('commentstring')
+
+if exists("b:did_ftplugin")
+ finish
+endif
+let b:did_ftplugin = 1
+
+let s:cpo_save = &cpo
+set cpo&mnv
+
+let b:undo_ftplugin = "setl com< cms< inc< fo<"
+
+setlocal comments=s1:/*,mb:*,ex:*/,:! commentstring=!\ %s inc&
+setlocal formatoptions-=t formatoptions+=croql
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/mnv/runtime/ftplugin/xf86conf.mnv b/mnv/runtime/ftplugin/xf86conf.mnv
new file mode 100644
index 0000000000..cb94a2b60d
--- /dev/null
+++ b/mnv/runtime/ftplugin/xf86conf.mnv
@@ -0,0 +1,19 @@
+" MNV filetype plugin file
+" Language: XFree86 Configuration File
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2008-07-09
+
+if exists("b:did_ftplugin")
+ finish
+endif
+let b:did_ftplugin = 1
+
+let s:cpo_save = &cpo
+set cpo&mnv
+
+let b:undo_ftplugin = "setl com< cms< fo<"
+
+setlocal comments=:# commentstring=#\ %s formatoptions-=t formatoptions+=croql
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/mnv/runtime/ftplugin/xhtml.mnv b/mnv/runtime/ftplugin/xhtml.mnv
new file mode 100644
index 0000000000..5f227eba81
--- /dev/null
+++ b/mnv/runtime/ftplugin/xhtml.mnv
@@ -0,0 +1,74 @@
+" MNV filetype plugin file
+" Language: xhtml
+"
+" This runtime file is looking for a new maintainer.
+"
+" Former maintainer: Dan Sharp
+" Last Changed: 2009 Jan 20
+" 2024 Jan 14 by MNV Project (browsefilter)
+
+if exists("b:did_ftplugin") | finish | endif
+
+" Make sure the continuation lines below do not cause problems in
+" compatibility mode.
+let s:save_cpo = &cpo
+set cpo-=C
+
+" Define some defaults in case the included ftplugins don't set them.
+let s:undo_ftplugin = ""
+let s:browsefilter = "HTML Files (*.html, *.htm)\t*.html;*.htm\n" .
+ \ "XML Files (*.xml)\t*.xml\n"
+if has("win32")
+ let s:browsefilter .= "All Files (*.*)\t*\n"
+else
+ let s:browsefilter .= "All Files (*)\t*\n"
+endif
+let s:match_words = ""
+
+runtime! ftplugin/xml.mnv ftplugin/xml_*.mnv ftplugin/xml/*.mnv
+unlet b:did_ftplugin
+
+" Override our defaults if these were set by an included ftplugin.
+if exists("b:undo_ftplugin")
+ let s:undo_ftplugin = b:undo_ftplugin
+ unlet b:undo_ftplugin
+endif
+if exists("b:browsefilter")
+ let s:browsefilter = b:browsefilter
+ unlet b:browsefilter
+endif
+if exists("b:match_words")
+ let s:match_words = b:match_words
+ unlet b:match_words
+endif
+
+runtime! ftplugin/html.mnv ftplugin/html_*.mnv ftplugin/html/*.mnv
+let b:did_ftplugin = 1
+
+" Combine the new set of values with those previously included.
+if exists("b:undo_ftplugin")
+ let s:undo_ftplugin = b:undo_ftplugin . " | " . s:undo_ftplugin
+endif
+if exists("b:browsefilter")
+ let s:browsefilter = b:browsefilter . s:browsefilter
+endif
+if exists("b:match_words")
+ let s:match_words = b:match_words . "," . s:match_words
+endif
+
+" Load the combined list of match_words for matchit.mnv
+if exists("loaded_matchit")
+ let b:match_words = s:match_words
+endif
+
+" Change the :browse e filter to primarily show tcsh-related files.
+if (has("gui_win32") || has("gui_gtk")) && !exists("b:browsefilter")
+ let b:browsefilter="XHTML files (*.xhtml, *.xhtm)\t*.xhtml;*.xhtm\n" . s:browsefilter
+endif
+
+" Undo the stuff we changed.
+let b:undo_ftplugin = "unlet! b:browsefilter b:match_words | " . s:undo_ftplugin
+
+" Restore the saved compatibility options.
+let &cpo = s:save_cpo
+unlet s:save_cpo
diff --git a/mnv/runtime/ftplugin/xinetd.mnv b/mnv/runtime/ftplugin/xinetd.mnv
new file mode 100644
index 0000000000..5249991a3b
--- /dev/null
+++ b/mnv/runtime/ftplugin/xinetd.mnv
@@ -0,0 +1,20 @@
+" MNV filetype plugin file
+" Language: xinetd.conf(5) configuration file
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2008-07-09
+
+if exists("b:did_ftplugin")
+ finish
+endif
+let b:did_ftplugin = 1
+
+let s:cpo_save = &cpo
+set cpo&mnv
+
+let b:undo_ftplugin = "setl com< cms< inc< fo<"
+
+setlocal comments=:# commentstring=#\ %s include=^\\s*include
+setlocal formatoptions-=t formatoptions+=croql
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/mnv/runtime/ftplugin/xkb.mnv b/mnv/runtime/ftplugin/xkb.mnv
new file mode 100644
index 0000000000..0d4af60d44
--- /dev/null
+++ b/mnv/runtime/ftplugin/xkb.mnv
@@ -0,0 +1,14 @@
+" MNV filetype plugin
+" Language: xkb (X keyboard extension)
+" Maintainer: The MNV Project <https://github.com/Project-Tick/Project-Tick>
+" Last Change: 2026 Mar 01
+
+if exists('b:did_ftplugin')
+ finish
+endif
+let b:did_ftplugin = 1
+
+setl comments=://
+setl commentstring=//\ %s
+
+let b:undo_ftplugin = 'setl com< cms<'
diff --git a/mnv/runtime/ftplugin/xml.mnv b/mnv/runtime/ftplugin/xml.mnv
new file mode 100644
index 0000000000..32793ffc88
--- /dev/null
+++ b/mnv/runtime/ftplugin/xml.mnv
@@ -0,0 +1,66 @@
+" MNV filetype plugin file
+" Language: xml
+" Maintainer: Christian Brabandt <cb@256bit.org>
+" Last Changed: 2024 May 24
+" Repository: https://github.com/chrisbra/mnv-xml-ftplugin
+" Previously
+" Maintainer: Dan Sharp <dwsharp at users dot sourceforge dot net>
+" URL: http://dwsharp.users.sourceforge.net/mnv/ftplugin
+
+if exists("b:did_ftplugin") | finish | endif
+let b:did_ftplugin = 1
+
+" Make sure the continuation lines below do not cause problems in
+" compatibility mode.
+let s:save_cpo = &cpo
+set cpo&mnv
+
+setlocal commentstring=<!--\ %s\ -->
+" Remove the middlepart from the comments section, as this causes problems:
+" https://groups.google.com/d/msg/mnv_dev/x4GT-nqa0Kg/jvtRnEbtAnMJ
+setlocal comments=s:<!--,e:-->
+
+setlocal formatoptions-=t
+setlocal formatoptions+=croql
+setlocal formatexpr=xmlformat#Format()
+
+" XML: thanks to Johannes Zellner and Akbar Ibrahim
+" - case sensitive
+" - don't match empty tags <fred/>
+" - match <!--, --> style comments (but not --, --)
+" - match <!, > inlined dtd's. This is not perfect, as it
+" gets confused for example by
+" <!ENTITY gt ">">
+if exists("loaded_matchit")
+ let b:match_ignorecase=0
+ let b:match_words =
+ \ '<:>,' .
+ \ '<\@<=!\[CDATA\[:]]>,'.
+ \ '<\@<=!--:-->,'.
+ \ '<\@<=?\k\+:?>,'.
+ \ '<\@<=\([^ \t>/]\+\)\%(\s\+[^>]*\%([^/]>\|$\)\|>\|$\):<\@<=/\1>,'.
+ \ '<\@<=\%([^ \t>/]\+\)\%(\s\+[^/>]*\|$\):/>'
+endif
+
+" For Omni completion, by Mikolaj Machowski.
+if exists('&ofu')
+ setlocal ofu=xmlcomplete#CompleteTags
+endif
+command! -nargs=+ XMLns call xmlcomplete#CreateConnection(<f-args>)
+command! -nargs=? XMLent call xmlcomplete#CreateEntConnection(<f-args>)
+
+" Change the :browse e filter to primarily show xml-related files.
+if (has("gui_win32") || has("gui_gtk")) && !exists("b:browsefilter")
+ let b:browsefilter="XML Files (*.xml)\t*.xml\n" .
+ \ "DTD Files (*.dtd)\t*.dtd\n" .
+ \ "XSD Files (*.xsd)\t*.xsd\n" .
+ \ "All Files (*.*)\t*.*\n"
+endif
+
+" Undo the stuff we changed.
+let b:undo_ftplugin = "setlocal commentstring< comments< formatoptions< formatexpr< " .
+ \ " | unlet! b:match_ignorecase b:match_words b:browsefilter"
+
+" Restore the saved compatibility options.
+let &cpo = s:save_cpo
+unlet s:save_cpo
diff --git a/mnv/runtime/ftplugin/xmodmap.mnv b/mnv/runtime/ftplugin/xmodmap.mnv
new file mode 100644
index 0000000000..63d355d96c
--- /dev/null
+++ b/mnv/runtime/ftplugin/xmodmap.mnv
@@ -0,0 +1,19 @@
+" MNV filetype plugin file
+" Language: xmodmap(1) definition file
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2008-07-09
+
+if exists("b:did_ftplugin")
+ finish
+endif
+let b:did_ftplugin = 1
+
+let s:cpo_save = &cpo
+set cpo&mnv
+
+let b:undo_ftplugin = "setl com< cms< fo<"
+
+setlocal comments=:! commentstring=!\ %s formatoptions-=t formatoptions+=croql
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/mnv/runtime/ftplugin/xs.mnv b/mnv/runtime/ftplugin/xs.mnv
new file mode 100644
index 0000000000..565ac62161
--- /dev/null
+++ b/mnv/runtime/ftplugin/xs.mnv
@@ -0,0 +1,15 @@
+" MNV filetype plugin file
+" Language: XS (Perl extension interface language)
+" Maintainer: mnv-perl <mnv-perl@googlegroups.com> (need to be subscribed to post)
+" Homepage: https://github.com/mnv-perl/mnv-perl
+" Bugs/requests: https://github.com/mnv-perl/mnv-perl/issues
+" License: MNV License (see :help license)
+" Last Change: 2018 Mar 28
+
+" Only do this when not done yet for this buffer
+if exists("b:did_ftplugin")
+ finish
+endif
+
+" Just use the C plugin for now.
+runtime! ftplugin/c.mnv ftplugin/c_*.mnv ftplugin/c/*.mnv
diff --git a/mnv/runtime/ftplugin/xsd.mnv b/mnv/runtime/ftplugin/xsd.mnv
new file mode 100644
index 0000000000..1845b9bb6c
--- /dev/null
+++ b/mnv/runtime/ftplugin/xsd.mnv
@@ -0,0 +1,46 @@
+" MNV filetype plugin file
+" Language: xsd
+"
+" This runtime file is looking for a new maintainer.
+"
+" Former maintainer: Dan Sharp
+" Last Changed: 2009 Jan 20
+" 2024 Jan 14 by MNV Project (browsefilter)
+
+if exists("b:did_ftplugin") | finish | endif
+
+" Make sure the continuation lines below do not cause problems in
+" compatibility mode.
+let s:save_cpo = &cpo
+set cpo-=C
+
+" Define some defaults in case the included ftplugins don't set them.
+let s:undo_ftplugin = ""
+let s:browsefilter = "XML Files (*.xml)\t*.xml\n"
+if has("win32")
+ let s:browsefilter .= "All Files (*.*)\t*\n"
+else
+ let s:browsefilter .= "All Files (*)\t*\n"
+endif
+
+runtime! ftplugin/xml.mnv ftplugin/xml_*.mnv ftplugin/xml/*.mnv
+let b:did_ftplugin = 1
+
+" Override our defaults if these were set by an included ftplugin.
+if exists("b:undo_ftplugin")
+ let s:undo_ftplugin = b:undo_ftplugin
+endif
+if exists("b:browsefilter")
+ let s:browsefilter = b:browsefilter
+endif
+
+" Change the :browse e filter to primarily show xsd-related files.
+if (has("gui_win32") || has("gui_gtk")) && !exists("b:browsefilter")
+ let b:browsefilter="XSD Files (*.xsd)\t*.xsd\n" . s:browsefilter
+endif
+
+let b:undo_ftplugin = "unlet! b:browsefilter | " . s:undo_ftplugin
+
+" Restore the saved compatibility options.
+let &cpo = s:save_cpo
+unlet s:save_cpo
diff --git a/mnv/runtime/ftplugin/xslt.mnv b/mnv/runtime/ftplugin/xslt.mnv
new file mode 100644
index 0000000000..f3ff5c83ca
--- /dev/null
+++ b/mnv/runtime/ftplugin/xslt.mnv
@@ -0,0 +1,18 @@
+" MNV filetype plugin file
+" Language: XSLT
+" Maintainer: Doug Kearns <dougkearns@gmail.com>
+" Previous Maintainer: Dan Sharp
+" Last Change: 2022 Apr 25
+
+if exists("b:did_ftplugin")
+ finish
+endif
+
+runtime! ftplugin/xml.mnv ftplugin/xml_*.mnv ftplugin/xml/*.mnv
+
+let b:did_ftplugin = 1
+
+" Change the :browse e filter to primarily show xsd-related files.
+if (has("gui_win32") || has("gui_gtk")) && exists("b:browsefilter")
+ let b:browsefilter = "XSLT Files (*.xsl, *.xslt)\t*.xsl;*.xslt\n" . b:browsefilter
+endif
diff --git a/mnv/runtime/ftplugin/yacc.mnv b/mnv/runtime/ftplugin/yacc.mnv
new file mode 100644
index 0000000000..d082cf88a8
--- /dev/null
+++ b/mnv/runtime/ftplugin/yacc.mnv
@@ -0,0 +1,16 @@
+" MNV filetype plugin
+" Language: Yacc
+" Maintainer: Riley Bruins <ribru17@gmail.com>
+" Last Change: 2024 Jul 06
+
+if exists('b:did_ftplugin')
+ finish
+endif
+let b:did_ftplugin = 1
+
+" Set 'comments' to format dashed lists in comments.
+" Also include ///, used for Doxygen.
+setlocal comments=sO:*\ -,mO:*\ \ ,exO:*/,s1:/*,mb:*,ex:*/,:///,://
+setlocal commentstring=//\ %s
+
+let b:undo_ftplugin = 'setl com< cms<'
diff --git a/mnv/runtime/ftplugin/yaml.mnv b/mnv/runtime/ftplugin/yaml.mnv
new file mode 100644
index 0000000000..f7135847b5
--- /dev/null
+++ b/mnv/runtime/ftplugin/yaml.mnv
@@ -0,0 +1,41 @@
+" MNV filetype plugin file
+" Language: YAML (YAML Ain't Markup Language)
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se> (inactive)
+" Last Change: 2024 Oct 04
+" 2025 Apr 22 by MNV project re-order b:undo_ftplugin (#17179)
+
+if exists("b:did_ftplugin")
+ finish
+endif
+let b:did_ftplugin = 1
+
+let s:cpo_save = &cpo
+set cpo&mnv
+
+let b:undo_ftplugin = "setl com< cms< et< fo<"
+
+setlocal comments=:# commentstring=#\ %s expandtab
+setlocal formatoptions-=t formatoptions+=croql
+
+if get(g:, "yaml_recommended_style",1)
+ let b:undo_ftplugin ..= " sw< sts<"
+ setlocal shiftwidth=2 softtabstop=2
+endif
+
+" rime input method engine(https://rime.im/)
+" uses `*.custom.yaml` as its config files
+if expand('%:r:e') ==# 'custom'
+ " `__include` command in `*.custom.yaml`
+ " see: https://github.com/rime/home/wiki/Configuration#%E5%8C%85%E5%90%AB
+ setlocal include=__include:\\s*
+ let b:undo_ftplugin ..= " inc<"
+
+ if !exists('current_compiler')
+ compiler rime_deployer
+ let b:undo_ftplugin ..= " | compiler make"
+ endif
+endif
+
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/mnv/runtime/ftplugin/yara.mnv b/mnv/runtime/ftplugin/yara.mnv
new file mode 100644
index 0000000000..23d44cca2e
--- /dev/null
+++ b/mnv/runtime/ftplugin/yara.mnv
@@ -0,0 +1,22 @@
+" MNV filetype plugin file
+" Language: YARA
+" Maintainer: The MNV Project <https://github.com/Project-Tick/Project-Tick>
+" Last Change: 2026 Mar 17
+
+" Only do this when not done yet for this buffer
+if exists("b:did_ftplugin")
+ finish
+endif
+
+" Don't load another plugin for this buffer
+let b:did_ftplugin = 1
+
+" Set 'formatoptions' to break comment lines but not other lines,
+" and insert the comment leader when hitting <CR> or using "o".
+setlocal formatoptions-=t formatoptions+=croql
+
+setlocal commentstring=//\ %s
+setlocal comments=s1:/*,mb:*,ex:*/,://
+
+" Undo settings when leaving buffer
+let b:undo_ftplugin = "setlocal commentstring< comments< formatoptions<"
diff --git a/mnv/runtime/ftplugin/zathurarc.mnv b/mnv/runtime/ftplugin/zathurarc.mnv
new file mode 100644
index 0000000000..816d2bfc42
--- /dev/null
+++ b/mnv/runtime/ftplugin/zathurarc.mnv
@@ -0,0 +1,22 @@
+" MNV filetype plugin file
+" Language: Zathurarc
+" Maintainer: Wu, Zhenyu <wuzhenyu@ustc.edu>
+" Documentation: https://pwmt.org/projects/zathura/documentation/
+" Upstream: https://github.com/Freed-Wu/zathurarc.mnv
+" Latest Revision: 2024-04-02
+
+if exists('b:did_ftplugin')
+ finish
+endif
+let b:did_ftplugin = 1
+
+let s:save_cpoptions = &cpoptions
+set cpoptions&mnv
+
+let b:undo_ftplugin = 'setlocal comments< commentstring< include<'
+setlocal comments=:#
+setlocal commentstring=#\ %s
+setlocal include=^\sinclude
+
+let &cpoptions = s:save_cpoptions
+unlet s:save_cpoptions
diff --git a/mnv/runtime/ftplugin/zig.mnv b/mnv/runtime/ftplugin/zig.mnv
new file mode 100644
index 0000000000..03067be73f
--- /dev/null
+++ b/mnv/runtime/ftplugin/zig.mnv
@@ -0,0 +1,55 @@
+" MNV filetype plugin file
+" Language: Zig
+" Maintainer: Mathias Lindgren <math.lindgren@gmail.com>
+" Last Change: 2024 Oct 04
+" Based on: https://github.com/ziglang/zig.mnv
+
+if exists("b:did_ftplugin")
+ finish
+endif
+
+let b:did_ftplugin = 1
+
+let s:cpo_save = &cpo
+set cpo&mnv
+
+" Match Zig builtin fns
+setlocal iskeyword+=@-@
+setlocal formatoptions-=t formatoptions+=croql
+setlocal suffixesadd=.zig,.zir,.zon
+let &l:define='\v(<fn>|<const>|<var>|^\s*\#\s*define)'
+let b:undo_ftplugin = 'setl isk< fo< sua< mp< def<'
+
+if get(g:, 'zig_recommended_style', 1)
+ setlocal expandtab
+ setlocal tabstop=8
+ setlocal softtabstop=4
+ setlocal shiftwidth=4
+ let b:undo_ftplugin .= ' | setl et< ts< sts< sw<'
+endif
+
+if has('comments')
+ setlocal comments=:///,://!,://
+ setlocal commentstring=//\ %s
+ let b:undo_ftplugin .= ' | setl com< cms<'
+endif
+
+if has('find_in_path')
+ let &l:includeexpr='substitute(v:fname, "^([^.])$", "\1.zig", "")'
+ let &l:include='\v(\@import>|\@cInclude>|^\s*\#\s*include)'
+ let b:undo_ftplugin .= ' | setl inex< inc<'
+endif
+
+if exists('g:zig_std_dir')
+ let &l:path .= ',' . g:zig_std_dir
+ let b:undo_ftplugin .= ' | setl pa<'
+endif
+
+if !exists('current_compiler')
+ compiler zig_build
+ let b:undo_ftplugin .= "| compiler make"
+endif
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
+" mnv: tabstop=8 shiftwidth=4 softtabstop=4 expandtab
diff --git a/mnv/runtime/ftplugin/zimbu.mnv b/mnv/runtime/ftplugin/zimbu.mnv
new file mode 100644
index 0000000000..ec14192661
--- /dev/null
+++ b/mnv/runtime/ftplugin/zimbu.mnv
@@ -0,0 +1,210 @@
+" MNV filetype plugin file
+" Language: Zimbu
+" Maintainer: The MNV Project <https://github.com/Project-Tick/Project-Tick>
+" Last Change: 2025 Jun 08
+" Former Maintainer: Bram Moolenaar <Bram@mnv.org>
+" Note: Zimbu was the programming language invented by Bram,
+" but it seems to be lost by now
+
+" Only do this when not done yet for this buffer
+if exists("b:did_ftplugin")
+ finish
+endif
+
+" Don't load another plugin for this buffer
+let b:did_ftplugin = 1
+
+" Using line continuation here.
+let s:cpo_save = &cpo
+set cpo-=C
+
+let b:undo_ftplugin = "setl fo< com< cms< ofu< efm< tw< et< sts< sw< | if has('vms') | setl isk< | endif"
+
+" Set 'formatoptions' to break comment lines but not other lines,
+" and insert the comment leader when hitting <CR> or using "o".
+setlocal fo-=t fo+=croql
+
+" Set completion with CTRL-X CTRL-O to autoloaded function.
+if exists('&ofu')
+ setlocal ofu=ccomplete#Complete
+endif
+
+" Set 'comments' to format dashed lists in comments.
+" And to keep Zudocu comment characters.
+setlocal comments=sO:#\ -,mO:#\ \ ,exO:#/,s:/*,m:\ ,ex:*/,:#=,:#-,:#%,:#
+setlocal commentstring=#\ %s
+
+setlocal errorformat^=%f\ line\ %l\ col\ %c:\ %m,ERROR:\ %m
+
+" When the matchit plugin is loaded, this makes the % command skip parens and
+" braces in comments.
+if exists("loaded_matchit") && !exists("b:match_words")
+ let b:match_words = '\(^\s*\)\@<=\(MODULE\|CLASS\|INTERFACE\|BITS\|ENUM\|SHARED\|FUNC\|REPLACE\|DEFINE\|PROC\|EQUAL\|MAIN\|IF\|GENERATE_IF\|WHILE\|REPEAT\|WITH\|DO\|FOR\|SWITCH\|TRY\)\>\|{\s*$:\(^\s*\)\@<=\(ELSE\|ELSEIF\|GENERATE_ELSE\|GENERATE_ELSEIF\|CATCH\|FINALLY\)\>:\(^\s*\)\@<=\(}\|\<UNTIL\>\)'
+ let b:match_skip = 's:comment\|string\|zimbuchar'
+ let b:undo_ftplugin ..= " | unlet! b:match_words b:match_skip"
+endif
+
+setlocal tw=78
+setlocal et sts=2 sw=2
+
+" Does replace when a dot, space or closing brace is typed.
+func! GCUpperDot(what)
+ if v:char != ' ' && v:char != "\r" && v:char != "\x1b" && v:char != '.' && v:char != ')' && v:char != '}' && v:char != ','
+ " no space or dot after the typed text
+ let g:got_char = v:char
+ return a:what
+ endif
+ return GCUpperCommon(a:what)
+endfunc
+
+" Does not replace when a dot is typed.
+func! GCUpper(what)
+ if v:char != ' ' && v:char != "\r" && v:char != "\x1b" && v:char != ')' && v:char != ','
+ " no space or other "terminating" character after the typed text
+ let g:got_char = v:char
+ return a:what
+ endif
+ return GCUpperCommon(a:what)
+endfunc
+
+" Only replaces when a space is typed.
+func! GCUpperSpace(what)
+ if v:char != ' '
+ " no space after the typed text
+ let g:got_char = v:char
+ return a:what
+ endif
+ return GCUpperCommon(a:what)
+endfunc
+
+func! GCUpperCommon(what)
+ let col = col(".") - strlen(a:what)
+ if col > 1 && getline('.')[col - 2] != ' '
+ " no space before the typed text
+ let g:got_char = 999
+ return a:what
+ endif
+ let synName = synIDattr(synID(line("."), col(".") - 2, 1), "name")
+ if synName =~ 'Comment\|String\|zimbuCregion\|\<c'
+ " inside a comment or C code
+ let g:got_char = 777
+ return a:what
+ endif
+ let g:got_char = 1111
+ return toupper(a:what)
+endfunc
+
+iabbr <buffer> <expr> alias GCUpperSpace("alias")
+iabbr <buffer> <expr> arg GCUpperDot("arg")
+iabbr <buffer> <expr> break GCUpper("break")
+iabbr <buffer> <expr> case GCUpperSpace("case")
+iabbr <buffer> <expr> catch GCUpperSpace("catch")
+iabbr <buffer> <expr> check GCUpperDot("check")
+iabbr <buffer> <expr> class GCUpperSpace("class")
+iabbr <buffer> <expr> interface GCUpperSpace("interface")
+iabbr <buffer> <expr> implements GCUpperSpace("implements")
+iabbr <buffer> <expr> shared GCUpperSpace("shared")
+iabbr <buffer> <expr> continue GCUpper("continue")
+iabbr <buffer> <expr> default GCUpper("default")
+iabbr <buffer> <expr> extends GCUpper("extends")
+iabbr <buffer> <expr> do GCUpper("do")
+iabbr <buffer> <expr> else GCUpper("else")
+iabbr <buffer> <expr> elseif GCUpperSpace("elseif")
+iabbr <buffer> <expr> enum GCUpperSpace("enum")
+iabbr <buffer> <expr> exit GCUpper("exit")
+iabbr <buffer> <expr> false GCUpper("false")
+iabbr <buffer> <expr> fail GCUpper("fail")
+iabbr <buffer> <expr> finally GCUpper("finally")
+iabbr <buffer> <expr> for GCUpperSpace("for")
+iabbr <buffer> <expr> func GCUpperSpace("func")
+iabbr <buffer> <expr> if GCUpperSpace("if")
+iabbr <buffer> <expr> import GCUpperSpace("import")
+iabbr <buffer> <expr> in GCUpperSpace("in")
+iabbr <buffer> <expr> io GCUpperDot("io")
+iabbr <buffer> <expr> main GCUpper("main")
+iabbr <buffer> <expr> module GCUpperSpace("module")
+iabbr <buffer> <expr> new GCUpper("new")
+iabbr <buffer> <expr> nil GCUpper("nil")
+iabbr <buffer> <expr> ok GCUpper("ok")
+iabbr <buffer> <expr> proc GCUpperSpace("proc")
+iabbr <buffer> <expr> proceed GCUpper("proceed")
+iabbr <buffer> <expr> return GCUpper("return")
+iabbr <buffer> <expr> step GCUpperSpace("step")
+iabbr <buffer> <expr> switch GCUpperSpace("switch")
+iabbr <buffer> <expr> sys GCUpperDot("sys")
+iabbr <buffer> <expr> this GCUpperDot("this")
+iabbr <buffer> <expr> throw GCUpperSpace("throw")
+iabbr <buffer> <expr> try GCUpper("try")
+iabbr <buffer> <expr> to GCUpperSpace("to")
+iabbr <buffer> <expr> true GCUpper("true")
+iabbr <buffer> <expr> until GCUpperSpace("until")
+iabbr <buffer> <expr> while GCUpperSpace("while")
+iabbr <buffer> <expr> repeat GCUpper("repeat")
+
+let b:undo_ftplugin ..=
+ \ " | iunabbr <buffer> alias" ..
+ \ " | iunabbr <buffer> arg" ..
+ \ " | iunabbr <buffer> break" ..
+ \ " | iunabbr <buffer> case" ..
+ \ " | iunabbr <buffer> catch" ..
+ \ " | iunabbr <buffer> check" ..
+ \ " | iunabbr <buffer> class" ..
+ \ " | iunabbr <buffer> interface" ..
+ \ " | iunabbr <buffer> implements" ..
+ \ " | iunabbr <buffer> shared" ..
+ \ " | iunabbr <buffer> continue" ..
+ \ " | iunabbr <buffer> default" ..
+ \ " | iunabbr <buffer> extends" ..
+ \ " | iunabbr <buffer> do" ..
+ \ " | iunabbr <buffer> else" ..
+ \ " | iunabbr <buffer> elseif" ..
+ \ " | iunabbr <buffer> enum" ..
+ \ " | iunabbr <buffer> exit" ..
+ \ " | iunabbr <buffer> false" ..
+ \ " | iunabbr <buffer> fail" ..
+ \ " | iunabbr <buffer> finally" ..
+ \ " | iunabbr <buffer> for" ..
+ \ " | iunabbr <buffer> func" ..
+ \ " | iunabbr <buffer> if" ..
+ \ " | iunabbr <buffer> import" ..
+ \ " | iunabbr <buffer> in" ..
+ \ " | iunabbr <buffer> io" ..
+ \ " | iunabbr <buffer> main" ..
+ \ " | iunabbr <buffer> module" ..
+ \ " | iunabbr <buffer> new" ..
+ \ " | iunabbr <buffer> nil" ..
+ \ " | iunabbr <buffer> ok" ..
+ \ " | iunabbr <buffer> proc" ..
+ \ " | iunabbr <buffer> proceed" ..
+ \ " | iunabbr <buffer> return" ..
+ \ " | iunabbr <buffer> step" ..
+ \ " | iunabbr <buffer> switch" ..
+ \ " | iunabbr <buffer> sys" ..
+ \ " | iunabbr <buffer> this" ..
+ \ " | iunabbr <buffer> throw" ..
+ \ " | iunabbr <buffer> try" ..
+ \ " | iunabbr <buffer> to" ..
+ \ " | iunabbr <buffer> true" ..
+ \ " | iunabbr <buffer> until" ..
+ \ " | iunabbr <buffer> while" ..
+ \ " | iunabbr <buffer> repeat"
+
+if !exists("no_plugin_maps") && !exists("no_zimbu_maps")
+ nnoremap <silent> <buffer> [[ m`:call ZimbuGoStartBlock()<CR>
+ nnoremap <silent> <buffer> ]] m`:call ZimbuGoEndBlock()<CR>
+ let b:undo_ftplugin ..=
+ \ " | silent! exe 'nunmap <buffer> [['" ..
+ \ " | silent! exe 'nunmap <buffer> ]]'"
+endif
+
+" Using a function makes sure the search pattern is restored
+func! ZimbuGoStartBlock()
+ ?^\s*\(FUNC\|PROC\|MAIN\|ENUM\|CLASS\|INTERFACE\)\>
+endfunc
+func! ZimbuGoEndBlock()
+ /^\s*\(FUNC\|PROC\|MAIN\|ENUM\|CLASS\|INTERFACE\)\>
+endfunc
+
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/mnv/runtime/ftplugin/zsh.mnv b/mnv/runtime/ftplugin/zsh.mnv
new file mode 100644
index 0000000000..278253626a
--- /dev/null
+++ b/mnv/runtime/ftplugin/zsh.mnv
@@ -0,0 +1,47 @@
+" MNV filetype plugin file
+" Language: Zsh shell script
+" Maintainer: Christian Brabandt <cb@256bit.org>
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2025 Jul 23
+" License: MNV (see :h license)
+" Repository: https://github.com/chrisbra/mnv-zsh
+
+if exists("b:did_ftplugin")
+ finish
+endif
+let b:did_ftplugin = 1
+
+let s:cpo_save = &cpo
+set cpo&mnv
+
+setlocal comments=:# commentstring=#\ %s formatoptions-=t formatoptions+=croql
+
+let b:undo_ftplugin = "setl com< cms< fo< "
+
+if get(g:, 'zsh_fold_enable', 0)
+ setlocal foldmethod=syntax
+ let b:undo_ftplugin .= "fdm< "
+endif
+
+if executable('zsh') && &shell !~# '/\%(nologin\|false\)$'
+ if exists(':terminal') == 2
+ command! -buffer -nargs=1 ZshKeywordPrg silent exe ':hor :term zsh -c "autoload -Uz run-help; run-help <args>"'
+ else
+ command! -buffer -nargs=1 ZshKeywordPrg echo system('MANPAGER= zsh -c "autoload -Uz run-help; run-help <args> 2>/dev/null"')
+ endif
+ setlocal keywordprg=:ZshKeywordPrg
+ let b:undo_ftplugin .= '| setl keywordprg< | sil! delc -buffer ZshKeywordPrg'
+
+ if !exists('current_compiler')
+ compiler zsh
+ endif
+ let b:undo_ftplugin .= ' | compiler make'
+endif
+
+let b:match_words = '\<if\>:\<elif\>:\<else\>:\<fi\>'
+ \ . ',\<case\>:^\s*([^)]*):\<esac\>'
+ \ . ',\<\%(select\|while\|until\|repeat\|for\%(each\)\=\)\>:\<done\>'
+let b:match_skip = 's:comment\|string\|heredoc\|subst'
+
+let &cpo = s:cpo_save
+unlet s:cpo_save