diff src/testdir/test_filetype.vim @ 32669:448aef880252

normalize line endings
author Christian Brabandt <cb@256bit.org>
date Mon, 26 Jun 2023 09:54:34 +0200
parents 4e2d73ee7350
children 695b50472e85
line wrap: on
line diff
--- a/src/testdir/test_filetype.vim
+++ b/src/testdir/test_filetype.vim
@@ -1,2221 +1,2221 @@
-" Test :setfiletype
-
-func Test_backup_strip()
-  filetype on
-  let fname = 'Xdetect.js~~~~~~~~~~~'
-  call writefile(['one', 'two', 'three'], fname, 'D')
-  exe 'edit ' .. fname
-  call assert_equal('javascript', &filetype)
-
-  bwipe!
-  filetype off
-endfunc
-
-func Test_detection()
-  filetype on
-  augroup filetypedetect
-    au BufNewFile,BufRead *	call assert_equal(1, did_filetype())
-  augroup END
-  new something.vim
-  call assert_equal('vim', &filetype)
-
-  bwipe!
-  filetype off
-endfunc
-
-func Test_conf_type()
-  filetype on
-  call writefile(['# some comment', 'must be conf'], 'Xconffile', 'D')
-  augroup filetypedetect
-    au BufNewFile,BufRead *	call assert_equal(0, did_filetype())
-  augroup END
-  split Xconffile
-  call assert_equal('conf', &filetype)
-
-  bwipe!
-  filetype off
-endfunc
-
-func Test_other_type()
-  filetype on
-  augroup filetypedetect
-    au BufNewFile,BufRead *	call assert_equal(0, did_filetype())
-    au BufNewFile,BufRead Xotherfile	setf testfile
-    au BufNewFile,BufRead *	call assert_equal(1, did_filetype())
-  augroup END
-  call writefile(['# some comment', 'must be conf'], 'Xotherfile', 'D')
-  split Xotherfile
-  call assert_equal('testfile', &filetype)
-
-  bwipe!
-  filetype off
-endfunc
-
-" If $XDG_CONFIG_HOME is set return "fname" expanded in a list.
-" Otherwise return an empty list.
-def s:WhenConfigHome(fname: string): list<string>
-  if exists('$XDG_CONFIG_HOME')
-    return [expand(fname)]
-  endif
-  return []
-enddef
-
-" Return the name used for the $XDG_CONFIG_HOME directory.
-def s:GetConfigHome(): string
-  return getcwd() .. '/Xdg_config_home'
-enddef
-
-" saved value of $XDG_CONFIG_HOME
-let s:saveConfigHome = ''
-
-def s:SetupConfigHome()
-  if empty(windowsversion())
-    s:saveConfigHome = $XDG_CONFIG_HOME
-    setenv("XDG_CONFIG_HOME", GetConfigHome())
-  endif
-enddef
-
-" Filetypes detected just from matching the file name.
-" First one is checking that these files have no filetype.
-def s:GetFilenameChecks(): dict<list<string>>
-  return {
-    none: ['bsd', 'some-bsd'],
-    8th: ['file.8th'],
-    a2ps: ['/etc/a2ps.cfg', '/etc/a2ps/file.cfg', 'a2psrc', '.a2psrc', 'any/etc/a2ps.cfg', 'any/etc/a2ps/file.cfg'],
-    a65: ['file.a65'],
-    aap: ['file.aap'],
-    abap: ['file.abap'],
-    abc: ['file.abc'],
-    abel: ['file.abl'],
-    acedb: ['file.wrm'],
-    ada: ['file.adb', 'file.ads', 'file.ada', 'file.gpr'],
-    ahdl: ['file.tdf'],
-    aidl: ['file.aidl'],
-    alsaconf: ['.asoundrc', '/usr/share/alsa/alsa.conf', '/etc/asound.conf', 'any/etc/asound.conf', 'any/usr/share/alsa/alsa.conf'],
-    aml: ['file.aml'],
-    ampl: ['file.run'],
-    ant: ['build.xml'],
-    apache: ['.htaccess', '/etc/httpd/file.conf', '/etc/apache2/sites-2/file.com', '/etc/apache2/some.config', '/etc/apache2/conf.file/conf', '/etc/apache2/mods-some/file', '/etc/apache2/sites-some/file', '/etc/httpd/conf.d/file.config', '/etc/apache2/conf.file/file', '/etc/apache2/file.conf', '/etc/apache2/file.conf-file', '/etc/apache2/mods-file/file', '/etc/apache2/sites-file/file', '/etc/apache2/sites-file/file.com', '/etc/httpd/conf.d/file.conf', '/etc/httpd/conf.d/file.conf-file', 'access.conf', 'access.conf-file', 'any/etc/apache2/conf.file/file', 'any/etc/apache2/file.conf', 'any/etc/apache2/file.conf-file', 'any/etc/apache2/mods-file/file', 'any/etc/apache2/sites-file/file', 'any/etc/apache2/sites-file/file.com', 'any/etc/httpd/conf.d/file.conf', 'any/etc/httpd/conf.d/file.conf-file', 'any/etc/httpd/file.conf', 'apache.conf', 'apache.conf-file', 'apache2.conf', 'apache2.conf-file', 'httpd.conf', 'httpd.conf-file', 'srm.conf', 'srm.conf-file', '/etc/httpd/mods-some/file', '/etc/httpd/sites-some/file', '/etc/httpd/conf.file/conf'],
-    apachestyle: ['/etc/proftpd/file.config,/etc/proftpd/conf.file/file', '/etc/proftpd/conf.file/file', '/etc/proftpd/file.conf', '/etc/proftpd/file.conf-file', 'any/etc/proftpd/conf.file/file', 'any/etc/proftpd/file.conf', 'any/etc/proftpd/file.conf-file', 'proftpd.conf', 'proftpd.conf-file'],
-    applescript: ['file.scpt'],
-    aptconf: ['apt.conf', '/.aptitude/config', 'any/.aptitude/config'],
-    arch: ['.arch-inventory', '=tagging-method'],
-    arduino: ['file.ino', 'file.pde'],
-    art: ['file.art'],
-    asciidoc: ['file.asciidoc', 'file.adoc'],
-    asn: ['file.asn', 'file.asn1'],
-    asterisk: ['asterisk/file.conf', 'asterisk/file.conf-file', 'some-asterisk/file.conf', 'some-asterisk/file.conf-file'],
-    astro: ['file.astro'],
-    atlas: ['file.atl', 'file.as'],
-    autohotkey: ['file.ahk'],
-    autoit: ['file.au3'],
-    automake: ['GNUmakefile.am', 'makefile.am', 'Makefile.am'],
-    ave: ['file.ave'],
-    awk: ['file.awk', 'file.gawk'],
-    b: ['file.mch', 'file.ref', 'file.imp'],
-    basic: ['file.bas', 'file.bi', 'file.bm'],
-    bass: ['file.bass'],
-    bc: ['file.bc'],
-    bdf: ['file.bdf'],
-    beancount: ['file.beancount'],
-    bib: ['file.bib'],
-    bicep: ['file.bicep'],
-    bindzone: ['named.root', '/bind/db.file', '/named/db.file', 'any/bind/db.file', 'any/named/db.file'],
-    bitbake: ['file.bb', 'file.bbappend', 'file.bbclass', 'build/conf/local.conf', 'meta/conf/layer.conf', 'build/conf/bbappend.conf', 'meta-layer/conf/distro/foo.conf'],
-    blank: ['file.bl'],
-    blueprint: ['file.blp'],
-    bsdl: ['file.bsd', 'file.bsdl'],
-    bst: ['file.bst'],
-    bzl: ['file.bazel', 'file.bzl', 'WORKSPACE', 'WORKSPACE.bzlmod'],
-    bzr: ['bzr_log.any', 'bzr_log.file'],
-    c: ['enlightenment/file.cfg', 'file.qc', 'file.c', 'some-enlightenment/file.cfg'],
-    cabal: ['file.cabal'],
-    cabalconfig: ['cabal.config', expand("$HOME/.config/cabal/config")] + WhenConfigHome('$XDG_CONFIG_HOME/cabal/config'),
-    cabalproject: ['cabal.project', 'cabal.project.local'],
-    cairo: ['file.cairo'],
-    calendar: ['calendar', '/.calendar/file', '/share/calendar/any/calendar.file', '/share/calendar/calendar.file', 'any/share/calendar/any/calendar.file', 'any/share/calendar/calendar.file'],
-    capnp: ['file.capnp'],
-    catalog: ['catalog', 'sgml.catalogfile', 'sgml.catalog', 'sgml.catalog-file'],
-    cdl: ['file.cdl'],
-    cdrdaoconf: ['/etc/cdrdao.conf', '/etc/defaults/cdrdao', '/etc/default/cdrdao', '.cdrdao', 'any/etc/cdrdao.conf', 'any/etc/default/cdrdao', 'any/etc/defaults/cdrdao'],
-    cdrtoc: ['file.toc'],
-    cf: ['file.cfm', 'file.cfi', 'file.cfc'],
-    cfengine: ['cfengine.conf'],
-    cfg: ['file.hgrc', 'filehgrc', 'hgrc', 'some-hgrc'],
-    ch: ['file.chf'],
-    chaiscript: ['file.chai'],
-    chaskell: ['file.chs'],
-    chatito: ['file.chatito'],
-    chill: ['file..ch'],
-    chordpro: ['file.chopro', 'file.crd', 'file.cho', 'file.crdpro', 'file.chordpro'],
-    cl: ['file.eni'],
-    clean: ['file.dcl', 'file.icl'],
-    clojure: ['file.clj', 'file.cljs', 'file.cljx', 'file.cljc'],
-    cmake: ['CMakeLists.txt', 'file.cmake', 'file.cmake.in'],
-    cmod: ['file.cmod'],
-    cmusrc: ['any/.cmus/autosave', 'any/.cmus/rc', 'any/.cmus/command-history', 'any/.cmus/file.theme', 'any/cmus/rc', 'any/cmus/file.theme', '/.cmus/autosave', '/.cmus/command-history', '/.cmus/file.theme', '/.cmus/rc', '/cmus/file.theme', '/cmus/rc'],
-    cobol: ['file.cbl', 'file.cob', 'file.lib'],
-    coco: ['file.atg'],
-    conaryrecipe: ['file.recipe'],
-    conf: ['auto.master', 'file.conf'],
-    config: ['configure.in', 'configure.ac', '/etc/hostname.file', 'any/etc/hostname.file'],
-    confini: ['/etc/pacman.conf', 'any/etc/pacman.conf', 'mpv.conf', 'any/.aws/config', 'any/.aws/credentials', 'file.nmconnection'],
-    context: ['tex/context/any/file.tex', 'file.mkii', 'file.mkiv', 'file.mkvi', 'file.mkxl', 'file.mklx'],
-    cook: ['file.cook'],
-    corn: ['file.corn'],
-    cpon: ['file.cpon'],
-    cpp: ['file.cxx', 'file.c++', 'file.hh', 'file.hxx', 'file.hpp', 'file.ipp', 'file.moc', 'file.tcc', 'file.inl', 'file.tlh', 'file.cppm', 'file.ccm', 'file.cxxm', 'file.c++m'],
-    cqlang: ['file.cql'],
-    crm: ['file.crm'],
-    crontab: ['crontab', 'crontab.file', '/etc/cron.d/file', 'any/etc/cron.d/file'],
-    crystal: ['file.cr'],
-    cs: ['file.cs', 'file.csx'],
-    csc: ['file.csc'],
-    csdl: ['file.csdl'],
-    csp: ['file.csp', 'file.fdr'],
-    css: ['file.css'],
-    cterm: ['file.con'],
-    csv: ['file.csv'],
-    cucumber: ['file.feature'],
-    cuda: ['file.cu', 'file.cuh'],
-    cue: ['file.cue'],
-    cupl: ['file.pld'],
-    cuplsim: ['file.si'],
-    cvs: ['cvs123'],
-    cvsrc: ['.cvsrc'],
-    cynpp: ['file.cyn'],
-    d: ['file.d'],
-    dart: ['file.dart', 'file.drt'],
-    datascript: ['file.ds'],
-    dcd: ['file.dcd'],
-    debchangelog: ['changelog.Debian', 'changelog.dch', 'NEWS.Debian', 'NEWS.dch', '/debian/changelog'],
-    debcontrol: ['/debian/control', 'any/debian/control'],
-    debcopyright: ['/debian/copyright', 'any/debian/copyright'],
-    debsources: ['/etc/apt/sources.list', '/etc/apt/sources.list.d/file.list', 'any/etc/apt/sources.list', 'any/etc/apt/sources.list.d/file.list'],
-    def: ['file.def'],
-    denyhosts: ['denyhosts.conf'],
-    desc: ['file.desc'],
-    desktop: ['file.desktop', '.directory', 'file.directory'],
-    dhall: ['file.dhall'],
-    dictconf: ['dict.conf', '.dictrc'],
-    dictdconf: ['dictd.conf', 'dictdfile.conf', 'dictd-file.conf'],
-    diff: ['file.diff', 'file.rej'],
-    dircolors: ['.dir_colors', '.dircolors', '/etc/DIR_COLORS', 'any/etc/DIR_COLORS'],
-    dnsmasq: ['/etc/dnsmasq.conf', '/etc/dnsmasq.d/file', 'any/etc/dnsmasq.conf', 'any/etc/dnsmasq.d/file'],
-    dockerfile: ['Containerfile', 'Dockerfile', 'dockerfile', 'file.Dockerfile', 'file.dockerfile', 'Dockerfile.debian', 'Containerfile.something'],
-    dosbatch: ['file.bat'],
-    dosini: ['/etc/yum.conf', 'file.ini', 'npmrc', '.npmrc', 'php.ini', 'php.ini-5', 'php.ini-file', '/etc/yum.repos.d/file', 'any/etc/yum.conf', 'any/etc/yum.repos.d/file', 'file.wrap'],
-    dot: ['file.dot', 'file.gv'],
-    dracula: ['file.drac', 'file.drc', 'filelvs', 'filelpe', 'drac.file', 'lpe', 'lvs', 'some-lpe', 'some-lvs'],
-    dtd: ['file.dtd'],
-    dtrace: ['/usr/lib/dtrace/io.d'],
-    dts: ['file.dts', 'file.dtsi'],
-    dune: ['jbuild', 'dune', 'dune-project', 'dune-workspace'],
-    dylan: ['file.dylan'],
-    dylanintr: ['file.intr'],
-    dylanlid: ['file.lid'],
-    ecd: ['file.ecd'],
-    edif: ['file.edf', 'file.edif', 'file.edo'],
-    editorconfig: ['.editorconfig'],
-    eelixir: ['file.eex', 'file.leex'],
-    elinks: ['elinks.conf'],
-    elixir: ['file.ex', 'file.exs', 'mix.lock'],
-    elm: ['file.elm'],
-    elmfilt: ['filter-rules'],
-    elsa: ['file.lc'],
-    elvish: ['file.elv'],
-    epuppet: ['file.epp'],
-    erlang: ['file.erl', 'file.hrl', 'file.yaws'],
-    eruby: ['file.erb', 'file.rhtml'],
-    esdl: ['file.esdl'],
-    esmtprc: ['anyesmtprc', 'esmtprc', 'some-esmtprc'],
-    esqlc: ['file.ec', 'file.EC'],
-    esterel: ['file.strl'],
-    eterm: ['anyEterm/file.cfg', 'Eterm/file.cfg', 'some-Eterm/file.cfg'],
-    exim: ['exim.conf'],
-    expect: ['file.exp'],
-    exports: ['exports'],
-    factor: ['file.factor'],
-    falcon: ['file.fal'],
-    fan: ['file.fan', 'file.fwt'],
-    fennel: ['file.fnl'],
-    fetchmail: ['.fetchmailrc'],
-    fgl: ['file.4gl', 'file.4gh', 'file.m4gl'],
-    firrtl: ['file.fir'],
-    fish: ['file.fish'],
-    focexec: ['file.fex', 'file.focexec'],
-    form: ['file.frm'],
-    forth: ['file.ft', 'file.fth'],
-    fortran: ['file.f', 'file.for', 'file.fortran', 'file.fpp', 'file.ftn', 'file.f77', 'file.f90', 'file.f95', 'file.f03', 'file.f08'],
-    fpcmake: ['file.fpc'],
-    framescript: ['file.fsl'],
-    freebasic: ['file.fb'],
-    fsh: ['file.fsh'],
-    fsharp: ['file.fs', 'file.fsi', 'file.fsx'],
-    fstab: ['fstab', 'mtab'],
-    func: ['file.fc'],
-    fusion: ['file.fusion'],
-    fvwm: ['/.fvwm/file', 'any/.fvwm/file'],
-    gdb: ['.gdbinit', 'gdbinit', 'file.gdb', '.config/gdbearlyinit', '.gdbearlyinit'],
-    gdmo: ['file.mo', 'file.gdmo'],
-    gdresource: ['file.tscn', 'file.tres'],
-    gdscript: ['file.gd'],
-    gdshader: ['file.gdshader', 'file.shader'],
-    gedcom: ['file.ged', 'lltxxxxx.txt', '/tmp/lltmp', '/tmp/lltmp-file', 'any/tmp/lltmp', 'any/tmp/lltmp-file'],
-    gemtext: ['file.gmi', 'file.gemini'],
-    gift: ['file.gift'],
-    gitattributes: ['file.git/info/attributes', '.gitattributes', '/.config/git/attributes', '/etc/gitattributes', '/usr/local/etc/gitattributes', 'some.git/info/attributes'] + WhenConfigHome('$XDG_CONFIG_HOME/git/attributes'),
-    gitcommit: ['COMMIT_EDITMSG', 'MERGE_MSG', 'TAG_EDITMSG', 'NOTES_EDITMSG', 'EDIT_DESCRIPTION'],
-    gitconfig: ['file.git/config', 'file.git/config.worktree', 'file.git/worktrees/x/config.worktree', '.gitconfig', '.gitmodules', 'file.git/modules//config', '/.config/git/config', '/etc/gitconfig', '/usr/local/etc/gitconfig', '/etc/gitconfig.d/file', 'any/etc/gitconfig.d/file', '/.gitconfig.d/file', 'any/.config/git/config', 'any/.gitconfig.d/file', 'some.git/config', 'some.git/modules/any/config'] + WhenConfigHome('$XDG_CONFIG_HOME/git/config'),
-    gitignore: ['file.git/info/exclude', '.gitignore', '/.config/git/ignore', 'some.git/info/exclude'] + WhenConfigHome('$XDG_CONFIG_HOME/git/ignore'),
-    gitolite: ['gitolite.conf', '/gitolite-admin/conf/file', 'any/gitolite-admin/conf/file'],
-    gitrebase: ['git-rebase-todo'],
-    gitsendemail: ['.gitsendemail.msg.xxxxxx'],
-    gkrellmrc: ['gkrellmrc', 'gkrellmrc_x'],
-    gleam: ['file.gleam'],
-    glsl: ['file.glsl'],
-    gnash: ['gnashrc', '.gnashrc', 'gnashpluginrc', '.gnashpluginrc'],
-    gnuplot: ['file.gpi', '.gnuplot'],
-    go: ['file.go'],
-    gomod: ['go.mod'],
-    gosum: ['go.sum', 'go.work.sum'],
-    gowork: ['go.work'],
-    gp: ['file.gp', '.gprc'],
-    gpg: ['/.gnupg/options', '/.gnupg/gpg.conf', '/usr/any/gnupg/options.skel', 'any/.gnupg/gpg.conf', 'any/.gnupg/options', 'any/usr/any/gnupg/options.skel'],
-    grads: ['file.gs'],
-    graphql: ['file.graphql', 'file.graphqls', 'file.gql'],
-    gretl: ['file.gretl'],
-    groovy: ['file.gradle', 'file.groovy', 'Jenkinsfile'],
-    group: ['any/etc/group', 'any/etc/group-', 'any/etc/group.edit', 'any/etc/gshadow', 'any/etc/gshadow-', 'any/etc/gshadow.edit', 'any/var/backups/group.bak', 'any/var/backups/gshadow.bak', '/etc/group', '/etc/group-', '/etc/group.edit', '/etc/gshadow', '/etc/gshadow-', '/etc/gshadow.edit', '/var/backups/group.bak', '/var/backups/gshadow.bak'],
-    grub: ['/boot/grub/menu.lst', '/boot/grub/grub.conf', '/etc/grub.conf', 'any/boot/grub/grub.conf', 'any/boot/grub/menu.lst', 'any/etc/grub.conf'],
-    gsp: ['file.gsp'],
-    gtkrc: ['.gtkrc', 'gtkrc', '.gtkrc-file', 'gtkrc-file'],
-    gyp: ['file.gyp', 'file.gypi'],
-    hack: ['file.hack', 'file.hackpartial'],
-    haml: ['file.haml'],
-    hamster: ['file.hsm'],
-    handlebars: ['file.hbs'],
-    hare: ['file.ha'],
-    haskell: ['file.hs', 'file.hsc', 'file.hs-boot', 'file.hsig'],
-    haste: ['file.ht'],
-    hastepreproc: ['file.htpp'],
-    hb: ['file.hb'],
-    hcl: ['file.hcl'],
-    heex: ['file.heex'],
-    hercules: ['file.vc', 'file.ev', 'file.sum', 'file.errsum'],
-    hex: ['file.hex', 'file.h32'],
-    hgcommit: ['hg-editor-file.txt'],
-    hjson: ['file.hjson'],
-    hlsplaylist: ['file.m3u', 'file.m3u8'],
-    hog: ['file.hog', 'snort.conf', 'vision.conf'],
-    hollywood: ['file.hws'],
-    hoon: ['file.hoon'],
-    hostconf: ['/etc/host.conf', 'any/etc/host.conf'],
-    hostsaccess: ['/etc/hosts.allow', '/etc/hosts.deny', 'any/etc/hosts.allow', 'any/etc/hosts.deny'],
-    html: ['file.html', 'file.htm', 'file.cshtml'],
-    htmlm4: ['file.html.m4'],
-    httest: ['file.htt', 'file.htb'],
-    i3config: ['/home/user/.i3/config', '/home/user/.config/i3/config', '/etc/i3/config', '/etc/xdg/i3/config'],
-    ibasic: ['file.iba', 'file.ibi'],
-    icemenu: ['/.icewm/menu', 'any/.icewm/menu'],
-    icon: ['file.icn'],
-    indent: ['.indent.pro', 'indentrc'],
-    inform: ['file.inf', 'file.INF'],
-    initng: ['/etc/initng/any/file.i', 'file.ii', 'any/etc/initng/any/file.i'],
-    inittab: ['inittab'],
-    ipfilter: ['ipf.conf', 'ipf6.conf', 'ipf.rules'],
-    iss: ['file.iss'],
-    ist: ['file.ist', 'file.mst'],
-    j: ['file.ijs'],
-    jal: ['file.jal', 'file.JAL'],
-    jam: ['file.jpl', 'file.jpr', 'JAM-file.file', 'JAM.file', 'Prl-file.file', 'Prl.file'],
-    java: ['file.java', 'file.jav'],
-    javacc: ['file.jj', 'file.jjt'],
-    javascript: ['file.js', 'file.jsm', 'file.javascript', 'file.es', 'file.mjs', 'file.cjs'],
-    'javascript.glimmer': ['file.gjs'],
-    javascriptreact: ['file.jsx'],
-    jess: ['file.clp'],
-    jgraph: ['file.jgr'],
-    jq: ['file.jq'],
-    jovial: ['file.jov', 'file.j73', 'file.jovial'],
-    jproperties: ['file.properties', 'file.properties_xx', 'file.properties_xx_xx', 'some.properties_xx_xx_file', 'org.eclipse.xyz.prefs'],
-    json: ['file.json', 'file.jsonp', 'file.json-patch', 'file.webmanifest', 'Pipfile.lock', 'file.ipynb', '.prettierrc', '.firebaserc', '.stylelintrc', 'file.slnf'],
-    json5: ['file.json5'],
-    jsonc: ['file.jsonc', '.babelrc', '.eslintrc', '.jsfmtrc', '.jshintrc', '.hintrc', '.swrc', 'jsconfig.json', 'tsconfig.json', 'tsconfig.test.json', 'tsconfig-test.json'],
-    jsonl: ['file.jsonl'],
-    jsonnet: ['file.jsonnet', 'file.libsonnet'],
-    jsp: ['file.jsp'],
-    julia: ['file.jl'],
-    kconfig: ['Kconfig', 'Kconfig.debug', 'Kconfig.file'],
-    kdl: ['file.kdl'],
-    kivy: ['file.kv'],
-    kix: ['file.kix'],
-    kotlin: ['file.kt', 'file.ktm', 'file.kts'],
-    krl: ['file.sub', 'file.Sub', 'file.SUB'],
-    kscript: ['file.ks'],
-    kwt: ['file.k'],
-    lace: ['file.ace', 'file.ACE'],
-    latte: ['file.latte', 'file.lte'],
-    ld: ['file.ld'],
-    ldif: ['file.ldif'],
-    lean: ['file.lean'],
-    ledger: ['file.ldg', 'file.ledger', 'file.journal'],
-    less: ['file.less'],
-    lex: ['file.lex', 'file.l', 'file.lxx', 'file.l++'],
-    lftp: ['lftp.conf', '.lftprc', 'anylftp/rc', 'lftp/rc', 'some-lftp/rc'],
-    lhaskell: ['file.lhs'],
-    libao: ['/etc/libao.conf', '/.libao', 'any/.libao', 'any/etc/libao.conf'],
-    lifelines: ['file.ll'],
-    lilo: ['lilo.conf', 'lilo.conf-file'],
-    lilypond: ['file.ly', 'file.ily'],
-    limits: ['/etc/limits', '/etc/anylimits.conf', '/etc/anylimits.d/file.conf', '/etc/limits.conf', '/etc/limits.d/file.conf', '/etc/some-limits.conf', '/etc/some-limits.d/file.conf', 'any/etc/limits', 'any/etc/limits.conf', 'any/etc/limits.d/file.conf', 'any/etc/some-limits.conf', 'any/etc/some-limits.d/file.conf'],
-    liquid: ['file.liquid'],
-    lisp: ['file.lsp', 'file.lisp', 'file.asd', 'file.el', 'file.cl', '.emacs', '.sawfishrc', 'sbclrc', '.sbclrc'],
-    lite: ['file.lite', 'file.lt'],
-    litestep: ['/LiteStep/any/file.rc', 'any/LiteStep/any/file.rc'],
-    logcheck: ['/etc/logcheck/file.d-some/file', '/etc/logcheck/file.d/file', 'any/etc/logcheck/file.d-some/file', 'any/etc/logcheck/file.d/file'],
-    livebook: ['file.livemd'],
-    loginaccess: ['/etc/login.access', 'any/etc/login.access'],
-    logindefs: ['/etc/login.defs', 'any/etc/login.defs'],
-    logtalk: ['file.lgt'],
-    lotos: ['file.lot', 'file.lotos'],
-    lout: ['file.lou', 'file.lout'],
-    lpc: ['file.lpc', 'file.ulpc'],
-    lsl: ['file.lsl'],
-    lss: ['file.lss'],
-    lua: ['file.lua', 'file.rockspec', 'file.nse', '.luacheckrc', '.busted'],
-    luau: ['file.luau'],
-    lynx: ['lynx.cfg'],
-    lyrics: ['file.lrc'],
-    m3build: ['m3makefile', 'm3overrides'],
-    m3quake: ['file.quake', 'cm3.cfg'],
-    m4: ['file.at'],
-    mail: ['snd.123', '.letter', '.letter.123', '.followup', '.article', '.article.123', 'pico.123', 'mutt-xx-xxx', 'muttng-xx-xxx', 'ae123.txt', 'file.eml', 'reportbug-file'],
-    mailaliases: ['/etc/mail/aliases', '/etc/aliases', 'any/etc/aliases', 'any/etc/mail/aliases'],
-    mailcap: ['.mailcap', 'mailcap'],
-    make: ['file.mk', 'file.mak', 'file.dsp', 'makefile', 'Makefile', 'makefile-file', 'Makefile-file', 'some-makefile', 'some-Makefile'],
-    mallard: ['file.page'],
-    man: ['file.man'],
-    manconf: ['/etc/man.conf', 'man.config', 'any/etc/man.conf'],
-    map: ['file.map'],
-    maple: ['file.mv', 'file.mpl', 'file.mws'],
-    markdown: ['file.markdown', 'file.mdown', 'file.mkd', 'file.mkdn', 'file.mdwn', 'file.md'],
-    mason: ['file.mason', 'file.mhtml', 'file.comp'],
-    master: ['file.mas', 'file.master'],
-    matlab: ['file.m'],
-    maxima: ['file.demo', 'file.dmt', 'file.dm1', 'file.dm2', 'file.dm3',
-                'file.wxm', 'maxima-init.mac'],
-    mel: ['file.mel'],
-    mermaid: ['file.mmd', 'file.mmdc', 'file.mermaid'],
-    meson: ['meson.build', 'meson.options', 'meson_options.txt'],
-    messages: ['/log/auth', '/log/cron', '/log/daemon', '/log/debug',
-               '/log/kern', '/log/lpr', '/log/mail', '/log/messages',
-               '/log/news/news', '/log/syslog', '/log/user', '/log/auth.log',
-               '/log/cron.log', '/log/daemon.log', '/log/debug.log',
-               '/log/kern.log', '/log/lpr.log', '/log/mail.log',
-               '/log/messages.log', '/log/news/news.log', '/log/syslog.log',
-               '/log/user.log', '/log/auth.err', '/log/cron.err',
-               '/log/daemon.err', '/log/debug.err', '/log/kern.err',
-               '/log/lpr.err', '/log/mail.err', '/log/messages.err',
-               '/log/news/news.err', '/log/syslog.err', '/log/user.err',
-               '/log/auth.info', '/log/cron.info', '/log/daemon.info',
-               '/log/debug.info', '/log/kern.info', '/log/lpr.info',
-               '/log/mail.info', '/log/messages.info', '/log/news/news.info',
-               '/log/syslog.info', '/log/user.info', '/log/auth.warn',
-               '/log/cron.warn', '/log/daemon.warn', '/log/debug.warn',
-               '/log/kern.warn', '/log/lpr.warn', '/log/mail.warn',
-               '/log/messages.warn', '/log/news/news.warn',
-               '/log/syslog.warn', '/log/user.warn', '/log/auth.crit',
-               '/log/cron.crit', '/log/daemon.crit', '/log/debug.crit',
-               '/log/kern.crit', '/log/lpr.crit', '/log/mail.crit',
-               '/log/messages.crit', '/log/news/news.crit',
-               '/log/syslog.crit', '/log/user.crit', '/log/auth.notice',
-               '/log/cron.notice', '/log/daemon.notice', '/log/debug.notice',
-               '/log/kern.notice', '/log/lpr.notice', '/log/mail.notice',
-               '/log/messages.notice', '/log/news/news.notice',
-               '/log/syslog.notice', '/log/user.notice'],
-    mf: ['file.mf'],
-    mgl: ['file.mgl'],
-    mgp: ['file.mgp'],
-    mib: ['file.mib', 'file.my'],
-    mix: ['file.mix', 'file.mixal'],
-    mma: ['file.nb'],
-    mmp: ['file.mmp'],
-    modconf: ['/etc/modules.conf', '/etc/modules', '/etc/conf.modules', '/etc/modprobe.file', 'any/etc/conf.modules', 'any/etc/modprobe.file', 'any/etc/modules', 'any/etc/modules.conf'],
-    modula2: ['file.m2', 'file.mi'],
-    modula3: ['file.m3', 'file.mg', 'file.i3', 'file.ig', 'file.lm3'],
-    monk: ['file.isc', 'file.monk', 'file.ssc', 'file.tsc'],
-    moo: ['file.moo'],
-    moonscript: ['file.moon'],
-    move: ['file.move'],
-    mp: ['file.mp', 'file.mpxl', 'file.mpiv', 'file.mpvi'],
-    mplayerconf: ['mplayer.conf', '/.mplayer/config', 'any/.mplayer/config'],
-    mrxvtrc: ['mrxvtrc', '.mrxvtrc'],
-    msidl: ['file.odl', 'file.mof'],
-    msql: ['file.msql'],
-    mupad: ['file.mu'],
-    mush: ['file.mush'],
-    muttrc: ['Muttngrc', 'Muttrc', '.muttngrc', '.muttngrc-file', '.muttrc',
-             '.muttrc-file', '/.mutt/muttngrc', '/.mutt/muttngrc-file',
-             '/.mutt/muttrc', '/.mutt/muttrc-file', '/.muttng/muttngrc',
-             '/.muttng/muttngrc-file', '/.muttng/muttrc',
-             '/.muttng/muttrc-file', '/etc/Muttrc.d/file',
-             '/etc/Muttrc.d/file.rc', 'Muttngrc-file', 'Muttrc-file',
-             'any/.mutt/muttngrc', 'any/.mutt/muttngrc-file',
-             'any/.mutt/muttrc', 'any/.mutt/muttrc-file',
-             'any/.muttng/muttngrc', 'any/.muttng/muttngrc-file',
-             'any/.muttng/muttrc', 'any/.muttng/muttrc-file',
-             'any/etc/Muttrc.d/file', 'muttngrc', 'muttngrc-file', 'muttrc',
-             'muttrc-file'],
-    mysql: ['file.mysql'],
-    n1ql: ['file.n1ql', 'file.nql'],
-    named: ['namedfile.conf', 'rndcfile.conf', 'named-file.conf', 'named.conf', 'rndc-file.conf', 'rndc-file.key', 'rndc.conf', 'rndc.key'],
-    nanorc: ['/etc/nanorc', 'file.nanorc', 'any/etc/nanorc'],
-    natural: ['file.NSA', 'file.NSC', 'file.NSG', 'file.NSL', 'file.NSM', 'file.NSN', 'file.NSP', 'file.NSS'],
-    ncf: ['file.ncf'],
-    neomuttrc: ['Neomuttrc', '.neomuttrc', '.neomuttrc-file', '/.neomutt/neomuttrc', '/.neomutt/neomuttrc-file', 'Neomuttrc', 'Neomuttrc-file', 'any/.neomutt/neomuttrc', 'any/.neomutt/neomuttrc-file', 'neomuttrc', 'neomuttrc-file'],
-    netrc: ['.netrc'],
-    nginx: ['file.nginx', 'nginxfile.conf', 'filenginx.conf', 'any/etc/nginx/file', 'any/usr/local/nginx/conf/file', 'any/nginx/file.conf'],
-    nim: ['file.nim', 'file.nims', 'file.nimble'],
-    ninja: ['file.ninja'],
-    nix: ['file.nix'],
-    nqc: ['file.nqc'],
-    nroff: ['file.tr', 'file.nr', 'file.roff', 'file.tmac', 'file.mom', 'tmac.file'],
-    nsis: ['file.nsi', 'file.nsh'],
-    nu: ['env.nu', 'config.nu'],
-    obj: ['file.obj'],
-    obse: ['file.obl', 'file.obse', 'file.oblivion', 'file.obscript'],
-    ocaml: ['file.ml', 'file.mli', 'file.mll', 'file.mly', '.ocamlinit', 'file.mlt', 'file.mlp', 'file.mlip', 'file.mli.cppo', 'file.ml.cppo'],
-    occam: ['file.occ'],
-    octave: ['octaverc', '.octaverc', 'octave.conf'],
-    odin: ['file.odin'],
-    omnimark: ['file.xom', 'file.xin'],
-    opam: ['opam', 'file.opam', 'file.opam.template'],
-    openroad: ['file.or'],
-    openscad: ['file.scad'],
-    openvpn: ['file.ovpn', '/etc/openvpn/client/client.conf', '/usr/share/openvpn/examples/server.conf'],
-    opl: ['file.OPL', 'file.OPl', 'file.OpL', 'file.Opl', 'file.oPL', 'file.oPl', 'file.opL', 'file.opl'],
-    ora: ['file.ora'],
-    org: ['file.org', 'file.org_archive'],
-    pamconf: ['/etc/pam.conf', '/etc/pam.d/file', 'any/etc/pam.conf', 'any/etc/pam.d/file'],
-    pamenv: ['/etc/security/pam_env.conf', '/home/user/.pam_environment', '.pam_environment', 'pam_env.conf'],
-    papp: ['file.papp', 'file.pxml', 'file.pxsl'],
-    pascal: ['file.pas', 'file.dpr', 'file.lpr'],
-    passwd: ['any/etc/passwd', 'any/etc/passwd-', 'any/etc/passwd.edit', 'any/etc/shadow', 'any/etc/shadow-', 'any/etc/shadow.edit', 'any/var/backups/passwd.bak', 'any/var/backups/shadow.bak', '/etc/passwd', '/etc/passwd-', '/etc/passwd.edit', '/etc/shadow', '/etc/shadow-', '/etc/shadow.edit', '/var/backups/passwd.bak', '/var/backups/shadow.bak'],
-    pbtxt: ['file.pbtxt'],
-    pccts: ['file.g'],
-    pcmk: ['file.pcmk'],
-    pdf: ['file.pdf'],
-    perl: ['file.plx', 'file.al', 'file.psgi', 'gitolite.rc', '.gitolite.rc', 'example.gitolite.rc', '.latexmkrc', 'latexmkrc'],
-    pf: ['pf.conf'],
-    pfmain: ['main.cf', 'main.cf.proto'],
-    php: ['file.php', 'file.php9', 'file.phtml', 'file.ctp', 'file.phpt', 'file.theme'],
-    pike: ['file.pike', 'file.pmod'],
-    pilrc: ['file.rcp'],
-    pine: ['.pinerc', 'pinerc', '.pinercex', 'pinercex'],
-    pinfo: ['/etc/pinforc', '/.pinforc', 'any/.pinforc', 'any/etc/pinforc'],
-    pli: ['file.pli', 'file.pl1'],
-    plm: ['file.plm', 'file.p36', 'file.pac'],
-    plp: ['file.plp'],
-    plsql: ['file.pls', 'file.plsql'],
-    po: ['file.po', 'file.pot'],
-    pod: ['file.pod'],
-    poefilter: ['file.filter'],
-    poke: ['file.pk'],
-    pony: ['file.pony'],
-    postscr: ['file.ps', 'file.pfa', 'file.afm', 'file.eps', 'file.epsf', 'file.epsi', 'file.ai'],
-    pov: ['file.pov'],
-    povini: ['.povrayrc'],
-    ppd: ['file.ppd'],
-    ppwiz: ['file.it', 'file.ih'],
-    prisma: ['file.prisma'],
-    privoxy: ['file.action'],
-    proc: ['file.pc'],
-    procmail: ['.procmail', '.procmailrc'],
-    prolog: ['file.pdb'],
-    promela: ['file.pml'],
-    proto: ['file.proto'],
-    protocols: ['/etc/protocols', 'any/etc/protocols'],
-    ps1: ['file.ps1', 'file.psd1', 'file.psm1', 'file.pssc'],
-    ps1xml: ['file.ps1xml'],
-    psf: ['file.psf'],
-    psl: ['file.psl'],
-    pug: ['file.pug'],
-    puppet: ['file.pp'],
-    pyret: ['file.arr'],
-    pyrex: ['file.pyx', 'file.pxd'],
-    python: ['file.py', 'file.pyw', '.pythonstartup', '.pythonrc', 'file.ptl', 'file.pyi', 'SConstruct'],
-    ql: ['file.ql', 'file.qll'],
-    qmldir: ['qmldir'],
-    quake: ['anybaseq2/file.cfg', 'anyid1/file.cfg', 'quake3/file.cfg', 'baseq2/file.cfg', 'id1/file.cfg', 'quake1/file.cfg', 'some-baseq2/file.cfg', 'some-id1/file.cfg', 'some-quake1/file.cfg'],
-    quarto: ['file.qmd'],
-    r: ['file.r', '.Rprofile', 'Rprofile', 'Rprofile.site'],
-    racket: ['file.rkt', 'file.rktd', 'file.rktl'],
-    radiance: ['file.rad', 'file.mat'],
-    raku: ['file.pm6', 'file.p6', 'file.t6', 'file.pod6', 'file.raku', 'file.rakumod', 'file.rakudoc', 'file.rakutest'],
-    raml: ['file.raml'],
-    ratpoison: ['.ratpoisonrc', 'ratpoisonrc'],
-    rbs: ['file.rbs'],
-    rc: ['file.rc', 'file.rch'],
-    rcs: ['file,v'],
-    readline: ['.inputrc', 'inputrc'],
-    rego: ['file.rego'],
-    remind: ['.reminders', 'file.remind', 'file.rem', '.reminders-file'],
-    rescript: ['file.res', 'file.resi'],
-    resolv: ['resolv.conf'],
-    reva: ['file.frt'],
-    rexx: ['file.rex', 'file.orx', 'file.rxo', 'file.rxj', 'file.jrexx', 'file.rexxj', 'file.rexx', 'file.testGroup', 'file.testUnit'],
-    rhelp: ['file.rd'],
-    rib: ['file.rib'],
-    rmd: ['file.rmd', 'file.smd'],
-    rnc: ['file.rnc'],
-    rng: ['file.rng'],
-    rnoweb: ['file.rnw', 'file.snw'],
-    rpgle: ['file.rpgle', 'file.rpgleinc'],
-    robot: ['file.robot', 'file.resource'],
-    robots: ['robots.txt'],
-    ron: ['file.ron'],
-    routeros: ['file.rsc'],
-    rpcgen: ['file.x'],
-    rpl: ['file.rpl'],
-    rrst: ['file.rrst', 'file.srst'],
-    rst: ['file.rst'],
-    rtf: ['file.rtf'],
-    ruby: ['.irbrc', 'irbrc', 'file.rb', 'file.rbw', 'file.gemspec', 'file.ru', 'Gemfile', 'file.builder', 'file.rxml', 'file.rjs', 'file.rant', 'file.rake', 'rakefile', 'Rakefile', 'rantfile', 'Rantfile', 'rakefile-file', 'Rakefile-file', 'Puppetfile', 'Vagrantfile'],
-    rust: ['file.rs'],
-    samba: ['smb.conf'],
-    sas: ['file.sas'],
-    sass: ['file.sass'],
-    sather: ['file.sa'],
-    sbt: ['file.sbt'],
-    scala: ['file.scala'],
-    scheme: ['file.scm', 'file.ss', 'file.sld'],
-    scilab: ['file.sci', 'file.sce'],
-    screen: ['.screenrc', 'screenrc'],
-    scss: ['file.scss'],
-    sd: ['file.sd'],
-    sdc: ['file.sdc'],
-    sdl: ['file.sdl', 'file.pr'],
-    sed: ['file.sed'],
-    sensors: ['/etc/sensors.conf', '/etc/sensors3.conf', '/etc/sensors.d/file', 'any/etc/sensors.conf', 'any/etc/sensors3.conf', 'any/etc/sensors.d/file'],
-    services: ['/etc/services', 'any/etc/services'],
-    setserial: ['/etc/serial.conf', 'any/etc/serial.conf'],
-    sexplib: ['file.sexp'],
-    sh: ['.bashrc', '.bash_profile', '.bash-profile', '.bash_logout', '.bash-logout', '.bash_aliases', '.bash-aliases', '/tmp/bash-fc-3Ozjlw', '/tmp/bash-fc.3Ozjlw', 'PKGBUILD', 'APKBUILD', 'file.bash', '/usr/share/doc/bash-completion/filter.sh', '/etc/udev/cdsymlinks.conf', 'any/etc/udev/cdsymlinks.conf'],
-    sieve: ['file.siv', 'file.sieve'],
-    sil: ['file.sil'],
-    simula: ['file.sim'],
-    sinda: ['file.sin', 'file.s85'],
-    sisu: ['file.sst', 'file.ssm', 'file.ssi', 'file.-sst', 'file._sst', 'file.sst.meta', 'file.-sst.meta', 'file._sst.meta'],
-    skill: ['file.il', 'file.ils', 'file.cdf'],
-    cdc: ['file.cdc'],
-    slang: ['file.sl'],
-    sage: ['file.sage'],
-    slice: ['file.ice'],
-    slpconf: ['/etc/slp.conf', 'any/etc/slp.conf'],
-    slpreg: ['/etc/slp.reg', 'any/etc/slp.reg'],
-    slpspi: ['/etc/slp.spi', 'any/etc/slp.spi'],
-    slrnrc: ['.slrnrc'],
-    slrnsc: ['file.score'],
-    sm: ['sendmail.cf'],
-    smali: ['file.smali'],
-    smarty: ['file.tpl'],
-    smcl: ['file.hlp', 'file.ihlp', 'file.smcl'],
-    smith: ['file.smt', 'file.smith'],
-    smithy: ['file.smithy'],
-    sml: ['file.sml'],
-    snobol4: ['file.sno', 'file.spt'],
-    solidity: ['file.sol'],
-    solution: ['file.sln'],
-    sparql: ['file.rq', 'file.sparql'],
-    spec: ['file.spec'],
-    spice: ['file.sp', 'file.spice'],
-    spup: ['file.speedup', 'file.spdata', 'file.spd'],
-    spyce: ['file.spy', 'file.spi'],
-    sql: ['file.tyb', 'file.tyc', 'file.pkb', 'file.pks'],
-    sqlj: ['file.sqlj'],
-    prql: ['file.prql'],
-    sqr: ['file.sqr', 'file.sqi'],
-    squid: ['squid.conf'],
-    squirrel: ['file.nut'],
-    srec: ['file.s19', 'file.s28', 'file.s37', 'file.mot', 'file.srec'],
-    srt: ['file.srt'],
-    ssa: ['file.ass', 'file.ssa'],
-    sshconfig: ['ssh_config', '/.ssh/config', '/etc/ssh/ssh_config.d/file.conf', 'any/etc/ssh/ssh_config.d/file.conf', 'any/.ssh/config', 'any/.ssh/file.conf'],
-    sshdconfig: ['sshd_config', '/etc/ssh/sshd_config.d/file.conf', 'any/etc/ssh/sshd_config.d/file.conf'],
-    st: ['file.st'],
-    starlark: ['file.ipd', 'file.star', 'file.starlark'],
-    stata: ['file.ado', 'file.do', 'file.imata', 'file.mata'],
-    stp: ['file.stp'],
-    sudoers: ['any/etc/sudoers', 'sudoers.tmp', '/etc/sudoers', 'any/etc/sudoers.d/file'],
-    supercollider: ['file.quark'],
-    surface: ['file.sface'],
-    svelte: ['file.svelte'],
-    svg: ['file.svg'],
-    svn: ['svn-commitfile.tmp', 'svn-commit-file.tmp', 'svn-commit.tmp'],
-    swayconfig: ['/home/user/.sway/config', '/home/user/.config/sway/config', '/etc/sway/config', '/etc/xdg/sway/config'],
-    swift: ['file.swift'],
-    swiftgyb: ['file.swift.gyb'],
-    sysctl: ['/etc/sysctl.conf', '/etc/sysctl.d/file.conf', 'any/etc/sysctl.conf', 'any/etc/sysctl.d/file.conf'],
-    systemd: ['any/systemd/file.automount', 'any/systemd/file.dnssd',
-              'any/systemd/file.link', 'any/systemd/file.mount',
-              'any/systemd/file.netdev', 'any/systemd/file.network',
-              'any/systemd/file.nspawn', 'any/systemd/file.path',
-              'any/systemd/file.service', 'any/systemd/file.slice',
-              'any/systemd/file.socket', 'any/systemd/file.swap',
-              'any/systemd/file.target', 'any/systemd/file.timer',
-              '/etc/systemd/some.conf.d/file.conf',
-              '/etc/systemd/system/some.d/file.conf',
-              '/etc/systemd/system/some.d/.#file',
-              '/etc/systemd/system/.#otherfile',
-              '/home/user/.config/systemd/user/some.d/mine.conf',
-              '/home/user/.config/systemd/user/some.d/.#file',
-              '/home/user/.config/systemd/user/.#otherfile',
-              '/.config/systemd/user/.#', '/.config/systemd/user/.#-file',
-              '/.config/systemd/user/file.d/.#',
-              '/.config/systemd/user/file.d/.#-file',
-              '/.config/systemd/user/file.d/file.conf',
-              '/etc/systemd/file.conf.d/file.conf', '/etc/systemd/system/.#',
-              '/etc/systemd/system/.#-file', '/etc/systemd/system/file.d/.#',
-              '/etc/systemd/system/file.d/.#-file',
-              '/etc/systemd/system/file.d/file.conf',
-              '/systemd/file.automount', '/systemd/file.dnssd',
-              '/systemd/file.link', '/systemd/file.mount',
-              '/systemd/file.netdev', '/systemd/file.network',
-              '/systemd/file.nspawn', '/systemd/file.path',
-              '/systemd/file.service', '/systemd/file.slice',
-              '/systemd/file.socket', '/systemd/file.swap',
-              '/systemd/file.target', '/systemd/file.timer',
-              'any/.config/systemd/user/.#',
-              'any/.config/systemd/user/.#-file',
-              'any/.config/systemd/user/file.d/.#',
-              'any/.config/systemd/user/file.d/.#-file',
-              'any/.config/systemd/user/file.d/file.conf',
-              'any/etc/systemd/file.conf.d/file.conf',
-              'any/etc/systemd/system/.#', 'any/etc/systemd/system/.#-file',
-              'any/etc/systemd/system/file.d/.#',
-              'any/etc/systemd/system/file.d/.#-file',
-              'any/etc/systemd/system/file.d/file.conf'],
-    systemverilog: ['file.sv', 'file.svh'],
-    trace32: ['file.cmm', 'file.t32'],
-    tags: ['tags'],
-    tak: ['file.tak'],
-    tal: ['file.tal'],
-    taskdata: ['pending.data', 'completed.data', 'undo.data'],
-    taskedit: ['file.task'],
-    tcl: ['file.tcl', 'file.tm', 'file.tk', 'file.itcl', 'file.itk', 'file.jacl', '.tclshrc', 'tclsh.rc', '.wishrc'],
-    tablegen: ['file.td'],
-    teal: ['file.tl'],
-    template: ['file.tmpl'],
-    teraterm: ['file.ttl'],
-    terminfo: ['file.ti'],
-    'terraform-vars': ['file.tfvars'],
-    tex: ['file.latex', 'file.sty', 'file.dtx', 'file.ltx', 'file.bbl'],
-    texinfo: ['file.texinfo', 'file.texi', 'file.txi'],
-    texmf: ['texmf.cnf'],
-    text: ['file.text', 'file.txt', 'README', 'LICENSE', 'COPYING', 'AUTHORS', '/usr/share/doc/bash-completion/AUTHORS', '/etc/apt/apt.conf.d/README', '/etc/Muttrc.d/README'],
-    tf: ['file.tf', '.tfrc', 'tfrc'],
-    thrift: ['file.thrift'],
-    tidy: ['.tidyrc', 'tidyrc', 'tidy.conf'],
-    tilde: ['file.t.html'],
-    tla: ['file.tla'],
-    tli: ['file.tli'],
-    tmux: ['tmuxfile.conf', '.tmuxfile.conf', '.tmux-file.conf', '.tmux.conf', 'tmux-file.conf', 'tmux.conf', 'tmux.conf.local'],
-    toml: ['file.toml', 'Gopkg.lock', 'Pipfile', '/home/user/.cargo/config'],
-    tpp: ['file.tpp'],
-    treetop: ['file.treetop'],
-    trustees: ['trustees.conf'],
-    tsalt: ['file.slt'],
-    tsscl: ['file.tsscl'],
-    tssgm: ['file.tssgm'],
-    tssop: ['file.tssop'],
-    tsv: ['file.tsv'],
-    twig: ['file.twig'],
-    typescript: ['file.mts', 'file.cts'],
-    'typescript.glimmer': ['file.gts'],
-    typescriptreact: ['file.tsx'],
-    ungrammar: ['file.ungram'],
-    uc: ['file.uc'],
-    udevconf: ['/etc/udev/udev.conf', 'any/etc/udev/udev.conf'],
-    udevperm: ['/etc/udev/permissions.d/file.permissions', 'any/etc/udev/permissions.d/file.permissions'],
-    udevrules: ['/etc/udev/rules.d/file.rules', '/usr/lib/udev/rules.d/file.rules', '/lib/udev/rules.d/file.rules'],
-    uil: ['file.uit', 'file.uil'],
-    updatedb: ['/etc/updatedb.conf', 'any/etc/updatedb.conf'],
-    upstart: ['/usr/share/upstart/file.conf', '/usr/share/upstart/file.override', '/etc/init/file.conf', '/etc/init/file.override', '/.init/file.conf', '/.init/file.override', '/.config/upstart/file.conf', '/.config/upstart/file.override', 'any/.config/upstart/file.conf', 'any/.config/upstart/file.override', 'any/.init/file.conf', 'any/.init/file.override', 'any/etc/init/file.conf', 'any/etc/init/file.override', 'any/usr/share/upstart/file.conf', 'any/usr/share/upstart/file.override'],
-    upstreamdat: ['upstream.dat', 'UPSTREAM.DAT', 'upstream.file.dat', 'UPSTREAM.FILE.DAT', 'file.upstream.dat', 'FILE.UPSTREAM.DAT'],
-    upstreaminstalllog: ['upstreaminstall.log', 'UPSTREAMINSTALL.LOG', 'upstreaminstall.file.log', 'UPSTREAMINSTALL.FILE.LOG', 'file.upstreaminstall.log', 'FILE.UPSTREAMINSTALL.LOG'],
-    upstreamlog: ['fdrupstream.log', 'upstream.log', 'UPSTREAM.LOG', 'upstream.file.log', 'UPSTREAM.FILE.LOG', 'file.upstream.log', 'FILE.UPSTREAM.LOG', 'UPSTREAM-file.log', 'UPSTREAM-FILE.LOG'],
-    urlshortcut: ['file.url'],
-    usd: ['file.usda', 'file.usd'],
-    usserverlog: ['usserver.log', 'USSERVER.LOG', 'usserver.file.log', 'USSERVER.FILE.LOG', 'file.usserver.log', 'FILE.USSERVER.LOG'],
-    usw2kagtlog: ['usw2kagt.log', 'USW2KAGT.LOG', 'usw2kagt.file.log', 'USW2KAGT.FILE.LOG', 'file.usw2kagt.log', 'FILE.USW2KAGT.LOG'],
-    vala: ['file.vala'],
-    vb: ['file.sba', 'file.vb', 'file.vbs', 'file.dsm', 'file.ctl'],
-    vdf: ['file.vdf'],
-    vdmpp: ['file.vpp', 'file.vdmpp'],
-    vdmrt: ['file.vdmrt'],
-    vdmsl: ['file.vdm', 'file.vdmsl'],
-    vera: ['file.vr', 'file.vri', 'file.vrh'],
-    verilogams: ['file.va', 'file.vams'],
-    vgrindefs: ['vgrindefs'],
-    vhdl: ['file.hdl', 'file.vhd', 'file.vhdl', 'file.vbe', 'file.vst', 'file.vhdl_123', 'file.vho', 'some.vhdl_1', 'some.vhdl_1-file'],
-    vhs: ['file.tape'],
-    vim: ['file.vim', 'file.vba', '.exrc', '_exrc', 'some-vimrc', 'some-vimrc-file', 'vimrc', 'vimrc-file'],
-    viminfo: ['.viminfo', '_viminfo'],
-    vmasm: ['file.mar'],
-    voscm: ['file.cm'],
-    vrml: ['file.wrl'],
-    vroom: ['file.vroom'],
-    vue: ['file.vue'],
-    wat: ['file.wat'],
-    wast: ['file.wast'],
-    wdl: ['file.wdl'],
-    webmacro: ['file.wm'],
-    wget: ['.wgetrc', 'wgetrc'],
-    wget2: ['.wget2rc', 'wget2rc'],
-    winbatch: ['file.wbt'],
-    wit: ['file.wit'],
-    wml: ['file.wml'],
-    wsh: ['file.wsf', 'file.wsc'],
-    wsml: ['file.wsml'],
-    wvdial: ['wvdial.conf', '.wvdialrc'],
-    xdefaults: ['.Xdefaults', '.Xpdefaults', '.Xresources', 'xdm-config', 'file.ad', '/Xresources/file', '/app-defaults/file', 'Xresources', 'Xresources-file', 'any/Xresources/file', 'any/app-defaults/file'],
-    xf86conf: ['xorg.conf', 'xorg.conf-4'],
-    xhtml: ['file.xhtml', 'file.xht'],
-    xinetd: ['/etc/xinetd.conf', '/etc/xinetd.d/file', 'any/etc/xinetd.conf', 'any/etc/xinetd.d/file'],
-    xmath: ['file.msc', 'file.msf'],
-    xml: ['/etc/blkid.tab', '/etc/blkid.tab.old', 'file.xmi', 'file.csproj', 'file.csproj.user', 'file.fsproj', 'file.fsproj.user', 'file.vbproj', 'file.vbproj.user', 'file.ui', 'file.tpm', '/etc/xdg/menus/file.menu', 'fglrxrc', 'file.xlf', 'file.xliff', 'file.xul', 'file.wsdl', 'file.wpl', 'any/etc/blkid.tab', 'any/etc/blkid.tab.old', 'any/etc/xdg/menus/file.menu', 'file.atom', 'file.rss', 'file.cdxml', 'file.psc1', 'file.mpd'],
-    xmodmap: ['anyXmodmap', 'Xmodmap', 'some-Xmodmap', 'some-xmodmap', 'some-xmodmap-file', 'xmodmap', 'xmodmap-file'],
-    xpm: ['file.xpm'],
-    xpm2: ['file.xpm2'],
-    xquery: ['file.xq', 'file.xql', 'file.xqm', 'file.xquery', 'file.xqy'],
-    xs: ['file.xs'],
-    xsd: ['file.xsd'],
-    xslt: ['file.xsl', 'file.xslt'],
-    yacc: ['file.yy', 'file.yxx', 'file.y++'],
-    yaml: ['file.yaml', 'file.yml', '.clangd', '.clang-format', '.clang-tidy'],
-    yang: ['file.yang'],
-    yuck: ['file.yuck'],
-    z8a: ['file.z8a'],
-    zig: ['file.zig'],
-    zimbu: ['file.zu'],
-    zimbutempl: ['file.zut'],
-    zir: ['file.zir'],
-    zserio: ['file.zs'],
-    zsh: ['.zprofile', '/etc/zprofile', '.zfbfmarks', 'file.zsh',
-          '.zcompdump', '.zlogin', '.zlogout', '.zshenv', '.zshrc',
-          '.zcompdump-file', '.zlog', '.zlog-file', '.zsh', '.zsh-file',
-          'any/etc/zprofile', 'zlog', 'zlog-file', 'zsh', 'zsh-file'],
-
-    help: [$VIMRUNTIME .. '/doc/help.txt'],
-    }
-enddef
-
-def s:GetFilenameCaseChecks(): dict<list<string>>
-  return {
-    modula2: ['file.DEF'],
-    bzl: ['file.BUILD', 'BUILD', 'BUCK'],
-  }
-enddef
-
-def s:CheckItems(checks: dict<list<string>>)
-  set noswapfile
-
-  for [ft, names] in items(checks)
-    for i in range(0, len(names) - 1)
-      new
-      try
-        exe 'edit ' .. fnameescape(names[i])
-      catch
-	assert_report('cannot edit "' .. names[i] .. '": ' .. v:exception)
-      endtry
-      if &filetype == '' && &readonly
-	# File exists but not able to edit it (permission denied)
-      else
-        var expected = ft == 'none' ? '' : ft
-	assert_equal(expected, &filetype, 'with file name: ' .. names[i])
-      endif
-      bwipe!
-    endfor
-  endfor
-
-  set swapfile&
-enddef
-
-def Test_filetype_detection()
-  SetupConfigHome()
-  if !empty(s:saveConfigHome)
-    defer setenv("XDG_CONFIG_HOME", s:saveConfigHome)
-  endif
-  mkdir(GetConfigHome(), 'R')
-
-  filetype on
-  CheckItems(s:GetFilenameChecks())
-  if has('fname_case')
-    CheckItems(s:GetFilenameCaseChecks())
-  endif
-  filetype off
-enddef
-
-" Content lines that should not result in filetype detection
-def s:GetFalsePositiveChecks(): dict<list<list<string>>>
-  return {
-      '': [['test execve("/usr/bin/pstree", ["pstree"], 0x7ff0 /* 63 vars */) = 0']],
-      }
-enddef
-
-" Filetypes detected from the file contents by scripts.vim
-def s:GetScriptChecks(): dict<list<list<string>>>
-  return {
-    virata: [['% Virata'],
-            ['', '% Virata'],
-            ['', '', '% Virata'],
-            ['', '', '', '% Virata'],
-            ['', '', '', '', '% Virata']],
-    strace: [['execve("/usr/bin/pstree", ["pstree"], 0x7ff0 /* 63 vars */) = 0'],
-            ['15:17:47 execve("/usr/bin/pstree", ["pstree"], ... "_=/usr/bin/strace"]) = 0'],
-            ['__libc_start_main and something']],
-    clojure: [['#!/path/clojure']],
-    scala:  [['#!/path/scala']],
-    sh:     [['#!/path/sh'],
-            ['#!/path/bash'],
-            ['#!/path/bash2'],
-            ['#!/path/dash'],
-            ['#!/path/ksh'],
-            ['#!/path/ksh93']],
-    csh:    [['#!/path/csh']],
-    tcsh:   [['#!/path/tcsh']],
-    zsh:    [['#!/path/zsh']],
-    tcl:    [['#!/path/tclsh'],
-            ['#!/path/wish'],
-            ['#!/path/expectk'],
-            ['#!/path/itclsh'],
-            ['#!/path/itkwish']],
-    expect: [['#!/path/expect']],
-    gnuplot: [['#!/path/gnuplot']],
-    make:   [['#!/path/make']],
-    nix:    [['#!/path/nix-shell']],
-    pike:   [['#!/path/pike'],
-            ['#!/path/pike0'],
-            ['#!/path/pike9']],
-    lua:    [['#!/path/lua']],
-    raku:   [['#!/path/raku']],
-    perl:   [['#!/path/perl']],
-    php:    [['#!/path/php']],
-    python: [['#!/path/python'],
-            ['#!/path/python2'],
-            ['#!/path/python3']],
-    groovy: [['#!/path/groovy']],
-    ruby:   [['#!/path/ruby']],
-    javascript: [['#!/path/node'],
-            ['#!/path/js'],
-            ['#!/path/nodejs'],
-            ['#!/path/rhino']],
-    bc:     [['#!/path/bc']],
-    sed:    [['#!/path/sed'],
-            ['#n'],
-            ['#n comment']],
-    ocaml:  [['#!/path/ocaml']],
-    awk:    [['#!/path/awk'],
-            ['#!/path/gawk']],
-    wml:    [['#!/path/wml']],
-    scheme: [['#!/path/scheme'],
-            ['#!/path/guile']],
-    cfengine: [['#!/path/cfengine']],
-    erlang: [['#!/path/escript']],
-    haskell: [['#!/path/haskell']],
-    cpp:    [['// Standard iostream objects -*- C++ -*-'],
-            ['// -*- C++ -*-']],
-    yaml:   [['%YAML 1.2']],
-    pascal: [['#!/path/instantfpc']],
-    fennel: [['#!/path/fennel']],
-    routeros: [['#!/path/rsc']],
-    fish:   [['#!/path/fish']],
-    forth:  [['#!/path/gforth']],
-    icon:   [['#!/path/icon']],
-  }
-enddef
-
-" Various forms of "env" optional arguments.
-def s:GetScriptEnvChecks(): dict<list<list<string>>>
-  return {
-    perl: [['#!/usr/bin/env VAR=val perl']],
-    scala: [['#!/usr/bin/env VAR=val VVAR=vval scala']],
-    awk: [['#!/usr/bin/env VAR=val -i awk']],
-    scheme: [['#!/usr/bin/env VAR=val --ignore-environment scheme']],
-    python: [['#!/usr/bin/env VAR=val -S python -w -T']],
-    wml: [['#!/usr/bin/env VAR=val --split-string wml']],
-    nix: [['#!/usr/bin/env nix-shell']],
-  }
-enddef
-
-def s:Run_script_detection(test_dict: dict<list<list<string>>>)
-  filetype on
-  for [ft, files] in items(test_dict)
-    for file in files
-      writefile(file, 'Xtest', 'D')
-      split Xtest
-      assert_equal(ft, &filetype, 'for text: ' .. string(file))
-      bwipe!
-    endfor
-  endfor
-  filetype off
-enddef
-
-def Test_script_detection()
-  Run_script_detection(GetFalsePositiveChecks())
-  Run_script_detection(GetScriptChecks())
-  Run_script_detection(GetScriptEnvChecks())
-enddef
-
-func Test_setfiletype_completion()
-  call feedkeys(":setfiletype java\<C-A>\<C-B>\"\<CR>", 'tx')
-  call assert_equal('"setfiletype java javacc javascript javascriptreact', @:)
-endfunc
-
-" Test for ':filetype detect' command for a buffer without a file
-func Test_emptybuf_ftdetect()
-  new
-  call setline(1, '#!/bin/sh')
-  call assert_equal('', &filetype)
-  filetype detect
-  call assert_equal('sh', &filetype)
-  close!
-endfunc
-
-" Test for ':filetype indent on' and ':filetype indent off' commands
-func Test_filetype_indent_off()
-  new Xtest.vim
-  filetype indent on
-  call assert_equal(1, g:did_indent_on)
-  call assert_equal(['filetype detection:ON  plugin:OFF  indent:ON'],
-        \ execute('filetype')->split("\n"))
-  filetype indent off
-  call assert_equal(0, exists('g:did_indent_on'))
-  call assert_equal(['filetype detection:ON  plugin:OFF  indent:OFF'],
-        \ execute('filetype')->split("\n"))
-  close
-endfunc
-
-"""""""""""""""""""""""""""""""""""""""""""""""""
-" Tests for specific extensions and filetypes.
-" Keep sorted.
-"""""""""""""""""""""""""""""""""""""""""""""""""
-
-func Test_bas_file()
-  filetype on
-
-  call writefile(['looks like BASIC'], 'Xfile.bas', 'D')
-  split Xfile.bas
-  call assert_equal('basic', &filetype)
-  bwipe!
-
-  " Test dist#ft#FTbas()
-
-  let g:filetype_bas = 'freebasic'
-  split Xfile.bas
-  call assert_equal('freebasic', &filetype)
-  bwipe!
-  unlet g:filetype_bas
-
-  " FreeBASIC
-
-  call writefile(["/' FreeBASIC multiline comment '/"], 'Xfile.bas')
-  split Xfile.bas
-  call assert_equal('freebasic', &filetype)
-  bwipe!
-
-  call writefile(['#define TESTING'], 'Xfile.bas')
-  split Xfile.bas
-  call assert_equal('freebasic', &filetype)
-  bwipe!
-
-  call writefile(['option byval'], 'Xfile.bas')
-  split Xfile.bas
-  call assert_equal('freebasic', &filetype)
-  bwipe!
-
-  call writefile(['extern "C"'], 'Xfile.bas')
-  split Xfile.bas
-  call assert_equal('freebasic', &filetype)
-  bwipe!
-
-  " QB64
-
-  call writefile(['$LET TESTING = 1'], 'Xfile.bas')
-  split Xfile.bas
-  call assert_equal('qb64', &filetype)
-  bwipe!
-
-  call writefile(['OPTION _EXPLICIT'], 'Xfile.bas')
-  split Xfile.bas
-  call assert_equal('qb64', &filetype)
-  bwipe!
-
-  " Visual Basic
-
-  call writefile(['Attribute VB_NAME = "Testing"', 'Enum Foo', 'End Enum'], 'Xfile.bas')
-  split Xfile.bas
-  call assert_equal('vb', &filetype)
-  bwipe!
-
-  filetype off
-endfunc
-
-" Test dist#ft#FTcfg()
-func Test_cfg_file()
-  filetype on
-
-  " *.cfg defaults to cfg
-  call writefile(['looks like cfg'], 'cfgfile.cfg', 'D')
-  split cfgfile.cfg
-  call assert_equal('cfg', &filetype)
-
-  let g:filetype_cfg = 'other'
-  edit
-  call assert_equal('other', &filetype)
-  bwipe!
-  unlet g:filetype_cfg
-
-  " RAPID cfg
-  let ext = 'cfg'
-  for i in ['EIO', 'MMC', 'MOC', 'PROC', 'SIO', 'SYS']
-    call writefile([i .. ':CFG'], 'cfgfile.' .. ext)
-    execute "split cfgfile." .. ext
-    call assert_equal('rapid', &filetype)
-    bwipe!
-    call delete('cfgfile.' .. ext)
-    " check different case of file extension
-    let ext = substitute(ext, '\(\l\)', '\u\1', '')
-  endfor
-
-  " clean up
-  filetype off
-endfunc
-
-func Test_d_file()
-  filetype on
-
-  call writefile(['looks like D'], 'Xfile.d', 'D')
-  split Xfile.d
-  call assert_equal('d', &filetype)
-  bwipe!
-
-  call writefile(['#!/some/bin/dtrace'], 'Xfile.d')
-  split Xfile.d
-  call assert_equal('dtrace', &filetype)
-  bwipe!
-
-  call writefile(['#pragma  D  option'], 'Xfile.d')
-  split Xfile.d
-  call assert_equal('dtrace', &filetype)
-  bwipe!
-
-  call writefile([':some:thing:'], 'Xfile.d')
-  split Xfile.d
-  call assert_equal('dtrace', &filetype)
-  bwipe!
-
-  call writefile(['module this', '#pragma  D  option'], 'Xfile.d')
-  split Xfile.d
-  call assert_equal('d', &filetype)
-  bwipe!
-
-  call writefile(['import that', '#pragma  D  option'], 'Xfile.d')
-  split Xfile.d
-  call assert_equal('d', &filetype)
-  bwipe!
-
-  " clean up
-  filetype off
-endfunc
-
-func Test_dat_file()
-  filetype on
-
-  " KRL header start with "&WORD", but is not always present.
-  call writefile(['&ACCESS'], 'datfile.dat')
-  split datfile.dat
-  call assert_equal('krl', &filetype)
-  bwipe!
-  call delete('datfile.dat')
-
-  " KRL defdat with leading spaces, for KRL file extension is not case
-  " sensitive.
-  call writefile(['  DEFDAT datfile'], 'datfile.Dat')
-  split datfile.Dat
-  call assert_equal('krl', &filetype)
-  bwipe!
-  call delete('datfile.Dat')
-
-  " KRL defdat with embedded spaces, file starts with empty line(s).
-  call writefile(['', 'defdat  datfile  public'], 'datfile.DAT')
-  split datfile.DAT
-  call assert_equal('krl', &filetype)
-  bwipe!
-
-  " User may overrule file inspection
-  let g:filetype_dat = 'dat'
-  split datfile.DAT
-  call assert_equal('dat', &filetype)
-  bwipe!
-  call delete('datfile.DAT')
-  unlet g:filetype_dat
-
-  filetype off
-endfunc
-
-func Test_dep3patch_file()
-  filetype on
-
-  call assert_true(mkdir('debian/patches', 'pR'))
-
-  " series files are not patches
-  call writefile(['Description: some awesome patch'], 'debian/patches/series')
-  split debian/patches/series
-  call assert_notequal('dep3patch', &filetype)
-  bwipe!
-
-  " diff/patch files without the right headers should still show up as ft=diff
-  call writefile([], 'debian/patches/foo.diff')
-  split debian/patches/foo.diff
-  call assert_equal('diff', &filetype)
-  bwipe!
-
-  " Files with the right headers are detected as dep3patch, even if they don't
-  " have a diff/patch extension
-  call writefile(['Subject: dep3patches'], 'debian/patches/bar')
-  split debian/patches/bar
-  call assert_equal('dep3patch', &filetype)
-  bwipe!
-
-  " Files in sub-directories are detected
-  call assert_true(mkdir('debian/patches/s390x', 'p'))
-  call writefile(['Subject: dep3patches'], 'debian/patches/s390x/bar')
-  split debian/patches/s390x/bar
-  call assert_equal('dep3patch', &filetype)
-  bwipe!
-
-  " The detection stops when seeing the "header end" marker
-  call writefile(['---', 'Origin: the cloud'], 'debian/patches/baz')
-  split debian/patches/baz
-  call assert_notequal('dep3patch', &filetype)
-  bwipe!
-endfunc
-
-func Test_dsl_file()
-  filetype on
-
-  call writefile(['  <!doctype dsssl-spec ['], 'dslfile.dsl', 'D')
-  split dslfile.dsl
-  call assert_equal('dsl', &filetype)
-  bwipe!
-
-  call writefile(['workspace {'], 'dslfile.dsl')
-  split dslfile.dsl
-  call assert_equal('structurizr', &filetype)
-  bwipe!
-
-  filetype off
-endfunc
-
-func Test_ex_file()
-  filetype on
-
-  call writefile(['arbitrary content'], 'Xfile.ex', 'D')
-  split Xfile.ex
-  call assert_equal('elixir', &filetype)
-  bwipe!
-  let g:filetype_euphoria = 'euphoria4'
-  split Xfile.ex
-  call assert_equal('euphoria4', &filetype)
-  bwipe!
-  unlet g:filetype_euphoria
-
-  call writefile(['-- filetype euphoria comment'], 'Xfile.ex')
-  split Xfile.ex
-  call assert_equal('euphoria3', &filetype)
-  bwipe!
-
-  call writefile(['--filetype euphoria comment'], 'Xfile.ex')
-  split Xfile.ex
-  call assert_equal('euphoria3', &filetype)
-  bwipe!
-
-  call writefile(['ifdef '], 'Xfile.ex')
-  split Xfile.ex
-  call assert_equal('euphoria3', &filetype)
-  bwipe!
-
-  call writefile(['include '], 'Xfile.ex')
-  split Xfile.ex
-  call assert_equal('euphoria3', &filetype)
-  bwipe!
-
-  filetype off
-endfunc
-
-func Test_foam_file()
-  filetype on
-  call assert_true(mkdir('0', 'pR'))
-  call assert_true(mkdir('0.orig', 'pR'))
-
-  call writefile(['FoamFile {', '    object something;'], 'Xfile1Dict', 'D')
-  split Xfile1Dict
-  call assert_equal('foam', &filetype)
-  bwipe!
-
-  call writefile(['FoamFile {', '    object something;'], 'Xfile1Dict.something', 'D')
-  split Xfile1Dict.something
-  call assert_equal('foam', &filetype)
-  bwipe!
-
-  call writefile(['FoamFile {', '    object something;'], 'XfileProperties', 'D')
-  split XfileProperties
-  call assert_equal('foam', &filetype)
-  bwipe!
-
-  call writefile(['FoamFile {', '    object something;'], 'XfileProperties.something', 'D')
-  split XfileProperties.something
-  call assert_equal('foam', &filetype)
-  bwipe!
-
-  call writefile(['FoamFile {', '    object something;'], 'XfileProperties')
-  split XfileProperties
-  call assert_equal('foam', &filetype)
-  bwipe!
-
-  call writefile(['FoamFile {', '    object something;'], 'XfileProperties.something')
-  split XfileProperties.something
-  call assert_equal('foam', &filetype)
-  bwipe!
-
-  call writefile(['FoamFile {', '    object something;'], '0/Xfile')
-  split 0/Xfile
-  call assert_equal('foam', &filetype)
-  bwipe!
-
-  call writefile(['FoamFile {', '    object something;'], '0.orig/Xfile')
-  split 0.orig/Xfile
-  call assert_equal('foam', &filetype)
-  bwipe!
-
-  filetype off
-endfunc
-
-func Test_frm_file()
-  filetype on
-
-  call writefile(['looks like FORM'], 'Xfile.frm', 'D')
-  split Xfile.frm
-  call assert_equal('form', &filetype)
-  bwipe!
-
-  " Test dist#ft#FTfrm()
-
-  let g:filetype_frm = 'form'
-  split Xfile.frm
-  call assert_equal('form', &filetype)
-  bwipe!
-  unlet g:filetype_frm
-
-  " Visual Basic
-
-  call writefile(['Begin VB.Form Form1'], 'Xfile.frm')
-  split Xfile.frm
-  call assert_equal('vb', &filetype)
-  bwipe!
-
-  filetype off
-endfunc
-
-func Test_fs_file()
-  filetype on
-
-  call writefile(['looks like F#'], 'Xfile.fs', 'D')
-  split Xfile.fs
-  call assert_equal('fsharp', &filetype)
-  bwipe!
-
-  let g:filetype_fs = 'forth'
-  split Xfile.fs
-  call assert_equal('forth', &filetype)
-  bwipe!
-  unlet g:filetype_fs
-
-  " Test dist#ft#FTfs()
-
-  " Forth (Gforth)
-
-  call writefile(['( Forth inline comment )'], 'Xfile.fs')
-  split Xfile.fs
-  call assert_equal('forth', &filetype)
-  bwipe!
-
-  call writefile(['\ Forth line comment'], 'Xfile.fs')
-  split Xfile.fs
-  call assert_equal('forth', &filetype)
-  bwipe!
-
-  call writefile([': squared ( n -- n^2 )', 'dup * ;'], 'Xfile.fs')
-  split Xfile.fs
-  call assert_equal('forth', &filetype)
-  bwipe!
-
-  filetype off
-endfunc
-
-func Test_git_file()
-  filetype on
-
-  call assert_true(mkdir('Xrepo.git', 'pR'))
-
-  call writefile([], 'Xrepo.git/HEAD')
-  split Xrepo.git/HEAD
-  call assert_equal('', &filetype)
-  bwipe!
-
-  call writefile(['0000000000000000000000000000000000000000'], 'Xrepo.git/HEAD')
-  split Xrepo.git/HEAD
-  call assert_equal('git', &filetype)
-  bwipe!
-
-  call writefile(['0000000000000000000000000000000000000000000000000000000000000000'], 'Xrepo.git/HEAD')
-  split Xrepo.git/HEAD
-  call assert_equal('git', &filetype)
-  bwipe!
-
-  call writefile(['ref: refs/heads/master'], 'Xrepo.git/HEAD')
-  split Xrepo.git/HEAD
-  call assert_equal('git', &filetype)
-  bwipe!
-
-  filetype off
-endfunc
-
-func Test_hook_file()
-  filetype on
-
-  call writefile(['[Trigger]', 'this is pacman config'], 'Xfile.hook', 'D')
-  split Xfile.hook
-  call assert_equal('conf', &filetype)
-  bwipe!
-
-  call writefile(['not pacman'], 'Xfile.hook')
-  split Xfile.hook
-  call assert_notequal('conf', &filetype)
-  bwipe!
-
-  filetype off
-endfunc
-
-func Test_m_file()
-  filetype on
-
-  call writefile(['looks like Matlab'], 'Xfile.m', 'D')
-  split Xfile.m
-  call assert_equal('matlab', &filetype)
-  bwipe!
-
-  let g:filetype_m = 'octave'
-  split Xfile.m
-  call assert_equal('octave', &filetype)
-  bwipe!
-  unlet g:filetype_m
-
-  " Test dist#ft#FTm()
-
-  " Objective-C
-
-  call writefile(['// Objective-C line comment'], 'Xfile.m')
-  split Xfile.m
-  call assert_equal('objc', &filetype)
-  bwipe!
-
-  call writefile(['/* Objective-C block comment */'], 'Xfile.m')
-  split Xfile.m
-  call assert_equal('objc', &filetype)
-  bwipe!
-
-  call writefile(['#import "test.m"'], 'Xfile.m')
-  split Xfile.m
-  call assert_equal('objc', &filetype)
-  bwipe!
-
-  call writefile(['#include <header.h>'], 'Xfile.m')
-  split Xfile.m
-  call assert_equal('objc', &filetype)
-  bwipe!
-
-  call writefile(['#define FORTY_TWO'], 'Xfile.m')
-  split Xfile.m
-  call assert_equal('objc', &filetype)
-  bwipe!
-
-  " Octave
-
-  call writefile(['# Octave line comment'], 'Xfile.m')
-  split Xfile.m
-  call assert_equal('octave', &filetype)
-  bwipe!
-
-  call writefile(['%!test "Octave test"'], 'Xfile.m')
-  split Xfile.m
-  call assert_equal('octave', &filetype)
-  bwipe!
-
-  call writefile(['unwind_protect'], 'Xfile.m')
-  split Xfile.m
-  call assert_equal('octave', &filetype)
-  bwipe!
-
-  call writefile(['try; 42; end_try_catch'], 'Xfile.m')
-  split Xfile.m
-  call assert_equal('octave', &filetype)
-  bwipe!
-
-  " Mathematica
-
-  call writefile(['(* Mathematica comment'], 'Xfile.m')
-  split Xfile.m
-  call assert_equal('mma', &filetype)
-  bwipe!
-
-  " MATLAB
-
-  call writefile(['% MATLAB line comment'], 'Xfile.m')
-  split Xfile.m
-  call assert_equal('matlab', &filetype)
-  bwipe!
-
-  " Murphi
-
-  call writefile(['-- Murphi comment'], 'Xfile.m')
-  split Xfile.m
-  call assert_equal('murphi', &filetype)
-  bwipe!
-
-  call writefile(['/* Murphi block comment */', 'Type'], 'Xfile.m')
-  split Xfile.m
-  call assert_equal('murphi', &filetype)
-  bwipe!
-
-  call writefile(['Type'], 'Xfile.m')
-  split Xfile.m
-  call assert_equal('murphi', &filetype)
-  bwipe!
-
-  filetype off
-endfunc
-
-func Test_mod_file()
-  filetype on
-
-  " *.mod defaults to Modsim III
-  call writefile(['locks like Modsim III'], 'modfile.mod')
-  split modfile.mod
-  call assert_equal('modsim3', &filetype)
-  bwipe!
-
-  " Users preference set by g:filetype_mod
-  let g:filetype_mod = 'lprolog'
-  split modfile.mod
-  call assert_equal('lprolog', &filetype)
-  unlet g:filetype_mod
-  bwipe!
-
-  " RAPID header start with a line containing only "%%%",
-  " but is not always present.
-  call writefile(['%%%'], 'modfile.mod')
-  split modfile.mod
-  call assert_equal('rapid', &filetype)
-  bwipe!
-  call delete('modfile.mod')
-
-  " RAPID supports umlauts in module names, leading spaces,
-  " the .mod extension is not case sensitive.
-  call writefile(['  module ÜmlautModule'], 'modfile.Mod')
-  split modfile.Mod
-  call assert_equal('rapid', &filetype)
-  bwipe!
-  call delete('modfile.Mod')
-
-  " RAPID is not case sensitive, embedded spaces, sysmodule,
-  " file starts with empty line(s).
-  call writefile(['', 'MODULE  rapidmödüle  (SYSMODULE,NOSTEPIN)'], 'modfile.MOD')
-  split modfile.MOD
-  call assert_equal('rapid', &filetype)
-  bwipe!
-
-  " Modula-2 MODULE not start of line
-  call writefile(['IMPLEMENTATION MODULE Module2Mod;'], 'modfile.MOD')
-  split modfile.MOD
-  call assert_equal('modula2', &filetype)
-  bwipe!
-
-  " Modula-2 with comment and empty lines prior MODULE
-  call writefile(['', '(* with',  ' comment *)', '', 'MODULE Module2Mod;'], 'modfile.MOD')
-  split modfile.MOD
-  call assert_equal('modula2', &filetype)
-  bwipe!
-  call delete('modfile.MOD')
-
-  " LambdaProlog module
-  call writefile(['module lpromod.'], 'modfile.mod')
-  split modfile.mod
-  call assert_equal('lprolog', &filetype)
-  bwipe!
-
-  " LambdaProlog with comment and empty lines prior module
-  call writefile(['', '% with',  '% comment', '', 'module lpromod.'], 'modfile.mod')
-  split modfile.mod
-  call assert_equal('lprolog', &filetype)
-  bwipe!
-  call delete('modfile.mod')
-
-  " go.mod
-  call writefile(['module example.com/M'], 'go.mod')
-  split go.mod
-  call assert_equal('gomod', &filetype)
-  bwipe!
-  call delete('go.mod')
-
-  call writefile(['module M'], 'go.mod')
-  split go.mod
-  call assert_equal('gomod', &filetype)
-  bwipe!
-  call delete('go.mod')
-
-  filetype off
-endfunc
-
-func Test_patch_file()
-  filetype on
-
-  call writefile([], 'Xfile.patch', 'D')
-  split Xfile.patch
-  call assert_equal('diff', &filetype)
-  bwipe!
-
-  call writefile(['From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001'], 'Xfile.patch')
-  split Xfile.patch
-  call assert_equal('gitsendemail', &filetype)
-  bwipe!
-
-  call writefile(['From 0000000000000000000000000000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001'], 'Xfile.patch')
-  split Xfile.patch
-  call assert_equal('gitsendemail', &filetype)
-  bwipe!
-
-  filetype off
-endfunc
-
-func Test_perl_file()
-  filetype on
-
-  " only tests one case, should do more
-  let lines =<< trim END
-
-    use a
-  END
-  call writefile(lines, "Xfile.t", 'D')
-  split Xfile.t
-  call assert_equal('perl', &filetype)
-  bwipe
-
-  filetype off
-endfunc
-
-func Test_pp_file()
-  filetype on
-
-  call writefile(['looks like puppet'], 'Xfile.pp', 'D')
-  split Xfile.pp
-  call assert_equal('puppet', &filetype)
-  bwipe!
-
-  let g:filetype_pp = 'pascal'
-  split Xfile.pp
-  call assert_equal('pascal', &filetype)
-  bwipe!
-  unlet g:filetype_pp
-
-  " Test dist#ft#FTpp()
-  call writefile(['{ pascal comment'], 'Xfile.pp')
-  split Xfile.pp
-  call assert_equal('pascal', &filetype)
-  bwipe!
-
-  call writefile(['procedure pascal'], 'Xfile.pp')
-  split Xfile.pp
-  call assert_equal('pascal', &filetype)
-  bwipe!
-
-  filetype off
-endfunc
-
-" Test dist#ft#FTprg()
-func Test_prg_file()
-  filetype on
-
-  " *.prg defaults to clipper
-  call writefile(['looks like clipper'], 'prgfile.prg')
-  split prgfile.prg
-  call assert_equal('clipper', &filetype)
-  bwipe!
-
-  " Users preference set by g:filetype_prg
-  let g:filetype_prg = 'eviews'
-  split prgfile.prg
-  call assert_equal('eviews', &filetype)
-  unlet g:filetype_prg
-  bwipe!
-
-  " RAPID header start with a line containing only "%%%",
-  " but is not always present.
-  call writefile(['%%%'], 'prgfile.prg')
-  split prgfile.prg
-  call assert_equal('rapid', &filetype)
-  bwipe!
-  call delete('prgfile.prg')
-
-  " RAPID supports umlauts in module names, leading spaces,
-  " the .prg extension is not case sensitive.
-  call writefile(['  module ÜmlautModule'], 'prgfile.Prg')
-  split prgfile.Prg
-  call assert_equal('rapid', &filetype)
-  bwipe!
-  call delete('prgfile.Prg')
-
-  " RAPID is not case sensitive, embedded spaces, sysmodule,
-  " file starts with empty line(s).
-  call writefile(['', 'MODULE  rapidmödüle  (SYSMODULE,NOSTEPIN)'], 'prgfile.PRG')
-  split prgfile.PRG
-  call assert_equal('rapid', &filetype)
-  bwipe!
-  call delete('prgfile.PRG')
-
-  filetype off
-endfunc
-
-" Test dist#ft#FTsc()
-func Test_sc_file()
-  filetype on
-
-  " SC classes are defined with '+ Class {}'
-  call writefile(['+ SCNvim {', '*methodArgs {|method|'], 'srcfile.sc')
-  split srcfile.sc
-  call assert_equal('supercollider', &filetype)
-  bwipe!
-  call delete('srcfile.sc')
-
-  " Some SC class files start with comment and define methods many lines later
-  call writefile(['// Query', '//Method','^this {'], 'srcfile.sc')
-  split srcfile.sc
-  call assert_equal('supercollider', &filetype)
-  bwipe!
-  call delete('srcfile.sc')
-
-  " Some SC class files put comments between method declaration after class
-  call writefile(['PingPong {', '//comment','*ar { arg'], 'srcfile.sc')
-  split srcfile.sc
-  call assert_equal('supercollider', &filetype)
-  bwipe!
-  call delete('srcfile.sc')
-
-  filetype off
-endfunc
-
-" Test dist#ft#FTscd()
-func Test_scd_file()
-  filetype on
-
-  call writefile(['ijq(1)'], 'srcfile.scd', 'D')
-  split srcfile.scd
-  call assert_equal('scdoc', &filetype)
-
-  bwipe!
-  filetype off
-endfunc
-
-func Test_src_file()
-  filetype on
-
-  " KRL header start with "&WORD", but is not always present.
-  call writefile(['&ACCESS'], 'srcfile.src')
-  split srcfile.src
-  call assert_equal('krl', &filetype)
-  bwipe!
-  call delete('srcfile.src')
-
-  " KRL def with leading spaces, for KRL file extension is not case sensitive.
-  call writefile(['  DEF srcfile()'], 'srcfile.Src')
-  split srcfile.Src
-  call assert_equal('krl', &filetype)
-  bwipe!
-  call delete('srcfile.Src')
-
-  " KRL global deffct with embedded spaces, file starts with empty line(s).
-  for text in ['global  def  srcfile()', 'global  deffct  srcfile()']
-    call writefile(['', text], 'srcfile.SRC')
-    split srcfile.SRC
-    call assert_equal('krl', &filetype, text)
-    bwipe!
-  endfor
-
-  " User may overrule file inspection
-  let g:filetype_src = 'src'
-  split srcfile.SRC
-  call assert_equal('src', &filetype)
-  bwipe!
-  call delete('srcfile.SRC')
-  unlet g:filetype_src
-
-  filetype off
-endfunc
-
-func Test_sys_file()
-  filetype on
-
-  " *.sys defaults to Batch file for MSDOS
-  call writefile(['looks like dos batch'], 'sysfile.sys')
-  split sysfile.sys
-  call assert_equal('bat', &filetype)
-  bwipe!
-
-  " Users preference set by g:filetype_sys
-  let g:filetype_sys = 'sys'
-  split sysfile.sys
-  call assert_equal('sys', &filetype)
-  unlet g:filetype_sys
-  bwipe!
-
-  " RAPID header start with a line containing only "%%%",
-  " but is not always present.
-  call writefile(['%%%'], 'sysfile.sys')
-  split sysfile.sys
-  call assert_equal('rapid', &filetype)
-  bwipe!
-  call delete('sysfile.sys')
-
-  " RAPID supports umlauts in module names, leading spaces,
-  " the .sys extension is not case sensitive.
-  call writefile(['  module ÜmlautModule'], 'sysfile.Sys')
-  split sysfile.Sys
-  call assert_equal('rapid', &filetype)
-  bwipe!
-  call delete('sysfile.Sys')
-
-  " RAPID is not case sensitive, embedded spaces, sysmodule,
-  " file starts with empty line(s).
-  call writefile(['', 'MODULE  rapidmödüle  (SYSMODULE,NOSTEPIN)'], 'sysfile.SYS')
-  split sysfile.SYS
-  call assert_equal('rapid', &filetype)
-  bwipe!
-  call delete('sysfile.SYS')
-
-  filetype off
-endfunc
-
-func Test_tex_file()
-  filetype on
-
-  call writefile(['%& pdflatex'], 'Xfile.tex')
-  split Xfile.tex
-  call assert_equal('tex', &filetype)
-  bwipe
-
-  call writefile(['\newcommand{\test}{some text}'], 'Xfile.tex')
-  split Xfile.tex
-  call assert_equal('tex', &filetype)
-  bwipe
-
-  " tex_flavor is unset
-  call writefile(['%& plain'], 'Xfile.tex')
-  split Xfile.tex
-  call assert_equal('plaintex', &filetype)
-  bwipe
-
-  let g:tex_flavor = 'plain'
-  call writefile(['just some text'], 'Xfile.tex')
-  split Xfile.tex
-  call assert_equal('plaintex', &filetype)
-  bwipe
-
-  let lines =<< trim END
-      % This is a comment.
-
-      \usemodule[translate]
-  END
-  call writefile(lines, 'Xfile.tex')
-  split Xfile.tex
-  call assert_equal('context', &filetype)
-  bwipe
-
-  let g:tex_flavor = 'context'
-  call writefile(['just some text'], 'Xfile.tex')
-  split Xfile.tex
-  call assert_equal('context', &filetype)
-  bwipe
-  unlet g:tex_flavor
-
-  call delete('Xfile.tex')
-  filetype off
-endfunc
-
-func Test_tf_file()
-  filetype on
-
-  call writefile([';;; TF MUD client is super duper cool'], 'Xfile.tf', 'D')
-  split Xfile.tf
-  call assert_equal('tf', &filetype)
-  bwipe!
-
-  call writefile(['provider "azurerm" {'], 'Xfile.tf')
-  split Xfile.tf
-  call assert_equal('terraform', &filetype)
-  bwipe!
-
-  filetype off
-endfunc
-
-func Test_ts_file()
-  filetype on
-
-  call writefile(['<?xml version="1.0" encoding="utf-8"?>'], 'Xfile.ts', 'D')
-  split Xfile.ts
-  call assert_equal('xml', &filetype)
-  bwipe!
-
-  call writefile(['// looks like Typescript'], 'Xfile.ts')
-  split Xfile.ts
-  call assert_equal('typescript', &filetype)
-  bwipe!
-
-  filetype off
-endfunc
-
-func Test_ttl_file()
-  filetype on
-
-  call writefile(['@base <http://example.org/> .'], 'Xfile.ttl', 'D')
-  split Xfile.ttl
-  call assert_equal('turtle', &filetype)
-  bwipe!
-
-  call writefile(['looks like Tera Term Language'], 'Xfile.ttl')
-  split Xfile.ttl
-  call assert_equal('teraterm', &filetype)
-  bwipe!
-
-  filetype off
-endfunc
-
-func Test_v_file()
-  filetype on
-
-  call writefile(['module tb; // Looks like a Verilog'], 'Xfile.v', 'D')
-  split Xfile.v
-  call assert_equal('verilog', &filetype)
-  bwipe!
-
-  call writefile(['module main'], 'Xfile.v')
-  split Xfile.v
-  call assert_equal('v', &filetype)
-  bwipe!
-
-  call writefile(['Definition x := 10.  (*'], 'Xfile.v')
-  split Xfile.v
-  call assert_equal('coq', &filetype)
-  bwipe!
-
-  filetype off
-endfunc
-
-func Test_xpm_file()
-  filetype on
-
-  call writefile(['this is XPM2'], 'file.xpm', 'D')
-  split file.xpm
-  call assert_equal('xpm2', &filetype)
-  bwipe!
-
-  filetype off
-endfunc
-
-func Test_cls_file()
-  filetype on
-
-  call writefile(['looks like Smalltalk'], 'Xfile.cls', 'D')
-  split Xfile.cls
-  call assert_equal('st', &filetype)
-  bwipe!
-
-  " Test dist#ft#FTcls()
-
-  let g:filetype_cls = 'vb'
-  split Xfile.cls
-  call assert_equal('vb', &filetype)
-  bwipe!
-  unlet g:filetype_cls
-
-  " TeX
-
-  call writefile(['%'], 'Xfile.cls')
-  split Xfile.cls
-  call assert_equal('tex', &filetype)
-  bwipe!
-
-  call writefile(['\NeedsTeXFormat{LaTeX2e}'], 'Xfile.cls')
-  split Xfile.cls
-  call assert_equal('tex', &filetype)
-  bwipe!
-
-  " Rexx
-
-  call writefile(['# rexx'], 'Xfile.cls')
-  split Xfile.cls
-  call assert_equal('rexx', &filetype)
-  bwipe!
-
-  " Visual Basic
-
-  call writefile(['VERSION 1.0 CLASS'], 'Xfile.cls')
-  split Xfile.cls
-  call assert_equal('vb', &filetype)
-  bwipe!
-
-  filetype off
-endfunc
-
-func Test_sig_file()
-  filetype on
-
-  call writefile(['this is neither Lambda Prolog nor SML'], 'Xfile.sig', 'D')
-  split Xfile.sig
-  call assert_equal('', &filetype)
-  bwipe!
-
-  " Test dist#ft#FTsig()
-
-  let g:filetype_sig = 'sml'
-  split Xfile.sig
-  call assert_equal('sml', &filetype)
-  bwipe!
-  unlet g:filetype_sig
-
-  " Lambda Prolog
-
-  call writefile(['sig foo.'], 'Xfile.sig')
-  split Xfile.sig
-  call assert_equal('lprolog', &filetype)
-  bwipe!
-
-  call writefile(['/* ... */'], 'Xfile.sig')
-  split Xfile.sig
-  call assert_equal('lprolog', &filetype)
-  bwipe!
-
-  call writefile(['% ...'], 'Xfile.sig')
-  split Xfile.sig
-  call assert_equal('lprolog', &filetype)
-  bwipe!
-
-  " SML signature file
-
-  call writefile(['signature FOO ='], 'Xfile.sig')
-  split Xfile.sig
-  call assert_equal('sml', &filetype)
-  bwipe!
-
-  call writefile(['structure FOO ='], 'Xfile.sig')
-  split Xfile.sig
-  call assert_equal('sml', &filetype)
-  bwipe!
-
-  call writefile(['(* ... *)'], 'Xfile.sig')
-  split Xfile.sig
-  call assert_equal('sml', &filetype)
-  bwipe!
-
-  filetype off
-endfunc
-
-" Test dist#ft#FTsil()
-func Test_sil_file()
-  filetype on
-
-  split Xfile.sil
-  call assert_equal('sil', &filetype)
-  bwipe!
-
-  let lines =<< trim END
-  // valid
-  let protoErasedPathA = \ABCProtocol.a
-
-  // also valid
-  let protoErasedPathA =
-          \ABCProtocol.a
-  END
-  call writefile(lines, 'Xfile.sil', 'D')
-
-  split Xfile.sil
-  call assert_equal('sil', &filetype)
-  bwipe!
-
-  " SILE
-
-  call writefile(['% some comment'], 'Xfile.sil')
-  split Xfile.sil
-  call assert_equal('sile', &filetype)
-  bwipe!
-
-  call writefile(['\begin[papersize=a6]{document}foo\end{document}'], 'Xfile.sil')
-  split Xfile.sil
-  call assert_equal('sile', &filetype)
-  bwipe!
-
-  filetype off
-endfunc
-
-func Test_inc_file()
-  filetype on
-
-  call writefile(['this is the fallback'], 'Xfile.inc', 'D')
-  split Xfile.inc
-  call assert_equal('pov', &filetype)
-  bwipe!
-
-  let g:filetype_inc = 'foo'
-  split Xfile.inc
-  call assert_equal('foo', &filetype)
-  bwipe!
-  unlet g:filetype_inc
-
-  " aspperl
-  call writefile(['perlscript'], 'Xfile.inc')
-  split Xfile.inc
-  call assert_equal('aspperl', &filetype)
-  bwipe!
-
-  " aspvbs
-  call writefile(['<% something'], 'Xfile.inc')
-  split Xfile.inc
-  call assert_equal('aspvbs', &filetype)
-  bwipe!
-
-  " php
-  call writefile(['<?php'], 'Xfile.inc')
-  split Xfile.inc
-  call assert_equal('php', &filetype)
-  bwipe!
-
-  " pascal
-  call writefile(['program'], 'Xfile.inc')
-  split Xfile.inc
-  call assert_equal('pascal', &filetype)
-  bwipe!
-
-  " bitbake
-  call writefile(['require foo'], 'Xfile.inc')
-  split Xfile.inc
-  call assert_equal('bitbake', &filetype)
-  bwipe!
-
-  call writefile(['S = "${WORKDIR}"'], 'Xfile.inc')
-  split Xfile.inc
-  call assert_equal('bitbake', &filetype)
-  bwipe!
-
-  call writefile(['DEPENDS:append = " somedep"'], 'Xfile.inc')
-  split Xfile.inc
-  call assert_equal('bitbake', &filetype)
-  bwipe!
-
-  call writefile(['MACHINE ??= "qemu"'], 'Xfile.inc')
-  split Xfile.inc
-  call assert_equal('bitbake', &filetype)
-  bwipe!
-
-  call writefile(['PROVIDES := "test"'], 'Xfile.inc')
-  split Xfile.inc
-  call assert_equal('bitbake', &filetype)
-  bwipe!
-
-  call writefile(['RDEPENDS_${PN} += "bar"'], 'Xfile.inc')
-  split Xfile.inc
-  call assert_equal('bitbake', &filetype)
-  bwipe!
-
-  " asm
-  call writefile(['asmsyntax=foo'], 'Xfile.inc')
-  split Xfile.inc
-  call assert_equal('foo', &filetype)
-  bwipe!
-
-  filetype off
-endfunc
-
-func Test_lsl_file()
-  filetype on
-
-  call writefile(['looks like Linden Scripting Language'], 'Xfile.lsl', 'D')
-  split Xfile.lsl
-  call assert_equal('lsl', &filetype)
-  bwipe!
-
-  " Test dist#ft#FTlsl()
-
-  let g:filetype_lsl = 'larch'
-  split Xfile.lsl
-  call assert_equal('larch', &filetype)
-  bwipe!
-  unlet g:filetype_lsl
-
-  " Larch Shared Language
-
-  call writefile(['% larch comment'], 'Xfile.lsl')
-  split Xfile.lsl
-  call assert_equal('larch', &filetype)
-  bwipe!
-
-  call writefile(['foo: trait'], 'Xfile.lsl')
-  split Xfile.lsl
-  call assert_equal('larch', &filetype)
-  bwipe!
-
-  filetype off
-endfunc
-
-func Test_typ_file()
-  filetype on
-
-  " SQL type file
-
-  call writefile(['CASE = LOWER'], 'Xfile.typ', 'D')
-  split Xfile.typ
-  call assert_equal('sql', &filetype)
-  bwipe!
-
-  call writefile(['TYPE foo'], 'Xfile.typ')
-  split Xfile.typ
-  call assert_equal('sql', &filetype)
-  bwipe!
-
-  " typst document
-
-  call writefile(['this is a fallback'], 'Xfile.typ')
-  split Xfile.typ
-  call assert_equal('typst', &filetype)
-  bwipe!
-
-  let g:filetype_typ = 'typst'
-  split test.typ
-  call assert_equal('typst', &filetype)
-  bwipe!
-  unlet g:filetype_typ
-
-  filetype off
-endfunc
-
-" vim: shiftwidth=2 sts=2 expandtab
+" Test :setfiletype
+
+func Test_backup_strip()
+  filetype on
+  let fname = 'Xdetect.js~~~~~~~~~~~'
+  call writefile(['one', 'two', 'three'], fname, 'D')
+  exe 'edit ' .. fname
+  call assert_equal('javascript', &filetype)
+
+  bwipe!
+  filetype off
+endfunc
+
+func Test_detection()
+  filetype on
+  augroup filetypedetect
+    au BufNewFile,BufRead *	call assert_equal(1, did_filetype())
+  augroup END
+  new something.vim
+  call assert_equal('vim', &filetype)
+
+  bwipe!
+  filetype off
+endfunc
+
+func Test_conf_type()
+  filetype on
+  call writefile(['# some comment', 'must be conf'], 'Xconffile', 'D')
+  augroup filetypedetect
+    au BufNewFile,BufRead *	call assert_equal(0, did_filetype())
+  augroup END
+  split Xconffile
+  call assert_equal('conf', &filetype)
+
+  bwipe!
+  filetype off
+endfunc
+
+func Test_other_type()
+  filetype on
+  augroup filetypedetect
+    au BufNewFile,BufRead *	call assert_equal(0, did_filetype())
+    au BufNewFile,BufRead Xotherfile	setf testfile
+    au BufNewFile,BufRead *	call assert_equal(1, did_filetype())
+  augroup END
+  call writefile(['# some comment', 'must be conf'], 'Xotherfile', 'D')
+  split Xotherfile
+  call assert_equal('testfile', &filetype)
+
+  bwipe!
+  filetype off
+endfunc
+
+" If $XDG_CONFIG_HOME is set return "fname" expanded in a list.
+" Otherwise return an empty list.
+def s:WhenConfigHome(fname: string): list<string>
+  if exists('$XDG_CONFIG_HOME')
+    return [expand(fname)]
+  endif
+  return []
+enddef
+
+" Return the name used for the $XDG_CONFIG_HOME directory.
+def s:GetConfigHome(): string
+  return getcwd() .. '/Xdg_config_home'
+enddef
+
+" saved value of $XDG_CONFIG_HOME
+let s:saveConfigHome = ''
+
+def s:SetupConfigHome()
+  if empty(windowsversion())
+    s:saveConfigHome = $XDG_CONFIG_HOME
+    setenv("XDG_CONFIG_HOME", GetConfigHome())
+  endif
+enddef
+
+" Filetypes detected just from matching the file name.
+" First one is checking that these files have no filetype.
+def s:GetFilenameChecks(): dict<list<string>>
+  return {
+    none: ['bsd', 'some-bsd'],
+    8th: ['file.8th'],
+    a2ps: ['/etc/a2ps.cfg', '/etc/a2ps/file.cfg', 'a2psrc', '.a2psrc', 'any/etc/a2ps.cfg', 'any/etc/a2ps/file.cfg'],
+    a65: ['file.a65'],
+    aap: ['file.aap'],
+    abap: ['file.abap'],
+    abc: ['file.abc'],
+    abel: ['file.abl'],
+    acedb: ['file.wrm'],
+    ada: ['file.adb', 'file.ads', 'file.ada', 'file.gpr'],
+    ahdl: ['file.tdf'],
+    aidl: ['file.aidl'],
+    alsaconf: ['.asoundrc', '/usr/share/alsa/alsa.conf', '/etc/asound.conf', 'any/etc/asound.conf', 'any/usr/share/alsa/alsa.conf'],
+    aml: ['file.aml'],
+    ampl: ['file.run'],
+    ant: ['build.xml'],
+    apache: ['.htaccess', '/etc/httpd/file.conf', '/etc/apache2/sites-2/file.com', '/etc/apache2/some.config', '/etc/apache2/conf.file/conf', '/etc/apache2/mods-some/file', '/etc/apache2/sites-some/file', '/etc/httpd/conf.d/file.config', '/etc/apache2/conf.file/file', '/etc/apache2/file.conf', '/etc/apache2/file.conf-file', '/etc/apache2/mods-file/file', '/etc/apache2/sites-file/file', '/etc/apache2/sites-file/file.com', '/etc/httpd/conf.d/file.conf', '/etc/httpd/conf.d/file.conf-file', 'access.conf', 'access.conf-file', 'any/etc/apache2/conf.file/file', 'any/etc/apache2/file.conf', 'any/etc/apache2/file.conf-file', 'any/etc/apache2/mods-file/file', 'any/etc/apache2/sites-file/file', 'any/etc/apache2/sites-file/file.com', 'any/etc/httpd/conf.d/file.conf', 'any/etc/httpd/conf.d/file.conf-file', 'any/etc/httpd/file.conf', 'apache.conf', 'apache.conf-file', 'apache2.conf', 'apache2.conf-file', 'httpd.conf', 'httpd.conf-file', 'srm.conf', 'srm.conf-file', '/etc/httpd/mods-some/file', '/etc/httpd/sites-some/file', '/etc/httpd/conf.file/conf'],
+    apachestyle: ['/etc/proftpd/file.config,/etc/proftpd/conf.file/file', '/etc/proftpd/conf.file/file', '/etc/proftpd/file.conf', '/etc/proftpd/file.conf-file', 'any/etc/proftpd/conf.file/file', 'any/etc/proftpd/file.conf', 'any/etc/proftpd/file.conf-file', 'proftpd.conf', 'proftpd.conf-file'],
+    applescript: ['file.scpt'],
+    aptconf: ['apt.conf', '/.aptitude/config', 'any/.aptitude/config'],
+    arch: ['.arch-inventory', '=tagging-method'],
+    arduino: ['file.ino', 'file.pde'],
+    art: ['file.art'],
+    asciidoc: ['file.asciidoc', 'file.adoc'],
+    asn: ['file.asn', 'file.asn1'],
+    asterisk: ['asterisk/file.conf', 'asterisk/file.conf-file', 'some-asterisk/file.conf', 'some-asterisk/file.conf-file'],
+    astro: ['file.astro'],
+    atlas: ['file.atl', 'file.as'],
+    autohotkey: ['file.ahk'],
+    autoit: ['file.au3'],
+    automake: ['GNUmakefile.am', 'makefile.am', 'Makefile.am'],
+    ave: ['file.ave'],
+    awk: ['file.awk', 'file.gawk'],
+    b: ['file.mch', 'file.ref', 'file.imp'],
+    basic: ['file.bas', 'file.bi', 'file.bm'],
+    bass: ['file.bass'],
+    bc: ['file.bc'],
+    bdf: ['file.bdf'],
+    beancount: ['file.beancount'],
+    bib: ['file.bib'],
+    bicep: ['file.bicep'],
+    bindzone: ['named.root', '/bind/db.file', '/named/db.file', 'any/bind/db.file', 'any/named/db.file'],
+    bitbake: ['file.bb', 'file.bbappend', 'file.bbclass', 'build/conf/local.conf', 'meta/conf/layer.conf', 'build/conf/bbappend.conf', 'meta-layer/conf/distro/foo.conf'],
+    blank: ['file.bl'],
+    blueprint: ['file.blp'],
+    bsdl: ['file.bsd', 'file.bsdl'],
+    bst: ['file.bst'],
+    bzl: ['file.bazel', 'file.bzl', 'WORKSPACE', 'WORKSPACE.bzlmod'],
+    bzr: ['bzr_log.any', 'bzr_log.file'],
+    c: ['enlightenment/file.cfg', 'file.qc', 'file.c', 'some-enlightenment/file.cfg'],
+    cabal: ['file.cabal'],
+    cabalconfig: ['cabal.config', expand("$HOME/.config/cabal/config")] + WhenConfigHome('$XDG_CONFIG_HOME/cabal/config'),
+    cabalproject: ['cabal.project', 'cabal.project.local'],
+    cairo: ['file.cairo'],
+    calendar: ['calendar', '/.calendar/file', '/share/calendar/any/calendar.file', '/share/calendar/calendar.file', 'any/share/calendar/any/calendar.file', 'any/share/calendar/calendar.file'],
+    capnp: ['file.capnp'],
+    catalog: ['catalog', 'sgml.catalogfile', 'sgml.catalog', 'sgml.catalog-file'],
+    cdl: ['file.cdl'],
+    cdrdaoconf: ['/etc/cdrdao.conf', '/etc/defaults/cdrdao', '/etc/default/cdrdao', '.cdrdao', 'any/etc/cdrdao.conf', 'any/etc/default/cdrdao', 'any/etc/defaults/cdrdao'],
+    cdrtoc: ['file.toc'],
+    cf: ['file.cfm', 'file.cfi', 'file.cfc'],
+    cfengine: ['cfengine.conf'],
+    cfg: ['file.hgrc', 'filehgrc', 'hgrc', 'some-hgrc'],
+    ch: ['file.chf'],
+    chaiscript: ['file.chai'],
+    chaskell: ['file.chs'],
+    chatito: ['file.chatito'],
+    chill: ['file..ch'],
+    chordpro: ['file.chopro', 'file.crd', 'file.cho', 'file.crdpro', 'file.chordpro'],
+    cl: ['file.eni'],
+    clean: ['file.dcl', 'file.icl'],
+    clojure: ['file.clj', 'file.cljs', 'file.cljx', 'file.cljc'],
+    cmake: ['CMakeLists.txt', 'file.cmake', 'file.cmake.in'],
+    cmod: ['file.cmod'],
+    cmusrc: ['any/.cmus/autosave', 'any/.cmus/rc', 'any/.cmus/command-history', 'any/.cmus/file.theme', 'any/cmus/rc', 'any/cmus/file.theme', '/.cmus/autosave', '/.cmus/command-history', '/.cmus/file.theme', '/.cmus/rc', '/cmus/file.theme', '/cmus/rc'],
+    cobol: ['file.cbl', 'file.cob', 'file.lib'],
+    coco: ['file.atg'],
+    conaryrecipe: ['file.recipe'],
+    conf: ['auto.master', 'file.conf'],
+    config: ['configure.in', 'configure.ac', '/etc/hostname.file', 'any/etc/hostname.file'],
+    confini: ['/etc/pacman.conf', 'any/etc/pacman.conf', 'mpv.conf', 'any/.aws/config', 'any/.aws/credentials', 'file.nmconnection'],
+    context: ['tex/context/any/file.tex', 'file.mkii', 'file.mkiv', 'file.mkvi', 'file.mkxl', 'file.mklx'],
+    cook: ['file.cook'],
+    corn: ['file.corn'],
+    cpon: ['file.cpon'],
+    cpp: ['file.cxx', 'file.c++', 'file.hh', 'file.hxx', 'file.hpp', 'file.ipp', 'file.moc', 'file.tcc', 'file.inl', 'file.tlh', 'file.cppm', 'file.ccm', 'file.cxxm', 'file.c++m'],
+    cqlang: ['file.cql'],
+    crm: ['file.crm'],
+    crontab: ['crontab', 'crontab.file', '/etc/cron.d/file', 'any/etc/cron.d/file'],
+    crystal: ['file.cr'],
+    cs: ['file.cs', 'file.csx'],
+    csc: ['file.csc'],
+    csdl: ['file.csdl'],
+    csp: ['file.csp', 'file.fdr'],
+    css: ['file.css'],
+    cterm: ['file.con'],
+    csv: ['file.csv'],
+    cucumber: ['file.feature'],
+    cuda: ['file.cu', 'file.cuh'],
+    cue: ['file.cue'],
+    cupl: ['file.pld'],
+    cuplsim: ['file.si'],
+    cvs: ['cvs123'],
+    cvsrc: ['.cvsrc'],
+    cynpp: ['file.cyn'],
+    d: ['file.d'],
+    dart: ['file.dart', 'file.drt'],
+    datascript: ['file.ds'],
+    dcd: ['file.dcd'],
+    debchangelog: ['changelog.Debian', 'changelog.dch', 'NEWS.Debian', 'NEWS.dch', '/debian/changelog'],
+    debcontrol: ['/debian/control', 'any/debian/control'],
+    debcopyright: ['/debian/copyright', 'any/debian/copyright'],
+    debsources: ['/etc/apt/sources.list', '/etc/apt/sources.list.d/file.list', 'any/etc/apt/sources.list', 'any/etc/apt/sources.list.d/file.list'],
+    def: ['file.def'],
+    denyhosts: ['denyhosts.conf'],
+    desc: ['file.desc'],
+    desktop: ['file.desktop', '.directory', 'file.directory'],
+    dhall: ['file.dhall'],
+    dictconf: ['dict.conf', '.dictrc'],
+    dictdconf: ['dictd.conf', 'dictdfile.conf', 'dictd-file.conf'],
+    diff: ['file.diff', 'file.rej'],
+    dircolors: ['.dir_colors', '.dircolors', '/etc/DIR_COLORS', 'any/etc/DIR_COLORS'],
+    dnsmasq: ['/etc/dnsmasq.conf', '/etc/dnsmasq.d/file', 'any/etc/dnsmasq.conf', 'any/etc/dnsmasq.d/file'],
+    dockerfile: ['Containerfile', 'Dockerfile', 'dockerfile', 'file.Dockerfile', 'file.dockerfile', 'Dockerfile.debian', 'Containerfile.something'],
+    dosbatch: ['file.bat'],
+    dosini: ['/etc/yum.conf', 'file.ini', 'npmrc', '.npmrc', 'php.ini', 'php.ini-5', 'php.ini-file', '/etc/yum.repos.d/file', 'any/etc/yum.conf', 'any/etc/yum.repos.d/file', 'file.wrap'],
+    dot: ['file.dot', 'file.gv'],
+    dracula: ['file.drac', 'file.drc', 'filelvs', 'filelpe', 'drac.file', 'lpe', 'lvs', 'some-lpe', 'some-lvs'],
+    dtd: ['file.dtd'],
+    dtrace: ['/usr/lib/dtrace/io.d'],
+    dts: ['file.dts', 'file.dtsi'],
+    dune: ['jbuild', 'dune', 'dune-project', 'dune-workspace'],
+    dylan: ['file.dylan'],
+    dylanintr: ['file.intr'],
+    dylanlid: ['file.lid'],
+    ecd: ['file.ecd'],
+    edif: ['file.edf', 'file.edif', 'file.edo'],
+    editorconfig: ['.editorconfig'],
+    eelixir: ['file.eex', 'file.leex'],
+    elinks: ['elinks.conf'],
+    elixir: ['file.ex', 'file.exs', 'mix.lock'],
+    elm: ['file.elm'],
+    elmfilt: ['filter-rules'],
+    elsa: ['file.lc'],
+    elvish: ['file.elv'],
+    epuppet: ['file.epp'],
+    erlang: ['file.erl', 'file.hrl', 'file.yaws'],
+    eruby: ['file.erb', 'file.rhtml'],
+    esdl: ['file.esdl'],
+    esmtprc: ['anyesmtprc', 'esmtprc', 'some-esmtprc'],
+    esqlc: ['file.ec', 'file.EC'],
+    esterel: ['file.strl'],
+    eterm: ['anyEterm/file.cfg', 'Eterm/file.cfg', 'some-Eterm/file.cfg'],
+    exim: ['exim.conf'],
+    expect: ['file.exp'],
+    exports: ['exports'],
+    factor: ['file.factor'],
+    falcon: ['file.fal'],
+    fan: ['file.fan', 'file.fwt'],
+    fennel: ['file.fnl'],
+    fetchmail: ['.fetchmailrc'],
+    fgl: ['file.4gl', 'file.4gh', 'file.m4gl'],
+    firrtl: ['file.fir'],
+    fish: ['file.fish'],
+    focexec: ['file.fex', 'file.focexec'],
+    form: ['file.frm'],
+    forth: ['file.ft', 'file.fth'],
+    fortran: ['file.f', 'file.for', 'file.fortran', 'file.fpp', 'file.ftn', 'file.f77', 'file.f90', 'file.f95', 'file.f03', 'file.f08'],
+    fpcmake: ['file.fpc'],
+    framescript: ['file.fsl'],
+    freebasic: ['file.fb'],
+    fsh: ['file.fsh'],
+    fsharp: ['file.fs', 'file.fsi', 'file.fsx'],
+    fstab: ['fstab', 'mtab'],
+    func: ['file.fc'],
+    fusion: ['file.fusion'],
+    fvwm: ['/.fvwm/file', 'any/.fvwm/file'],
+    gdb: ['.gdbinit', 'gdbinit', 'file.gdb', '.config/gdbearlyinit', '.gdbearlyinit'],
+    gdmo: ['file.mo', 'file.gdmo'],
+    gdresource: ['file.tscn', 'file.tres'],
+    gdscript: ['file.gd'],
+    gdshader: ['file.gdshader', 'file.shader'],
+    gedcom: ['file.ged', 'lltxxxxx.txt', '/tmp/lltmp', '/tmp/lltmp-file', 'any/tmp/lltmp', 'any/tmp/lltmp-file'],
+    gemtext: ['file.gmi', 'file.gemini'],
+    gift: ['file.gift'],
+    gitattributes: ['file.git/info/attributes', '.gitattributes', '/.config/git/attributes', '/etc/gitattributes', '/usr/local/etc/gitattributes', 'some.git/info/attributes'] + WhenConfigHome('$XDG_CONFIG_HOME/git/attributes'),
+    gitcommit: ['COMMIT_EDITMSG', 'MERGE_MSG', 'TAG_EDITMSG', 'NOTES_EDITMSG', 'EDIT_DESCRIPTION'],
+    gitconfig: ['file.git/config', 'file.git/config.worktree', 'file.git/worktrees/x/config.worktree', '.gitconfig', '.gitmodules', 'file.git/modules//config', '/.config/git/config', '/etc/gitconfig', '/usr/local/etc/gitconfig', '/etc/gitconfig.d/file', 'any/etc/gitconfig.d/file', '/.gitconfig.d/file', 'any/.config/git/config', 'any/.gitconfig.d/file', 'some.git/config', 'some.git/modules/any/config'] + WhenConfigHome('$XDG_CONFIG_HOME/git/config'),
+    gitignore: ['file.git/info/exclude', '.gitignore', '/.config/git/ignore', 'some.git/info/exclude'] + WhenConfigHome('$XDG_CONFIG_HOME/git/ignore'),
+    gitolite: ['gitolite.conf', '/gitolite-admin/conf/file', 'any/gitolite-admin/conf/file'],
+    gitrebase: ['git-rebase-todo'],
+    gitsendemail: ['.gitsendemail.msg.xxxxxx'],
+    gkrellmrc: ['gkrellmrc', 'gkrellmrc_x'],
+    gleam: ['file.gleam'],
+    glsl: ['file.glsl'],
+    gnash: ['gnashrc', '.gnashrc', 'gnashpluginrc', '.gnashpluginrc'],
+    gnuplot: ['file.gpi', '.gnuplot'],
+    go: ['file.go'],
+    gomod: ['go.mod'],
+    gosum: ['go.sum', 'go.work.sum'],
+    gowork: ['go.work'],
+    gp: ['file.gp', '.gprc'],
+    gpg: ['/.gnupg/options', '/.gnupg/gpg.conf', '/usr/any/gnupg/options.skel', 'any/.gnupg/gpg.conf', 'any/.gnupg/options', 'any/usr/any/gnupg/options.skel'],
+    grads: ['file.gs'],
+    graphql: ['file.graphql', 'file.graphqls', 'file.gql'],
+    gretl: ['file.gretl'],
+    groovy: ['file.gradle', 'file.groovy', 'Jenkinsfile'],
+    group: ['any/etc/group', 'any/etc/group-', 'any/etc/group.edit', 'any/etc/gshadow', 'any/etc/gshadow-', 'any/etc/gshadow.edit', 'any/var/backups/group.bak', 'any/var/backups/gshadow.bak', '/etc/group', '/etc/group-', '/etc/group.edit', '/etc/gshadow', '/etc/gshadow-', '/etc/gshadow.edit', '/var/backups/group.bak', '/var/backups/gshadow.bak'],
+    grub: ['/boot/grub/menu.lst', '/boot/grub/grub.conf', '/etc/grub.conf', 'any/boot/grub/grub.conf', 'any/boot/grub/menu.lst', 'any/etc/grub.conf'],
+    gsp: ['file.gsp'],
+    gtkrc: ['.gtkrc', 'gtkrc', '.gtkrc-file', 'gtkrc-file'],
+    gyp: ['file.gyp', 'file.gypi'],
+    hack: ['file.hack', 'file.hackpartial'],
+    haml: ['file.haml'],
+    hamster: ['file.hsm'],
+    handlebars: ['file.hbs'],
+    hare: ['file.ha'],
+    haskell: ['file.hs', 'file.hsc', 'file.hs-boot', 'file.hsig'],
+    haste: ['file.ht'],
+    hastepreproc: ['file.htpp'],
+    hb: ['file.hb'],
+    hcl: ['file.hcl'],
+    heex: ['file.heex'],
+    hercules: ['file.vc', 'file.ev', 'file.sum', 'file.errsum'],
+    hex: ['file.hex', 'file.h32'],
+    hgcommit: ['hg-editor-file.txt'],
+    hjson: ['file.hjson'],
+    hlsplaylist: ['file.m3u', 'file.m3u8'],
+    hog: ['file.hog', 'snort.conf', 'vision.conf'],
+    hollywood: ['file.hws'],
+    hoon: ['file.hoon'],
+    hostconf: ['/etc/host.conf', 'any/etc/host.conf'],
+    hostsaccess: ['/etc/hosts.allow', '/etc/hosts.deny', 'any/etc/hosts.allow', 'any/etc/hosts.deny'],
+    html: ['file.html', 'file.htm', 'file.cshtml'],
+    htmlm4: ['file.html.m4'],
+    httest: ['file.htt', 'file.htb'],
+    i3config: ['/home/user/.i3/config', '/home/user/.config/i3/config', '/etc/i3/config', '/etc/xdg/i3/config'],
+    ibasic: ['file.iba', 'file.ibi'],
+    icemenu: ['/.icewm/menu', 'any/.icewm/menu'],
+    icon: ['file.icn'],
+    indent: ['.indent.pro', 'indentrc'],
+    inform: ['file.inf', 'file.INF'],
+    initng: ['/etc/initng/any/file.i', 'file.ii', 'any/etc/initng/any/file.i'],
+    inittab: ['inittab'],
+    ipfilter: ['ipf.conf', 'ipf6.conf', 'ipf.rules'],
+    iss: ['file.iss'],
+    ist: ['file.ist', 'file.mst'],
+    j: ['file.ijs'],
+    jal: ['file.jal', 'file.JAL'],
+    jam: ['file.jpl', 'file.jpr', 'JAM-file.file', 'JAM.file', 'Prl-file.file', 'Prl.file'],
+    java: ['file.java', 'file.jav'],
+    javacc: ['file.jj', 'file.jjt'],
+    javascript: ['file.js', 'file.jsm', 'file.javascript', 'file.es', 'file.mjs', 'file.cjs'],
+    'javascript.glimmer': ['file.gjs'],
+    javascriptreact: ['file.jsx'],
+    jess: ['file.clp'],
+    jgraph: ['file.jgr'],
+    jq: ['file.jq'],
+    jovial: ['file.jov', 'file.j73', 'file.jovial'],
+    jproperties: ['file.properties', 'file.properties_xx', 'file.properties_xx_xx', 'some.properties_xx_xx_file', 'org.eclipse.xyz.prefs'],
+    json: ['file.json', 'file.jsonp', 'file.json-patch', 'file.webmanifest', 'Pipfile.lock', 'file.ipynb', '.prettierrc', '.firebaserc', '.stylelintrc', 'file.slnf'],
+    json5: ['file.json5'],
+    jsonc: ['file.jsonc', '.babelrc', '.eslintrc', '.jsfmtrc', '.jshintrc', '.hintrc', '.swrc', 'jsconfig.json', 'tsconfig.json', 'tsconfig.test.json', 'tsconfig-test.json'],
+    jsonl: ['file.jsonl'],
+    jsonnet: ['file.jsonnet', 'file.libsonnet'],
+    jsp: ['file.jsp'],
+    julia: ['file.jl'],
+    kconfig: ['Kconfig', 'Kconfig.debug', 'Kconfig.file'],
+    kdl: ['file.kdl'],
+    kivy: ['file.kv'],
+    kix: ['file.kix'],
+    kotlin: ['file.kt', 'file.ktm', 'file.kts'],
+    krl: ['file.sub', 'file.Sub', 'file.SUB'],
+    kscript: ['file.ks'],
+    kwt: ['file.k'],
+    lace: ['file.ace', 'file.ACE'],
+    latte: ['file.latte', 'file.lte'],
+    ld: ['file.ld'],
+    ldif: ['file.ldif'],
+    lean: ['file.lean'],
+    ledger: ['file.ldg', 'file.ledger', 'file.journal'],
+    less: ['file.less'],
+    lex: ['file.lex', 'file.l', 'file.lxx', 'file.l++'],
+    lftp: ['lftp.conf', '.lftprc', 'anylftp/rc', 'lftp/rc', 'some-lftp/rc'],
+    lhaskell: ['file.lhs'],
+    libao: ['/etc/libao.conf', '/.libao', 'any/.libao', 'any/etc/libao.conf'],
+    lifelines: ['file.ll'],
+    lilo: ['lilo.conf', 'lilo.conf-file'],
+    lilypond: ['file.ly', 'file.ily'],
+    limits: ['/etc/limits', '/etc/anylimits.conf', '/etc/anylimits.d/file.conf', '/etc/limits.conf', '/etc/limits.d/file.conf', '/etc/some-limits.conf', '/etc/some-limits.d/file.conf', 'any/etc/limits', 'any/etc/limits.conf', 'any/etc/limits.d/file.conf', 'any/etc/some-limits.conf', 'any/etc/some-limits.d/file.conf'],
+    liquid: ['file.liquid'],
+    lisp: ['file.lsp', 'file.lisp', 'file.asd', 'file.el', 'file.cl', '.emacs', '.sawfishrc', 'sbclrc', '.sbclrc'],
+    lite: ['file.lite', 'file.lt'],
+    litestep: ['/LiteStep/any/file.rc', 'any/LiteStep/any/file.rc'],
+    logcheck: ['/etc/logcheck/file.d-some/file', '/etc/logcheck/file.d/file', 'any/etc/logcheck/file.d-some/file', 'any/etc/logcheck/file.d/file'],
+    livebook: ['file.livemd'],
+    loginaccess: ['/etc/login.access', 'any/etc/login.access'],
+    logindefs: ['/etc/login.defs', 'any/etc/login.defs'],
+    logtalk: ['file.lgt'],
+    lotos: ['file.lot', 'file.lotos'],
+    lout: ['file.lou', 'file.lout'],
+    lpc: ['file.lpc', 'file.ulpc'],
+    lsl: ['file.lsl'],
+    lss: ['file.lss'],
+    lua: ['file.lua', 'file.rockspec', 'file.nse', '.luacheckrc', '.busted'],
+    luau: ['file.luau'],
+    lynx: ['lynx.cfg'],
+    lyrics: ['file.lrc'],
+    m3build: ['m3makefile', 'm3overrides'],
+    m3quake: ['file.quake', 'cm3.cfg'],
+    m4: ['file.at'],
+    mail: ['snd.123', '.letter', '.letter.123', '.followup', '.article', '.article.123', 'pico.123', 'mutt-xx-xxx', 'muttng-xx-xxx', 'ae123.txt', 'file.eml', 'reportbug-file'],
+    mailaliases: ['/etc/mail/aliases', '/etc/aliases', 'any/etc/aliases', 'any/etc/mail/aliases'],
+    mailcap: ['.mailcap', 'mailcap'],
+    make: ['file.mk', 'file.mak', 'file.dsp', 'makefile', 'Makefile', 'makefile-file', 'Makefile-file', 'some-makefile', 'some-Makefile'],
+    mallard: ['file.page'],
+    man: ['file.man'],
+    manconf: ['/etc/man.conf', 'man.config', 'any/etc/man.conf'],
+    map: ['file.map'],
+    maple: ['file.mv', 'file.mpl', 'file.mws'],
+    markdown: ['file.markdown', 'file.mdown', 'file.mkd', 'file.mkdn', 'file.mdwn', 'file.md'],
+    mason: ['file.mason', 'file.mhtml', 'file.comp'],
+    master: ['file.mas', 'file.master'],
+    matlab: ['file.m'],
+    maxima: ['file.demo', 'file.dmt', 'file.dm1', 'file.dm2', 'file.dm3',
+                'file.wxm', 'maxima-init.mac'],
+    mel: ['file.mel'],
+    mermaid: ['file.mmd', 'file.mmdc', 'file.mermaid'],
+    meson: ['meson.build', 'meson.options', 'meson_options.txt'],
+    messages: ['/log/auth', '/log/cron', '/log/daemon', '/log/debug',
+               '/log/kern', '/log/lpr', '/log/mail', '/log/messages',
+               '/log/news/news', '/log/syslog', '/log/user', '/log/auth.log',
+               '/log/cron.log', '/log/daemon.log', '/log/debug.log',
+               '/log/kern.log', '/log/lpr.log', '/log/mail.log',
+               '/log/messages.log', '/log/news/news.log', '/log/syslog.log',
+               '/log/user.log', '/log/auth.err', '/log/cron.err',
+               '/log/daemon.err', '/log/debug.err', '/log/kern.err',
+               '/log/lpr.err', '/log/mail.err', '/log/messages.err',
+               '/log/news/news.err', '/log/syslog.err', '/log/user.err',
+               '/log/auth.info', '/log/cron.info', '/log/daemon.info',
+               '/log/debug.info', '/log/kern.info', '/log/lpr.info',
+               '/log/mail.info', '/log/messages.info', '/log/news/news.info',
+               '/log/syslog.info', '/log/user.info', '/log/auth.warn',
+               '/log/cron.warn', '/log/daemon.warn', '/log/debug.warn',
+               '/log/kern.warn', '/log/lpr.warn', '/log/mail.warn',
+               '/log/messages.warn', '/log/news/news.warn',
+               '/log/syslog.warn', '/log/user.warn', '/log/auth.crit',
+               '/log/cron.crit', '/log/daemon.crit', '/log/debug.crit',
+               '/log/kern.crit', '/log/lpr.crit', '/log/mail.crit',
+               '/log/messages.crit', '/log/news/news.crit',
+               '/log/syslog.crit', '/log/user.crit', '/log/auth.notice',
+               '/log/cron.notice', '/log/daemon.notice', '/log/debug.notice',
+               '/log/kern.notice', '/log/lpr.notice', '/log/mail.notice',
+               '/log/messages.notice', '/log/news/news.notice',
+               '/log/syslog.notice', '/log/user.notice'],
+    mf: ['file.mf'],
+    mgl: ['file.mgl'],
+    mgp: ['file.mgp'],
+    mib: ['file.mib', 'file.my'],
+    mix: ['file.mix', 'file.mixal'],
+    mma: ['file.nb'],
+    mmp: ['file.mmp'],
+    modconf: ['/etc/modules.conf', '/etc/modules', '/etc/conf.modules', '/etc/modprobe.file', 'any/etc/conf.modules', 'any/etc/modprobe.file', 'any/etc/modules', 'any/etc/modules.conf'],
+    modula2: ['file.m2', 'file.mi'],
+    modula3: ['file.m3', 'file.mg', 'file.i3', 'file.ig', 'file.lm3'],
+    monk: ['file.isc', 'file.monk', 'file.ssc', 'file.tsc'],
+    moo: ['file.moo'],
+    moonscript: ['file.moon'],
+    move: ['file.move'],
+    mp: ['file.mp', 'file.mpxl', 'file.mpiv', 'file.mpvi'],
+    mplayerconf: ['mplayer.conf', '/.mplayer/config', 'any/.mplayer/config'],
+    mrxvtrc: ['mrxvtrc', '.mrxvtrc'],
+    msidl: ['file.odl', 'file.mof'],
+    msql: ['file.msql'],
+    mupad: ['file.mu'],
+    mush: ['file.mush'],
+    muttrc: ['Muttngrc', 'Muttrc', '.muttngrc', '.muttngrc-file', '.muttrc',
+             '.muttrc-file', '/.mutt/muttngrc', '/.mutt/muttngrc-file',
+             '/.mutt/muttrc', '/.mutt/muttrc-file', '/.muttng/muttngrc',
+             '/.muttng/muttngrc-file', '/.muttng/muttrc',
+             '/.muttng/muttrc-file', '/etc/Muttrc.d/file',
+             '/etc/Muttrc.d/file.rc', 'Muttngrc-file', 'Muttrc-file',
+             'any/.mutt/muttngrc', 'any/.mutt/muttngrc-file',
+             'any/.mutt/muttrc', 'any/.mutt/muttrc-file',
+             'any/.muttng/muttngrc', 'any/.muttng/muttngrc-file',
+             'any/.muttng/muttrc', 'any/.muttng/muttrc-file',
+             'any/etc/Muttrc.d/file', 'muttngrc', 'muttngrc-file', 'muttrc',
+             'muttrc-file'],
+    mysql: ['file.mysql'],
+    n1ql: ['file.n1ql', 'file.nql'],
+    named: ['namedfile.conf', 'rndcfile.conf', 'named-file.conf', 'named.conf', 'rndc-file.conf', 'rndc-file.key', 'rndc.conf', 'rndc.key'],
+    nanorc: ['/etc/nanorc', 'file.nanorc', 'any/etc/nanorc'],
+    natural: ['file.NSA', 'file.NSC', 'file.NSG', 'file.NSL', 'file.NSM', 'file.NSN', 'file.NSP', 'file.NSS'],
+    ncf: ['file.ncf'],
+    neomuttrc: ['Neomuttrc', '.neomuttrc', '.neomuttrc-file', '/.neomutt/neomuttrc', '/.neomutt/neomuttrc-file', 'Neomuttrc', 'Neomuttrc-file', 'any/.neomutt/neomuttrc', 'any/.neomutt/neomuttrc-file', 'neomuttrc', 'neomuttrc-file'],
+    netrc: ['.netrc'],
+    nginx: ['file.nginx', 'nginxfile.conf', 'filenginx.conf', 'any/etc/nginx/file', 'any/usr/local/nginx/conf/file', 'any/nginx/file.conf'],
+    nim: ['file.nim', 'file.nims', 'file.nimble'],
+    ninja: ['file.ninja'],
+    nix: ['file.nix'],
+    nqc: ['file.nqc'],
+    nroff: ['file.tr', 'file.nr', 'file.roff', 'file.tmac', 'file.mom', 'tmac.file'],
+    nsis: ['file.nsi', 'file.nsh'],
+    nu: ['env.nu', 'config.nu'],
+    obj: ['file.obj'],
+    obse: ['file.obl', 'file.obse', 'file.oblivion', 'file.obscript'],
+    ocaml: ['file.ml', 'file.mli', 'file.mll', 'file.mly', '.ocamlinit', 'file.mlt', 'file.mlp', 'file.mlip', 'file.mli.cppo', 'file.ml.cppo'],
+    occam: ['file.occ'],
+    octave: ['octaverc', '.octaverc', 'octave.conf'],
+    odin: ['file.odin'],
+    omnimark: ['file.xom', 'file.xin'],
+    opam: ['opam', 'file.opam', 'file.opam.template'],
+    openroad: ['file.or'],
+    openscad: ['file.scad'],
+    openvpn: ['file.ovpn', '/etc/openvpn/client/client.conf', '/usr/share/openvpn/examples/server.conf'],
+    opl: ['file.OPL', 'file.OPl', 'file.OpL', 'file.Opl', 'file.oPL', 'file.oPl', 'file.opL', 'file.opl'],
+    ora: ['file.ora'],
+    org: ['file.org', 'file.org_archive'],
+    pamconf: ['/etc/pam.conf', '/etc/pam.d/file', 'any/etc/pam.conf', 'any/etc/pam.d/file'],
+    pamenv: ['/etc/security/pam_env.conf', '/home/user/.pam_environment', '.pam_environment', 'pam_env.conf'],
+    papp: ['file.papp', 'file.pxml', 'file.pxsl'],
+    pascal: ['file.pas', 'file.dpr', 'file.lpr'],
+    passwd: ['any/etc/passwd', 'any/etc/passwd-', 'any/etc/passwd.edit', 'any/etc/shadow', 'any/etc/shadow-', 'any/etc/shadow.edit', 'any/var/backups/passwd.bak', 'any/var/backups/shadow.bak', '/etc/passwd', '/etc/passwd-', '/etc/passwd.edit', '/etc/shadow', '/etc/shadow-', '/etc/shadow.edit', '/var/backups/passwd.bak', '/var/backups/shadow.bak'],
+    pbtxt: ['file.pbtxt'],
+    pccts: ['file.g'],
+    pcmk: ['file.pcmk'],
+    pdf: ['file.pdf'],
+    perl: ['file.plx', 'file.al', 'file.psgi', 'gitolite.rc', '.gitolite.rc', 'example.gitolite.rc', '.latexmkrc', 'latexmkrc'],
+    pf: ['pf.conf'],
+    pfmain: ['main.cf', 'main.cf.proto'],
+    php: ['file.php', 'file.php9', 'file.phtml', 'file.ctp', 'file.phpt', 'file.theme'],
+    pike: ['file.pike', 'file.pmod'],
+    pilrc: ['file.rcp'],
+    pine: ['.pinerc', 'pinerc', '.pinercex', 'pinercex'],
+    pinfo: ['/etc/pinforc', '/.pinforc', 'any/.pinforc', 'any/etc/pinforc'],
+    pli: ['file.pli', 'file.pl1'],
+    plm: ['file.plm', 'file.p36', 'file.pac'],
+    plp: ['file.plp'],
+    plsql: ['file.pls', 'file.plsql'],
+    po: ['file.po', 'file.pot'],
+    pod: ['file.pod'],
+    poefilter: ['file.filter'],
+    poke: ['file.pk'],
+    pony: ['file.pony'],
+    postscr: ['file.ps', 'file.pfa', 'file.afm', 'file.eps', 'file.epsf', 'file.epsi', 'file.ai'],
+    pov: ['file.pov'],
+    povini: ['.povrayrc'],
+    ppd: ['file.ppd'],
+    ppwiz: ['file.it', 'file.ih'],
+    prisma: ['file.prisma'],
+    privoxy: ['file.action'],
+    proc: ['file.pc'],
+    procmail: ['.procmail', '.procmailrc'],
+    prolog: ['file.pdb'],
+    promela: ['file.pml'],
+    proto: ['file.proto'],
+    protocols: ['/etc/protocols', 'any/etc/protocols'],
+    ps1: ['file.ps1', 'file.psd1', 'file.psm1', 'file.pssc'],
+    ps1xml: ['file.ps1xml'],
+    psf: ['file.psf'],
+    psl: ['file.psl'],
+    pug: ['file.pug'],
+    puppet: ['file.pp'],
+    pyret: ['file.arr'],
+    pyrex: ['file.pyx', 'file.pxd'],
+    python: ['file.py', 'file.pyw', '.pythonstartup', '.pythonrc', 'file.ptl', 'file.pyi', 'SConstruct'],
+    ql: ['file.ql', 'file.qll'],
+    qmldir: ['qmldir'],
+    quake: ['anybaseq2/file.cfg', 'anyid1/file.cfg', 'quake3/file.cfg', 'baseq2/file.cfg', 'id1/file.cfg', 'quake1/file.cfg', 'some-baseq2/file.cfg', 'some-id1/file.cfg', 'some-quake1/file.cfg'],
+    quarto: ['file.qmd'],
+    r: ['file.r', '.Rprofile', 'Rprofile', 'Rprofile.site'],
+    racket: ['file.rkt', 'file.rktd', 'file.rktl'],
+    radiance: ['file.rad', 'file.mat'],
+    raku: ['file.pm6', 'file.p6', 'file.t6', 'file.pod6', 'file.raku', 'file.rakumod', 'file.rakudoc', 'file.rakutest'],
+    raml: ['file.raml'],
+    ratpoison: ['.ratpoisonrc', 'ratpoisonrc'],
+    rbs: ['file.rbs'],
+    rc: ['file.rc', 'file.rch'],
+    rcs: ['file,v'],
+    readline: ['.inputrc', 'inputrc'],
+    rego: ['file.rego'],
+    remind: ['.reminders', 'file.remind', 'file.rem', '.reminders-file'],
+    rescript: ['file.res', 'file.resi'],
+    resolv: ['resolv.conf'],
+    reva: ['file.frt'],
+    rexx: ['file.rex', 'file.orx', 'file.rxo', 'file.rxj', 'file.jrexx', 'file.rexxj', 'file.rexx', 'file.testGroup', 'file.testUnit'],
+    rhelp: ['file.rd'],
+    rib: ['file.rib'],
+    rmd: ['file.rmd', 'file.smd'],
+    rnc: ['file.rnc'],
+    rng: ['file.rng'],
+    rnoweb: ['file.rnw', 'file.snw'],
+    rpgle: ['file.rpgle', 'file.rpgleinc'],
+    robot: ['file.robot', 'file.resource'],
+    robots: ['robots.txt'],
+    ron: ['file.ron'],
+    routeros: ['file.rsc'],
+    rpcgen: ['file.x'],
+    rpl: ['file.rpl'],
+    rrst: ['file.rrst', 'file.srst'],
+    rst: ['file.rst'],
+    rtf: ['file.rtf'],
+    ruby: ['.irbrc', 'irbrc', 'file.rb', 'file.rbw', 'file.gemspec', 'file.ru', 'Gemfile', 'file.builder', 'file.rxml', 'file.rjs', 'file.rant', 'file.rake', 'rakefile', 'Rakefile', 'rantfile', 'Rantfile', 'rakefile-file', 'Rakefile-file', 'Puppetfile', 'Vagrantfile'],
+    rust: ['file.rs'],
+    samba: ['smb.conf'],
+    sas: ['file.sas'],
+    sass: ['file.sass'],
+    sather: ['file.sa'],
+    sbt: ['file.sbt'],
+    scala: ['file.scala'],
+    scheme: ['file.scm', 'file.ss', 'file.sld'],
+    scilab: ['file.sci', 'file.sce'],
+    screen: ['.screenrc', 'screenrc'],
+    scss: ['file.scss'],
+    sd: ['file.sd'],
+    sdc: ['file.sdc'],
+    sdl: ['file.sdl', 'file.pr'],
+    sed: ['file.sed'],
+    sensors: ['/etc/sensors.conf', '/etc/sensors3.conf', '/etc/sensors.d/file', 'any/etc/sensors.conf', 'any/etc/sensors3.conf', 'any/etc/sensors.d/file'],
+    services: ['/etc/services', 'any/etc/services'],
+    setserial: ['/etc/serial.conf', 'any/etc/serial.conf'],
+    sexplib: ['file.sexp'],
+    sh: ['.bashrc', '.bash_profile', '.bash-profile', '.bash_logout', '.bash-logout', '.bash_aliases', '.bash-aliases', '/tmp/bash-fc-3Ozjlw', '/tmp/bash-fc.3Ozjlw', 'PKGBUILD', 'APKBUILD', 'file.bash', '/usr/share/doc/bash-completion/filter.sh', '/etc/udev/cdsymlinks.conf', 'any/etc/udev/cdsymlinks.conf'],
+    sieve: ['file.siv', 'file.sieve'],
+    sil: ['file.sil'],
+    simula: ['file.sim'],
+    sinda: ['file.sin', 'file.s85'],
+    sisu: ['file.sst', 'file.ssm', 'file.ssi', 'file.-sst', 'file._sst', 'file.sst.meta', 'file.-sst.meta', 'file._sst.meta'],
+    skill: ['file.il', 'file.ils', 'file.cdf'],
+    cdc: ['file.cdc'],
+    slang: ['file.sl'],
+    sage: ['file.sage'],
+    slice: ['file.ice'],
+    slpconf: ['/etc/slp.conf', 'any/etc/slp.conf'],
+    slpreg: ['/etc/slp.reg', 'any/etc/slp.reg'],
+    slpspi: ['/etc/slp.spi', 'any/etc/slp.spi'],
+    slrnrc: ['.slrnrc'],
+    slrnsc: ['file.score'],
+    sm: ['sendmail.cf'],
+    smali: ['file.smali'],
+    smarty: ['file.tpl'],
+    smcl: ['file.hlp', 'file.ihlp', 'file.smcl'],
+    smith: ['file.smt', 'file.smith'],
+    smithy: ['file.smithy'],
+    sml: ['file.sml'],
+    snobol4: ['file.sno', 'file.spt'],
+    solidity: ['file.sol'],
+    solution: ['file.sln'],
+    sparql: ['file.rq', 'file.sparql'],
+    spec: ['file.spec'],
+    spice: ['file.sp', 'file.spice'],
+    spup: ['file.speedup', 'file.spdata', 'file.spd'],
+    spyce: ['file.spy', 'file.spi'],
+    sql: ['file.tyb', 'file.tyc', 'file.pkb', 'file.pks'],
+    sqlj: ['file.sqlj'],
+    prql: ['file.prql'],
+    sqr: ['file.sqr', 'file.sqi'],
+    squid: ['squid.conf'],
+    squirrel: ['file.nut'],
+    srec: ['file.s19', 'file.s28', 'file.s37', 'file.mot', 'file.srec'],
+    srt: ['file.srt'],
+    ssa: ['file.ass', 'file.ssa'],
+    sshconfig: ['ssh_config', '/.ssh/config', '/etc/ssh/ssh_config.d/file.conf', 'any/etc/ssh/ssh_config.d/file.conf', 'any/.ssh/config', 'any/.ssh/file.conf'],
+    sshdconfig: ['sshd_config', '/etc/ssh/sshd_config.d/file.conf', 'any/etc/ssh/sshd_config.d/file.conf'],
+    st: ['file.st'],
+    starlark: ['file.ipd', 'file.star', 'file.starlark'],
+    stata: ['file.ado', 'file.do', 'file.imata', 'file.mata'],
+    stp: ['file.stp'],
+    sudoers: ['any/etc/sudoers', 'sudoers.tmp', '/etc/sudoers', 'any/etc/sudoers.d/file'],
+    supercollider: ['file.quark'],
+    surface: ['file.sface'],
+    svelte: ['file.svelte'],
+    svg: ['file.svg'],
+    svn: ['svn-commitfile.tmp', 'svn-commit-file.tmp', 'svn-commit.tmp'],
+    swayconfig: ['/home/user/.sway/config', '/home/user/.config/sway/config', '/etc/sway/config', '/etc/xdg/sway/config'],
+    swift: ['file.swift'],
+    swiftgyb: ['file.swift.gyb'],
+    sysctl: ['/etc/sysctl.conf', '/etc/sysctl.d/file.conf', 'any/etc/sysctl.conf', 'any/etc/sysctl.d/file.conf'],
+    systemd: ['any/systemd/file.automount', 'any/systemd/file.dnssd',
+              'any/systemd/file.link', 'any/systemd/file.mount',
+              'any/systemd/file.netdev', 'any/systemd/file.network',
+              'any/systemd/file.nspawn', 'any/systemd/file.path',
+              'any/systemd/file.service', 'any/systemd/file.slice',
+              'any/systemd/file.socket', 'any/systemd/file.swap',
+              'any/systemd/file.target', 'any/systemd/file.timer',
+              '/etc/systemd/some.conf.d/file.conf',
+              '/etc/systemd/system/some.d/file.conf',
+              '/etc/systemd/system/some.d/.#file',
+              '/etc/systemd/system/.#otherfile',
+              '/home/user/.config/systemd/user/some.d/mine.conf',
+              '/home/user/.config/systemd/user/some.d/.#file',
+              '/home/user/.config/systemd/user/.#otherfile',
+              '/.config/systemd/user/.#', '/.config/systemd/user/.#-file',
+              '/.config/systemd/user/file.d/.#',
+              '/.config/systemd/user/file.d/.#-file',
+              '/.config/systemd/user/file.d/file.conf',
+              '/etc/systemd/file.conf.d/file.conf', '/etc/systemd/system/.#',
+              '/etc/systemd/system/.#-file', '/etc/systemd/system/file.d/.#',
+              '/etc/systemd/system/file.d/.#-file',
+              '/etc/systemd/system/file.d/file.conf',
+              '/systemd/file.automount', '/systemd/file.dnssd',
+              '/systemd/file.link', '/systemd/file.mount',
+              '/systemd/file.netdev', '/systemd/file.network',
+              '/systemd/file.nspawn', '/systemd/file.path',
+              '/systemd/file.service', '/systemd/file.slice',
+              '/systemd/file.socket', '/systemd/file.swap',
+              '/systemd/file.target', '/systemd/file.timer',
+              'any/.config/systemd/user/.#',
+              'any/.config/systemd/user/.#-file',
+              'any/.config/systemd/user/file.d/.#',
+              'any/.config/systemd/user/file.d/.#-file',
+              'any/.config/systemd/user/file.d/file.conf',
+              'any/etc/systemd/file.conf.d/file.conf',
+              'any/etc/systemd/system/.#', 'any/etc/systemd/system/.#-file',
+              'any/etc/systemd/system/file.d/.#',
+              'any/etc/systemd/system/file.d/.#-file',
+              'any/etc/systemd/system/file.d/file.conf'],
+    systemverilog: ['file.sv', 'file.svh'],
+    trace32: ['file.cmm', 'file.t32'],
+    tags: ['tags'],
+    tak: ['file.tak'],
+    tal: ['file.tal'],
+    taskdata: ['pending.data', 'completed.data', 'undo.data'],
+    taskedit: ['file.task'],
+    tcl: ['file.tcl', 'file.tm', 'file.tk', 'file.itcl', 'file.itk', 'file.jacl', '.tclshrc', 'tclsh.rc', '.wishrc'],
+    tablegen: ['file.td'],
+    teal: ['file.tl'],
+    template: ['file.tmpl'],
+    teraterm: ['file.ttl'],
+    terminfo: ['file.ti'],
+    'terraform-vars': ['file.tfvars'],
+    tex: ['file.latex', 'file.sty', 'file.dtx', 'file.ltx', 'file.bbl'],
+    texinfo: ['file.texinfo', 'file.texi', 'file.txi'],
+    texmf: ['texmf.cnf'],
+    text: ['file.text', 'file.txt', 'README', 'LICENSE', 'COPYING', 'AUTHORS', '/usr/share/doc/bash-completion/AUTHORS', '/etc/apt/apt.conf.d/README', '/etc/Muttrc.d/README'],
+    tf: ['file.tf', '.tfrc', 'tfrc'],
+    thrift: ['file.thrift'],
+    tidy: ['.tidyrc', 'tidyrc', 'tidy.conf'],
+    tilde: ['file.t.html'],
+    tla: ['file.tla'],
+    tli: ['file.tli'],
+    tmux: ['tmuxfile.conf', '.tmuxfile.conf', '.tmux-file.conf', '.tmux.conf', 'tmux-file.conf', 'tmux.conf', 'tmux.conf.local'],
+    toml: ['file.toml', 'Gopkg.lock', 'Pipfile', '/home/user/.cargo/config'],
+    tpp: ['file.tpp'],
+    treetop: ['file.treetop'],
+    trustees: ['trustees.conf'],
+    tsalt: ['file.slt'],
+    tsscl: ['file.tsscl'],
+    tssgm: ['file.tssgm'],
+    tssop: ['file.tssop'],
+    tsv: ['file.tsv'],
+    twig: ['file.twig'],
+    typescript: ['file.mts', 'file.cts'],
+    'typescript.glimmer': ['file.gts'],
+    typescriptreact: ['file.tsx'],
+    ungrammar: ['file.ungram'],
+    uc: ['file.uc'],
+    udevconf: ['/etc/udev/udev.conf', 'any/etc/udev/udev.conf'],
+    udevperm: ['/etc/udev/permissions.d/file.permissions', 'any/etc/udev/permissions.d/file.permissions'],
+    udevrules: ['/etc/udev/rules.d/file.rules', '/usr/lib/udev/rules.d/file.rules', '/lib/udev/rules.d/file.rules'],
+    uil: ['file.uit', 'file.uil'],
+    updatedb: ['/etc/updatedb.conf', 'any/etc/updatedb.conf'],
+    upstart: ['/usr/share/upstart/file.conf', '/usr/share/upstart/file.override', '/etc/init/file.conf', '/etc/init/file.override', '/.init/file.conf', '/.init/file.override', '/.config/upstart/file.conf', '/.config/upstart/file.override', 'any/.config/upstart/file.conf', 'any/.config/upstart/file.override', 'any/.init/file.conf', 'any/.init/file.override', 'any/etc/init/file.conf', 'any/etc/init/file.override', 'any/usr/share/upstart/file.conf', 'any/usr/share/upstart/file.override'],
+    upstreamdat: ['upstream.dat', 'UPSTREAM.DAT', 'upstream.file.dat', 'UPSTREAM.FILE.DAT', 'file.upstream.dat', 'FILE.UPSTREAM.DAT'],
+    upstreaminstalllog: ['upstreaminstall.log', 'UPSTREAMINSTALL.LOG', 'upstreaminstall.file.log', 'UPSTREAMINSTALL.FILE.LOG', 'file.upstreaminstall.log', 'FILE.UPSTREAMINSTALL.LOG'],
+    upstreamlog: ['fdrupstream.log', 'upstream.log', 'UPSTREAM.LOG', 'upstream.file.log', 'UPSTREAM.FILE.LOG', 'file.upstream.log', 'FILE.UPSTREAM.LOG', 'UPSTREAM-file.log', 'UPSTREAM-FILE.LOG'],
+    urlshortcut: ['file.url'],
+    usd: ['file.usda', 'file.usd'],
+    usserverlog: ['usserver.log', 'USSERVER.LOG', 'usserver.file.log', 'USSERVER.FILE.LOG', 'file.usserver.log', 'FILE.USSERVER.LOG'],
+    usw2kagtlog: ['usw2kagt.log', 'USW2KAGT.LOG', 'usw2kagt.file.log', 'USW2KAGT.FILE.LOG', 'file.usw2kagt.log', 'FILE.USW2KAGT.LOG'],
+    vala: ['file.vala'],
+    vb: ['file.sba', 'file.vb', 'file.vbs', 'file.dsm', 'file.ctl'],
+    vdf: ['file.vdf'],
+    vdmpp: ['file.vpp', 'file.vdmpp'],
+    vdmrt: ['file.vdmrt'],
+    vdmsl: ['file.vdm', 'file.vdmsl'],
+    vera: ['file.vr', 'file.vri', 'file.vrh'],
+    verilogams: ['file.va', 'file.vams'],
+    vgrindefs: ['vgrindefs'],
+    vhdl: ['file.hdl', 'file.vhd', 'file.vhdl', 'file.vbe', 'file.vst', 'file.vhdl_123', 'file.vho', 'some.vhdl_1', 'some.vhdl_1-file'],
+    vhs: ['file.tape'],
+    vim: ['file.vim', 'file.vba', '.exrc', '_exrc', 'some-vimrc', 'some-vimrc-file', 'vimrc', 'vimrc-file'],
+    viminfo: ['.viminfo', '_viminfo'],
+    vmasm: ['file.mar'],
+    voscm: ['file.cm'],
+    vrml: ['file.wrl'],
+    vroom: ['file.vroom'],
+    vue: ['file.vue'],
+    wat: ['file.wat'],
+    wast: ['file.wast'],
+    wdl: ['file.wdl'],
+    webmacro: ['file.wm'],
+    wget: ['.wgetrc', 'wgetrc'],
+    wget2: ['.wget2rc', 'wget2rc'],
+    winbatch: ['file.wbt'],
+    wit: ['file.wit'],
+    wml: ['file.wml'],
+    wsh: ['file.wsf', 'file.wsc'],
+    wsml: ['file.wsml'],
+    wvdial: ['wvdial.conf', '.wvdialrc'],
+    xdefaults: ['.Xdefaults', '.Xpdefaults', '.Xresources', 'xdm-config', 'file.ad', '/Xresources/file', '/app-defaults/file', 'Xresources', 'Xresources-file', 'any/Xresources/file', 'any/app-defaults/file'],
+    xf86conf: ['xorg.conf', 'xorg.conf-4'],
+    xhtml: ['file.xhtml', 'file.xht'],
+    xinetd: ['/etc/xinetd.conf', '/etc/xinetd.d/file', 'any/etc/xinetd.conf', 'any/etc/xinetd.d/file'],
+    xmath: ['file.msc', 'file.msf'],
+    xml: ['/etc/blkid.tab', '/etc/blkid.tab.old', 'file.xmi', 'file.csproj', 'file.csproj.user', 'file.fsproj', 'file.fsproj.user', 'file.vbproj', 'file.vbproj.user', 'file.ui', 'file.tpm', '/etc/xdg/menus/file.menu', 'fglrxrc', 'file.xlf', 'file.xliff', 'file.xul', 'file.wsdl', 'file.wpl', 'any/etc/blkid.tab', 'any/etc/blkid.tab.old', 'any/etc/xdg/menus/file.menu', 'file.atom', 'file.rss', 'file.cdxml', 'file.psc1', 'file.mpd'],
+    xmodmap: ['anyXmodmap', 'Xmodmap', 'some-Xmodmap', 'some-xmodmap', 'some-xmodmap-file', 'xmodmap', 'xmodmap-file'],
+    xpm: ['file.xpm'],
+    xpm2: ['file.xpm2'],
+    xquery: ['file.xq', 'file.xql', 'file.xqm', 'file.xquery', 'file.xqy'],
+    xs: ['file.xs'],
+    xsd: ['file.xsd'],
+    xslt: ['file.xsl', 'file.xslt'],
+    yacc: ['file.yy', 'file.yxx', 'file.y++'],
+    yaml: ['file.yaml', 'file.yml', '.clangd', '.clang-format', '.clang-tidy'],
+    yang: ['file.yang'],
+    yuck: ['file.yuck'],
+    z8a: ['file.z8a'],
+    zig: ['file.zig'],
+    zimbu: ['file.zu'],
+    zimbutempl: ['file.zut'],
+    zir: ['file.zir'],
+    zserio: ['file.zs'],
+    zsh: ['.zprofile', '/etc/zprofile', '.zfbfmarks', 'file.zsh',
+          '.zcompdump', '.zlogin', '.zlogout', '.zshenv', '.zshrc',
+          '.zcompdump-file', '.zlog', '.zlog-file', '.zsh', '.zsh-file',
+          'any/etc/zprofile', 'zlog', 'zlog-file', 'zsh', 'zsh-file'],
+
+    help: [$VIMRUNTIME .. '/doc/help.txt'],
+    }
+enddef
+
+def s:GetFilenameCaseChecks(): dict<list<string>>
+  return {
+    modula2: ['file.DEF'],
+    bzl: ['file.BUILD', 'BUILD', 'BUCK'],
+  }
+enddef
+
+def s:CheckItems(checks: dict<list<string>>)
+  set noswapfile
+
+  for [ft, names] in items(checks)
+    for i in range(0, len(names) - 1)
+      new
+      try
+        exe 'edit ' .. fnameescape(names[i])
+      catch
+	assert_report('cannot edit "' .. names[i] .. '": ' .. v:exception)
+      endtry
+      if &filetype == '' && &readonly
+	# File exists but not able to edit it (permission denied)
+      else
+        var expected = ft == 'none' ? '' : ft
+	assert_equal(expected, &filetype, 'with file name: ' .. names[i])
+      endif
+      bwipe!
+    endfor
+  endfor
+
+  set swapfile&
+enddef
+
+def Test_filetype_detection()
+  SetupConfigHome()
+  if !empty(s:saveConfigHome)
+    defer setenv("XDG_CONFIG_HOME", s:saveConfigHome)
+  endif
+  mkdir(GetConfigHome(), 'R')
+
+  filetype on
+  CheckItems(s:GetFilenameChecks())
+  if has('fname_case')
+    CheckItems(s:GetFilenameCaseChecks())
+  endif
+  filetype off
+enddef
+
+" Content lines that should not result in filetype detection
+def s:GetFalsePositiveChecks(): dict<list<list<string>>>
+  return {
+      '': [['test execve("/usr/bin/pstree", ["pstree"], 0x7ff0 /* 63 vars */) = 0']],
+      }
+enddef
+
+" Filetypes detected from the file contents by scripts.vim
+def s:GetScriptChecks(): dict<list<list<string>>>
+  return {
+    virata: [['% Virata'],
+            ['', '% Virata'],
+            ['', '', '% Virata'],
+            ['', '', '', '% Virata'],
+            ['', '', '', '', '% Virata']],
+    strace: [['execve("/usr/bin/pstree", ["pstree"], 0x7ff0 /* 63 vars */) = 0'],
+            ['15:17:47 execve("/usr/bin/pstree", ["pstree"], ... "_=/usr/bin/strace"]) = 0'],
+            ['__libc_start_main and something']],
+    clojure: [['#!/path/clojure']],
+    scala:  [['#!/path/scala']],
+    sh:     [['#!/path/sh'],
+            ['#!/path/bash'],
+            ['#!/path/bash2'],
+            ['#!/path/dash'],
+            ['#!/path/ksh'],
+            ['#!/path/ksh93']],
+    csh:    [['#!/path/csh']],
+    tcsh:   [['#!/path/tcsh']],
+    zsh:    [['#!/path/zsh']],
+    tcl:    [['#!/path/tclsh'],
+            ['#!/path/wish'],
+            ['#!/path/expectk'],
+            ['#!/path/itclsh'],
+            ['#!/path/itkwish']],
+    expect: [['#!/path/expect']],
+    gnuplot: [['#!/path/gnuplot']],
+    make:   [['#!/path/make']],
+    nix:    [['#!/path/nix-shell']],
+    pike:   [['#!/path/pike'],
+            ['#!/path/pike0'],
+            ['#!/path/pike9']],
+    lua:    [['#!/path/lua']],
+    raku:   [['#!/path/raku']],
+    perl:   [['#!/path/perl']],
+    php:    [['#!/path/php']],
+    python: [['#!/path/python'],
+            ['#!/path/python2'],
+            ['#!/path/python3']],
+    groovy: [['#!/path/groovy']],
+    ruby:   [['#!/path/ruby']],
+    javascript: [['#!/path/node'],
+            ['#!/path/js'],
+            ['#!/path/nodejs'],
+            ['#!/path/rhino']],
+    bc:     [['#!/path/bc']],
+    sed:    [['#!/path/sed'],
+            ['#n'],
+            ['#n comment']],
+    ocaml:  [['#!/path/ocaml']],
+    awk:    [['#!/path/awk'],
+            ['#!/path/gawk']],
+    wml:    [['#!/path/wml']],
+    scheme: [['#!/path/scheme'],
+            ['#!/path/guile']],
+    cfengine: [['#!/path/cfengine']],
+    erlang: [['#!/path/escript']],
+    haskell: [['#!/path/haskell']],
+    cpp:    [['// Standard iostream objects -*- C++ -*-'],
+            ['// -*- C++ -*-']],
+    yaml:   [['%YAML 1.2']],
+    pascal: [['#!/path/instantfpc']],
+    fennel: [['#!/path/fennel']],
+    routeros: [['#!/path/rsc']],
+    fish:   [['#!/path/fish']],
+    forth:  [['#!/path/gforth']],
+    icon:   [['#!/path/icon']],
+  }
+enddef
+
+" Various forms of "env" optional arguments.
+def s:GetScriptEnvChecks(): dict<list<list<string>>>
+  return {
+    perl: [['#!/usr/bin/env VAR=val perl']],
+    scala: [['#!/usr/bin/env VAR=val VVAR=vval scala']],
+    awk: [['#!/usr/bin/env VAR=val -i awk']],
+    scheme: [['#!/usr/bin/env VAR=val --ignore-environment scheme']],
+    python: [['#!/usr/bin/env VAR=val -S python -w -T']],
+    wml: [['#!/usr/bin/env VAR=val --split-string wml']],
+    nix: [['#!/usr/bin/env nix-shell']],
+  }
+enddef
+
+def s:Run_script_detection(test_dict: dict<list<list<string>>>)
+  filetype on
+  for [ft, files] in items(test_dict)
+    for file in files
+      writefile(file, 'Xtest', 'D')
+      split Xtest
+      assert_equal(ft, &filetype, 'for text: ' .. string(file))
+      bwipe!
+    endfor
+  endfor
+  filetype off
+enddef
+
+def Test_script_detection()
+  Run_script_detection(GetFalsePositiveChecks())
+  Run_script_detection(GetScriptChecks())
+  Run_script_detection(GetScriptEnvChecks())
+enddef
+
+func Test_setfiletype_completion()
+  call feedkeys(":setfiletype java\<C-A>\<C-B>\"\<CR>", 'tx')
+  call assert_equal('"setfiletype java javacc javascript javascriptreact', @:)
+endfunc
+
+" Test for ':filetype detect' command for a buffer without a file
+func Test_emptybuf_ftdetect()
+  new
+  call setline(1, '#!/bin/sh')
+  call assert_equal('', &filetype)
+  filetype detect
+  call assert_equal('sh', &filetype)
+  close!
+endfunc
+
+" Test for ':filetype indent on' and ':filetype indent off' commands
+func Test_filetype_indent_off()
+  new Xtest.vim
+  filetype indent on
+  call assert_equal(1, g:did_indent_on)
+  call assert_equal(['filetype detection:ON  plugin:OFF  indent:ON'],
+        \ execute('filetype')->split("\n"))
+  filetype indent off
+  call assert_equal(0, exists('g:did_indent_on'))
+  call assert_equal(['filetype detection:ON  plugin:OFF  indent:OFF'],
+        \ execute('filetype')->split("\n"))
+  close
+endfunc
+
+"""""""""""""""""""""""""""""""""""""""""""""""""
+" Tests for specific extensions and filetypes.
+" Keep sorted.
+"""""""""""""""""""""""""""""""""""""""""""""""""
+
+func Test_bas_file()
+  filetype on
+
+  call writefile(['looks like BASIC'], 'Xfile.bas', 'D')
+  split Xfile.bas
+  call assert_equal('basic', &filetype)
+  bwipe!
+
+  " Test dist#ft#FTbas()
+
+  let g:filetype_bas = 'freebasic'
+  split Xfile.bas
+  call assert_equal('freebasic', &filetype)
+  bwipe!
+  unlet g:filetype_bas
+
+  " FreeBASIC
+
+  call writefile(["/' FreeBASIC multiline comment '/"], 'Xfile.bas')
+  split Xfile.bas
+  call assert_equal('freebasic', &filetype)
+  bwipe!
+
+  call writefile(['#define TESTING'], 'Xfile.bas')
+  split Xfile.bas
+  call assert_equal('freebasic', &filetype)
+  bwipe!
+
+  call writefile(['option byval'], 'Xfile.bas')
+  split Xfile.bas
+  call assert_equal('freebasic', &filetype)
+  bwipe!
+
+  call writefile(['extern "C"'], 'Xfile.bas')
+  split Xfile.bas
+  call assert_equal('freebasic', &filetype)
+  bwipe!
+
+  " QB64
+
+  call writefile(['$LET TESTING = 1'], 'Xfile.bas')
+  split Xfile.bas
+  call assert_equal('qb64', &filetype)
+  bwipe!
+
+  call writefile(['OPTION _EXPLICIT'], 'Xfile.bas')
+  split Xfile.bas
+  call assert_equal('qb64', &filetype)
+  bwipe!
+
+  " Visual Basic
+
+  call writefile(['Attribute VB_NAME = "Testing"', 'Enum Foo', 'End Enum'], 'Xfile.bas')
+  split Xfile.bas
+  call assert_equal('vb', &filetype)
+  bwipe!
+
+  filetype off
+endfunc
+
+" Test dist#ft#FTcfg()
+func Test_cfg_file()
+  filetype on
+
+  " *.cfg defaults to cfg
+  call writefile(['looks like cfg'], 'cfgfile.cfg', 'D')
+  split cfgfile.cfg
+  call assert_equal('cfg', &filetype)
+
+  let g:filetype_cfg = 'other'
+  edit
+  call assert_equal('other', &filetype)
+  bwipe!
+  unlet g:filetype_cfg
+
+  " RAPID cfg
+  let ext = 'cfg'
+  for i in ['EIO', 'MMC', 'MOC', 'PROC', 'SIO', 'SYS']
+    call writefile([i .. ':CFG'], 'cfgfile.' .. ext)
+    execute "split cfgfile." .. ext
+    call assert_equal('rapid', &filetype)
+    bwipe!
+    call delete('cfgfile.' .. ext)
+    " check different case of file extension
+    let ext = substitute(ext, '\(\l\)', '\u\1', '')
+  endfor
+
+  " clean up
+  filetype off
+endfunc
+
+func Test_d_file()
+  filetype on
+
+  call writefile(['looks like D'], 'Xfile.d', 'D')
+  split Xfile.d
+  call assert_equal('d', &filetype)
+  bwipe!
+
+  call writefile(['#!/some/bin/dtrace'], 'Xfile.d')
+  split Xfile.d
+  call assert_equal('dtrace', &filetype)
+  bwipe!
+
+  call writefile(['#pragma  D  option'], 'Xfile.d')
+  split Xfile.d
+  call assert_equal('dtrace', &filetype)
+  bwipe!
+
+  call writefile([':some:thing:'], 'Xfile.d')
+  split Xfile.d
+  call assert_equal('dtrace', &filetype)
+  bwipe!
+
+  call writefile(['module this', '#pragma  D  option'], 'Xfile.d')
+  split Xfile.d
+  call assert_equal('d', &filetype)
+  bwipe!
+
+  call writefile(['import that', '#pragma  D  option'], 'Xfile.d')
+  split Xfile.d
+  call assert_equal('d', &filetype)
+  bwipe!
+
+  " clean up
+  filetype off
+endfunc
+
+func Test_dat_file()
+  filetype on
+
+  " KRL header start with "&WORD", but is not always present.
+  call writefile(['&ACCESS'], 'datfile.dat')
+  split datfile.dat
+  call assert_equal('krl', &filetype)
+  bwipe!
+  call delete('datfile.dat')
+
+  " KRL defdat with leading spaces, for KRL file extension is not case
+  " sensitive.
+  call writefile(['  DEFDAT datfile'], 'datfile.Dat')
+  split datfile.Dat
+  call assert_equal('krl', &filetype)
+  bwipe!
+  call delete('datfile.Dat')
+
+  " KRL defdat with embedded spaces, file starts with empty line(s).
+  call writefile(['', 'defdat  datfile  public'], 'datfile.DAT')
+  split datfile.DAT
+  call assert_equal('krl', &filetype)
+  bwipe!
+
+  " User may overrule file inspection
+  let g:filetype_dat = 'dat'
+  split datfile.DAT
+  call assert_equal('dat', &filetype)
+  bwipe!
+  call delete('datfile.DAT')
+  unlet g:filetype_dat
+
+  filetype off
+endfunc
+
+func Test_dep3patch_file()
+  filetype on
+
+  call assert_true(mkdir('debian/patches', 'pR'))
+
+  " series files are not patches
+  call writefile(['Description: some awesome patch'], 'debian/patches/series')
+  split debian/patches/series
+  call assert_notequal('dep3patch', &filetype)
+  bwipe!
+
+  " diff/patch files without the right headers should still show up as ft=diff
+  call writefile([], 'debian/patches/foo.diff')
+  split debian/patches/foo.diff
+  call assert_equal('diff', &filetype)
+  bwipe!
+
+  " Files with the right headers are detected as dep3patch, even if they don't
+  " have a diff/patch extension
+  call writefile(['Subject: dep3patches'], 'debian/patches/bar')
+  split debian/patches/bar
+  call assert_equal('dep3patch', &filetype)
+  bwipe!
+
+  " Files in sub-directories are detected
+  call assert_true(mkdir('debian/patches/s390x', 'p'))
+  call writefile(['Subject: dep3patches'], 'debian/patches/s390x/bar')
+  split debian/patches/s390x/bar
+  call assert_equal('dep3patch', &filetype)
+  bwipe!
+
+  " The detection stops when seeing the "header end" marker
+  call writefile(['---', 'Origin: the cloud'], 'debian/patches/baz')
+  split debian/patches/baz
+  call assert_notequal('dep3patch', &filetype)
+  bwipe!
+endfunc
+
+func Test_dsl_file()
+  filetype on
+
+  call writefile(['  <!doctype dsssl-spec ['], 'dslfile.dsl', 'D')
+  split dslfile.dsl
+  call assert_equal('dsl', &filetype)
+  bwipe!
+
+  call writefile(['workspace {'], 'dslfile.dsl')
+  split dslfile.dsl
+  call assert_equal('structurizr', &filetype)
+  bwipe!
+
+  filetype off
+endfunc
+
+func Test_ex_file()
+  filetype on
+
+  call writefile(['arbitrary content'], 'Xfile.ex', 'D')
+  split Xfile.ex
+  call assert_equal('elixir', &filetype)
+  bwipe!
+  let g:filetype_euphoria = 'euphoria4'
+  split Xfile.ex
+  call assert_equal('euphoria4', &filetype)
+  bwipe!
+  unlet g:filetype_euphoria
+
+  call writefile(['-- filetype euphoria comment'], 'Xfile.ex')
+  split Xfile.ex
+  call assert_equal('euphoria3', &filetype)
+  bwipe!
+
+  call writefile(['--filetype euphoria comment'], 'Xfile.ex')
+  split Xfile.ex
+  call assert_equal('euphoria3', &filetype)
+  bwipe!
+
+  call writefile(['ifdef '], 'Xfile.ex')
+  split Xfile.ex
+  call assert_equal('euphoria3', &filetype)
+  bwipe!
+
+  call writefile(['include '], 'Xfile.ex')
+  split Xfile.ex
+  call assert_equal('euphoria3', &filetype)
+  bwipe!
+
+  filetype off
+endfunc
+
+func Test_foam_file()
+  filetype on
+  call assert_true(mkdir('0', 'pR'))
+  call assert_true(mkdir('0.orig', 'pR'))
+
+  call writefile(['FoamFile {', '    object something;'], 'Xfile1Dict', 'D')
+  split Xfile1Dict
+  call assert_equal('foam', &filetype)
+  bwipe!
+
+  call writefile(['FoamFile {', '    object something;'], 'Xfile1Dict.something', 'D')
+  split Xfile1Dict.something
+  call assert_equal('foam', &filetype)
+  bwipe!
+
+  call writefile(['FoamFile {', '    object something;'], 'XfileProperties', 'D')
+  split XfileProperties
+  call assert_equal('foam', &filetype)
+  bwipe!
+
+  call writefile(['FoamFile {', '    object something;'], 'XfileProperties.something', 'D')
+  split XfileProperties.something
+  call assert_equal('foam', &filetype)
+  bwipe!
+
+  call writefile(['FoamFile {', '    object something;'], 'XfileProperties')
+  split XfileProperties
+  call assert_equal('foam', &filetype)
+  bwipe!
+
+  call writefile(['FoamFile {', '    object something;'], 'XfileProperties.something')
+  split XfileProperties.something
+  call assert_equal('foam', &filetype)
+  bwipe!
+
+  call writefile(['FoamFile {', '    object something;'], '0/Xfile')
+  split 0/Xfile
+  call assert_equal('foam', &filetype)
+  bwipe!
+
+  call writefile(['FoamFile {', '    object something;'], '0.orig/Xfile')
+  split 0.orig/Xfile
+  call assert_equal('foam', &filetype)
+  bwipe!
+
+  filetype off
+endfunc
+
+func Test_frm_file()
+  filetype on
+
+  call writefile(['looks like FORM'], 'Xfile.frm', 'D')
+  split Xfile.frm
+  call assert_equal('form', &filetype)
+  bwipe!
+
+  " Test dist#ft#FTfrm()
+
+  let g:filetype_frm = 'form'
+  split Xfile.frm
+  call assert_equal('form', &filetype)
+  bwipe!
+  unlet g:filetype_frm
+
+  " Visual Basic
+
+  call writefile(['Begin VB.Form Form1'], 'Xfile.frm')
+  split Xfile.frm
+  call assert_equal('vb', &filetype)
+  bwipe!
+
+  filetype off
+endfunc
+
+func Test_fs_file()
+  filetype on
+
+  call writefile(['looks like F#'], 'Xfile.fs', 'D')
+  split Xfile.fs
+  call assert_equal('fsharp', &filetype)
+  bwipe!
+
+  let g:filetype_fs = 'forth'
+  split Xfile.fs
+  call assert_equal('forth', &filetype)
+  bwipe!
+  unlet g:filetype_fs
+
+  " Test dist#ft#FTfs()
+
+  " Forth (Gforth)
+
+  call writefile(['( Forth inline comment )'], 'Xfile.fs')
+  split Xfile.fs
+  call assert_equal('forth', &filetype)
+  bwipe!
+
+  call writefile(['\ Forth line comment'], 'Xfile.fs')
+  split Xfile.fs
+  call assert_equal('forth', &filetype)
+  bwipe!
+
+  call writefile([': squared ( n -- n^2 )', 'dup * ;'], 'Xfile.fs')
+  split Xfile.fs
+  call assert_equal('forth', &filetype)
+  bwipe!
+
+  filetype off
+endfunc
+
+func Test_git_file()
+  filetype on
+
+  call assert_true(mkdir('Xrepo.git', 'pR'))
+
+  call writefile([], 'Xrepo.git/HEAD')
+  split Xrepo.git/HEAD
+  call assert_equal('', &filetype)
+  bwipe!
+
+  call writefile(['0000000000000000000000000000000000000000'], 'Xrepo.git/HEAD')
+  split Xrepo.git/HEAD
+  call assert_equal('git', &filetype)
+  bwipe!
+
+  call writefile(['0000000000000000000000000000000000000000000000000000000000000000'], 'Xrepo.git/HEAD')
+  split Xrepo.git/HEAD
+  call assert_equal('git', &filetype)
+  bwipe!
+
+  call writefile(['ref: refs/heads/master'], 'Xrepo.git/HEAD')
+  split Xrepo.git/HEAD
+  call assert_equal('git', &filetype)
+  bwipe!
+
+  filetype off
+endfunc
+
+func Test_hook_file()
+  filetype on
+
+  call writefile(['[Trigger]', 'this is pacman config'], 'Xfile.hook', 'D')
+  split Xfile.hook
+  call assert_equal('conf', &filetype)
+  bwipe!
+
+  call writefile(['not pacman'], 'Xfile.hook')
+  split Xfile.hook
+  call assert_notequal('conf', &filetype)
+  bwipe!
+
+  filetype off
+endfunc
+
+func Test_m_file()
+  filetype on
+
+  call writefile(['looks like Matlab'], 'Xfile.m', 'D')
+  split Xfile.m
+  call assert_equal('matlab', &filetype)
+  bwipe!
+
+  let g:filetype_m = 'octave'
+  split Xfile.m
+  call assert_equal('octave', &filetype)
+  bwipe!
+  unlet g:filetype_m
+
+  " Test dist#ft#FTm()
+
+  " Objective-C
+
+  call writefile(['// Objective-C line comment'], 'Xfile.m')
+  split Xfile.m
+  call assert_equal('objc', &filetype)
+  bwipe!
+
+  call writefile(['/* Objective-C block comment */'], 'Xfile.m')
+  split Xfile.m
+  call assert_equal('objc', &filetype)
+  bwipe!
+
+  call writefile(['#import "test.m"'], 'Xfile.m')
+  split Xfile.m
+  call assert_equal('objc', &filetype)
+  bwipe!
+
+  call writefile(['#include <header.h>'], 'Xfile.m')
+  split Xfile.m
+  call assert_equal('objc', &filetype)
+  bwipe!
+
+  call writefile(['#define FORTY_TWO'], 'Xfile.m')
+  split Xfile.m
+  call assert_equal('objc', &filetype)
+  bwipe!
+
+  " Octave
+
+  call writefile(['# Octave line comment'], 'Xfile.m')
+  split Xfile.m
+  call assert_equal('octave', &filetype)
+  bwipe!
+
+  call writefile(['%!test "Octave test"'], 'Xfile.m')
+  split Xfile.m
+  call assert_equal('octave', &filetype)
+  bwipe!
+
+  call writefile(['unwind_protect'], 'Xfile.m')
+  split Xfile.m
+  call assert_equal('octave', &filetype)
+  bwipe!
+
+  call writefile(['try; 42; end_try_catch'], 'Xfile.m')
+  split Xfile.m
+  call assert_equal('octave', &filetype)
+  bwipe!
+
+  " Mathematica
+
+  call writefile(['(* Mathematica comment'], 'Xfile.m')
+  split Xfile.m
+  call assert_equal('mma', &filetype)
+  bwipe!
+
+  " MATLAB
+
+  call writefile(['% MATLAB line comment'], 'Xfile.m')
+  split Xfile.m
+  call assert_equal('matlab', &filetype)
+  bwipe!
+
+  " Murphi
+
+  call writefile(['-- Murphi comment'], 'Xfile.m')
+  split Xfile.m
+  call assert_equal('murphi', &filetype)
+  bwipe!
+
+  call writefile(['/* Murphi block comment */', 'Type'], 'Xfile.m')
+  split Xfile.m
+  call assert_equal('murphi', &filetype)
+  bwipe!
+
+  call writefile(['Type'], 'Xfile.m')
+  split Xfile.m
+  call assert_equal('murphi', &filetype)
+  bwipe!
+
+  filetype off
+endfunc
+
+func Test_mod_file()
+  filetype on
+
+  " *.mod defaults to Modsim III
+  call writefile(['locks like Modsim III'], 'modfile.mod')
+  split modfile.mod
+  call assert_equal('modsim3', &filetype)
+  bwipe!
+
+  " Users preference set by g:filetype_mod
+  let g:filetype_mod = 'lprolog'
+  split modfile.mod
+  call assert_equal('lprolog', &filetype)
+  unlet g:filetype_mod
+  bwipe!
+
+  " RAPID header start with a line containing only "%%%",
+  " but is not always present.
+  call writefile(['%%%'], 'modfile.mod')
+  split modfile.mod
+  call assert_equal('rapid', &filetype)
+  bwipe!
+  call delete('modfile.mod')
+
+  " RAPID supports umlauts in module names, leading spaces,
+  " the .mod extension is not case sensitive.
+  call writefile(['  module ÜmlautModule'], 'modfile.Mod')
+  split modfile.Mod
+  call assert_equal('rapid', &filetype)
+  bwipe!
+  call delete('modfile.Mod')
+
+  " RAPID is not case sensitive, embedded spaces, sysmodule,
+  " file starts with empty line(s).
+  call writefile(['', 'MODULE  rapidmödüle  (SYSMODULE,NOSTEPIN)'], 'modfile.MOD')
+  split modfile.MOD
+  call assert_equal('rapid', &filetype)
+  bwipe!
+
+  " Modula-2 MODULE not start of line
+  call writefile(['IMPLEMENTATION MODULE Module2Mod;'], 'modfile.MOD')
+  split modfile.MOD
+  call assert_equal('modula2', &filetype)
+  bwipe!
+
+  " Modula-2 with comment and empty lines prior MODULE
+  call writefile(['', '(* with',  ' comment *)', '', 'MODULE Module2Mod;'], 'modfile.MOD')
+  split modfile.MOD
+  call assert_equal('modula2', &filetype)
+  bwipe!
+  call delete('modfile.MOD')
+
+  " LambdaProlog module
+  call writefile(['module lpromod.'], 'modfile.mod')
+  split modfile.mod
+  call assert_equal('lprolog', &filetype)
+  bwipe!
+
+  " LambdaProlog with comment and empty lines prior module
+  call writefile(['', '% with',  '% comment', '', 'module lpromod.'], 'modfile.mod')
+  split modfile.mod
+  call assert_equal('lprolog', &filetype)
+  bwipe!
+  call delete('modfile.mod')
+
+  " go.mod
+  call writefile(['module example.com/M'], 'go.mod')
+  split go.mod
+  call assert_equal('gomod', &filetype)
+  bwipe!
+  call delete('go.mod')
+
+  call writefile(['module M'], 'go.mod')
+  split go.mod
+  call assert_equal('gomod', &filetype)
+  bwipe!
+  call delete('go.mod')
+
+  filetype off
+endfunc
+
+func Test_patch_file()
+  filetype on
+
+  call writefile([], 'Xfile.patch', 'D')
+  split Xfile.patch
+  call assert_equal('diff', &filetype)
+  bwipe!
+
+  call writefile(['From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001'], 'Xfile.patch')
+  split Xfile.patch
+  call assert_equal('gitsendemail', &filetype)
+  bwipe!
+
+  call writefile(['From 0000000000000000000000000000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001'], 'Xfile.patch')
+  split Xfile.patch
+  call assert_equal('gitsendemail', &filetype)
+  bwipe!
+
+  filetype off
+endfunc
+
+func Test_perl_file()
+  filetype on
+
+  " only tests one case, should do more
+  let lines =<< trim END
+
+    use a
+  END
+  call writefile(lines, "Xfile.t", 'D')
+  split Xfile.t
+  call assert_equal('perl', &filetype)
+  bwipe
+
+  filetype off
+endfunc
+
+func Test_pp_file()
+  filetype on
+
+  call writefile(['looks like puppet'], 'Xfile.pp', 'D')
+  split Xfile.pp
+  call assert_equal('puppet', &filetype)
+  bwipe!
+
+  let g:filetype_pp = 'pascal'
+  split Xfile.pp
+  call assert_equal('pascal', &filetype)
+  bwipe!
+  unlet g:filetype_pp
+
+  " Test dist#ft#FTpp()
+  call writefile(['{ pascal comment'], 'Xfile.pp')
+  split Xfile.pp
+  call assert_equal('pascal', &filetype)
+  bwipe!
+
+  call writefile(['procedure pascal'], 'Xfile.pp')
+  split Xfile.pp
+  call assert_equal('pascal', &filetype)
+  bwipe!
+
+  filetype off
+endfunc
+
+" Test dist#ft#FTprg()
+func Test_prg_file()
+  filetype on
+
+  " *.prg defaults to clipper
+  call writefile(['looks like clipper'], 'prgfile.prg')
+  split prgfile.prg
+  call assert_equal('clipper', &filetype)
+  bwipe!
+
+  " Users preference set by g:filetype_prg
+  let g:filetype_prg = 'eviews'
+  split prgfile.prg
+  call assert_equal('eviews', &filetype)
+  unlet g:filetype_prg
+  bwipe!
+
+  " RAPID header start with a line containing only "%%%",
+  " but is not always present.
+  call writefile(['%%%'], 'prgfile.prg')
+  split prgfile.prg
+  call assert_equal('rapid', &filetype)
+  bwipe!
+  call delete('prgfile.prg')
+
+  " RAPID supports umlauts in module names, leading spaces,
+  " the .prg extension is not case sensitive.
+  call writefile(['  module ÜmlautModule'], 'prgfile.Prg')
+  split prgfile.Prg
+  call assert_equal('rapid', &filetype)
+  bwipe!
+  call delete('prgfile.Prg')
+
+  " RAPID is not case sensitive, embedded spaces, sysmodule,
+  " file starts with empty line(s).
+  call writefile(['', 'MODULE  rapidmödüle  (SYSMODULE,NOSTEPIN)'], 'prgfile.PRG')
+  split prgfile.PRG
+  call assert_equal('rapid', &filetype)
+  bwipe!
+  call delete('prgfile.PRG')
+
+  filetype off
+endfunc
+
+" Test dist#ft#FTsc()
+func Test_sc_file()
+  filetype on
+
+  " SC classes are defined with '+ Class {}'
+  call writefile(['+ SCNvim {', '*methodArgs {|method|'], 'srcfile.sc')
+  split srcfile.sc
+  call assert_equal('supercollider', &filetype)
+  bwipe!
+  call delete('srcfile.sc')
+
+  " Some SC class files start with comment and define methods many lines later
+  call writefile(['// Query', '//Method','^this {'], 'srcfile.sc')
+  split srcfile.sc
+  call assert_equal('supercollider', &filetype)
+  bwipe!
+  call delete('srcfile.sc')
+
+  " Some SC class files put comments between method declaration after class
+  call writefile(['PingPong {', '//comment','*ar { arg'], 'srcfile.sc')
+  split srcfile.sc
+  call assert_equal('supercollider', &filetype)
+  bwipe!
+  call delete('srcfile.sc')
+
+  filetype off
+endfunc
+
+" Test dist#ft#FTscd()
+func Test_scd_file()
+  filetype on
+
+  call writefile(['ijq(1)'], 'srcfile.scd', 'D')
+  split srcfile.scd
+  call assert_equal('scdoc', &filetype)
+
+  bwipe!
+  filetype off
+endfunc
+
+func Test_src_file()
+  filetype on
+
+  " KRL header start with "&WORD", but is not always present.
+  call writefile(['&ACCESS'], 'srcfile.src')
+  split srcfile.src
+  call assert_equal('krl', &filetype)
+  bwipe!
+  call delete('srcfile.src')
+
+  " KRL def with leading spaces, for KRL file extension is not case sensitive.
+  call writefile(['  DEF srcfile()'], 'srcfile.Src')
+  split srcfile.Src
+  call assert_equal('krl', &filetype)
+  bwipe!
+  call delete('srcfile.Src')
+
+  " KRL global deffct with embedded spaces, file starts with empty line(s).
+  for text in ['global  def  srcfile()', 'global  deffct  srcfile()']
+    call writefile(['', text], 'srcfile.SRC')
+    split srcfile.SRC
+    call assert_equal('krl', &filetype, text)
+    bwipe!
+  endfor
+
+  " User may overrule file inspection
+  let g:filetype_src = 'src'
+  split srcfile.SRC
+  call assert_equal('src', &filetype)
+  bwipe!
+  call delete('srcfile.SRC')
+  unlet g:filetype_src
+
+  filetype off
+endfunc
+
+func Test_sys_file()
+  filetype on
+
+  " *.sys defaults to Batch file for MSDOS
+  call writefile(['looks like dos batch'], 'sysfile.sys')
+  split sysfile.sys
+  call assert_equal('bat', &filetype)
+  bwipe!
+
+  " Users preference set by g:filetype_sys
+  let g:filetype_sys = 'sys'
+  split sysfile.sys
+  call assert_equal('sys', &filetype)
+  unlet g:filetype_sys
+  bwipe!
+
+  " RAPID header start with a line containing only "%%%",
+  " but is not always present.
+  call writefile(['%%%'], 'sysfile.sys')
+  split sysfile.sys
+  call assert_equal('rapid', &filetype)
+  bwipe!
+  call delete('sysfile.sys')
+
+  " RAPID supports umlauts in module names, leading spaces,
+  " the .sys extension is not case sensitive.
+  call writefile(['  module ÜmlautModule'], 'sysfile.Sys')
+  split sysfile.Sys
+  call assert_equal('rapid', &filetype)
+  bwipe!
+  call delete('sysfile.Sys')
+
+  " RAPID is not case sensitive, embedded spaces, sysmodule,
+  " file starts with empty line(s).
+  call writefile(['', 'MODULE  rapidmödüle  (SYSMODULE,NOSTEPIN)'], 'sysfile.SYS')
+  split sysfile.SYS
+  call assert_equal('rapid', &filetype)
+  bwipe!
+  call delete('sysfile.SYS')
+
+  filetype off
+endfunc
+
+func Test_tex_file()
+  filetype on
+
+  call writefile(['%& pdflatex'], 'Xfile.tex')
+  split Xfile.tex
+  call assert_equal('tex', &filetype)
+  bwipe
+
+  call writefile(['\newcommand{\test}{some text}'], 'Xfile.tex')
+  split Xfile.tex
+  call assert_equal('tex', &filetype)
+  bwipe
+
+  " tex_flavor is unset
+  call writefile(['%& plain'], 'Xfile.tex')
+  split Xfile.tex
+  call assert_equal('plaintex', &filetype)
+  bwipe
+
+  let g:tex_flavor = 'plain'
+  call writefile(['just some text'], 'Xfile.tex')
+  split Xfile.tex
+  call assert_equal('plaintex', &filetype)
+  bwipe
+
+  let lines =<< trim END
+      % This is a comment.
+
+      \usemodule[translate]
+  END
+  call writefile(lines, 'Xfile.tex')
+  split Xfile.tex
+  call assert_equal('context', &filetype)
+  bwipe
+
+  let g:tex_flavor = 'context'
+  call writefile(['just some text'], 'Xfile.tex')
+  split Xfile.tex
+  call assert_equal('context', &filetype)
+  bwipe
+  unlet g:tex_flavor
+
+  call delete('Xfile.tex')
+  filetype off
+endfunc
+
+func Test_tf_file()
+  filetype on
+
+  call writefile([';;; TF MUD client is super duper cool'], 'Xfile.tf', 'D')
+  split Xfile.tf
+  call assert_equal('tf', &filetype)
+  bwipe!
+
+  call writefile(['provider "azurerm" {'], 'Xfile.tf')
+  split Xfile.tf
+  call assert_equal('terraform', &filetype)
+  bwipe!
+
+  filetype off
+endfunc
+
+func Test_ts_file()
+  filetype on
+
+  call writefile(['<?xml version="1.0" encoding="utf-8"?>'], 'Xfile.ts', 'D')
+  split Xfile.ts
+  call assert_equal('xml', &filetype)
+  bwipe!
+
+  call writefile(['// looks like Typescript'], 'Xfile.ts')
+  split Xfile.ts
+  call assert_equal('typescript', &filetype)
+  bwipe!
+
+  filetype off
+endfunc
+
+func Test_ttl_file()
+  filetype on
+
+  call writefile(['@base <http://example.org/> .'], 'Xfile.ttl', 'D')
+  split Xfile.ttl
+  call assert_equal('turtle', &filetype)
+  bwipe!
+
+  call writefile(['looks like Tera Term Language'], 'Xfile.ttl')
+  split Xfile.ttl
+  call assert_equal('teraterm', &filetype)
+  bwipe!
+
+  filetype off
+endfunc
+
+func Test_v_file()
+  filetype on
+
+  call writefile(['module tb; // Looks like a Verilog'], 'Xfile.v', 'D')
+  split Xfile.v
+  call assert_equal('verilog', &filetype)
+  bwipe!
+
+  call writefile(['module main'], 'Xfile.v')
+  split Xfile.v
+  call assert_equal('v', &filetype)
+  bwipe!
+
+  call writefile(['Definition x := 10.  (*'], 'Xfile.v')
+  split Xfile.v
+  call assert_equal('coq', &filetype)
+  bwipe!
+
+  filetype off
+endfunc
+
+func Test_xpm_file()
+  filetype on
+
+  call writefile(['this is XPM2'], 'file.xpm', 'D')
+  split file.xpm
+  call assert_equal('xpm2', &filetype)
+  bwipe!
+
+  filetype off
+endfunc
+
+func Test_cls_file()
+  filetype on
+
+  call writefile(['looks like Smalltalk'], 'Xfile.cls', 'D')
+  split Xfile.cls
+  call assert_equal('st', &filetype)
+  bwipe!
+
+  " Test dist#ft#FTcls()
+
+  let g:filetype_cls = 'vb'
+  split Xfile.cls
+  call assert_equal('vb', &filetype)
+  bwipe!
+  unlet g:filetype_cls
+
+  " TeX
+
+  call writefile(['%'], 'Xfile.cls')
+  split Xfile.cls
+  call assert_equal('tex', &filetype)
+  bwipe!
+
+  call writefile(['\NeedsTeXFormat{LaTeX2e}'], 'Xfile.cls')
+  split Xfile.cls
+  call assert_equal('tex', &filetype)
+  bwipe!
+
+  " Rexx
+
+  call writefile(['# rexx'], 'Xfile.cls')
+  split Xfile.cls
+  call assert_equal('rexx', &filetype)
+  bwipe!
+
+  " Visual Basic
+
+  call writefile(['VERSION 1.0 CLASS'], 'Xfile.cls')
+  split Xfile.cls
+  call assert_equal('vb', &filetype)
+  bwipe!
+
+  filetype off
+endfunc
+
+func Test_sig_file()
+  filetype on
+
+  call writefile(['this is neither Lambda Prolog nor SML'], 'Xfile.sig', 'D')
+  split Xfile.sig
+  call assert_equal('', &filetype)
+  bwipe!
+
+  " Test dist#ft#FTsig()
+
+  let g:filetype_sig = 'sml'
+  split Xfile.sig
+  call assert_equal('sml', &filetype)
+  bwipe!
+  unlet g:filetype_sig
+
+  " Lambda Prolog
+
+  call writefile(['sig foo.'], 'Xfile.sig')
+  split Xfile.sig
+  call assert_equal('lprolog', &filetype)
+  bwipe!
+
+  call writefile(['/* ... */'], 'Xfile.sig')
+  split Xfile.sig
+  call assert_equal('lprolog', &filetype)
+  bwipe!
+
+  call writefile(['% ...'], 'Xfile.sig')
+  split Xfile.sig
+  call assert_equal('lprolog', &filetype)
+  bwipe!
+
+  " SML signature file
+
+  call writefile(['signature FOO ='], 'Xfile.sig')
+  split Xfile.sig
+  call assert_equal('sml', &filetype)
+  bwipe!
+
+  call writefile(['structure FOO ='], 'Xfile.sig')
+  split Xfile.sig
+  call assert_equal('sml', &filetype)
+  bwipe!
+
+  call writefile(['(* ... *)'], 'Xfile.sig')
+  split Xfile.sig
+  call assert_equal('sml', &filetype)
+  bwipe!
+
+  filetype off
+endfunc
+
+" Test dist#ft#FTsil()
+func Test_sil_file()
+  filetype on
+
+  split Xfile.sil
+  call assert_equal('sil', &filetype)
+  bwipe!
+
+  let lines =<< trim END
+  // valid
+  let protoErasedPathA = \ABCProtocol.a
+
+  // also valid
+  let protoErasedPathA =
+          \ABCProtocol.a
+  END
+  call writefile(lines, 'Xfile.sil', 'D')
+
+  split Xfile.sil
+  call assert_equal('sil', &filetype)
+  bwipe!
+
+  " SILE
+
+  call writefile(['% some comment'], 'Xfile.sil')
+  split Xfile.sil
+  call assert_equal('sile', &filetype)
+  bwipe!
+
+  call writefile(['\begin[papersize=a6]{document}foo\end{document}'], 'Xfile.sil')
+  split Xfile.sil
+  call assert_equal('sile', &filetype)
+  bwipe!
+
+  filetype off
+endfunc
+
+func Test_inc_file()
+  filetype on
+
+  call writefile(['this is the fallback'], 'Xfile.inc', 'D')
+  split Xfile.inc
+  call assert_equal('pov', &filetype)
+  bwipe!
+
+  let g:filetype_inc = 'foo'
+  split Xfile.inc
+  call assert_equal('foo', &filetype)
+  bwipe!
+  unlet g:filetype_inc
+
+  " aspperl
+  call writefile(['perlscript'], 'Xfile.inc')
+  split Xfile.inc
+  call assert_equal('aspperl', &filetype)
+  bwipe!
+
+  " aspvbs
+  call writefile(['<% something'], 'Xfile.inc')
+  split Xfile.inc
+  call assert_equal('aspvbs', &filetype)
+  bwipe!
+
+  " php
+  call writefile(['<?php'], 'Xfile.inc')
+  split Xfile.inc
+  call assert_equal('php', &filetype)
+  bwipe!
+
+  " pascal
+  call writefile(['program'], 'Xfile.inc')
+  split Xfile.inc
+  call assert_equal('pascal', &filetype)
+  bwipe!
+
+  " bitbake
+  call writefile(['require foo'], 'Xfile.inc')
+  split Xfile.inc
+  call assert_equal('bitbake', &filetype)
+  bwipe!
+
+  call writefile(['S = "${WORKDIR}"'], 'Xfile.inc')
+  split Xfile.inc
+  call assert_equal('bitbake', &filetype)
+  bwipe!
+
+  call writefile(['DEPENDS:append = " somedep"'], 'Xfile.inc')
+  split Xfile.inc
+  call assert_equal('bitbake', &filetype)
+  bwipe!
+
+  call writefile(['MACHINE ??= "qemu"'], 'Xfile.inc')
+  split Xfile.inc
+  call assert_equal('bitbake', &filetype)
+  bwipe!
+
+  call writefile(['PROVIDES := "test"'], 'Xfile.inc')
+  split Xfile.inc
+  call assert_equal('bitbake', &filetype)
+  bwipe!
+
+  call writefile(['RDEPENDS_${PN} += "bar"'], 'Xfile.inc')
+  split Xfile.inc
+  call assert_equal('bitbake', &filetype)
+  bwipe!
+
+  " asm
+  call writefile(['asmsyntax=foo'], 'Xfile.inc')
+  split Xfile.inc
+  call assert_equal('foo', &filetype)
+  bwipe!
+
+  filetype off
+endfunc
+
+func Test_lsl_file()
+  filetype on
+
+  call writefile(['looks like Linden Scripting Language'], 'Xfile.lsl', 'D')
+  split Xfile.lsl
+  call assert_equal('lsl', &filetype)
+  bwipe!
+
+  " Test dist#ft#FTlsl()
+
+  let g:filetype_lsl = 'larch'
+  split Xfile.lsl
+  call assert_equal('larch', &filetype)
+  bwipe!
+  unlet g:filetype_lsl
+
+  " Larch Shared Language
+
+  call writefile(['% larch comment'], 'Xfile.lsl')
+  split Xfile.lsl
+  call assert_equal('larch', &filetype)
+  bwipe!
+
+  call writefile(['foo: trait'], 'Xfile.lsl')
+  split Xfile.lsl
+  call assert_equal('larch', &filetype)
+  bwipe!
+
+  filetype off
+endfunc
+
+func Test_typ_file()
+  filetype on
+
+  " SQL type file
+
+  call writefile(['CASE = LOWER'], 'Xfile.typ', 'D')
+  split Xfile.typ
+  call assert_equal('sql', &filetype)
+  bwipe!
+
+  call writefile(['TYPE foo'], 'Xfile.typ')
+  split Xfile.typ
+  call assert_equal('sql', &filetype)
+  bwipe!
+
+  " typst document
+
+  call writefile(['this is a fallback'], 'Xfile.typ')
+  split Xfile.typ
+  call assert_equal('typst', &filetype)
+  bwipe!
+
+  let g:filetype_typ = 'typst'
+  split test.typ
+  call assert_equal('typst', &filetype)
+  bwipe!
+  unlet g:filetype_typ
+
+  filetype off
+endfunc
+
+" vim: shiftwidth=2 sts=2 expandtab