Skip to content

Keyboard Customization

ZestSSH provides extensive keyboard customization on both desktop and mobile platforms.

The desktop shell registers 40+ keyboard shortcuts via Flutter’s Shortcuts widget. On macOS, Ctrl is replaced with Cmd throughout.

ShortcutAction
Ctrl+TQuick Connect dialog
Ctrl+Shift+NNew Connection (open connection editor)
Ctrl+WClose current tab
Ctrl+Shift+TReopen last closed tab
ShortcutAction
Ctrl+TabNext tab
Ctrl+Shift+TabPrevious tab
Ctrl+1 through Ctrl+9Jump to tab by index
ShortcutAction
Ctrl+Shift+DSplit right (vertical split)
Ctrl+Shift+ESplit down (horizontal split)
Ctrl+\Close current split pane
Ctrl+Shift+MToggle maximize focused pane
Alt+ArrowMove focus between panes (left/right/up/down)
ShortcutAction
Ctrl+Alt+1Side-by-side (2 columns)
Ctrl+Alt+2Stacked (2 rows)
Ctrl+Alt+33 columns
Ctrl+Alt+42x2 grid
Ctrl+Alt+5Reset to single pane
Ctrl+Alt+61 + 2 layout (one left, two right)
Ctrl+Alt+72 + 1 layout (two left, one right)
Ctrl+Alt+83 rows
ShortcutAction
Ctrl+Shift+CCopy selected text (when text is selected)
Ctrl+Shift+VPaste from clipboard
Ctrl+Shift+FFind / search in terminal
Ctrl+Shift+SSFTP file browser
Ctrl+Shift+BToggle broadcast mode (type to all sessions)
ShortcutAction
Ctrl+=Increase font size
Ctrl+-Decrease font size
Ctrl+0Reset font size to 14px
ShortcutAction
Ctrl+Shift+KCommand palette
Ctrl+BToggle sidebar collapse/expand
Ctrl+,Open settings
F11Toggle fullscreen

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

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”).

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.

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.

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.

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.

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.

In addition to the soft keyboard, the terminal supports advanced touch gestures:

GestureAction
Two-finger tapSend Ctrl+C (interrupt)
Three-finger tapPaste from clipboard
Two-finger horizontal swipeSwitch 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, lone CR and lone LF line 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 -rf or shutdown. 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.