-- Phase 6.7: nvim-ufo for better folding with Treesitter and LSP support return { 'kevinhwang91/nvim-ufo', dependencies = { 'kevinhwang91/promise-async', }, event = { 'BufReadPost', 'BufNewFile' }, keys = { { 'zR', function() require('ufo').openAllFolds() end, desc = 'UFO: Open all folds' }, { 'zM', function() require('ufo').closeAllFolds() end, desc = 'UFO: Close all folds' }, { 'zr', function() require('ufo').openFoldsExceptKinds() end, desc = 'UFO: Open folds except kinds' }, { 'zm', function() require('ufo').closeFoldsWith() end, desc = 'UFO: Close folds with' }, { 'K', function() local winid = require('ufo').peekFoldedLinesUnderCursor() if not winid then -- Fall back to LSP hover if not on a fold vim.lsp.buf.hover() end end, desc = 'UFO: Peek fold or LSP hover' }, }, opts = { provider_selector = function(bufnr, filetype, buftype) -- Use Treesitter for supported languages, LSP for others, indent as fallback return { 'treesitter', 'indent' } end, -- Open folds when searching open_fold_hl_timeout = 150, close_fold_kinds_for_ft = { default = { 'imports', 'comment' }, }, preview = { win_config = { border = { '', '─', '', '', '', '─', '', '' }, winhighlight = 'Normal:Folded', winblend = 0, }, mappings = { scrollU = '', scrollD = '', jumpTop = '[', jumpBot = ']', }, }, -- Custom fold text showing line count fold_virt_text_handler = function(virtText, lnum, endLnum, width, truncate) local newVirtText = {} local suffix = (' %d lines '):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, }, config = function(_, opts) -- Set fold settings for nvim-ufo vim.o.foldcolumn = '0' -- Hide fold column (we don't need it) vim.o.foldlevel = 99 -- Open all folds by default vim.o.foldlevelstart = 99 -- Open all folds when opening a file vim.o.foldenable = true -- Enable folding -- Use simple characters for fold indicators (though foldcolumn is hidden) vim.o.fillchars = [[eob: ,fold: ,foldopen:▼,foldsep: ,foldclose:▶]] require('ufo').setup(opts) end, }