nix-conf/home/config/nvim/lua/plugins/nvim-ufo.lua
2024-12-13 22:30:05 +08:00

92 lines
2.5 KiB
Lua
Executable file

local handler = function(virtText, lnum, endLnum, width, truncate)
local newVirtText = {}
local suffix = (" 󰁂 %d "):format(endLnum - lnum)
local sufWidth = vim.fn.strdisplaywidth(suffix)
local targetWidth = width - sufWidth
local curWidth = 0
for _, chunk in ipairs(virtText) do
local chunkText = chunk[1]
local chunkWidth = vim.fn.strdisplaywidth(chunkText)
if targetWidth > curWidth + chunkWidth then
table.insert(newVirtText, chunk)
else
chunkText = truncate(chunkText, targetWidth - curWidth)
local hlGroup = chunk[2]
table.insert(newVirtText, { chunkText, hlGroup })
chunkWidth = vim.fn.strdisplaywidth(chunkText)
-- str width returned from truncate() may less than 2nd argument, need padding
if curWidth + chunkWidth < targetWidth then
suffix = suffix .. (" "):rep(targetWidth - curWidth - chunkWidth)
end
break
end
curWidth = curWidth + chunkWidth
end
table.insert(newVirtText, { suffix, "MoreMsg" })
return newVirtText
end
return {
{
"kevinhwang91/nvim-ufo",
dependencies = { "kevinhwang91/promise-async" },
opts = {
provider_selector = function()
return { "lsp", "indent" }
end,
fold_virt_text_handler = handler,
filetype_exclude = { "help", "alpha", "dashboard", "neo-tree", "Trouble", "lazy", "mason" },
},
config = function(_, opts)
vim.api.nvim_create_autocmd("FileType", {
group = vim.api.nvim_create_augroup("local_detach_ufo", { clear = true }),
pattern = opts.filetype_exclude,
callback = function()
require("ufo").detach()
end,
})
vim.o.foldcolumn = "1"
vim.o.foldlevel = 99
vim.o.foldlevelstart = 99
vim.o.foldenable = true
require("ufo").setup(opts)
end,
keys = {
{
"zR",
mode = { "n" },
function()
require("ufo").openAllFolds()
end,
{ desc = "Open all folds" },
},
{
"zM",
mode = { "n" },
function()
require("ufo").closeAllFolds()
end,
{ desc = "Close all folds" },
},
{
"zK",
function()
local winid = require("ufo").peekFoldedLinesUnderCursor()
if not winid then
vim.lsp.buf.hover()
end
end,
{ desc = "Peek Fold" },
},
{
"zr",
mode = { "n" },
function()
require("ufo").openFoldsExceptKinds()
end,
{ desc = "Open fold" },
},
},
},
}