TMUX Easymotion

July 19, 2026 · View on GitHub

Tests

demo

Features

  • Cross-pane jumping - Jump between any visible pane in the same window
  • Two search modes - 1-char (s) and 2-char (s2, leap.nvim style)
  • CJK support - Proper handling of wide characters
  • Smartsign - Match shifted symbols (e.g., 1 matches !)
  • Distance-based hints - Closer matches get shorter hints
  • Frozen frames - Panes freeze the moment you trigger, so you always land on what you saw. On tmux ≥ 3.6 frozen views are read exactly; older tmux uses an approximation with known edge cases

Installation

Add plugin to the list of TPM plugins in ~/.tmux.conf:

set -g @plugin 'ddzero2c/tmux-easymotion#v1.4.0'
set -g @easymotion-s 's'

Press prefix + I to install

For development version: Use set -g @plugin 'ddzero2c/tmux-easymotion' (master branch, may be unstable)

Requirements

  • tmux ≥ 3.4 (Python 3.8+)
  • tmux ≥ 3.6 recommended: overlays of re-triggered or user-scrolled frozen panes are read directly from the frozen view (exact). Older tmux lacks a reliable way to read a copy-mode view (#{copy_cursor_line} truncates at wide characters before 3.6), so it falls back to reconstructing the frame from the live grid — accurate in common cases, but the frame can drift when a TUI rewrites its screen in place or the pane is resized while frozen.

Configuration

OptionDefaultDescription
@easymotion-ss1-character search key binding (opens the overlay; type the character on the frozen frame)
@easymotion-s2(none)2-character search key binding (leap.nvim style)
@easymotion-hintsasdghklqwertyuiopzxcvbnmfj;Characters used for hints
@easymotion-case-sensitivefalseCase-sensitive search
@easymotion-smartsignfalseMatch shifted symbols (e.g., 1 matches !)
@easymotion-copy-mode-no-prefixfalseBind keys directly in copy mode (no prefix required)
@easymotion-vertical-borderVertical border character
@easymotion-horizontal-borderHorizontal border character
@easymotion-use-cursesfalseUse curses instead of ANSI sequences
@easymotion-hint1-fg1;31SGR color code for the first hint character (bold red)
@easymotion-hint2-fg1;32SGR color code for the second hint character (bold green)
@easymotion-dim2SGR color code for the dimmed background text
@easymotion-debugfalseDebug logging to ~/easymotion.log
@easymotion-perffalsePerformance logging to ~/easymotion.log

Example configuration:

set -g @easymotion-s 's'
set -g @easymotion-s2 'f'
set -g @easymotion-hints 'asdfghjkl;'
set -g @easymotion-case-sensitive 'true'
set -g @easymotion-smartsign 'true'

# Custom colors (standard SGR codes: "1" bold, "4" underline,
# "31"-"37" / "90"-"97" basic colors, "38;5;N" for 256-color)
set -g @easymotion-hint1-fg '1;38;5;208'  # bold orange
set -g @easymotion-hint2-fg '1;38;5;33'   # bold blue
set -g @easymotion-dim '2;90'             # dim grey

Vim-like Configuration

set-window-option -g mode-keys vi
bind-key -T copy-mode-vi C-v send-keys -X begin-selection \; send-keys -X rectangle-toggle;
bind-key -T copy-mode-vi v send-keys -X begin-selection;
bind-key -T copy-mode-vi V send-keys -X select-line;

Usage

Copy a word: prefix + s → type character → select hint → press ve and y to copy

Paste: prefix + ] to paste

Development

# Install development dependencies
pip install -r requirements-dev.txt

# Run tests
pytest test_easymotion.py -v --cache-clear

Inspired by