github ZenNotes/zennotes v2.32.0
ZenNotes 2.32.0: wrapped Vim motions, your way

latest release: v2.33.0
3 hours ago

ZenNotes 2.32.0: wrapped Vim motions, your way

Vim motions under Word Wrap are now explicit instead of surprising. Keep ZenNotes' current display-row behavior, or switch $, I, A, and the operators built on them back to traditional logical-line semantics. The default is unchanged, and g0, g^, and g$ remain the always-display-row forms. Open Buffers now supports selective cleanup without dismissing the picker, and custom-status task moves in server-backed vaults survive the refresh that confirms them.

✨ New

  • Wrapped Vim motions can follow the screen or the source line. (#638, reported by @uNyanda) Settings → Editor → Vim now has a Wrapped line motions choice. Display row preserves the behavior introduced in 2.21: $, I, A, v$, y$, d$, and c$ stop at the visible wrapped row. Logical line restores traditional Vim behavior for those commands across the complete source line, while g0, g^, and g$ still target the display row in either mode. The preference is persisted as [vim].wrapped_line_motions in config.toml and applies in the main editor, Quick Capture, and floating-note windows. How to test locally: enable Word Wrap and Vim mode, open a paragraph that wraps across several rows, compare v$ in both settings, then confirm g$ still selects only to the current display-row end.

  • Open Buffers can close the highlighted buffer in place. (#641, reported by @uNyanda) Open the list with Space o or :buffers, highlight an entry, and press Ctrl+D. Only that buffer closes; the picker keeps its query and focus, and the highlight advances or clamps to the last row. The footer and Help advertise the shortcut. How to test locally: open four tabs, close two non-adjacent rows from Open Buffers, and confirm the other tabs remain while the picker stays open.

🐛 Fixes

  • Custom-status task moves now stick in server-backed vaults. (#643, reported by @mptpro) Moving a whole-note task into a custom Kanban status wrote the right status: frontmatter and showed the card in its new column immediately, but the server's follow-up task scan omitted custom fields. A few seconds later the board trusted that incomplete scan and put the card back under No status. The server parser now returns fields.status and the matching status value for whole-note tasks, and mirrors the desktop parser for inline @key:value fields too, so custom status, sprint, area, and other field boards all survive watcher rescans and manual refreshes. How to test locally: connect to a ZenNotes server, group the Tasks Kanban by Custom status, move a task file from Open into another status, wait for the watcher, then press Refresh; the card stays in its new column and its frontmatter keeps the same status.

🧰 For contributors

  • The CodeMirror-Vim boundary adapter reads the current preference at motion time, so changing the setting applies without re-registering Vim commands or reopening the editor. Invalid stored values normalize to the backward-compatible display default.
  • Open Buffers uses the existing close action, preserving dirty-note saves. A component test covers repeated closes, picker persistence, and selection clamping.
  • The Go server's Task JSON now carries the same fields map and status convenience value as VaultTask in shared-domain. Its inline-field grammar and note-level status fallback intentionally mirror the TypeScript parser so remote and local task scans classify Kanban cards identically.

Local-first and keyboard-first, as always.

Don't miss a new zennotes release

NewReleases is sending notifications on new releases.