feat: add <C-a> / <C-x> keymaps for priority increment/decrement (#114)

* feat(s3): create bucket interactively during auth when unconfigured

Problem: when a user runs `:Pending s3 auth` with no bucket configured,
auth succeeds but offers no way to create the bucket. The user must
manually run `aws s3api create-bucket` and update their config.

Solution: add `util.input()` coroutine-aware prompt wrapper and a
`create_bucket()` flow in `s3.lua` that prompts for bucket name and
region, handles the `us-east-1` LocationConstraint quirk, and logs a
config snippet on success. Called automatically from `auth()` when
`sync.s3.bucket` is absent.

* ci: typing

* feat(parse): add `parse_duration_to_days` for duration string conversion

Problem: The archive command accepted only a bare integer for days,
inconsistent with the `+Nd`/`+Nw`/`+Nm` duration syntax used elsewhere.

Solution: Add `parse_duration_to_days()` supporting `Nd`, `Nw`, `Nm`,
and bare integers. Returns nil on invalid input for caller error handling.

* feat(archive): duration syntax and confirmation prompt

Problem: `:Pending archive` accepted only a bare integer for days and
silently deleted tasks with no confirmation, risking accidental data loss.

Solution: Accept duration strings (`7d`, `3w`, `2m`) via
`parse.parse_duration_to_days()`, show a `vim.ui.input` confirmation
prompt before removing tasks, and skip the prompt when zero tasks match.

* feat: add `<C-a>` / `<C-x>` keymaps for priority increment/decrement

Problem: Priority could only be cycled with `g!` (0→1→2→3→0), with no
way to directly increment or decrement.

Solution: Add `adjust_priority()` with clamping at 0 and `max_priority`,
exposed as `increment_priority()` / `decrement_priority()` on `<C-a>` /
`<C-x>`. Includes `<Plug>` mappings and vimdoc.

* fix(s3): use parenthetical defaults in bucket creation prompts

Problem: `util.input` with `default` pre-filled the input field, and
the success message said "Add to your config" ambiguously.

Solution: Show defaults in prompt text as `(default)` instead of
pre-filling, and clarify the message to "Add to your pending.nvim
config".

* ci: format
This commit is contained in:
Barrett Ruth 2026-03-08 20:49:05 -04:00 committed by GitHub
parent dc365e266b
commit 9672af7c08
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
7 changed files with 106 additions and 15 deletions

View file

@ -67,11 +67,14 @@ local function ensure_sync_id(task)
end
local function create_bucket()
local name = util.input({ prompt = 'S3 bucket name: ', default = 'pending.nvim' })
if not name or name == '' then
local name = util.input({ prompt = 'S3 bucket name (pending.nvim): ' })
if not name then
log.info('s3: bucket creation cancelled')
return
end
if name == '' then
name = 'pending.nvim'
end
local region_cmd = base_cmd()
vim.list_extend(region_cmd, { 'configure', 'get', 'region' })
@ -84,9 +87,11 @@ local function create_bucket()
end
end
local region = util.input({ prompt = 'AWS region: ', default = default_region })
if not region or region == '' then
region = 'us-east-1'
local region = util.input({ prompt = 'AWS region (' .. default_region .. '): ' })
if not region then
region = default_region
elseif region == '' then
region = default_region
end
local cmd = base_cmd()
@ -98,7 +103,7 @@ local function create_bucket()
local result = util.system(cmd, { text = true })
if result.code == 0 then
log.info(
's3: bucket created. Add to your config:\n sync = { s3 = { bucket = "'
's3: bucket created. Add to your pending.nvim config:\n sync = { s3 = { bucket = "'
.. name
.. '", region = "'
.. region