-- Not UFO in the sky, but an ultra fold in Neovim. -- https://github.com/kevinhwang91/nvim-ufo/ -- fold_virt_text_handler -- This handler is called when the fold text is too long to fit in the window. -- It is expected to truncate the text and return a new list of virtual text. -- The handler is called with the following arguments: -- virtText: The current virtual text list. -- lnum: The line number of the first line in the fold. -- endLnum: The line number of the last line in the fold. -- width: The width of the window. -- --@type function --@param virtText --@param lnum --@param endLnum --@param width --@param truncate --@return table 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', lazy = false, enabled = true, version = '*', dependencies = { 'kevinhwang91/promise-async', { 'nvim-treesitter/nvim-treesitter', run = ':TSUpdate' }, { 'luukvbaal/statuscol.nvim', config = function() local builtin = require 'statuscol.builtin' require('statuscol').setup { relculright = true, segments = { { text = { builtin.foldfunc }, click = 'v:lua.ScFa' }, { text = { '%s' }, click = 'v:lua.ScSa' }, { text = { builtin.lnumfunc, ' ' }, click = 'v:lua.ScLa' }, }, } end, }, }, init = function() vim.o.fillchars = [[eob: ,fold: ,foldopen:,foldsep: ,foldclose:]] vim.o.foldcolumn = '1' -- '0' is not bad vim.o.foldlevel = 99 -- Using ufo provider need a large value, feel free to decrease the value vim.o.foldlevelstart = 99 vim.o.foldenable = true end, opts = { open_fold_hl_timeout = 150, close_fold_kinds_for_ft = { 'imports', 'comment' }, preview = { win_config = { border = { '', '─', '', '', '', '─', '', '' }, winhighlight = 'Normal:Folded', winblend = 0, }, mappings = { scrollU = '', scrollD = '', jumpTop = '[', jumpBot = ']', }, }, provider_selector = function(_, _, _) -- bufnr, filetype, buftype return { 'treesitter', 'indent' } end, fold_virt_text_handler = handler, }, }, }