From 40ebd0ebb2e9c0ff105d30bf0a7b4f9edac4ba99 Mon Sep 17 00:00:00 2001 From: Barrett Ruth Date: Tue, 24 Feb 2026 18:29:54 -0500 Subject: [PATCH] feat(buffer): add category folds via foldexpr Problem: category_view had no fold support, making it harder to focus on one category in large lists. Solution: add M.get_fold() returning '>1' for headers, '1' for task lines, and '0' for blanks. M.render() now sets foldmethod=expr (foldlevel=99) in category view and foldmethod=manual in priority. --- lua/pending/buffer.lua | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/lua/pending/buffer.lua b/lua/pending/buffer.lua index d7f6b4c..e36972e 100644 --- a/lua/pending/buffer.lua +++ b/lua/pending/buffer.lua @@ -81,6 +81,22 @@ function M.get_indent() return 2 end +---@return string +function M.get_fold() + local lnum = vim.v.lnum + local m = _meta[lnum] + if not m then + return '0' + end + if m.type == 'header' then + return '>1' + elseif m.type == 'task' then + return '1' + else + return '0' + end +end + ---@param bufnr integer ---@param line_meta pending.LineMeta[] local function apply_extmarks(bufnr, line_meta) @@ -166,6 +182,18 @@ function M.render(bufnr) setup_syntax(bufnr) apply_extmarks(bufnr, line_meta) + + for _, winid in ipairs(vim.fn.win_findbuf(bufnr)) do + if current_view == 'category' then + vim.wo[winid].foldmethod = 'expr' + vim.wo[winid].foldexpr = 'v:lua.require("pending.buffer").get_fold()' + vim.wo[winid].foldlevel = 99 + vim.wo[winid].foldenable = true + else + vim.wo[winid].foldmethod = 'manual' + vim.wo[winid].foldenable = false + end + end end function M.toggle_view()