0.63.0 #
(June 2025)
Screenshot #

git ls-files | fzf --style full --scheme path \
--border --padding 1,2 \
--ghost 'Type in your query' \
--border-label ' Demo ' --input-label ' Input ' --header-label ' File Type ' \
--footer-label ' MD5 Hash ' \
--preview 'BAT_THEME=gruvbox-dark fzf-preview.sh {}' \
--bind 'result:bg-transform-list-label:
if [[ -z $FZF_QUERY ]]; then
echo " $FZF_MATCH_COUNT items "
else
echo " $FZF_MATCH_COUNT matches for [$FZF_QUERY] "
fi
' \
--bind 'focus:bg-transform-preview-label:[[ -n {} ]] && printf " Previewing [%s] " {}' \
--bind 'focus:+bg-transform-header:[[ -n {} ]] && file --brief {}' \
--bind 'focus:+bg-transform-footer:if [[ -n {} ]]; then
echo "MD5: $(md5sum < {})"
echo "SHA1: $(sha1sum < {})"
echo "SHA256: $(sha256sum < {})"
fi' \
--bind 'ctrl-r:change-list-label( Reloading the list )+reload(sleep 2; git ls-files)' \
--color 'border:#aaaaaa,label:#cccccc' \
--color 'preview-border:#9999cc,preview-label:#ccccff' \
--color 'list-border:#669966,list-label:#99cc99' \
--color 'input-border:#996666,input-label:#ffcccc' \
--color 'header-border:#6699cc,header-label:#99ccff' \
--color 'footer:#ccbbaa,footer-border:#cc9966,footer-label:#cc9966'
Asynchronous transformation #
fzf provides a set of transform-*
actions to transform the elements using
the output of an external command.
# Display file information in the header section
fzf --bind 'focus:transform-header:file {}'
However, these actions are synchronous and block the UI until the command completes, so you shouldn’t use a command that takes a while to run.
To address this limitation, fzf now provides a new set of bg-transform-*
actions that run asynchronously in the background.
# It's okay for the commands to take a little while because they run in the background
GETTER='curl -s http://metaphorpsum.com/sentences/1'
fzf --style full --border --preview : \
--bind "focus:bg-transform-header:$GETTER" \
--bind "focus:+bg-transform-footer:$GETTER" \
--bind "focus:+bg-transform-border-label:$GETTER" \
--bind "focus:+bg-transform-preview-label:$GETTER" \
--bind "focus:+bg-transform-input-label:$GETTER" \
--bind "focus:+bg-transform-list-label:$GETTER" \
--bind "focus:+bg-transform-header-label:$GETTER" \
--bind "focus:+bg-transform-footer-label:$GETTER" \
--bind "focus:+bg-transform-ghost:$GETTER" \
--bind "focus:+bg-transform-prompt:$GETTER"
However, this does not mean that the command can take forever to run since fzf will not update its elements until the command completes.
In the following example, we use this background transformation to clear the footer after 1 second, effectively implementing a popup.
# Implement popup that disappears after 1 second
# * Use footer as the popup
# * Use `bell` to ring the terminal bell
# * Use `bg-transform-footer` to clear the footer after 1 second
# * Use `bg-cancel` to ignore currently running background transform actions
fzf --multi --list-border \
--bind 'enter:execute-silent(echo -n {+} | pbcopy)+bell' \
--bind 'enter:+transform-footer(echo Copied {} to clipboard)' \
--bind 'enter:+bg-cancel+bg-transform-footer(sleep 1)'
*
flag for placeholders
#
A new *
flag has been added for placeholders. {*}
evaluates to the entire
matches. Because there can be many matches, it is recommended to use this with
the f
flag, that evaluates to the temporary file containing the list.
# Display the sum of the numbers matched in the preview window
seq 10000 | fzf --preview "awk '{sum += \$1} END {print sum}' {*f}"
Footer #
This release introduces the “footer” section that is displayed after the list section. You can use it to display additional information, such as summaries or stats.
Combined with the bg-transform-footer
action and the new {*}
placeholder,
it allows you to asynchronously compute and display summary information about
the current matches, even if the computation takes some time.
Here’s an example in jira.fzf script from everything.fzf.
--bind 'result:bg-transform-footer:
[[ $FZF_MATCH_COUNT -gt 0 ]] && sort {*f2} | uniq -c | sort -nrk2'

The footer section is fully customizable with the following options:
- Options
--footer[=STRING]
--footer-border[=STYLE]
--footer-label=LABEL
--footer-label-pos=COL[:bottom]
- Colors
footer
footer-bg
footer-border
footer-label
- Actions
change-footer
transform-footer
bg-transform-footer
change-footer-label
transform-footer-label
bg-transform-footer-label
line
border style
#
The line
border style is now allowed for all borders except --list-border
.
It draws a single separator line to visually separate the element from the
rest of the interface. While this style is visually identical to top
or
bottom
, it is useful because the position is automatically determined by the
--layout
.
fzf --input-border line --header-border line --footer-border line \
--header 'Header' --footer 'Footer'
fzf --input-border line --header-border line --footer-border line \
--header 'Header' --footer 'Footer' --layout reverse
If you like this style, try the preset --style=full:line
to apply the line
style across all borders.
fzf --style full:line --height 50% --header 'Header' --footer 'Footer' \
--preview 'BAT_THEME=gruvbox-dark fzf-preview.sh {}'

Full-line background colors in the list section #
Full-line background colors, previously limited to the preview window, are now supported in the list section as well.
for i in $(seq 16 255); do
echo -e "\x1b[48;5;${i}m\x1b[0Khello"
done | fzf --ansi

Bug fixes and improvements #
This release also includes other important bug fixes and improvements.
As always, the latest fzf is the best fzf. So please go ahead and upgrade!