Keyboard Customization
ZestSSH provides extensive keyboard customization on both desktop and mobile platforms.
Desktop Keyboard Shortcuts
Section titled “Desktop Keyboard Shortcuts”The desktop shell registers 40+ keyboard shortcuts via Flutter’s Shortcuts widget. On macOS, Ctrl is replaced with Cmd throughout.
Connection Management
Section titled “Connection Management”| Shortcut | Action |
|---|---|
Ctrl+T | Quick Connect dialog |
Ctrl+Shift+N | New Connection (open connection editor) |
Ctrl+W | Close current tab |
Ctrl+Shift+T | Reopen last closed tab |
Tab Navigation
Section titled “Tab Navigation”| Shortcut | Action |
|---|---|
Ctrl+Tab | Next tab |
Ctrl+Shift+Tab | Previous tab |
Ctrl+1 through Ctrl+9 | Jump to tab by index |
Split Panes
Section titled “Split Panes”| Shortcut | Action |
|---|---|
Ctrl+Shift+D | Split right (vertical split) |
Ctrl+Shift+E | Split down (horizontal split) |
Ctrl+\ | Close current split pane |
Ctrl+Shift+M | Toggle maximize focused pane |
Alt+Arrow | Move focus between panes (left/right/up/down) |
Layout Presets
Section titled “Layout Presets”| Shortcut | Action |
|---|---|
Ctrl+Alt+1 | Side-by-side (2 columns) |
Ctrl+Alt+2 | Stacked (2 rows) |
Ctrl+Alt+3 | 3 columns |
Ctrl+Alt+4 | 2x2 grid |
Ctrl+Alt+5 | Reset to single pane |
Ctrl+Alt+6 | 1 + 2 layout (one left, two right) |
Ctrl+Alt+7 | 2 + 1 layout (two left, one right) |
Ctrl+Alt+8 | 3 rows |
Terminal Operations
Section titled “Terminal Operations”| Shortcut | Action |
|---|---|
Ctrl+Shift+C | Copy selected text (when text is selected) |
Ctrl+Shift+V | Paste from clipboard |
Ctrl+Shift+F | Find / search in terminal |
Ctrl+Shift+S | SFTP file browser |
Ctrl+Shift+B | Toggle broadcast mode (type to all sessions) |
Font Size
Section titled “Font Size”| Shortcut | Action |
|---|---|
Ctrl+= | Increase font size |
Ctrl+- | Decrease font size |
Ctrl+0 | Reset font size to 14px |
Application
Section titled “Application”| Shortcut | Action |
|---|---|
Ctrl+Shift+K | Command palette |
Ctrl+B | Toggle sidebar collapse/expand |
Ctrl+, | Open settings |
F11 | Toggle fullscreen |
Command Palette
Section titled “Command Palette”The command palette (Ctrl+Shift+K) provides fuzzy-search access to all actions, connections, and settings, including Snippets. It mirrors VS Code’s command palette behavior:
- Type to filter commands
- Arrow keys to navigate
- Enter to execute
- Escape to dismiss
Mobile Soft Keyboard
Section titled “Mobile Soft Keyboard”On mobile (Android/iOS), ZestSSH adds a two-row toolbar above the system keyboard, styled after the JuiceSSH keyboard pattern. Both rows contain exactly 9 equal-width keys.
If you connect a hardware or Bluetooth keyboard to your phone or tablet, see Hardware or Bluetooth keyboard on Android and iPad in the Keyboard Shortcuts reference for exactly which keys work. The two rows can be hidden to give the terminal that space back: Settings > Terminal Behaviour > Extra Keyboard Row (“Show Ctrl, Tab, Esc, arrow keys above keyboard”).
Normal Layout
Section titled “Normal Layout”Row 1: [ESC] [/] [|] [-] [UP] [~] [HOME] [END] [FN]Row 2: [TAB] [CTRL] [ALT] [LEFT] [DOWN] [RIGHT] [DEL] [INS] [MIC]Arrow keys form a natural inverted-T pattern because UP and DOWN are at the same column index (position 5) in their respective rows.
FN Layer
Section titled “FN Layer”Pressing FN replaces both rows with function keys and navigation:
Row 1: [<-] [F1] [F2] [F3] [F4] [F5] [F6] [F7] [F8] [F9]Row 2: [F10] [F11] [F12] [PgUp] [PgDn] [INS] [DEL] [HOME] [END] [MIC]Press <- (back arrow) to return to the normal layout.
Modifier Keys
Section titled “Modifier Keys”CTRL and ALT are sticky toggles:
- Tap once to activate (highlighted). The next key press includes the modifier.
- They are mutually exclusive — activating one deactivates the other.
- The active modifier state is exposed to the parent terminal via a
ValueNotifier<SoftKeyModifier>, allowing the terminal provider to intercept system keyboard input and apply the modifier before sending to the shell.
Microphone Button
Section titled “Microphone Button”The microphone button (MIC) activates voice-to-text input for the terminal. This requires Squeezed and uses the device’s on-device speech recognition to convert spoken words into terminal commands.
Key Repeat
Section titled “Key Repeat”On the mobile soft keyboard, holding down a key triggers key repeat via a timer. Arrow keys and deletion keys support repeat for continuous movement and character deletion. The repeat rate is hardcoded at 400ms initial delay followed by 80ms repeat interval and is not user-configurable.
Touch Gestures (Mobile)
Section titled “Touch Gestures (Mobile)”In addition to the soft keyboard, the terminal supports advanced touch gestures:
| Gesture | Action |
|---|---|
| Two-finger tap | Send Ctrl+C (interrupt) |
| Three-finger tap | Paste from clipboard |
| Two-finger horizontal swipe | Switch between active sessions |
These gestures work in conjunction with the soft keyboard modifiers.
Pasting into the terminal (bracketed paste)
Section titled “Pasting into the terminal (bracketed paste)”ZestSSH supports bracketed paste mode on every platform, and it is always on: there is no setting to toggle, because the program running in the session decides.
What bracketed paste is and when it is active
Section titled “What bracketed paste is and when it is active”When a program turns bracketed paste on with the standard escape sequence (ESC [ ? 2004 h), which bash, zsh, fish, vim, neovim, tmux and most modern shells and editors do by default, the terminal emulator wraps everything you paste in the paste markers ESC [ 200 ~ and ESC [ 201 ~. The program then receives the paste as one block of text instead of as typed keystrokes. When the program turns the mode off, or never asked for it, pasted text is sent as plain input.
Every way of pasting uses the same path: Ctrl+Shift+V (Cmd+Shift+V on macOS), right-click and middle-click paste on desktop, the three-finger tap and the long-press menu on mobile, and the paste shortcut of a hardware keyboard.
What you will notice in vim, neovim and shells
Section titled “What you will notice in vim, neovim and shells”- vim and neovim: pasted text is inserted verbatim, with no auto-indent cascade, no abbreviation expansion and no accidental Normal-mode commands. You do not need
:set paste. - bash, zsh, fish: a multi-line paste lands at the prompt as one editable block (continuation lines show as
>) and nothing runs until you press Enter once. A trailing newline in the clipboard does not execute the last line. - Line endings: every paste normalises Windows
CRLF, loneCRand loneLFline breaks to a single carriage return before sending, so text copied from a Windows app is not double spaced on the remote side. - Safety: if the clipboard itself contains a paste-end marker (a known trick to smuggle commands through a paste), ZestSSH removes it before wrapping, so a pasted block cannot close the bracket early and start executing.
Paste guards: dangerous command protection and mobile Confirm Paste
Section titled “Paste guards: dangerous command protection and mobile Confirm Paste”Two optional guards can run before the app sends a paste, independent of bracketed paste:
- Dangerous command protection (on by default; desktop: Settings > Security > Safety; mobile: the gear icon in the terminal toolbar, “Command Protection”) warns before pasting, running a snippet, or broadcasting destructive commands like
rm -rforshutdown. Commands you type directly are not checked. - On mobile, the three-finger tap and the long-press menu paste show a Confirm Paste dialog with a preview when the clipboard holds more than one line or more than 500 characters.