The TUI¶
Commando's interface has two stages: the search list and the fill-in form. This page documents every key in each.
Stage 1 — the search list¶
When you summon Commando (Ctrl+G or commando), you land on a fuzzy search
list drawn bottom-up: the best match sits at the bottom, right next to your
input.
h kubectl get pods -A kubectl get pods -A
c Rollout status kubectl rollout status deploy/<name>
❯ c Restart deployment kubectl rollout restart deploy/<name> [-n <ns>]
scope: all────────────────────────────────────────────3/42 commando
Restart a Kubernetes deployment.
kubectl rollout restart deploy/<name> [-n <ns>]
────────────────────────────────────────────────────────
❯ rollout▊
↑↓ move ←→ edit ⏎ select tab scope ^b bookmark esc quit
Just start typing to filter. The query fuzzy-matches across an entry's
title, description, command, and tags, spanning all four sources at once. Terms
are matched independently, so a multi-word query like deploy cluster finds an
entry tagged deploy whose description contains cluster — the words need not
be adjacent or in one column.
Rows use a compact source code (c cheat, p project, h history, b
bookmark), then a title column and a command column. The selected command's
description and full command are shown once in the footer, so the row and detail
area do not repeat the same information.
Scoping to a source¶
To narrow the list to a single kind of command, lead your query with a :
scope prefix, or press Tab to cycle through the scopes (Shift+Tab cycles
backward). The active scope shows on the left of the status line; the match
counter and commando label stay on the right.
| Prefix | Scope |
|---|---|
:c |
Authored cheats |
:p |
Project-detected / provider commands |
:h |
Shell history |
:b |
Bookmarks |
| (none) | Everything (the default) |
The rest of the query still searches within the scope: :h git push shows only
history entries matching "git push", while a bare :h lists all history. A
colon that isn't a scope token — :z, :cd, or a mid-string ubuntu:latest —
is searched literally. Pressing Tab simply rewrites this prefix in your
query, so the two mechanisms are always in sync.
List keys¶
| Key | Action |
|---|---|
| Up / Ctrl+P | Move the highlight up |
| Down / Ctrl+N | Move the highlight down |
| Enter | Select the highlighted entry (opens the form, or returns it if it has no variables) |
| Tab / Shift+Tab | Cycle the source scope forward / backward |
| Ctrl+B | Bookmark a literal command, or resolve and bookmark a parameterized entry |
| Ctrl+D | Delete the highlighted bookmark (available on bookmark rows only) |
| Left / Right | Move the cursor within the query |
| Backspace | Delete before the query cursor |
| Esc / Ctrl+C | Quit without selecting |
Why is the list upside down?
The list is drawn with the best match nearest your input at the bottom, so your eyes and the cursor stay in the same place. Moving "up" the screen walks toward less-relevant results.
Stage 2 — the fill-in form¶
Selecting an entry with variables opens a compact, bottom-anchored workspace. Each variable is a field; the command summary assembles the command as you go and stays near the active input even in a tall terminal.
╭────────────────────────────────────────────────────────╮
│ Search git log │
│ command: │
│ git log -n 20 -- <file> │
│ │
│ params: │
│ author (optional) = (skipped) │
│ count (optional) = 20 │
│ ❯ file (required, multi) = ‹unset› │
╰────────────────────────────────────────────────────────╯
helper.go
❯ ◯ main.go
❯ file (multi) = ▊
↑↓ candidates space toggle ⏎ run ^p/^n params ^d clear
Form keys¶
| Key | Action |
|---|---|
| Enter | Commit this field (adopting the highlighted candidate, or your typed text) and move to the next; on the last field, assemble and finish |
| Left / Right | Move the cursor within the active input |
| Ctrl+P / Ctrl+N | Move to the previous / next field |
| Tab | Jump to the next required field (skips optionals) |
| Shift+Tab | Jump to the previous required field |
| Up | Move up through the candidate list |
| Down | Move down through the candidate list |
| Space | On a multi-select field: toggle the highlighted candidate. Otherwise: type a space |
| Ctrl+S | Skip this field (only allowed on optional/skippable fields) |
| Ctrl+D | Clear this field's entire value |
| Ctrl+R | Retry a failed candidate source |
| Backspace | Delete before the input cursor |
| Esc | Return to the search list |
| Ctrl+C | Quit entirely |
Field types at a glance¶
- Plain field — free text. A
defaultprefills it. Type to overwrite. - List field (
srcset) — offers candidate values. Type to filter, or pick with the arrows. Your typed text also appears as the highlighted row, so Enter commits exactly what you see. Withstrict = true, only listed values are accepted. On a required list field, Enter with an empty input adopts the top candidate as a quick pick; on an optional one it leaves the field empty instead, so nothing is preselected. - Candidate sources load only when their field is focused. A slow source shows a loading state without blocking input; failures remain visible and can be retried with Ctrl+R.
- Optional field (inside a
[...]template segment) — shows[skip]. Nothing is highlighted until you engage (type, or move the arrows), so pressing Enter leaves it empty and drops the whole bracketed fragment. - Multi-select field (
multi = true) — toggle several values with Space; they're formatted witheachand joined withsep. When optional, the toggle cursor stays hidden until you navigate or select, so it can be left empty.
Candidate previews are loaded asynchronously after a candidate is engaged. Moving away cancels stale work, and preview failures are shown in the workspace instead of being mistaken for empty output.
See Template syntax and Variables for how these are declared.
Finishing¶
On the last field, Enter assembles the command and:
- Default: places it on your shell prompt for review (via the Zsh, Bash, or Fish widget) or prints it to stdout (when run directly).
- With
--exec: runs it immediately.
Either way, the values you entered are remembered and the entry's usage count is bumped for future ranking.