fix(driver): respect foldminlines (#108)

This commit is contained in:
kevinhwang91 2023-02-01 12:59:24 +08:00
parent ca5946c17f
commit 114799cfcf

View file

@ -1,8 +1,23 @@
local cmd = vim.cmd
local fn = vim.fn
local utils = require('ufo.utils')
local function convertToFoldRanges(ranges, rowPairs)
-- just check the last range only to filter out same ranges
local lastStartLine, lastEndLine
local foldRanges = {}
local minLines = vim.wo.foldminlines
for _, r in ipairs(ranges) do
local startLine, endLine = r.startLine, r.endLine
if not rowPairs[startLine] and endLine - startLine >= minLines and
(lastStartLine ~= startLine or lastEndLine ~= endLine) then
lastStartLine, lastEndLine = startLine, endLine
table.insert(foldRanges, {startLine + 1, endLine + 1})
end
end
return foldRanges
end
---@type UfoFoldDriverNonFFI|UfoFoldDriverFFI
local FoldDriver
@ -22,24 +37,14 @@ end
---@param rowPairs table<number, number>
function FoldDriverFFI:createFolds(winid, ranges, rowPairs)
utils.winCall(winid, function()
local foldRanges = {}
local wo = vim.wo[winid]
local foldLevel = wo.foldlevel
local level = wo.foldlevel
self._wffi.clearFolds(winid)
-- just check the last range only to filter out same ranges
local lastStartLine, lastEndLine
for _, r in ipairs(ranges) do
local startLine, endLine = r.startLine, r.endLine
if not rowPairs[startLine] and
(lastStartLine ~= startLine or lastEndLine ~= endLine) then
lastStartLine, lastEndLine = startLine, endLine
table.insert(foldRanges, {startLine + 1, endLine + 1})
end
end
local foldRanges = convertToFoldRanges(ranges, rowPairs)
self._wffi.createFolds(winid, foldRanges)
wo.foldmethod = 'manual'
wo.foldenable = true
wo.foldlevel = foldLevel
wo.foldlevel = level
foldRanges = {}
for row, endRow in pairs(rowPairs) do
table.insert(foldRanges, {row + 1, endRow + 1})
@ -63,23 +68,19 @@ end
---@param rowPairs table<number, number>
function FoldDriverNonFFI:createFolds(winid, ranges, rowPairs)
utils.winCall(winid, function()
local level = vim.wo.foldlevel
local cmds = {}
local lastStartLine, lastEndLine
for _, r in ipairs(ranges) do
local startLine, endLine = r.startLine, r.endLine
if not rowPairs[startLine] and
(lastStartLine ~= startLine or lastEndLine ~= endLine) then
table.insert(cmds, ('%d,%d:fold'):format(startLine + 1, endLine + 1))
end
local foldRanges = convertToFoldRanges(ranges, rowPairs)
for _, r in ipairs(foldRanges) do
table.insert(cmds, ('%d,%d:fold'):format(r[1], r[2]))
end
local view = utils.saveView(0)
cmd('norm! zE')
utils.restView(0, view)
local foldLevel = vim.wo.foldlevel
table.insert(cmds, 'setl foldmethod=manual')
table.insert(cmds, 'setl foldenable')
table.insert(cmds, 'setl foldlevel=' .. foldLevel)
local foldRanges = {}
table.insert(cmds, 'setl foldlevel=' .. level)
foldRanges = {}
for row, endRow in pairs(rowPairs) do
table.insert(foldRanges, {row + 1, endRow + 1})
end