feat(views): add hide_done_categories config option (#153)

Problem: Categories where every task is done still render in the buffer,
cluttering the view when entire categories are finished.

Solution: Add `view.category.hide_done_categories` (boolean, default
false). When enabled, `category_view()` skips categories whose tasks are
all done/deleted, returns their IDs as `done_cat_hidden_ids`, and
`_on_write` merges those IDs into `hidden_ids` passed to `diff.apply()`
so hidden tasks are not mistakenly deleted on `:w`.
This commit is contained in:
Barrett Ruth 2026-03-12 20:19:27 -04:00 committed by Barrett Ruth
parent ea59bbae96
commit 283f93eda1
Signed by: barrett
GPG key ID: A6C96C9349D2FC81
6 changed files with 123 additions and 4 deletions

View file

@ -138,6 +138,7 @@ end
---@param tasks pending.Task[]
---@return string[] lines
---@return pending.LineMeta[] meta
---@return table<integer, true> done_cat_hidden_ids
function M.category_view(tasks)
local by_cat = {}
local cat_order = {}
@ -177,6 +178,9 @@ function M.category_view(tasks)
cat_order = ordered
end
local hide_done = config.get().view.category.hide_done_categories
local done_cat_hidden = {} ---@type table<integer, true>
for _, cat in ipairs(cat_order) do
sort_tasks(by_cat[cat])
sort_tasks(done_by_cat[cat])
@ -184,12 +188,21 @@ function M.category_view(tasks)
local lines = {}
local meta = {}
local rendered = 0
for i, cat in ipairs(cat_order) do
if i > 1 then
for _, cat in ipairs(cat_order) do
if hide_done and #by_cat[cat] == 0 and #done_by_cat[cat] > 0 then
for _, t in ipairs(done_by_cat[cat]) do
done_cat_hidden[t.id] = true
end
goto next_cat
end
if rendered > 0 then
table.insert(lines, '')
table.insert(meta, { type = 'blank' })
end
rendered = rendered + 1
table.insert(lines, '# ' .. cat)
table.insert(meta, { type = 'header', category = cat })
@ -220,9 +233,11 @@ function M.category_view(tasks)
forge_spans = compute_forge_spans(task, prefix_len),
})
end
::next_cat::
end
return lines, meta
return lines, meta, done_cat_hidden
end
---@param tasks pending.Task[]