Skip to content

Lazyplanner v1.4.0

Choose a tag to compare

@littekge littekge released this 24 Jul 14:32

v1.4.0 — SELECT mode: multi-select & bulk operations

LazyPlanner gains a vim-style multi-select layer. Press V to anchor a
selection, extend it with the ordinary movement keys, then apply one bulk
action to the whole range.

New

SELECT mode (V)

  • Works in three contexts: the task tree, the un-drilled calendar
    (a range of days), and a drilled day's item list.
  • The range is a contiguous anchor→cursor span, extended with normal motion:
    hjkl/arrows, gg/G, f/b, and vim counts (10j).
  • The status bar shows a SELECT badge and a live N selected count; the
    selected range is highlighted in the view (reverse-video rows in the tree,
    outlined day boxes on the calendar).
  • Modes nest vim-style: DRILL → SELECT → GRAB, with each Esc unwinding
    exactly one level.

Bulk operations (one keystroke, one undo step)

  • Spacecomplete every selected task (children before parents, so a
    folder and its last open subtask can be finished in one pass; recurring
    todos advance one occurrence, exactly like single-item Space).
  • ddelete the selection, with a single confirmation naming the real
    resource count (a selected subtask of a selected parent is absorbed, never
    counted or deleted twice).
  • y / Ycut / copy multiple subtrees to the clipboard (task tree
    only), then p/P pastes them together — including across lists.
  • mbulk grab: shift every selected item by whole days (h/l) or
    weeks (j/k) as one uniform date-shift. Esc returns to SELECT with the
    range intact so a grab can be retried.
  • Every bulk action is all-or-nothing: a mid-batch failure rolls back
    cleanly, and a full success is a single u undo step.
  • Items an action can't apply to (read-only calendars, recurring events,
    undated tasks, folders with open subtasks, already-done tasks) are skipped
    and counted — the flash reports exactly what was skipped and why, and
    confirmation counts always match what is actually acted on.

Fixed

  • The always-visible help bar now shows the active grab's controls and
    granularity for the whole grab (single grab: ±hour/±day per context;
    bulk grab: ±day/±week) instead of the ordinary controls line — or, mid
    bulk-grab, a stale SELECT · hjkl extend line that no longer matched what
    the keys did.
  • A malformed RELATED-TO parent cycle in hand-edited/foreign .ics data
    could hang the UI during a bulk delete's ancestor walk — now cycle-guarded,
    consistent with the "malformed iCalendar is never fatal" invariant.
  • V pressed while an overview panel (Calendars/Tasks) is focused flashes a
    hint instead of silently anchoring a selection that motion could never
    extend.
  • A bare 0 in SELECT no longer leaks through to the week/day hour-zoom
    reset (a 0 continuing a count, e.g. 10j, still works); modified motion
    keys (Ctrl-arrows) can no longer sneak a pane resize in mid-select.

Docs

  • README.md keybindings table gains V (and a previously missing m grab
    row); the ?/:help cheat sheet gains a Select section.

Full gate green (go test ./..., go vet, staticcheck, race + display-stress suites) on every commit.

Full Changelog: v1.3.0...v1.4.0