refactor(runtime): port remaining patterns from filetype.vim to filetype.lua (#18814)

This commit is contained in:
Jonas Strittmatter 2022-06-06 17:25:33 +02:00 committed by GitHub
parent cf2738109a
commit 41a49dd9c8
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 360 additions and 72 deletions

View File

@ -3,21 +3,22 @@ local api = vim.api
local M = {}
---@private
local function starsetf(ft)
local function starsetf(ft, opts)
return {
function(path)
function(path, bufnr)
local f = type(ft) == 'function' and ft(path, bufnr) or ft
if not vim.g.ft_ignore_pat then
return ft
return f
end
local re = vim.regex(vim.g.ft_ignore_pat)
if re:match_str(path) then
return ft
if not re:match_str(path) then
return f
end
end,
{
-- Starset matches should always have lowest priority
priority = -math.huge,
priority = (opts and opts.priority) or -math.huge,
},
}
end
@ -29,8 +30,73 @@ local function getline(bufnr, start_lnum, end_lnum)
return table.concat(lines) or ''
end
-- Filetypes based on file extension
---@private
--- Get a single line or line-range from the buffer.
---
---@param bufnr number|nil The buffer to get the lines from
---@param start_lnum number The line number of the first line (inclusive, 1-based)
---@param end_lnum number|nil The line number of the last line (inclusive, 1-based)
---@return table<string>|string Array of lines, or string when end_lnum is omitted
function M.getlines(bufnr, start_lnum, end_lnum)
if not end_lnum then
-- Return a single line as a string
return vim.api.nvim_buf_get_lines(bufnr, start_lnum - 1, start_lnum, false)[1]
end
return vim.api.nvim_buf_get_lines(bufnr, start_lnum - 1, end_lnum, false)
end
---@private
--- Check whether a string matches any of the given Lua patterns.
---
---@param s string The string to check
---@param patterns table<string> A list of Lua patterns
---@return boolean `true` if s matched a pattern, else `false`
function M.findany(s, patterns)
if s == nil then
return false
end
for _, v in ipairs(patterns) do
if s:find(v) then
return true
end
end
return false
end
---@private
--- Get the next non-whitespace line in the buffer.
---
---@param bufnr number The buffer to get the line from
---@param start_lnum number The line number of the first line to start from (inclusive, 1-based)
---@return string|nil The first non-blank line if found or `nil` otherwise
function M.nextnonblank(bufnr, start_lnum)
for _, line in ipairs(M.getlines(bufnr, start_lnum, -1)) do
if not line:find('^%s*$') then
return line
end
end
return nil
end
---@private
--- Check whether the given string matches the Vim regex pattern.
M.matchregex = (function()
local cache = {}
return function(s, pattern)
if s == nil then
return nil
end
if not cache[pattern] then
cache[pattern] = vim.regex(pattern)
end
return cache[pattern]:match_str(s)
end
end)()
-- luacheck: push no unused args
-- luacheck: push ignore 122
-- Filetypes based on file extension
---@diagnostic disable: unused-local
local extension = {
-- BEGIN EXTENSION
@ -178,6 +244,7 @@ local extension = {
diff = 'diff',
rej = 'diff',
Dockerfile = 'dockerfile',
dockerfile = 'dockerfile',
bat = 'dosbatch',
wrap = 'dosini',
ini = 'dosini',
@ -1032,7 +1099,7 @@ local extension = {
end,
txt = function(path, bufnr)
--helpfiles match *.txt, but should have a modeline as last line
if not getline(bufnr, -1):match('vim:.*ft=help') then
if not getline(bufnr, -1):find('vim:.*ft=help') then
return 'text'
end
end,
@ -1175,6 +1242,67 @@ local extension = {
return 'rc'
end
end,
control = function(path, bufnr)
return require('vim.filetype.detect').control(bufnr)
end,
copyright = function(path, bufnr)
return require('vim.filetype.detect').copyright(bufnr)
end,
-- Ignored extensions
bak = function(path, bufnr)
local root = vim.fn.fnamemodify(path, ':r')
return M.match(root, bufnr)
end,
['dpkg-dist'] = function(path, bufnr)
local root = vim.fn.fnamemodify(path, ':r')
return M.match(root, bufnr)
end,
['dpkg-old'] = function(path, bufnr)
local root = vim.fn.fnamemodify(path, ':r')
return M.match(root, bufnr)
end,
['dpkg-new'] = function(path, bufnr)
local root = vim.fn.fnamemodify(path, ':r')
return M.match(root, bufnr)
end,
['dpkg-bak'] = function(path, bufnr)
local root = vim.fn.fnamemodify(path, ':r')
return M.match(root, bufnr)
end,
new = function(path, bufnr)
local root = vim.fn.fnamemodify(path, ':r')
return M.match(root, bufnr)
end,
old = function(path, bufnr)
local root = vim.fn.fnamemodify(path, ':r')
return M.match(root, bufnr)
end,
orig = function(path, bufnr)
local root = vim.fn.fnamemodify(path, ':r')
return M.match(root, bufnr)
end,
pacsave = function(path, bufnr)
local root = vim.fn.fnamemodify(path, ':r')
return M.match(root, bufnr)
end,
pacnew = function(path, bufnr)
local root = vim.fn.fnamemodify(path, ':r')
return M.match(root, bufnr)
end,
rpmsave = function(path, bufnr)
local root = vim.fn.fnamemodify(path, ':r')
return M.match(root, bufnr)
end,
rmpnew = function(path, bufnr)
local root = vim.fn.fnamemodify(path, ':r')
return M.match(root, bufnr)
end,
['in'] = function(path, bufnr)
if vim.fs.basename(path) ~= 'configure.in' then
local root = vim.fn.fnamemodify(path, ':r')
return M.match(root, bufnr)
end
end,
-- END EXTENSION
}
@ -1196,8 +1324,9 @@ local filename = {
['named.root'] = 'bindzone',
WORKSPACE = 'bzl',
BUILD = 'bzl',
['cabal.config'] = 'cabalconfig',
['cabal.project'] = 'cabalproject',
[vim.env.HOME .. '/cabal.config'] = 'cabalconfig',
['cabal.config'] = 'cabalconfig',
calendar = 'calendar',
catalog = 'catalog',
['/etc/cdrdao.conf'] = 'cdrdaoconf',
@ -1355,6 +1484,9 @@ local filename = {
['/etc/nanorc'] = 'nanorc',
Neomuttrc = 'neomuttrc',
['.netrc'] = 'netrc',
NEWS = function(path, bufnr)
return require('vim.filetype.detect').news(bufnr)
end,
['.ocamlinit'] = 'ocaml',
['.octaverc'] = 'octave',
octaverc = 'octave',
@ -1380,15 +1512,28 @@ local filename = {
['/etc/pinforc'] = 'pinfo',
['/.pinforc'] = 'pinfo',
['.povrayrc'] = 'povini',
['printcap'] = function(path, bufnr)
vim.b[bufnr].ptcap_type = 'print'
return 'ptcap'
end,
['termcap'] = function(path, bufnr)
vim.b[bufnr].ptcap_type = 'term'
return 'ptcap'
end,
['.procmailrc'] = 'procmail',
['.procmail'] = 'procmail',
['/etc/protocols'] = 'protocols',
['INDEX'] = function(path, bufnr)
return require('vim.filetype.detect').psf(bufnr)
end,
['INFO'] = function(path, bufnr)
return require('vim.filetype.detect').psf(bufnr)
end,
['.pythonstartup'] = 'python',
['.pythonrc'] = 'python',
SConstruct = 'python',
ratpoisonrc = 'ratpoison',
['.ratpoisonrc'] = 'ratpoison',
v = 'rcs',
inputrc = 'readline',
['.inputrc'] = 'readline',
['.reminders'] = 'remind',
@ -1458,6 +1603,14 @@ local filename = {
['.Xpdefaults'] = 'xdefaults',
['xdm-config'] = 'xdefaults',
['.Xdefaults'] = 'xdefaults',
['xorg.conf'] = function(path, bufnr)
vim.b[bufnr].xf86conf_xfree86_version = 4
return 'xf86conf'
end,
['xorg.conf-4'] = function(path, bufnr)
vim.b[bufnr].xf86conf_xfree86_version = 4
return 'xf86conf'
end,
['/etc/xinetd.conf'] = 'xinetd',
fglrxrc = 'xml',
['/etc/blkid.tab'] = 'xml',
@ -1528,6 +1681,9 @@ local filename = {
['tcsh.tcshrc'] = function(path, bufnr)
return require('vim.filetype.detect').shell(path, bufnr, 'tcsh')
end,
['XF86Config'] = function(path, bufnr)
return require('vim.filetype.detect').xf86conf(bufnr)
end,
-- END FILENAME
}
@ -1544,12 +1700,22 @@ local pattern = {
['.*bsd'] = 'bsdl',
['bzr_log%..*'] = 'bzr',
['.*enlightenment/.*%.cfg'] = 'c',
['.*/%.calendar/.*'] = starsetf('calendar'),
['.*/share/calendar/.*/calendar%..*'] = starsetf('calendar'),
['.*/share/calendar/calendar%..*'] = starsetf('calendar'),
['.*/etc/defaults/cdrdao'] = 'cdrdaoconf',
['.*/etc/cdrdao%.conf'] = 'cdrdaoconf',
['.*/etc/default/cdrdao'] = 'cdrdaoconf',
['.*hgrc'] = 'cfg',
['.*%.%.ch'] = 'chill',
['.*%.cmake%.in'] = 'cmake',
-- */cmus/rc and */.cmus/rc
['.*/%.?cmus/rc'] = 'cmusrc',
-- */cmus/*.theme and */.cmus/*.theme
['.*/%.?cmus/.*%.theme'] = 'cmusrc',
['.*/%.cmus/autosave'] = 'cmusrc',
['.*/%.cmus/command%-history'] = 'cmusrc',
['cvs%d+'] = 'cvs',
['.*/debian/changelog'] = 'debchangelog',
['.*/debian/control'] = 'debcontrol',
['.*/debian/copyright'] = 'debcopyright',
@ -1572,11 +1738,26 @@ local pattern = {
['.*/%.config/git/config'] = 'gitconfig',
['.*%.git/config%.worktree'] = 'gitconfig',
['.*%.git/worktrees/.*/config%.worktree'] = 'gitconfig',
['.*/git/config'] = function(path, bufnr)
if vim.env.XDG_CONFIG_HOME and path:find(vim.env.XDG_CONFIG_HOME .. '/git/config') then
return 'gitconfig'
end
end,
['%.gitsendemail%.msg%.......'] = 'gitsendemail',
['gkrellmrc_.'] = 'gkrellmrc',
['.*/usr/.*/gnupg/options%.skel'] = 'gpg',
['.*/%.gnupg/options'] = 'gpg',
['.*/%.gnupg/gpg%.conf'] = 'gpg',
['.*/options'] = function(path, bufnr)
if vim.env.GNUPGHOME and path:find(vim.env.GNUPGHOME .. '/options') then
return 'gpg'
end
end,
['.*/gpg%.conf'] = function(path, bufnr)
if vim.env.GNUPGHOME and path:find(vim.env.GNUPGHOME .. '/gpg%.conf') then
return 'gpg'
end
end,
['.*/etc/group'] = 'group',
['.*/etc/gshadow'] = 'group',
['.*/etc/group%.edit'] = 'group',
@ -1647,6 +1828,12 @@ local pattern = {
['.*/%.pinforc'] = 'pinfo',
['.*/etc/pinforc'] = 'pinfo',
['.*/etc/protocols'] = 'protocols',
['.*printcap.*'] = starsetf(function(path, bufnr)
if vim.fn.did_filetype() == 0 then
vim.b[bufnr].ptcap_type = 'print'
return 'ptcap'
end
end),
['.*baseq[2-3]/.*%.cfg'] = 'quake',
['.*quake[1-3]/.*%.cfg'] = 'quake',
['.*id1/.*%.cfg'] = 'quake',
@ -1671,9 +1858,33 @@ local pattern = {
['.*%.swift%.gyb'] = 'swiftgyb',
['.*/etc/sysctl%.conf'] = 'sysctl',
['.*/etc/sysctl%.d/.*%.conf'] = 'sysctl',
['.*/systemd/.*%.automount'] = 'systemd',
['.*/systemd/.*%.dnssd'] = 'systemd',
['.*/systemd/.*%.link'] = 'systemd',
['.*/systemd/.*%.mount'] = 'systemd',
['.*/systemd/.*%.netdev'] = 'systemd',
['.*/systemd/.*%.network'] = 'systemd',
['.*/systemd/.*%.nspawn'] = 'systemd',
['.*/systemd/.*%.path'] = 'systemd',
['.*/systemd/.*%.service'] = 'systemd',
['.*/systemd/.*%.slice'] = 'systemd',
['.*/systemd/.*%.socket'] = 'systemd',
['.*/systemd/.*%.swap'] = 'systemd',
['.*/systemd/.*%.target'] = 'systemd',
['.*/systemd/.*%.timer'] = 'systemd',
['.*/etc/systemd/.*%.conf%.d/.*%.conf'] = 'systemd',
['.*/%.config/systemd/user/.*%.d/.*%.conf'] = 'systemd',
['.*/etc/systemd/system/.*%.d/.*%.conf'] = 'systemd',
['.*/etc/systemd/system/.*%.d/%.#.*'] = 'systemd',
['.*/etc/systemd/system/%.#.*'] = 'systemd',
['.*/%.config/systemd/user/.*%.d/%.#.*'] = 'systemd',
['.*/%.config/systemd/user/%.#.*'] = 'systemd',
['.*termcap.*'] = starsetf(function(path, bufnr)
if vim.fn.did_filetype() == 0 then
vim.b[bufnr].ptcap_type = 'term'
return 'ptcap'
end
end),
['.*%.t%.html'] = 'tilde',
['%.?tmux.*%.conf'] = 'tmux',
['%.?tmux.*%.conf.*'] = { 'tmux', { priority = -1 } },
@ -1719,7 +1930,19 @@ local pattern = {
['%.login.*'] = function(path, bufnr)
return require('vim.filetype.detect').csh(path, bufnr)
end,
['%.neomuttrc.*'] = starsetf('neomuttrc'),
['Muttrc.*'] = starsetf('muttrc'),
['Muttngrc.*'] = starsetf('muttrc'),
-- muttrc* and .muttrc*
['%.?muttrc.*'] = starsetf('muttrc'),
-- muttngrc* and .muttngrc*
['%.?muttngrc.*'] = starsetf('muttrc'),
['.*/%.mutt/muttrc.*'] = starsetf('muttrc'),
['.*/%.muttng/muttrc.*'] = starsetf('muttrc'),
['.*/%.muttng/muttngrc.*'] = starsetf('muttrc'),
['Neomuttrc.*'] = starsetf('neomuttrc'),
-- neomuttrc* and .neomuttrc*
['%.?neomuttrc.*'] = starsetf('neomuttrc'),
['.*/%.neomutt/neomuttrc.*'] = starsetf('neomuttrc'),
['%.profile.*'] = function(path, bufnr)
return require('vim.filetype.detect').sh(path, bufnr, getline(bufnr, 1))
end,
@ -1742,8 +1965,15 @@ local pattern = {
['.*%.properties_.._.._.*'] = starsetf('jproperties'),
['.*%.vhdl_[0-9].*'] = starsetf('vhdl'),
['.*/%.fvwm/.*'] = starsetf('fvwm'),
['.*fvwmrc.*'] = starsetf(function(path, bufnr)
vim.b[bufnr].fvwm_version = 1
return 'fvwm'
end),
['.*fvwm95.*%.hook'] = starsetf(function(path, bufnr)
vim.b[bufnr].fvwm_version = 1
return 'fvwm'
end),
['.*/%.gitconfig%.d/.*'] = starsetf('gitconfig'),
['.*/%.neomutt/neomuttrc.*'] = starsetf('neomuttrc'),
['.*/Xresources/.*'] = starsetf('xdefaults'),
['.*/app%-defaults/.*'] = starsetf('xdefaults'),
['.*/bind/db%..*'] = starsetf('bindzone'),
@ -1763,6 +1993,11 @@ local pattern = {
['.*/etc/httpd/sites%-.*/.*'] = starsetf('apache'),
['.*/etc/logcheck/.*%.d.*/.*'] = starsetf('logcheck'),
['.*/etc/modprobe%..*'] = starsetf('modconf'),
['.*/etc/modutils/.*'] = starsetf(function(path, bufnr)
if vim.fn.executable(vim.fn.expand(path)) ~= 1 then
return 'modconf'
end
end),
['.*/etc/pam%.d/.*'] = starsetf('pamconf'),
['.*/etc/profile'] = function(path, bufnr)
return require('vim.filetype.detect').sh(path, bufnr, getline(bufnr, 1))
@ -1785,7 +2020,6 @@ local pattern = {
['Dockerfile%..*'] = starsetf('dockerfile'),
['JAM.*%..*'] = starsetf('jam'),
['Kconfig%..*'] = starsetf('kconfig'),
['Neomuttrc.*'] = starsetf('neomuttrc'),
['Prl.*%..*'] = starsetf('jam'),
['Xresources.*'] = starsetf('xdefaults'),
['[mM]akefile.*'] = starsetf('make'),
@ -1802,7 +2036,8 @@ local pattern = {
['gtkrc.*'] = starsetf('gtkrc'),
['httpd%.conf.*'] = starsetf('apache'),
['lilo%.conf.*'] = starsetf('lilo'),
['neomuttrc.*'] = starsetf('neomuttrc'),
['Muttrc'] = 'muttrc',
['Muttngrc'] = 'muttrc',
['proftpd%.conf.*'] = starsetf('apachestyle'),
['reportbug%-.*'] = starsetf('mail'),
['sgml%.catalog.*'] = starsetf('catalog'),
@ -1816,8 +2051,8 @@ local pattern = {
['%.article%.%d+'] = 'mail',
['pico%.%d+'] = 'mail',
['mutt%-.*%-%w+'] = 'mail',
['neomutt%-.*%-%w+'] = 'mail',
['muttng%-.*%-%w+'] = 'mail',
['neomutt%-.*%-%w+'] = 'mail',
['mutt' .. string.rep('[%w_-]', 6)] = 'mail',
['neomutt' .. string.rep('[%w_-]', 6)] = 'mail',
['/tmp/SLRN[0-9A-Z.]+'] = 'mail',
@ -1861,7 +2096,7 @@ local pattern = {
{ priority = -1 },
},
['.*%.[Dd][Aa][Tt]'] = function(path, bufnr)
return require('vim.filetype.detect').dat(bufnr)
return require('vim.filetype.detect').dat(path, bufnr)
end,
['.*%.[Mm][Oo][Dd]'] = function(path, bufnr)
return require('vim.filetype.detect').mod(path, bufnr)
@ -1880,9 +2115,61 @@ local pattern = {
['example%.gitolite%.rc'] = 'perl',
-- Neovim only
['.*/queries/.*%.scm'] = 'query', -- tree-sitter queries
['.*,v'] = 'rcs',
['.*/xorg%.conf%.d/.*%.conf'] = function(path, bufnr)
vim.b[bufnr].xf86conf_xfree86_version = 4
return 'xf86config'
end,
-- Increase priority to run before the pattern below
['XF86Config%-4'] = starsetf(function(path, bufnr)
vim.b[bufnr].xf86conf_xfree86_version = 4
return 'xf86config'
end, { priority = -math.huge + 1 }),
['XF86Config.*'] = starsetf(function(path, bufnr)
vim.b[bufnr].xf86conf_xfree86_version = 4
return require('vim.filetype.detect').xf86conf(bufnr)
end),
['[cC]hange[lL]og.*'] = starsetf(function(path, bufnr)
local line = getline(bufnr, 1):lower()
if line:find('; urgency=') then
return 'debchangelog'
else
return 'changelog'
end
end),
['.*fvwm2rc.*'] = starsetf(function(path, bufnr)
if vim.fn.fnamemodify(path, ':e') == 'm4' then
return 'fvwm2m4'
else
vim.b[bufnr].fvwm_version = 2
return 'fvwm'
end
end),
['.*%.[Ll][Oo][Gg]'] = function(path, bufnr)
-- Innovation Data Processing
-- (refactor of filetype.vim since the patterns are case-insensitive)
path = path:lower()
if M.findany(path, { 'upstream%.log', 'upstream%..*%.log', '.*%.upstream%.log', 'upstream%-.*%.log' }) then
return 'upstreamlog'
elseif M.findany(path, { 'upstreaminstall%.log', 'upstreaminstall%..*%.log', '.*%.upstreaminstall%.log' }) then
return 'upstreaminstalllog'
elseif M.findany(path, { 'usserver%.log', 'usserver%..*%.log', '.*%.usserver%.log' }) then
return 'usserverlog'
elseif M.findany(path, { 'usw2kagt%.log', 'usws2kagt%..*%.log', '.*%.usws2kagt%.log' }) then
return 'usw2kagtlog'
end
end,
-- Ignored extension
['.*~'] = function(path, bufnr)
local short = path:gsub('~$', '', 1)
if path ~= short and short ~= '' then
return M.match(vim.fn.fnameescape(short), bufnr)
end
end,
-- END PATTERN
}
-- luacheck: pop
-- luacheck: pop
---@private
local function sort_by_priority(t)

View File

@ -16,56 +16,10 @@
local M = {}
---@private
local function getlines(bufnr, start_lnum, end_lnum)
if not end_lnum then
-- Return a single line as a string
return vim.api.nvim_buf_get_lines(bufnr, start_lnum - 1, start_lnum, false)[1]
end
return vim.api.nvim_buf_get_lines(bufnr, start_lnum - 1, end_lnum, false)
end
---@private
local function findany(s, patterns)
if s == nil then
return false
end
for _, v in ipairs(patterns) do
if s:find(v) then
return true
end
end
return false
end
---@private
local function nextnonblank(bufnr, start_lnum)
for _, line in ipairs(getlines(bufnr, start_lnum, -1)) do
if not line:find('^%s*$') then
return line
end
end
return nil
end
---@private
local matchregex = (function()
local cache = {}
return function(line, pattern)
if line == nil then
return nil
end
if not cache[pattern] then
cache[pattern] = vim.regex(pattern)
end
return cache[pattern]:match_str(line)
end
end)()
---@private
local did_filetype = function()
return vim.fn.did_filetype() ~= 0
end
local getlines = vim.filetype.getlines
local findany = vim.filetype.findany
local nextnonblank = vim.filetype.nextnonblank
local matchregex = vim.filetype.matchregex
-- luacheck: push no unused args
-- luacheck: push ignore 122
@ -200,7 +154,7 @@ function M.change(bufnr)
end
function M.csh(path, bufnr)
if did_filetype() then
if vim.fn.did_filetype() ~= 0 then
-- Filetype was already detected
return
end
@ -213,11 +167,15 @@ function M.csh(path, bufnr)
end
end
-- Determine if a *.dat file is Kuka Robot Language
function M.dat(bufnr)
function M.dat(path, bufnr)
-- Innovation data processing
if findany(path:lower(), { '^upstream%.dat$', '^upstream%..*%.dat$', '^.*%.upstream%.dat$' }) then
return 'upstreamdat'
end
if vim.g.filetype_dat then
return vim.g.filetype_dat
end
-- Determine if a *.dat file is Kuka Robot Language
local line = nextnonblank(bufnr, 1)
if matchregex(line, [[\c\v^\s*%(\&\w+|defdat>)]]) then
return 'krl'
@ -257,7 +215,7 @@ function M.dep3patch(path, bufnr)
end
function M.dtrace(bufnr)
if did_filetype() then
if vim.fn.did_filetype() ~= 0 then
-- Filetype was already detected
return
end
@ -815,7 +773,7 @@ end
-- Also called from filetype.lua
function M.sh(path, bufnr, name)
if did_filetype() or path:find(vim.g.ft_ignore_pat) then
if vim.fn.did_filetype() ~= 0 or path:find(vim.g.ft_ignore_pat) then
-- Filetype was already detected or detection should be skipped
return
end
@ -848,7 +806,7 @@ end
-- For shell-like file types, check for an "exec" command hidden in a comment, as used for Tcl.
-- Also called from scripts.vim, thus can't be local to this script. [TODO]
function M.shell(path, bufnr, name)
if did_filetype() or matchregex(path, vim.g.ft_ignore_pat) then
if vim.fn.did_filetype() ~= 0 or matchregex(path, vim.g.ft_ignore_pat) then
-- Filetype was already detected or detection should be skipped
return
end
@ -1054,6 +1012,49 @@ function M.hw(bufnr)
end
return 'virata'
end
function M.news(bufnr)
if getlines(bufnr, 1):lower():find('; urgency=') then
return 'debchangelog'
end
end
-- Debian Control
function M.control(bufnr)
if getlines(bufnr, 1):find('^Source:') then
return 'debcontrol'
end
end
-- Debian Copyright
function M.copyright(bufnr)
if getlines(bufnr, 1):find('^Format:') then
return 'debcopyright'
end
end
-- Software Distributor Product Specification File (POSIX 1387.2-1995)
function M.psf(bufnr)
local line = getlines(bufnr, 1):lower()
if
findany(
line,
{ '^%s*distribution%s*$', '^%s*installed_software%s*$', '^%s*root%s*$', '^%s*bundle%s*$', '^%s*product%s*$' }
)
then
return 'psf'
end
end
-- XFree86 config
function M.xfree86(bufnr)
local line = getlines(bufnr, 1)
if matchregex(line, [[\<XConfigurator\>]]) then
vim.b[bufnr].xf86conf_xfree86_version = 3
return 'xf86conf'
end
end
-- luacheck: pop
-- luacheck: pop