snacks.nvim/lua/snacks/bigfile.lua

81 lines
2.2 KiB
Lua

---@private
---@class snacks.bigfile
local M = {}
M.meta = {
desc = "Deal with big files",
needs_setup = true,
}
---@class snacks.bigfile.Config
---@field enabled? boolean
local defaults = {
notify = true, -- show notification when big file detected
size = 1.5 * 1024 * 1024, -- 1.5MB
line_length = 1000, -- average line length (useful for minified files)
-- Enable or disable features when big file detected
---@param ctx {buf: number, ft:string}
setup = function(ctx)
if vim.fn.exists(":NoMatchParen") ~= 0 then
vim.cmd([[NoMatchParen]])
end
Snacks.util.wo(0, { foldmethod = "manual", statuscolumn = "", conceallevel = 0 })
vim.b.minianimate_disable = true
vim.schedule(function()
if vim.api.nvim_buf_is_valid(ctx.buf) then
vim.bo[ctx.buf].syntax = ctx.ft
end
end)
end,
}
---@private
function M.setup()
local opts = Snacks.config.get("bigfile", defaults)
vim.filetype.add({
pattern = {
[".*"] = {
function(path, buf)
if not path or not buf or vim.bo[buf].filetype == "bigfile" then
return
end
if path ~= vim.api.nvim_buf_get_name(buf) then
return
end
local size = vim.fn.getfsize(path)
if size <= 0 then
return
end
if size > opts.size then
return "bigfile"
end
local lines = vim.api.nvim_buf_line_count(buf)
return (size - lines) / lines > opts.line_length and "bigfile" or nil
end,
},
},
})
vim.api.nvim_create_autocmd({ "FileType" }, {
group = vim.api.nvim_create_augroup("snacks_bigfile", { clear = true }),
pattern = "bigfile",
callback = function(ev)
if opts.notify then
local path = vim.fn.fnamemodify(vim.api.nvim_buf_get_name(ev.buf), ":p:~:.")
Snacks.notify.warn({
("Big file detected `%s`."):format(path),
"Some Neovim features have been **disabled**.",
}, { title = "Big File" })
end
vim.api.nvim_buf_call(ev.buf, function()
opts.setup({
buf = ev.buf,
ft = vim.filetype.match({ buf = ev.buf }) or "",
})
end)
end,
})
end
return M