Release highlights: https://junegunn.github.io/fzf/releases/0.71.0/
- Added --popup as a new name for --tmux with Zellij support
- --popup starts fzf in a tmux popup or a Zellij floating pane
- --tmux is now an alias for --popup
- Requires tmux 3.3+ or Zellij 0.44+
- Cross-reload item identity with --id-nth
- Added --id-nth=NTH to define item identity fields for cross-reload operations
- When a reload is triggered with tracking enabled, fzf searches for the tracked item by its identity fields in the new list.
- --track --id-nth .. tracks by the entire line
- --track --id-nth 1 tracks by the first field
- --track without --id-nth retains the existing index-based tracking behavior
- The UI is temporarily blocked (prompt dimmed, input disabled) until the item is found or loading completes.
- Press Escape or Ctrl-C to cancel the blocked state without quitting
- Info line shows +T* / +t* while searching
- With --multi, selected items are preserved across reload-sync by matching their identity fields
- Performance improvements
- The search performance now scales linearly with the number of CPU cores, as we dropped static partitioning to allow better load balancing across threads.
=== query: 'linux' ===
[all] baseline: 21.95ms current: 17.47ms (1.26x) matches: 179966 (12.79%)
[1T] baseline: 179.63ms current: 180.53ms (1.00x) matches: 179966 (12.79%)
[2T] baseline: 97.38ms current: 90.05ms (1.08x) matches: 179966 (12.79%)
[4T] baseline: 53.83ms current: 44.77ms (1.20x) matches: 179966 (12.79%)
[8T] baseline: 41.66ms current: 22.58ms (1.84x) matches: 179966 (12.79%)
- Improved the cache structure, reducing memory footprint per entry by 86x.
- With the reduced per-entry cost, the cache now has broader coverage.
- Shell integration improvements
- bash: CTRL-R now supports multi-select and shift-delete to delete history entries (#4715)
- fish:
- Improved command history (CTRL-R) (#4703) (@bitraid)
- Rewrite completion script (SHIFT-TAB) (#4731) (@bitraid)
- Increase minimum fish version requirement to 3.4.0 (#4731) (@bitraid)
- GET / HTTP endpoint now includes positions field in each match entry, providing the indices of matched characters for external highlighting (#4726)
- Allow adaptive height with negative value (--height=~-HEIGHT) (#4682)
- Bug fixes
- --walker=follow no longer follows symlinks whose target is an ancestor of the walker root, avoiding severe resource exhaustion when a symlink points outside the tree (e.g. Wine's z: → /) (#4710)
- Fixed AWK tokenizer not treating a new line character as whitespace
- Fixed --{accept,with}-nth removing trailing whitespaces with a non-default --delimiter
- Fixed OSC8 hyperlinks being mangled when the URL contains unicode characters (#4707)
- Fixed --with-shell not handling quoted arguments correctly (#4709)
- Fixed child processes not being terminated on Windows (#4723) (@pjeby)
- Fixed preview scrollbar not rendered after toggle-preview
- Fixed preview follow/scroll with long wrapped lines
- Fixed tab width when --frozen-left is used
- Fixed preview mouse events being processed when no preview window exists
- zsh: Fixed history widget when sh_glob option is on (#4714) (@EvanHahn)