chore(nvim): add shortcut for folds

This commit is contained in:
Stefan Imhoff
2024-09-06 12:34:50 +02:00
parent b862f110e4
commit b0eee1430f

View File

@@ -1,79 +1,79 @@
-- Not UFO in the sky, but an ultra fold in Neovim. -- Not UFO in the sky, but an ultra fold in Neovim.
-- https://github.com/kevinhwang91/nvim-ufo -- https://github.com/kevinhwang91/nvim-ufo
return { return {
"kevinhwang91/nvim-ufo", "kevinhwang91/nvim-ufo",
dependencies = "kevinhwang91/promise-async", dependencies = "kevinhwang91/promise-async",
config = function() config = function()
vim.o.fillchars = [[eob: ,fold: ,foldopen:,foldsep: ,foldclose:]] vim.o.fillchars = [[eob: ,fold: ,foldopen:,foldsep: ,foldclose:]]
vim.o.foldcolumn = "0" vim.o.foldcolumn = "0"
vim.o.foldlevel = 99 vim.o.foldlevel = 99
vim.o.foldlevelstart = 100 vim.o.foldlevelstart = 100
vim.o.foldenable = true vim.o.foldenable = true
local handler = function(virtText, lnum, endLnum, width, truncate) local handler = function(virtText, lnum, endLnum, width, truncate)
local newVirtText = {} local newVirtText = {}
local suffix = (" 󰁂 %d "):format(endLnum - lnum) local suffix = (" 󰁂 %d "):format(endLnum - lnum)
local sufWidth = vim.fn.strdisplaywidth(suffix) local sufWidth = vim.fn.strdisplaywidth(suffix)
local targetWidth = width - sufWidth local targetWidth = width - sufWidth
local curWidth = 0 local curWidth = 0
for _, chunk in ipairs(virtText) do for _, chunk in ipairs(virtText) do
local chunkText = chunk[1] local chunkText = chunk[1]
local chunkWidth = vim.fn.strdisplaywidth(chunkText) local chunkWidth = vim.fn.strdisplaywidth(chunkText)
if targetWidth > curWidth + chunkWidth then if targetWidth > curWidth + chunkWidth then
table.insert(newVirtText, chunk) table.insert(newVirtText, chunk)
else else
chunkText = truncate(chunkText, targetWidth - curWidth) chunkText = truncate(chunkText, targetWidth - curWidth)
local hlGroup = chunk[2] local hlGroup = chunk[2]
table.insert(newVirtText, { chunkText, hlGroup }) table.insert(newVirtText, { chunkText, hlGroup })
chunkWidth = vim.fn.strdisplaywidth(chunkText) chunkWidth = vim.fn.strdisplaywidth(chunkText)
if curWidth + chunkWidth < targetWidth then if curWidth + chunkWidth < targetWidth then
suffix = suffix .. (" "):rep(targetWidth - curWidth - chunkWidth) suffix = suffix .. (" "):rep(targetWidth - curWidth - chunkWidth)
end end
break break
end end
curWidth = curWidth + chunkWidth curWidth = curWidth + chunkWidth
end end
table.insert(newVirtText, { suffix, "MoreMsg" }) table.insert(newVirtText, { suffix, "MoreMsg" })
return newVirtText return newVirtText
end end
require("ufo").setup({ require("ufo").setup({
fold_virt_text_handler = handler, fold_virt_text_handler = handler,
close_fold_kinds_for_ft = { close_fold_kinds_for_ft = {
default = { "imports", "comment" }, default = { "imports", "comment" },
}, },
open_fold_hl_timeout = 300, open_fold_hl_timeout = 300,
enable_get_fold_virt_text = false, enable_get_fold_virt_text = false,
preview = {}, preview = {},
provider_selector = function() provider_selector = function()
return { "lsp", "indent" } return { "lsp", "indent" }
end, end,
}) })
end, end,
keys = { keys = {
{ {
"zR", "zR",
function() function()
require("ufo").openAllFolds() require("ufo").openAllFolds()
end, end,
desc = "Open all folds", desc = "Open all folds",
}, },
{ {
"zM", "zM",
function() function()
require("ufo").closeAllFolds() require("ufo").closeAllFolds()
end, end,
desc = "Close all folds", desc = "Close all folds",
}, },
{ {
"zK", "zK",
function() function()
local winid = require("ufo").peekFoldedLinesUnderCursor() local winid = require("ufo").peekFoldedLinesUnderCursor()
if not winid then if not winid then
vim.lsp.buf.hover() vim.lsp.buf.hover()
end end
end, end,
desc = "Peek fold", desc = "Peek fold",
}, },
}, },
} }