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 default prefills it. Type to overwrite.
  • List field (src set) — 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. With strict = 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 with each and joined with sep. 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.

>_

Search the Commando documentation

Try “optional parameters”, “shell history”, or “bookmarks”.