Skip to content

Filtering & searching

Press / to narrow the focused panel. A slim input opens in the status bar and the query applies live as you type.

Key Effect
enterKeep the query. The hint bar then shows it, with esc to clear.
esc Clear the query.
n / N In Main and Status: jump to the next / previous match.

The query is remembered per panel, so the Files panel can stay narrowed to state:M while you search inside a diff in Main.

List panels filter. In Files and Log, non-matching rows are hidden. The panel footer keeps counting, and appends the full unfiltered count in brackets — 1 of 16 (29) — so you always know how much is out of view.

Detail panels search. In Main and Status, nothing is removed. Matching lines are highlighted in place: the current match is a reverse-video bar and the rest get a subtle highlight. n / N move between them, wrapping at the ends, and the hint bar shows the position — 2/5. If nothing matches, a toast says so.

Every query accepts free text. The list panels also accept key:value parameters, which can be combined in any order with the free text. Keys are case-insensitive, and so is matching.

Panel Behaviour Parameters Free text matches
Log filter rev: (exact revision, with or without the leading r), user: / author:, path: (a changed path), date: (YYYY-MM-DD) The full commit message, not just its first line
Log — a compared range filter state: (what the range did to the file: A, M, D, or part of a state name) The file path
Files — Changes, Changelists, Diffs, Rejects filter state: (a status code such as M, exactly as the row draws it, or part of a state name such as modified; a code may be suffixed + for copy history), cl: / changelist: The file path
Main / Status highlight + jump The visible lines

Anything that is not a recognised key:value pair — including an unknown key — is treated as free text.

state:M app.go

Modified files whose path contains app.go.

state:A+

Files scheduled with history — the A+ rows, which are where a copy or a move put its content. state:+ drops the code and takes any of them. Note that this finds the destination of a move; its source is a separate D row, which Main names when either half is highlighted. See copies and moves.

A code matches the row as it is drawn, so state:A is the plain adds only and leaves the A+ rows to state:A+. A state name covers both, since it is added either way: state:added takes the plain adds and the copies together.

A single letter is always read as a status code, never as part of a state name — state:D is the deleted rows, not everything with a d in its name. Two letters or more read as a name, which is what makes state:mod work.

cl:staged

Only the staged set. cl:unstaged is its counterpart, and cl:feature-x narrows to a named changelist.

The Files filter is shared by all four views — Changes, Changelists, Diffs and Rejects — so switching views with [ / ] keeps the same query. In the Diffs view only the free text applies, matched against the patch file name, and in the Rejects view likewise, matched against the reject’s path below the root.

A filter lasts as long as you keep it. To keep build output and generated files out of the Changes view for good, use a hide rule instead — it is remembered between sessions and leaves the filter free for looking things up.

rev:128 user:alice parser

Revision 128, authored by alice, with parser anywhere in the commit message.

date:2026-07 path:internal/svn

July 2026 revisions that touched something under internal/svn. date: is a substring match over YYYY-MM-DD HH:MM, so date:2026-07-14 pins a single day and date:2026-07 covers a month.

rev: is exact — rev:12 does not match revision 128.

Drilled into a compared range the panel lists files rather than revisions, so the filter narrows those instead — by path, or by what the range did to them:

state:deleted internal/svn

The two queries are written in different terms, so they are kept apart: the revisions’ own filter is set aside while you read a comparison and handed back when you leave it. The label in the input names whichever list is on screen.

No parameters; the whole query is a case-insensitive substring match over the visible lines. This is how you search inside a diff:

  1. 0 to focus Main.
  2. /, type the term, enter.
  3. n / N to walk the matches.

esc clears the focused panel’s query. It only consumes the keypress when there was a query to clear, so esc still backs out of a drilled-in changelist when no filter is active.

/ is in the Navigation section of the keybindings reference.