mirror of
https://github.com/kevinhwang91/nvim-ufo
synced 2024-09-16 14:14:02 +02:00
fix(driver): respect foldminlines
(#108)
This commit is contained in:
parent
ca5946c17f
commit
114799cfcf
1 changed files with 25 additions and 24 deletions
|
@ -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
|
||||
|
|
Loading…
Reference in a new issue