diff --git a/doc/pending.txt b/doc/pending.txt index 59da208..739ca88 100644 --- a/doc/pending.txt +++ b/doc/pending.txt @@ -299,6 +299,8 @@ Default buffer-local keys: ~ `gz` Undo the last `:w` save (`undo`) `o` Insert a new task line below (`open_line`) `O` Insert a new task line above (`open_line_above`) + `` Increment priority (clamped at `max_priority`) (`priority_up`) + `` Decrement priority (clamped at 0) (`priority_down`) `J` Move task down within its category (`move_down`) `K` Move task up within its category (`move_up`) `zc` Fold the current category section (requires `folding`) @@ -413,6 +415,16 @@ old keys to `false`: >lua Toggle blocked status for the task under the cursor. If the task is already `blocked`, reverts to `pending`. + *(pending-priority-up)* +(pending-priority-up) + Increment the priority level for the task under the cursor, clamped + at `max_priority`. Default key: ``. + + *(pending-priority-down)* +(pending-priority-down) + Decrement the priority level for the task under the cursor, clamped + at 0. Default key: ``. + *(pending-open-line)* (pending-open-line) Insert a correctly-formatted blank task line below the cursor. diff --git a/lua/pending/config.lua b/lua/pending/config.lua index 599b050..c947b40 100644 --- a/lua/pending/config.lua +++ b/lua/pending/config.lua @@ -137,6 +137,8 @@ local defaults = { move_up = 'K', wip = 'gw', blocked = 'gb', + priority_up = '', + priority_down = '', }, sync = {}, icons = { diff --git a/lua/pending/init.lua b/lua/pending/init.lua index 77959c9..2ed00d1 100644 --- a/lua/pending/init.lua +++ b/lua/pending/init.lua @@ -363,6 +363,12 @@ function M._setup_buf_mappings(bufnr) blocked = function() M.toggle_status('blocked') end, + priority_up = function() + M.increment_priority() + end, + priority_down = function() + M.decrement_priority() + end, undo = function() M.undo_write() end, @@ -646,6 +652,56 @@ function M.toggle_priority() end end +---@param delta integer +---@return nil +local function adjust_priority(delta) + local bufnr = buffer.bufnr() + if not bufnr then + return + end + if not require_saved() then + return + end + local row = vim.api.nvim_win_get_cursor(0)[1] + local meta = buffer.meta() + if not meta[row] or meta[row].type ~= 'task' then + return + end + local id = meta[row].id + if not id then + return + end + local s = get_store() + local task = s:get(id) + if not task then + return + end + local max = require('pending.config').get().max_priority or 3 + local new_priority = math.max(0, math.min(max, task.priority + delta)) + if new_priority == task.priority then + return + end + s:update(id, { priority = new_priority }) + _save_and_notify() + buffer.render(bufnr) + for lnum, m in ipairs(buffer.meta()) do + if m.id == id then + vim.api.nvim_win_set_cursor(0, { lnum, 0 }) + break + end + end +end + +---@return nil +function M.increment_priority() + adjust_priority(1) +end + +---@return nil +function M.decrement_priority() + adjust_priority(-1) +end + ---@return nil function M.prompt_date() local bufnr = buffer.bufnr() diff --git a/plugin/pending.lua b/plugin/pending.lua index 2d0d2be..084f162 100644 --- a/plugin/pending.lua +++ b/plugin/pending.lua @@ -328,6 +328,14 @@ vim.keymap.set('n', '(pending-blocked)', function() require('pending').toggle_status('blocked') end) +vim.keymap.set('n', '(pending-priority-up)', function() + require('pending').increment_priority() +end) + +vim.keymap.set('n', '(pending-priority-down)', function() + require('pending').decrement_priority() +end) + vim.keymap.set('n', '(pending-filter)', function() vim.ui.input({ prompt = 'Filter: ' }, function(input) if input then