-
Notifications
You must be signed in to change notification settings - Fork 0
Usage
This page covers day-to-day use of a go-term terminal. Falcon implements
all of it, and any other term/workspace embedder does too. Key names are
the macOS and Linux defaults. On Windows, Cmd becomes Ctrl+Shift.
Cmd+/ opens the in-app help overlay. It is generated from the live
binding table, so it is always accurate for your config.
| Chord | Action |
|---|---|
Cmd+D / Cmd+Shift+D
|
Split vertically / horizontally |
Cmd+[ / Cmd+]
|
Previous / next pane |
Cmd+Ctrl+←↑↓→ |
Resize the split |
Cmd+T / Cmd+Shift+W / Cmd+Ctrl+W
|
New tab / close pane / close tab |
Cmd+1…Cmd+9, Cmd+Shift+[ / ]
|
Select tab, previous / next tab |
New tabs and splits inherit the focused pane's working directory. That needs the OSC 7 report the shell integration hooks emit. See below.
| Chord | Action |
|---|---|
Cmd+C / Cmd+V
|
Copy / paste (Ctrl+Shift+C/V also) |
Cmd+Shift+U / Cmd+Shift+Y
|
Link hints: open / copy the labelled link |
Cmd+Shift+Space |
Copy mode |
Releasing a mouse selection copies it. There is no separate copy step for
the mouse. On X11 the selection is also published as PRIMARY, the buffer
middle click pastes. It is independent of the clipboard. Cmd+C and a
mouse selection can hold two different values at once.
term.hints labels every link in the pane with a letter. Press the letter
to open the link. term.hints-copy copies the URL instead. Both OSC 8
hyperlinks and plain http/https/mailto text are labelled, and the OSC
8 destination wins where a link is both. Only those three schemes are ever
opened. A hostile destination cannot invoke an arbitrary handler.
Cmd+F opens the search bar. Ctrl+R toggles regex, Enter and
Shift+Enter move between matches. The bar stays open while you edit, and
the pane scrolls to each match.
Cmd+Shift+Space enters copy mode: a vim-keyed state for scrolling the
buffer and selecting text without a mouse. While it is active, no key
reaches the shell, and incoming output freezes so the text you select
cannot scroll away. A click anywhere leaves the mode.
| Action | Default | Does |
|---|---|---|
| Exit |
Escape / q
|
Leave copy mode |
| Left / Down / Up / Right |
h / j / k / l
|
Move one cell |
| Word forward / back |
w / b
|
Move by word |
| Line start / end |
0 / $
|
Move to first column / last non-blank cell |
| Top / bottom |
g / G
|
Move to oldest scrollback row / newest row |
| Half page |
Ctrl+U / Ctrl+D
|
Move half a screen |
| Page |
PageUp / PageDown (also Ctrl+B / Ctrl+F) |
Move one screen |
| Select char / line |
v / V
|
Start or cancel a selection |
| Yank |
y / Enter
|
Copy the selection and exit |
| Search forward / back |
/ / ?
|
Open the search bar |
| Next / previous match |
n / N
|
Move between matches |
| Previous / next prompt mark |
[ / ]
|
Move between shell prompts |
With no selection yet, y copies the single cell under the cursor.
Pressing v or V a second time cancels the selection without leaving the
mode. In the search bar, Enter moves the cursor onto the match and closes
the bar. Shift+Enter does the same backwards. Escape closes the bar and
stays in copy mode.
The $ and ? defaults are US-layout Shift+4 and Shift+/. On another
layout, rebind them to whatever your keyboard actually produces.
Cmd+Shift+T opens the theme browser: a searchable list of every theme the
embedder registered, with a live preview. Falcon registers the built-in
Default plus 602 bundled themes. Type to filter, Up/Down to move,
Enter to apply. The names are also valid for the theme key in the
config file. See Configuration.
A light theme switches falcon's window chrome to light. Children that follow the terminal, like neovim and delta, re-theme themselves along with it.
Cmd+Shift+P opens a searchable list of everything you can invoke. It
spans both registries: the workspace.* commands and the term.* actions
of the focused pane. Type to filter, Up/Down to move, Enter to run,
Escape to clear the filter and then to close.
Actions you have unbound are not listed: the palette invokes an action by
way of its chord, so an action with no chord has no way to run. The wheel
scrolls the list without moving the selection, so a nudged mouse cannot
retarget what Enter runs.
Cmd+Shift+I mirrors what you type into every live pane in the active
tab. While it is on, the split dividers turn amber and a broadcast badge
sits at the bottom of the window. Typed keys and pastes are mirrored.
Mouse reporting, selection, copy, and scrolling stay per-pane. Broadcast
never persists: a restored workspace starts with it off.
| Gesture | Effect |
|---|---|
| Drag | Select by character |
| Double click | Select the word under the pointer. Drag to extend word by word |
| Triple click | Select the whole logical line. Drag to extend line by line |
Alt+drag |
Rectangular selection |
Shift+click |
Extend the selection to the click point |
| Middle click | Paste, when middle-click-paste is on |
Cmd/Ctrl+click |
Open the URL under the pointer |
A word is a run of non-blank characters with no punctuation class.
Double-clicking grabs a whole path, URL, or --flag=value rather than
stopping at every / or -. A logical line follows soft wraps, so
triple-clicking one row of a wrapped paragraph selects all of it. Clicking
a fourth time returns to character selection.
middle-click-paste defaults on for Linux, which has PRIMARY and the
muscle memory that goes with it, and off for macOS and Windows. Where there
is no PRIMARY, the gesture pastes the clipboard instead. A child that
enabled mouse reporting always receives the middle button itself.
One wheel notch scrolls three rows. This matches xterm, kitty, and
Windows Terminal. On the alternate screen, where pagers like less and man never
enable mouse reporting, the wheel sends Up/Down keys instead, one per
row of scroll distance. Full-screen applications that do report the mouse,
like vim with mouse=a, receive real wheel events unchanged.
Prompt jumping, failure jumping, whole-output selection, and the long-command notification need your shell to mark where commands begin and end. The shell prints OSC 133 marks around each command. Until the hooks are installed, these do nothing:
-
Cmd+Up/Cmd+Down— jump to the previous / next prompt -
Cmd+Shift+E— jump to the last failed command -
Cmd+Shift+O— select a command's whole output - Failure ticks in the scrollbar
notify-after
Open a new pane in the current directory also depends on the OSC 7 report the same hooks emit.
Add this line to your shell's rc file. It points at this repository's copy of the script:
# ~/.bashrc
source /path/to/go-term/scripts/shell-integration/goterm.bash# ~/.zshrc
source /path/to/go-term/scripts/shell-integration/goterm.zsh# ~/.config/fish/config.fish
source /path/to/go-term/scripts/shell-integration/goterm.fishThen start a new shell.
The scripts are safe to source twice, and they append to any
precmd/preexec chain you already have rather than replacing it. They
emit nothing that other terminals mind. iTerm2, kitty, and WezTerm read
the same marks, so one rc file works everywhere.
Two notes:
- fish 4.0 and newer need nothing. They emit the whole set natively. The fish script exists only for fish 3.x.
- bash can only preserve a
DEBUGtrap it can see. If you set your owntrap … DEBUG, load bash-preexec before this script. It is detected and used, and then nothing fights over the trap.
Cmd+Shift+E scrolls to the most recent command that exited non-zero, and
each failure gets a red tick in the scrollbar track. Repeated presses walk
back through older failures and then wrap to the newest. A command whose
shell reported no exit status never counts as a failure.
Cmd+Shift+O selects exactly the output region of the command under the
cursor and enters copy mode with that selection live, so y or Cmd+C
copies it. On a fresh prompt it selects the previous command's output,
which is the usual case right after a command finishes.
Set notify-after in the config file, and a desktop notification fires
when a command that ran at least that long finishes while you look
somewhere else. A command that finishes in the pane you watch never
notifies, because you saw it happen.
[general]
notify-after = 30The notification names the command and reports the duration, plus the exit status when the command failed.
A tab you are not looking at shows a marker to the left of its title:
| Marker | Meaning |
|---|---|
● |
The pane produced output |
○ |
It produced output, then went quiet for 10 seconds |
! |
The pane rang the bell |
Switching to the tab clears the marker. These need no shell integration. They follow raw output, not marks.
Record a session to a .gtr file and play it back through the emulator
itself. Recordings store the PTY's bytes verbatim, so malformed output
survives the round trip. Keystrokes are captured only when explicitly
enabled, and falcon leaves them off.
Cmd+Shift+R toggles recording on the focused pane. Recordings land in
the recordings subdirectory of the go-term config directory. The
gotermrec CLI inspects and converts them:
go run ./term/gotermrec info session.gtr
go run ./term/gotermrec play session.gtr
go run ./term/gotermrec export session.gtr -cast session.castinfo shows geometry, duration, and frame counts. play replays with
timing in any terminal. export writes asciicast v2.
Play a recording in falcon:
falcon --replay session.gtrSpace pauses, +/- change speed, . steps, and 0 restarts. --replay
is a viewer path: one pane, no tabs, no shell, no workspace persistence.
This is the preferred way to file a rendering bug: a recording reproduces the problem instead of describing it.
Cmd+= / Cmd+- / Cmd+0 zoom the font in, out, and reset. The zoom is
an absolute point size on top of the configured size.
While a full-screen app owns the alternate screen, plain PageUp and
PageDown pass through to the app. Only Shift+PageUp and Shift+PageDown
scroll go-term's scrollback. That is the "hold Shift to talk to the
terminal, not the app" idiom.
If you rebind the two scroll actions to a chord without Shift, they do
not reach scrollback while the alternate screen is active. term.scroll-top
and term.scroll-bottom have no such gate and rebind freely.
OSC 1337 File= transfers are saved to ~/Downloads in falcon. This
matches iTerm2. Transfers are opt-in per embedder, so this is falcon's
policy, not the library's. They are disabled entirely when the home
directory cannot be resolved. The DownloadDir field in term.Cfg or
workspace.Cfg changes the destination.