-- Not UFO in the sky, but an ultra fold in Neovim. -- https://github.com/kevinhwang91/nvim-ufo return { "kevinhwang91/nvim-ufo", dependencies = "kevinhwang91/promise-async", config = function() vim.o.fillchars = [[eob: ,fold: ,foldopen:,foldsep: ,foldclose:]] vim.o.foldcolumn = "0" vim.o.foldlevel = 99 vim.o.foldlevelstart = 100 vim.o.foldenable = true 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) 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 require("ufo").setup({ fold_virt_text_handler = handler, close_fold_kinds_for_ft = { default = { "imports", "comment" }, }, open_fold_hl_timeout = 300, enable_get_fold_virt_text = false, preview = {}, provider_selector = function() return { "lsp", "indent" } end, }) end, keys = { { "zR", function() require("ufo").openAllFolds() end, desc = "Open all folds", }, { "zM", 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", }, }, }