diff --git a/doc/pending.txt b/doc/pending.txt index 7270c8e..5bc8c37 100644 --- a/doc/pending.txt +++ b/doc/pending.txt @@ -354,6 +354,8 @@ Default buffer-local keys: ~ `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`) + `g` Increment priority for visual selection (`priority_up_visual`) + `g` Decrement priority for visual selection (`priority_down_visual`) `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`) diff --git a/lua/pending/config.lua b/lua/pending/config.lua index 4a5172e..451aace 100644 --- a/lua/pending/config.lua +++ b/lua/pending/config.lua @@ -78,6 +78,8 @@ ---@field move_up? string|false ---@field wip? string|false ---@field blocked? string|false +---@field priority_up_visual? string|false +---@field priority_down_visual? string|false ---@class pending.CategoryViewConfig ---@field order? string[] @@ -157,6 +159,8 @@ local defaults = { blocked = 'gb', priority_up = '', priority_down = '', + priority_up_visual = 'g', + priority_down_visual = 'g', }, sync = {}, forge = { diff --git a/lua/pending/init.lua b/lua/pending/init.lua index aeba431..fe8fd6f 100644 --- a/lua/pending/init.lua +++ b/lua/pending/init.lua @@ -402,6 +402,26 @@ function M._setup_buf_mappings(bufnr) end end + ---@type table + local visual_actions = { + priority_up_visual = function() + M.increment_priority_visual() + end, + priority_down_visual = function() + M.decrement_priority_visual() + end, + } + + for name, fn in pairs(visual_actions) do + local key = km[name] + if key and key ~= false then + vim.keymap.set('x', key --[[@as string]], function() + vim.api.nvim_feedkeys(vim.api.nvim_replace_termcodes('', true, false, true), 'nx', false) + fn() + end, opts) + end + end + local textobj = require('pending.textobj') ---@type table @@ -711,6 +731,53 @@ function M.decrement_priority() adjust_priority(-1) end +---@param delta integer +---@return nil +local function adjust_priority_visual(delta) + local bufnr = buffer.bufnr() + if not bufnr then + return + end + if not require_saved() then + return + end + local start_row = vim.fn.line("'<") + local end_row = vim.fn.line("'>") + local cursor = vim.api.nvim_win_get_cursor(0) + local meta = buffer.meta() + local s = get_store() + local max = require('pending.config').get().max_priority or 3 + local changed = false + for row = start_row, end_row do + if meta[row] and meta[row].type == 'task' and meta[row].id then + local task = s:get(meta[row].id) + if task then + local new_priority = math.max(0, math.min(max, task.priority + delta)) + if new_priority ~= task.priority then + s:update(meta[row].id, { priority = new_priority }) + changed = true + end + end + end + end + if not changed then + return + end + _save_and_notify() + buffer.render(bufnr) + pcall(vim.api.nvim_win_set_cursor, 0, cursor) +end + +---@return nil +function M.increment_priority_visual() + adjust_priority_visual(1) +end + +---@return nil +function M.decrement_priority_visual() + adjust_priority_visual(-1) +end + ---@return nil function M.prompt_date() local bufnr = buffer.bufnr() diff --git a/plugin/pending.lua b/plugin/pending.lua index 63caadd..62e2e89 100644 --- a/plugin/pending.lua +++ b/plugin/pending.lua @@ -402,6 +402,16 @@ vim.keymap.set('n', '(pending-priority-down)', function() require('pending').decrement_priority() end) +vim.keymap.set('x', '(pending-priority-up-visual)', function() + vim.api.nvim_feedkeys(vim.api.nvim_replace_termcodes('', true, false, true), 'nx', false) + require('pending').increment_priority_visual() +end) + +vim.keymap.set('x', '(pending-priority-down-visual)', function() + vim.api.nvim_feedkeys(vim.api.nvim_replace_termcodes('', true, false, true), 'nx', false) + require('pending').decrement_priority_visual() +end) + vim.keymap.set('n', '(pending-filter)', function() vim.ui.input({ prompt = 'Filter: ' }, function(input) if input then