diff --git a/.github/DISCUSSION_TEMPLATE/q-a.yaml b/.github/DISCUSSION_TEMPLATE/q-a.yaml index 0e657eb..a65fd46 100644 --- a/.github/DISCUSSION_TEMPLATE/q-a.yaml +++ b/.github/DISCUSSION_TEMPLATE/q-a.yaml @@ -1,4 +1,4 @@ -title: "Q&A" +title: 'Q&A' labels: [] body: - type: markdown diff --git a/.github/ISSUE_TEMPLATE/bug_report.yaml b/.github/ISSUE_TEMPLATE/bug_report.yaml index 0796c39..baae06b 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.yaml +++ b/.github/ISSUE_TEMPLATE/bug_report.yaml @@ -1,13 +1,14 @@ name: Bug Report description: Report a bug -title: "bug: " +title: 'bug: ' labels: [bug] body: - type: checkboxes attributes: label: Prerequisites options: - - label: I have searched [existing + - label: + I have searched [existing issues](https://github.com/barrettruth/pending.nvim/issues) required: true - label: I have updated to the latest version @@ -15,16 +16,16 @@ body: - type: textarea attributes: - label: "Neovim version" - description: "Output of `nvim --version`" + label: 'Neovim version' + description: 'Output of `nvim --version`' render: text validations: required: true - type: input attributes: - label: "Operating system" - placeholder: "e.g. Arch Linux, macOS 15, Ubuntu 24.04" + label: 'Operating system' + placeholder: 'e.g. Arch Linux, macOS 15, Ubuntu 24.04' validations: required: true @@ -48,8 +49,8 @@ body: - type: textarea attributes: - label: "Health check" - description: "Output of `:checkhealth task`" + label: 'Health check' + description: 'Output of `:checkhealth task`' render: text - type: textarea diff --git a/.github/ISSUE_TEMPLATE/feature_request.yaml b/.github/ISSUE_TEMPLATE/feature_request.yaml index f4c02eb..cabb27c 100644 --- a/.github/ISSUE_TEMPLATE/feature_request.yaml +++ b/.github/ISSUE_TEMPLATE/feature_request.yaml @@ -1,13 +1,14 @@ name: Feature Request description: Suggest a feature -title: "feat: " +title: 'feat: ' labels: [enhancement] body: - type: checkboxes attributes: label: Prerequisites options: - - label: I have searched [existing + - label: + I have searched [existing issues](https://github.com/barrettruth/pending.nvim/issues) required: true diff --git a/.github/workflows/luarocks.yaml b/.github/workflows/luarocks.yaml index 9f934a5..9b6664e 100644 --- a/.github/workflows/luarocks.yaml +++ b/.github/workflows/luarocks.yaml @@ -3,7 +3,7 @@ name: luarocks on: push: tags: - - "v*" + - 'v*' jobs: quality: diff --git a/README.md b/README.md index df7f3dd..98e14d3 100644 --- a/README.md +++ b/README.md @@ -2,30 +2,145 @@ Edit tasks like text. `:w` saves them. - +A buffer-centric task manager for Neovim. Tasks live in a plain buffer — add +with `o`, delete with `dd`, reorder with `dd`/`p`, rename by editing. Write the +buffer and the diff is computed against a JSON store. No UI chrome, no floating +windows, no abstractions between you and your tasks. -## Requirements +## How it works -- Neovim 0.10+ -- (Optionally) `curl` and `openssl` for Google Calendar and Google Task sync +``` +School + ! Read chapter 5 Feb 28 + Submit homework Feb 25 -## Installation +Errands + Buy groceries Mar 01 + Clean apartment +``` -Install with your package manager of choice or via -[luarocks](https://luarocks.org/modules/barrettruth/pending.nvim): +Category headers sit at column 0. Tasks are indented below them. `!` marks +priority. Due dates appear as right-aligned virtual text. Done tasks get +strikethrough. Everything you see is editable buffer text — the IDs are +concealed, and metadata is parsed from inline syntax on save. + +## Install ``` luarocks install pending.nvim ``` +**lazy.nvim:** + +```lua +{ 'barrettruth/pending.nvim' } +``` + +Requires Neovim 0.10+. No external dependencies for local use. Google Calendar +sync requires `curl` and `openssl`. + +## Usage + +`:Pending` opens the task buffer. From there, it's just vim: + +| Key | Action | +| --------- | ------------------------------- | +| `o` / `O` | Add a new task | +| `dd` | Delete a task (on `:w`) | +| `p` | Paste (duplicates get new IDs) | +| `:w` | Save all changes | +| `` | Toggle complete (immediate) | +| `` | Switch category / priority view | +| `g?` | Show keybind help | + +### Inline metadata + +Type metadata tokens at the end of a task line before saving: + +``` +Buy milk due:2026-03-15 cat:Errands +``` + +On `:w`, the date and category are extracted. The description becomes `Buy milk`, +the due date renders as virtual text, and the task moves under the `Errands` +header. + +### Quick add + +```vim +:Pending add Buy groceries due:2026-03-15 +:Pending add School: Submit homework +``` + +### Archive + +```vim +:Pending archive " purge done tasks older than 30 days +:Pending archive 7 " purge done tasks older than 7 days +``` + +## Configuration + +No `setup()` call required. Set `vim.g.pending` before the plugin loads: + +```lua +vim.g.pending = { + data_path = vim.fn.stdpath('data') .. '/pending/tasks.json', + default_view = 'category', -- 'category' or 'priority' + default_category = 'Inbox', + date_format = '%b %d', -- strftime format for virtual text + date_syntax = 'due', -- inline token name (e.g. 'by' for by:2026-03-15) +} +``` + +All fields are optional. Absent keys use the defaults shown above. + +## Google Calendar sync + +One-way push of tasks with due dates to a dedicated Google Calendar as all-day +events. + +```lua +vim.g.pending = { + gcal = { + calendar = 'Tasks', + credentials_path = '/path/to/client_secret.json', + }, +} +``` + +```vim +:Pending sync +``` + +On first run, a browser window opens for OAuth consent. The refresh token is +stored at `stdpath('data')/pending/gcal_tokens.json`. Completed or deleted tasks +have their calendar events removed. Due date changes update events in place. + +## Mappings + +The plugin defines `` mappings for custom keybinds: + +```lua +vim.keymap.set('n', 't', '(pending-open)') +vim.keymap.set('n', 'T', '(pending-toggle)') +``` + +| Plug mapping | Action | +| -------------------------- | -------------------- | +| `(pending-open)` | Open task buffer | +| `(pending-toggle)` | Toggle complete | +| `(pending-view)` | Switch view | +| `(pending-priority)` | Toggle priority flag | +| `(pending-date)` | Prompt for due date | + +## Data format + +Tasks are stored as JSON at `stdpath('data')/pending/tasks.json`. The schema is +versioned and forward-compatible — unknown fields are preserved on round-trip. + ## Documentation ```vim -:help pending.nvim +:checkhealth pending ``` - -## Acknowledgements - -- [dooing](https://github.com/atiladefreitas/dooing) -- [todo-comments.nvim](https://github.com/folke/todo-comments.nvim) -- [todotxt.nvim](https://github.com/arnarg/todotxt.nvim)