Save to file
Press Ctrl+W to save the current jq result to a file. A small popup appears with a pre-filled path — edit if you like, watch the resolved path update live, press Enter, and the result lands on disk.
Activation
Ctrl+W works from anywhere the query and results are visible — input pane (any vim mode), results pane, error overlay. It’s suppressed while a popup that owns its own keys is open (snippets, history, search, help): close that popup first, then press Ctrl+W.
If there’s no result yet — empty input, jq error, paste-recovery still active — Ctrl+W shows a transient “Nothing to save” notification instead of opening the popup.
The popup
╭ Save Result to file ─────────────────────────────────────╮
│ Path: │
│ ╭──────────────────────────────────────────────────────╮ │
│ │jiq-20260527-104522.json │ │
│ ╰──────────────────────────────────────────────────────╯ │
│ → /home/you/projects/api/jiq-20260527-104522.json │
│ Enter Save Esc Cancel │
╰──────────────────────────────────────────────────────────╯
The path starts pre-filled with jiq-{timestamp}.json, written into the directory you launched jiq from. The line below the input shows the resolved path — ~, env vars, {cwd}, and {timestamp} are all expanded as you type.
| Key | Action |
|---|---|
| Enter | Save (or overwrite — the popup tells you which) |
| Esc | Cancel without writing |
Path expansion
Anything you can type at a shell prompt works in this field:
| Placeholder | Expands to |
|---|---|
{timestamp} |
YYYYMMDD-HHMMSS (e.g. 20260527-104522) |
{ext} |
json |
{cwd} |
Current working directory |
~ |
Your home directory (only at the start of the path) |
$VAR or ${VAR} |
Environment variable lookup |
absolute (/foo/bar.json) |
Used verbatim |
relative (out.json, ./out.json) |
Resolved against {cwd} |
The timestamp is captured once when the popup opens and stays stable while you edit, so the resolved path you see is the path that will be written.
When the file already exists
The popup itself becomes the warning — no extra confirmation step:
╭ Save Result to file ─────────────────────────────────────╮
│ Path: │
│ ╭──────────────────────────────────────────────────────╮ │
│ │results.json │ │
│ ╰──────────────────────────────────────────────────────╯ │
│ ⚠ File exists: /home/you/projects/api/results.json │
│ Enter Overwrite Esc Cancel │
╰──────────────────────────────────────────────────────────╯
The preview line turns yellow with a ⚠, the popup border picks up the same warning color, and the button label flips from Save to Overwrite. As soon as you edit the path to something that doesn’t collide, everything flips back.
When the path can’t resolve
If your pattern references an unset env var or expands to nothing, the preview shows the error inline — the bad path never gets written:
│ ✕ env var UNSET_VAR not set │
Pressing Enter while in this state surfaces the same error as a sticky notification.
Atomic write
jiq writes to a sibling temporary file (.<filename>.tmp-<pid>), fsyncs it, then renames it into place. If your editor or shell tab is sharing the directory, you’ll never see a half-written file at the final path — either the new bytes are fully there, or the previous file is unchanged.
If the rename can’t be atomic (e.g. across filesystems), jiq falls back to a direct write so saves still succeed.
Errors
Write errors stay non-fatal — the popup closes after a successful write, but stays open if the write fails.
| Cause | Notification |
|---|---|
| Parent directory doesn’t exist | Save failed: parent directory does not exist: <path> |
| Permission denied | Save failed: Permission denied (os error 13) |
| Disk full / similar OS error | Save failed: <verbatim OS error> |
| Unset env var in pattern | Save failed: env var FOO not set (also surfaced live in the preview) |
| Empty filename | Save failed: filename is empty (also surfaced live) |
Suppression matrix
| Active surface | Ctrl+W behavior |
|---|---|
| Input pane (any vim mode) | Opens save popup |
| Results pane | Opens save popup |
| Snippets popup open | Suppressed — Esc out first |
| History popup open | Suppressed — Esc out first |
| Search popup open | Suppressed — Esc out first |
| Help popup open | Suppressed — F1 to close first |
| Save popup itself open | Routed to its own handler (Esc closes) |
Shortcuts
| Key | Action |
|---|---|
| Ctrl+W | Open save popup |
| Enter | Save (or overwrite, depending on preview) |
| Esc | Cancel without writing |