Releases: junegunn/fzf
Releases · junegunn/fzf
0.51.0
- Added a new environment variable
$FZF_POS
exported to the child processes. It's the vertical position of the cursor in the list starting from 1.# Toggle selection to the top or to the bottom seq 30 | fzf --multi --bind 'load:pos(10)' \ --bind 'shift-up:transform:for _ in $(seq $FZF_POS $FZF_MATCH_COUNT); do echo -n +toggle+up; done' \ --bind 'shift-down:transform:for _ in $(seq 1 $FZF_POS); do echo -n +toggle+down; done'
- Added
--with-shell
option to start child processes with a custom shell command and flagsgem list | fzf --with-shell 'ruby -e' \ --preview 'pp Gem::Specification.find_by_name({1})' \ --bind 'ctrl-o:execute-silent: spec = Gem::Specification.find_by_name({1}) [spec.homepage, *spec.metadata.filter { _1.end_with?("uri") }.values].uniq.each do system "open", _1 end '
- Added
change-multi
action for dynamically changing--multi
optionchange-multi
- enable multi-select mode with no limitchange-multi(NUM)
- enable multi-select mode with a limitchange-multi(0)
- disable multi-select mode
- Windows improvements
become
action is now supported on Windows- Unlike in *nix, this does not use
execve(2)
. Instead it spawns a new process and waits for it to finish, so the exact behavior may differ.
- Unlike in *nix, this does not use
- Fixed argument escaping for Windows cmd.exe. No redundant escaping of backslashes.
- Bug fixes and improvements
0.50.0
- Search performance optimization. You can observe 50%+ improvement in some scenarios.
$ rg --line-number --no-heading --smart-case . > $DATA $ wc < $DATA 5520118 26862362 897487793 $ hyperfine -w 1 -L bin fzf-0.49.0,fzf-7ce6452,fzf-a5447b8,fzf '{bin} --filter "///" < $DATA | head -30' Summary fzf --filter "///" < $DATA | head -30 ran 1.16 ± 0.03 times faster than fzf-a5447b8 --filter "///" < $DATA | head -30 1.23 ± 0.03 times faster than fzf-7ce6452 --filter "///" < $DATA | head -30 1.52 ± 0.03 times faster than fzf-0.49.0 --filter "///" < $DATA | head -30
- Added
jump
andjump-cancel
events that are triggered when leavingjump
mode# Default behavior fzf --bind space:jump # Same as jump-accept action fzf --bind space:jump,jump:accept # Accept on jump, abort on cancel fzf --bind space:jump,jump:accept,jump-cancel:abort # Change header on jump-cancel fzf --bind 'space:change-header(Type jump label)+jump,jump-cancel:change-header:Jump cancelled'
- Added a new environment variable
$FZF_KEY
exported to the child processes. It's the name of the last key pressed.fzf --bind 'space:jump,jump:accept,jump-cancel:transform:[[ $FZF_KEY =~ ctrl-c ]] && echo abort'
- fzf can be built with profiling options. See BUILD.md for more information.
- Bug fixes
0.49.0
- Ingestion performance improved by around 40% (more or less depending on options)
$ time wc data 5513620 37997130 547840920 data real 0m0.822s user 0m0.764s sys 0m0.052s $ hyperfine -L bin fzf-0.48.1,fzf '{bin} --sync --bind load:accept < data' Benchmark 1: fzf-0.48.1 --sync --bind load:accept < data Time (mean ± σ): 440.3 ms ± 4.9 ms [User: 501.8 ms, System: 117.0 ms] Range (min … max): 432.8 ms … 446.1 ms 10 runs Benchmark 2: fzf --sync --bind load:accept < data Time (mean ± σ): 303.3 ms ± 4.5 ms [User: 320.1 ms, System: 108.6 ms] Range (min … max): 296.6 ms … 311.4 ms 10 runs Summary fzf --sync --bind load:accept < data ran 1.45 ± 0.03 times faster than fzf-0.48.1 --sync --bind load:accept < data
--info=hidden
and--info=inline-right
will no longer hide the horizontal separator by default. This gives you more flexibility in customizing the layout.fzf --border --info=inline-right fzf --border --info=inline-right --separator ═ fzf --border --info=inline-right --no-separator fzf --border --info=hidden fzf --border --info=hidden --separator ━ fzf --border --info=hidden --no-separator
- Added two environment variables exported to the child processes
FZF_PREVIEW_LABEL
FZF_BORDER_LABEL
# Use the current value of $FZF_PREVIEW_LABEL to determine which actions to perform git ls-files | fzf --header 'Press CTRL-P to change preview mode' \ --bind='ctrl-p:transform:[[ $FZF_PREVIEW_LABEL =~ cat ]] \ && echo "change-preview(git log --color=always \{})+change-preview-label([[ log ]])" \ || echo "change-preview(bat --color=always \{})+change-preview-label([[ cat ]])"'
- Renamed
track
action totrack-current
to highlight the difference between the global tracking state set by--track
and a one-off tracking actiontrack
is still available as an alias
- Added
untrack-current
andtoggle-track-current
actions*-current
actions are no-op when the global tracking state is set
- Bug fixes and minor improvements
0.48.1
- CTRL-T and ALT-C bindings can be disabled by setting
FZF_CTRL_T_COMMAND
andFZF_ALT_C_COMMAND
to empty strings respectively when sourcing the script# bash FZF_CTRL_T_COMMAND= FZF_ALT_C_COMMAND= eval "$(fzf --bash)" # zsh FZF_CTRL_T_COMMAND= FZF_ALT_C_COMMAND= eval "$(fzf --zsh)" # fish fzf --fish | FZF_CTRL_T_COMMAND= FZF_ALT_C_COMMAND= source
- Setting the variables after sourcing the script will have no effect
- Bug fixes
0.48.0
- Shell integration scripts are now embedded in the fzf binary. This simplifies the distribution, and the users are less likely to have problems caused by using incompatible scripts and binaries.
- bash
# Set up fzf key bindings and fuzzy completion eval "$(fzf --bash)"
- zsh
# Set up fzf key bindings and fuzzy completion eval "$(fzf --zsh)"
- fish
# Set up fzf key bindings fzf --fish | source
- bash
- Added options for customizing the behavior of the built-in walker
Option Description Default --walker=OPTS
Walker options ( [file][,dir][,follow][,hidden]
)file,follow,hidden
--walker-root=DIR
Root directory from which to start walker .
--walker-skip=DIRS
Comma-separated list of directory names to skip .git,node_modules
- Examples
# Built-in walker is only used by standalone fzf when $FZF_DEFAULT_COMMAND is not set unset FZF_DEFAULT_COMMAND fzf # default: --walker=file,follow,hidden --walker-root=. --walker-skip=.git,node_modules fzf --walker=file,dir,hidden,follow --walker-skip=.git,node_modules,target # Walker options in $FZF_DEFAULT_OPTS export FZF_DEFAULT_OPTS="--walker=file,dir,hidden,follow --walker-skip=.git,node_modules,target" fzf # Reading from STDIN; --walker is ignored seq 100 | fzf --walker=dir # Reading from $FZF_DEFAULT_COMMAND; --walker is ignored export FZF_DEFAULT_COMMAND='seq 100' fzf --walker=dir
- Examples
- Shell integration scripts have been updated to use the built-in walker with these new options and they are now much faster out of the box.
0.47.0
- Replaced "the default find command" with a built-in directory walker to simplify the code and to achieve better performance and consistent behavior across platforms. This doesn't affect you if you have
$FZF_DEFAULT_COMMAND
set.- Breaking changes:
- Unlike the previous "find" command, the new traversal code will list hidden files, but hidden directories will still be ignored
- No filtering of
devtmpfs
orproc
types - Traversal is parallelized, so the order of the entries will be different each time
- You may wonder why fzf implements directory walker anyway when it's a filter program following the Unix philosophy. But fzf has had the walker code for years to tackle the performance problem on Windows. And I decided to use the same approach on different platforms as well for the benefits listed above.
- Built-in walker is using the excellent charlievieth/fastwalk library, which easily outperforms its competitors and supports safely following symlinks.
- Breaking changes:
- Added
$FZF_DEFAULT_OPTS_FILE
to allow managing default options in a file- See #3618
- Option precedence from lower to higher
- Options read from
$FZF_DEFAULT_OPTS_FILE
- Options from
$FZF_DEFAULT_OPTS
- Options from command-line arguments
- Options read from
- Bug fixes and improvements
0.46.1
- Bug fixes and improvements
- Fixed Windows binaries
- Downgraded Go version to 1.20 to support older versions of Windows
- Updated rivo/uniseg dependency to v0.4.6
0.46.0
- Added two new events
result
- triggered when the filtering for the current query is complete and the result list is readyresize
- triggered when the terminal size is changed
- fzf now exports the following environment variables to the child processes
Variable Description FZF_LINES
Number of lines fzf takes up excluding padding and margin FZF_COLUMNS
Number of columns fzf takes up excluding padding and margin FZF_TOTAL_COUNT
Total number of items FZF_MATCH_COUNT
Number of matched items FZF_SELECT_COUNT
Number of selected items FZF_QUERY
Current query string FZF_PROMPT
Prompt string FZF_ACTION
The name of the last action performed - This allows you to write sophisticated transformations like so
# Script to dynamically resize the preview window transformer=' # 1 line for info, another for prompt, and 2 more lines for preview window border lines=$(( FZF_LINES - FZF_MATCH_COUNT - 4 )) if [[ $FZF_MATCH_COUNT -eq 0 ]]; then echo "change-preview-window:hidden" elif [[ $lines -gt 3 ]]; then echo "change-preview-window:$lines" elif [[ $FZF_PREVIEW_LINES -ne 3 ]]; then echo "change-preview-window:3" fi ' seq 10000 | fzf --preview 'seq {} 10000' --preview-window up \ --bind "result:transform:$transformer" \ --bind "resize:transform:$transformer"
- And we're phasing out
{fzf:prompt}
and{fzf:action}
- This allows you to write sophisticated transformations like so
- Changed mattn/go-runewidth dependency to rivo/uniseg for accurate results
- Set
--ambidouble
if your terminal displays ambiguous width characters (e.g. box-drawing characters for borders) as 2 columns RUNEWIDTH_EASTASIAN=1
is still respected for backward compatibility, but it's recommended that you use this new option instead
- Set
- Bug fixes
0.45.0
- Added
transform
action to conditionally perform a series of actions# Disallow selecting an empty line echo -e "1. Hello\n2. Goodbye\n\n3. Exit" | fzf --height '~100%' --reverse --header 'Select one' \ --bind 'enter:transform:[[ -n {} ]] && echo accept || echo "change-header:Invalid selection"' # Move cursor past the empty line echo -e "1. Hello\n2. Goodbye\n\n3. Exit" | fzf --height '~100%' --reverse --header 'Select one' \ --bind 'enter:transform:[[ -n {} ]] && echo accept || echo "change-header:Invalid selection"' \ --bind 'focus:transform:[[ -n {} ]] && exit; [[ {fzf:action} =~ up$ ]] && echo up || echo down' # A single key binding to toggle between modes fd --type file | fzf --prompt 'Files> ' \ --header 'CTRL-T: Switch between Files/Directories' \ --bind 'ctrl-t:transform:[[ ! {fzf:prompt} =~ Files ]] && echo "change-prompt(Files> )+reload(fd --type file)" || echo "change-prompt(Directories> )+reload(fd --type directory)"'
- Added placeholder expressions
{fzf:action}
- The name of the last action performed{fzf:prompt}
- Prompt string (including ANSI color codes){fzf:query}
- Synonym for{q}
- Added support for negative height
# Terminal height minus 1, so you can still see the command line fzf --height=-1
- This handles a terminal resize better than
--height=$(($(tput lines) - 1))
- This handles a terminal resize better than
- Added
accept-or-print-query
action that acts likeaccept
but prints the current query when there's no match for the query# You can make CTRL-R paste the current query when there's no match export FZF_CTRL_R_OPTS='--bind enter:accept-or-print-query'
- Note that there are alternative ways to implement the same strategy
# 'become' is apparently more versatile but it's not available on Windows. export FZF_CTRL_R_OPTS='--bind "enter:become:if [ -z {} ]; then echo {q}; else echo {}; fi"' # Using the new 'transform' action export FZF_CTRL_R_OPTS='--bind "enter:transform:[ -z {} ] && echo print-query || echo accept"'
- Note that there are alternative ways to implement the same strategy
- Added
show-header
andhide-header
actions - Bug fixes