Skip to content

Working with Issues

Everything on this page starts from the card under the cursor — or, once you have marked some, from the selection.

on a card opens it: the fields, the sub-tasks or children with their statuses, a folded history, and the description rendered as Markdown (Jira’s ADF is converted on the way in).

The issue viewer

The viewer is navigable. j / k (or ^N / ^P) walk its links — the parent, the epic, each child, each history entry. on a link drills into that issue; backs out again, as many levels as you went. / filters the children. gg / ⇧G jump to the first and last item.

Finished issues read as finished here too — struck key, dimmed summary — and the children section follows the tab’s child visibility: v d leaves the done ones out (with ✓ N done under the list), v n starts the section folded.

Every issue action works inside the viewer and targets whatever is selected there: ⇧S on a child sets the child’s status, a assigns it, y copies its key.

z h unfolds the history: who changed what, when, newest first, with the churn (ranks, worklogs) filtered out. on a text change — a description or summary edit — shows the old and new text as a unified diff.

History with a diff

Keys Does
n new issue in context: a sub-task under the card, or a story in its epic; ^T cycles the type
⇧N new top-level issue
e rename — an inline prompt for the summary
i edit summary and description together in $EDITOR, as Markdown
a assign: me, unassigned, anyone on the board, or a typed name
# labels: toggle existing ones, type to add
⇧E set or detach the epic, from the epics on the board
⇧S set the status from the board’s statuses
⇧R close as a reason — Jira’s resolution — or change a closed issue’s reason in hindsight
⇧H / ⇧L move to the previous / next column
⇧J / ⇧K re-rank — the whole selection moves as one block

Every one of these is optimistic: the card changes at once, and snaps back with a toast if Jira refuses. Moving a card into a column transitions the issue to that column’s first status; into Done, it also attaches the resolution the workflow asks for, so an ordinary ⇧L works without a dialog.

The assign picker

i hands the summary and body to $EDITOR in one buffer — a heading line, then Markdown — and writes both back on save, converting to ADF. Headings, lists, tables, code, quotes, links and checklists survive the round trip.

space marks the issue under the cursor. ^A marks its siblings; pressed again it widens to the cell, the lane, then the whole board. In the list and the viewer, ⇧V starts a visual range that j / k extend; a second ⇧V ends the range and keeps what it covered as marks, while esc abandons it (and, pressed again, clears the marks too).

Marked rows in the list

With a selection, the field editors act on all of it: ⇧S sets one status on every marked issue, a assigns them all, # edits labels shared by all of them, ⇧E re-links them, ⇧R closes them as one reason. The palette names the target — Set status of 3 selected… — so there is no doubt what is about to do. Writes fan out per issue and revert individually, so one refusal doesn’t undo the others.

⇧J / ⇧K re-rank the whole selection as one block, gathered at the cursor: marks scattered down a column become contiguous where the cursor sits on the first press, and step together after that. Rank is a column’s own order, so only the marks in the cursor’s column and at its level take part — the toast says how many were left elsewhere. This one is a single write and reverts whole: the issues are ranked relative to each other, so half of it is not a partial success but a different order.

Keys Copies
y the key — or every marked key, one per line
⇧Y the URL(s)
⇧U the title(s)
⇧D the description, as Markdown

o opens the issue in the browser. ⇧O opens it in a new tmux window, rendered by lane view <key>, which is handy when the description is long and you want it beside the board.

Jira’s Done transitions usually require a resolution, and which one is a workflow fact. ⇧R lists the instance’s resolutions — Done, Won’t Do, Duplicate, … — and transitions the issue into Done carrying the one you pick. On an issue that is already closed, the same key changes the reason without touching the status.

The close-as picker

default_resolution in the config is what a plain ⇧L into Done sends when you didn’t pick one.