fzf: 0.71.0

0.71.0 #

(Apr 2026)

Quick summary #

This release brings significant performance improvements, Zellij integration, and a new --id-nth option for tracking items across reloads.

TypeClassNameDescription
EnhancementPerfLinearly scalable search performance across CPU cores
EnhancementPerf86x reduction in cache memory footprint per entry
NewOption--popupNew name for --tmux with Zellij support
NewOption--id-nthDefine item identity fields for cross-reload operations
EnhancementShellbash CTRL-RMulti-select and shift-delete to delete entries
EnhancementShellfish CTRL-RImproved command history
EnhancementShellfish SHIFT-TABRewritten completion script

1. Performance improvements #

The search performance now scales linearly with the number of CPU cores. Previously, fzf used static partitioning with more threads than the number of cores to mitigate uneven load distribution, but still couldn’t fully utilize all cores. This version replaces it with a shared work queue, allowing proper load balancing across threads and full utilization of available cores, leading to up to 1.3x speedup.

=== 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%)

The cache structure has also been improved, reducing memory footprint per entry by 86x. With the reduced per-entry cost, the cache now covers queries with up to 50% match rate, up from 20%.

2. Zellij integration via --popup #

--tmux has been renamed to --popup to reflect its expanded scope. --popup starts fzf in a tmux popup or a Zellij floating pane, depending on which terminal multiplexer you’re running.

  • --tmux is now an alias for --popup
  • Requires tmux 3.3+ or Zellij 0.44+
# Opens fzf in a tmux popup or Zellij floating pane
fzf --popup

3. Cross-reload item identity with --id-nth #

Since reload can bring a completely different set of items, fzf used to drop --multi selections and disable --track on reload. There was no way to correlate items between the old and new lists.

The new --id-nth option solves this by letting fzf identify items by specified fields. With an identity defined, fzf can find the same item in the new list after a reload, preserving tracking and selections.

Identifying items by a specific field is useful when some columns change between reloads while the identity remains the same. For example, when monitoring processes, CPU and memory usage will change on every reload, but the PID stays the same. --id-nth 1 lets fzf correlate items after reload by PID regardless of the changing values in other columns.

Tracking with --track #

When a reload is triggered with tracking enabled, fzf searches for the tracked item by its identity fields in the new list.

# Track by the entire line
fzf --track --id-nth ..

# Track by the first field
fzf --track --id-nth 1
  • --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

Preserving multi-selections #

With --multi, selected items are preserved across reload-sync by matching their identity fields. Previously, selections were lost on reload.

4. Shell integration enhancements #

bash #

  • CTRL-R now supports multi-select and shift-delete to delete history entries (#4715)

fish #

Thanks to @bitraid, the fish shell integration has seen significant improvements. Minimum fish version requirement is now 3.4.0.

CTRL-R (#4703) #

  • Multi-selection support
  • shift-delete to delete selected commands from history
  • alt-t to cycle through timestamp display modes (epoch, date/time, none)
  • alt-enter to reformat and insert selected commands via fish_indent
  • Proper handling of commands with trailing newlines and special characters

SHIFT-TAB completion rewrite (#4731) #

The completion script has been rewritten from scratch with a simpler API.

  • Wildcard expansion: if the current token contains a glob pattern (e.g. *.txt), fzf searches the expanded path list
  • New FZF_EXPANSION_OPTS variable for configuring wildcard expansion
  • Simplified custom completion: define _fzf_complete_COMMAND to call fzf_complete with custom options

Bug fixes and improvements #

  • GET / HTTP endpoint now includes positions field in each match entry, providing the indices of matched characters for external highlighting (#4726)
  • --walker=follow no longer follows symlinks whose target is an ancestor of the walker root, avoiding severe resource exhaustion (#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)
Last modified: Apr 4, 2026
Copyright © 2025 Junegunn Choi