tmux-fzf: A Faster tmux Control Surface with fzf
Use fzf to manage your tmux work environment!
At a glance
- What is it?
- sainnhe/tmux-fzf gives tmux users an fzf-based interface for sessions, windows, panes, commands, key bindings, clipboard history, processes, and custom commands. It is a good fit for keyboard-oriented tmux users, but it adds Bash, fzf, and configuration dependencies.
- Who is it for?
- Adopt tmux-fzf if you already use tmux and fzf and want one searchable control surface. Do not choose it if a lightweight plugin-free tmux setup is more important.
- Can I use it commercially?
- Yes. MIT is a permissive licence: you can use, modify and sell software built on it, as long as you keep its copyright and licence notices.
- Is it still maintained?
- Yes. The repository last received commits 7 days ago.
- What is it written in?
- Mainly Shell, according to GitHub's language statistics.
Answers come from the project's GitHub data, last synced on October 23, 2026, and from our analysis. They are not legal advice.
Editorial analysis
What tmux-fzf Changes in a tmux Workflow
tmux-fzf addresses a specific problem: tmux exposes many operations through separate commands and key bindings, while fzf provides a searchable selection interface. The plugin is for users who already spend time switching sessions, moving windows, rearranging panes, running commands, recalling clipboard entries, and inspecting processes inside tmux. Its purpose is not to replace tmux. It acts as an interface over the terminal multiplexer.
The documented scope is broad. Sessions can be switched, created, renamed, detached, and killed. Windows support switching, linking, moving, swapping, renaming, and killing. Pane actions include switching, breaking, joining, swapping, layout changes, killing, and resizing. The plugin also searches commands, key bindings, clipboard history, and processes, then previews sessions, windows, and panes.
That concentration matters for terminal users who already know tmux concepts but do not want to memorize every command. The interface is launched with `prefix` + `F`, and some actions accept multiple selections through `TAB` and `Shift-TAB`. The README describes most features as working out of the box. Configuration is available for the launch key, fzf behavior, preview behavior, action order, display formats, and custom menus.
The fzf and tmux Selection Flow
Based on the repository layout, the project has its main plugin file in `main.tmux`, entry logic in `main.sh`, and supporting files under `scripts/`. The README documents the interaction model rather than the implementation internals. It states that launching tmux-fzf opens an fzf interface whose actions cover tmux resources and terminal data.
The key architectural point is that fzf supplies searchable selection while tmux supplies the objects and operations. Session, window, and pane records are presented as selectable entries, with preview support for relevant objects. Command search can append a selected command to the command prompt. Key-binding search can execute a selected binding. Clipboard results can be pasted into the current window, while process actions can send signals or launch tools such as `top` and `pstree`.
Some behavior delegates to tmux semantics rather than creating a separate resource model. The kill-window action is a notable example. The plugin uses `tmux unlink-window -k` instead of `tmux kill-window`. According to the README, this unlinks the current window when that window exists in multiple sessions, but kills it when it exists in only one session. That choice protects other session references when windows are linked, but it also means the action called `kill` does not map directly to tmux's `kill-window` command.
Installing tmux-fzf Through TPM
The project documents installation through TPM. Its requirements are GNU bash, `sed`, and `junegunn/fzf`. `CopyQ` is optional because it enables access to the system clipboard, while the plugin falls back to built-in tmux buffers when `copyq` is not executable. `pstree` is also optional and is used to display the process tree.
Before installation, the README recommends checking whether tmux can locate fzf. This check is useful because a shell may find fzf while the environment used by tmux does not.
tmux run-shell -b 'command -v fzf'The command asks tmux's shell environment to locate `fzf`. A successful check should produce the executable path. If it produces nothing, the README indicates that tmux cannot currently find fzf.
Add the plugin declaration to `~/.tmux.conf`:
set -g @plugin 'sainnhe/tmux-fzf'After reloading the tmux configuration, press `prefix` + `I` to install the plugin. The first real use is then `prefix` + `F`. This opens tmux-fzf, where the available actions and resources can be searched.
First Uses: Preview, Selection, and tmux Resources
Start with the default launch binding and preview the resource lists before changing destructive settings. Press `prefix` + `F`, then inspect the actions offered by fzf. The documented order includes sessions, windows, panes, commands, key bindings, clipboard history, and processes, although the configuration examples show that the order can be changed or shortened.
Preview is enabled by default. It is intended to help identify a session, window, or pane before switching to it. For large tmux environments, the README documents a follow mode that can be disabled with `TMUX_FZF_PREVIEW_FOLLOW=0`. The display itself can be formatted for panes, windows, and sessions through separate variables. This is useful when the default tmux listing does not expose enough context, such as the current command or activity state.
Multiple selection is supported for some actions. Mark entries with `TAB`, move the selection with `Shift-TAB`, and apply the selected action. That model is appropriate for repeated session, window, or pane operations, but the README does not enumerate every action for which multi-selection is implemented. Users should therefore treat multi-selection as action-specific rather than assuming every menu item supports it.
A first operational test is to switch to a session, open a window, and inspect a pane preview without making changes. After that, try command and key-binding search, which exercises features beyond basic navigation. Process management should be approached more carefully because the menu includes termination and signal-related actions, including interrupt, continue, stop, quit, hangup, and kill.
Configuring tmux-fzf Without Rebuilding the Interface
The plugin is configurable through tmux environment variables, which is useful for matching an existing tmux setup rather than accepting defaults. The launch key can be changed from the documented `prefix` + `F` binding with the following line in `~/.tmux.conf`:
TMUX_FZF_LAUNCH_KEY="C-f"The fzf interface reads fzf environment variables, so prompt, color, and related behavior can be customized through those variables. The plugin also reads `TMUX_FZF_OPTIONS` for options passed to the bundled `fzf-tmux` command. The README gives these default examples:
# Default value in tmux < 3.2
TMUX_FZF_OPTIONS="-m"
# Default value in tmux >= 3.2
TMUX_FZF_OPTIONS="-p -w 62% -h 38% -m"The popup feature depends on tmux 3.2 or later. The README states that popup behavior is automatic for tmux 3.2 and later, while `TMUX_FZF_OPTIONS` can disable or alter the relevant fzf behavior. Preview can be hidden with `TMUX_FZF_PREVIEW=0`, and action categories can be limited with `TMUX_FZF_ORDER`. For example, this configuration removes clipboard and process entries:
TMUX_FZF_ORDER="session|window|pane|command|keybinding"These settings make the plugin adjustable without changing its source code. They also introduce more configuration decisions, especially for users who want the plugin to remain limited to navigation rather than process or clipboard operations.
Custom Menus, Clipboard Fallback, and tmux Compatibility
The optional user menu is disabled by default. Once enabled, it adds a `menu` entry to the tmux-fzf interface and maps displayed names to commands. The README warns that entries and commands are separated by escaped newlines, and that leading spaces or tabs should not be added. Commands run through `tmux -c`, so the selected command must work in that execution context.
TMUX_FZF_MENU=\
"foo\necho 'Hello!'\n"\
"bar\nls ~\n"\
"sh\nsh ~/test.sh\n"A menu can also appear in a popup window by setting `TMUX_FZF_MENU_POPUP=1`. The documented popup dimensions default to `TMUX_FZF_MENU_POPUP_WIDTH=50%` and `TMUX_FZF_MENU_POPUP_HEIGHT=50%`. This is useful when the current pane should remain visible or when a menu needs a bounded display area.
Clipboard support has a clear dependency boundary. `CopyQ` provides system clipboard access, but the plugin falls back to built-in tmux buffers when it is unavailable. That fallback is convenient for remote tmux sessions and minimal systems, but it does not promise parity with system clipboard integration. Likewise, popup support is tied to tmux 3.2, while `pstree` is optional for process-tree display. A user should not install the plugin without checking which optional facilities are relevant to the intended environment.
Limits, Alternatives, and Maintenance Cost
The main limitation is dependency and configuration complexity. tmux-fzf is not a self-contained replacement for tmux or fzf. It requires GNU bash, `sed`, and fzf, and its useful feature set expands when `CopyQ`, `pstree`, and a sufficiently recent tmux are available. Users who want a minimal tmux configuration may find a separate plugin an unnecessary addition.
A real alternative is plain tmux plus fzf used as separate commands. That approach gives the user direct control over each tmux query and action, without the plugin's grouped menu, preview defaults, custom variable system, or bundled `fzf-tmux` integration. The trade-off is manual configuration. tmux-fzf is more useful when a user wants the documented action set in one interface, while direct tmux commands are easier to inspect and adapt for a narrowly scripted workflow.
The repository uses the MIT license. That means the source is distributed under permissive licensing terms, but the MIT text should be reviewed for the project's actual obligations and notices rather than treated as a substitute for legal advice. The repository has no GitHub releases, so upgrades are not presented through a documented release channel. Based on the repository status, it is not archived, and the last push was on 2026-08-10. Upgrade planning should account for changes to tmux, fzf, and the plugin configuration rather than relying on versioned release notes.
Editorial conclusion
Adopt tmux-fzf if you already use tmux and fzf and want one searchable control surface. Do not choose it if a lightweight plugin-free tmux setup is more important. Verify your tmux and fzf versions, inspect the default action order and key bindings, and confirm that linked-window behavior matches how you manage shared windows before enabling the plugin.
Frequently asked questions
How do I install tmux-fzf in tmux?
Add `set -g @plugin 'sainnhe/tmux-fzf'` to `~/.tmux.conf`, reload the tmux configuration, and press `prefix` + `I`. The README lists GNU bash, `sed`, and `junegunn/fzf` as requirements.
How do I launch tmux-fzf after installation?
Press `prefix` + `F`. The key can be changed with `TMUX_FZF_LAUNCH_KEY`, with `C-f` given as the example configuration.
What happens when tmux-fzf kills a window?
The `kill` action uses `tmux unlink-window -k` rather than `tmux kill-window`. It removes only the current window when that window is linked into multiple sessions, while a window present in one session is killed.
Does tmux-fzf require CopyQ and pstree?
No. CopyQ is optional for system clipboard access, with fallback to built-in tmux buffers. `pstree` is optional and is used to display process trees.
Can tmux-fzf show menus in a popup window?
Yes. Set `TMUX_FZF_MENU_POPUP=1` to enable the custom menu popup. The documented size defaults are `TMUX_FZF_MENU_POPUP_WIDTH=50%` and `TMUX_FZF_MENU_POPUP_HEIGHT=50%`.
Official sources
Add this badge to your README
If you maintain this project, the badge below links readers to this analysis and shows its maintenance status from the daily GitHub snapshot. Paste the markdown into your README; add ?metric=license or ?metric=stars to the image URL for a different field.
[](https://hysenlabs.com/projects/sainnhe-tmux-fzf)Was this useful?