Releases: junegunn/fzf
Releases · junegunn/fzf
Release list
0.52.1
0.52.0
- Added
--highlight-lineto highlight the whole current line (à laset cursorlineof Vim) - Added color names for selected lines:
selected-fg,selected-bg, andselected-hlfzf --border --multi --info inline-right --layout reverse --marker ▏ --pointer ▌ --prompt '▌ ' \ --highlight-line --color gutter:-1,selected-bg:238,selected-fg:146,current-fg:189
- Added
click-headerevent that is triggered when the header section is clicked. When the event is triggered,$FZF_CLICK_HEADER_COLUMNand$FZF_CLICK_HEADER_LINEare set.fd --type f | fzf --header $'[Files] [Directories]' --header-first \ --bind 'click-header:transform: (( FZF_CLICK_HEADER_COLUMN <= 7 )) && echo "reload(fd --type f)" (( FZF_CLICK_HEADER_COLUMN >= 9 )) && echo "reload(fd --type d)" '
- Added
$FZF_COMPLETION_{DIR,PATH}_OPTSfor separately customizing the behavior of directory and path completion# Set --walker options without 'follow' not to follow symbolic links FZF_COMPLETION_PATH_OPTS="--walker=file,dir,hidden" FZF_COMPLETION_DIR_OPTS="--walker=dir,hidden"
- Fixed Windows argument escaping
- Bug fixes and improvements
- The code was heavily refactored to allow using fzf as a library in Go programs. The API is still experimental and subject to change.
0.51.0
- Added a new environment variable
$FZF_POSexported 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-shelloption 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-multiaction for dynamically changing--multioptionchange-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
becomeaction 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
jumpandjump-cancelevents that are triggered when leavingjumpmode# 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_KEYexported 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=hiddenand--info=inline-rightwill 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_LABELFZF_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
trackaction totrack-currentto highlight the difference between the global tracking state set by--trackand a one-off tracking actiontrackis still available as an alias
- Added
untrack-currentandtoggle-track-currentactions*-currentactions 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_COMMANDandFZF_ALT_C_COMMANDto 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=OPTSWalker options ( [file][,dir][,follow][,hidden])file,follow,hidden--walker-root=DIRRoot directory from which to start walker .--walker-skip=DIRSComma-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_COMMANDset.- 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
devtmpfsorproctypes - 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_FILEto 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_LINESNumber of lines fzf takes up excluding padding and margin FZF_COLUMNSNumber of columns fzf takes up excluding padding and margin FZF_TOTAL_COUNTTotal number of items FZF_MATCH_COUNTNumber of matched items FZF_SELECT_COUNTNumber of selected items FZF_QUERYCurrent query string FZF_PROMPTPrompt string FZF_ACTIONThe 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
--ambidoubleif your terminal displays ambiguous width characters (e.g. box-drawing characters for borders) as 2 columns RUNEWIDTH_EASTASIAN=1is still respected for backward compatibility, but it's recommended that you use this new option instead
- Set
- Bug fixes