Skip to content
overterm
Documentation

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.

⎋ — 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.