Search
One overlay over the terminal's scrollback, the checkout's file names and their contents.
⌘F opens one search field over the terminal. It answers three different questions at once, and the rows say which is which: the terminal’s scrollback, the checkout’s file names, and the text in those files.
Edit ▸ Search Terminal & Files… opens the same overlay. Opening it un-zooms a zoomed editor or browser, because it searches the terminal and a zoomed column hides it.
The three row types
| Row | Tag | Source | What ↩ does |
|---|---|---|---|
| the terminal | Terminal |
libghostty’s own search, highlighting live behind the overlay | keeps the search and shows the compact find bar |
| a file name | File |
git ls-files -z --cached --others --exclude-standard |
opens it in the editor |
| a line | In file |
git grep -z -n -I -F -i --untracked |
opens that file in the editor at that line |
The terminal row says “1 match” or “12 matches” once libghostty has counted them, and “searching…” until it has.
Both git commands matter for what you do not see. ls-files with
--others --exclude-standard lists tracked files plus untracked ones that
are not ignored, so node_modules and build output never appear. git grep
with -F is a fixed-string search, -i case-insensitive, -I skips
binaries, and --untracked covers the same set as the file list.
File names are ranked fuzzily with the name weighted over the path, so
typing appdel finds AppDelegate.swift wherever it lives. At most twelve
file rows.
The content search needs at least two characters and settles for about
150 ms after you stop typing, then caps itself at three matches per file and
fifty in total. Each keystroke cancels the previous search, which also stops
the git grep behind it.
Outside a git repository only the terminal row appears, and the placeholder says so.
Esc, and keeping the search
⎋ — or a click outside — closes the overlay and ends the terminal search, so the highlights go and the keyboard returns to the terminal.
Choosing the terminal row is the one way to keep it. The overlay closes, the
highlights stay, and a compact find bar appears in the corner of the terminal
with the needle, a 3/12 counter and three buttons:
| Key / button | What it does |
|---|---|
| ↩ | next match |
| ⇧↩ | previous match |
| ⎋ | back to the terminal, keeping the highlights; again with an empty field, the search ends |
| ✕ | ends the search |
That two-step ⎋ is Ghostty’s behaviour, kept deliberately.
⌘-click on a printed path
Any path:line printed in the terminal — by a compiler, a test runner,
git grep — is ⌘-clickable and opens in the
editor at that line. The formats recognised are:
src/main.swift:42
src/main.swift:42:17
src/main.swift(42)
src/main.swift(42, 17)
The column is read and discarded; the line is used. ~ is expanded, an
absolute path is used as it is, and a relative path is resolved against the
pane’s own directory, then the tab’s, then the checkout’s root — which is
what makes the repository-relative paths that compilers and git grep print
work.
The whole text is tried as a filename before it is split on a colon, so
a file genuinely called a:1 still opens.
If it is not an existing regular text file, the click falls through: a directory, a URL, an image or a PDF goes to the system opener or the browser, depending on your link setting. A binary is never opened in the editor — an image opens better in its own app than as “Binary file.”
Hovering a link shows what is under the pointer in the pane header, with “⌘-click to open”. It is in the header rather than a popover at the pointer because libghostty reports the link without a rectangle to anchor one to, and a popover under the cursor would fight selecting the text it covers.