Skip to content

Releases: junegunn/fzf

0.52.1

13 May 16:56
0.52.1
6432f00
Compare
Choose a tag to compare
  • Fixed a critical bug in the Windows version
    • Windows users are strongly encouraged to upgrade to this version

0.52.0

07 May 15:17
0.52.0
bcda25a
Compare
Choose a tag to compare
  • Added --highlight-line to highlight the whole current line (à la set cursorline of Vim)
  • Added color names for selected lines: selected-fg, selected-bg, and selected-hl
    fzf --border --multi --info inline-right --layout reverse --marker ▏ --pointer ▌ --prompt ''  \
        --highlight-line --color gutter:-1,selected-bg:238,selected-fg:146,current-fg:189
    image
  • Added click-header event that is triggered when the header section is clicked. When the event is triggered, $FZF_CLICK_HEADER_COLUMN and $FZF_CLICK_HEADER_LINE are 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}_OPTS for 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

01 May 05:37
0.51.0
260a65b
Compare
Choose a tag to compare
  • 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 flags
    gem 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 option
    • change-multi - enable multi-select mode with no limit
    • change-multi(NUM) - enable multi-select mode with a limit
    • change-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.
    • Fixed argument escaping for Windows cmd.exe. No redundant escaping of backslashes.
  • Bug fixes and improvements

0.50.0

14 Apr 15:06
0.50.0
f97d275
Compare
Choose a tag to compare
  • 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 and jump-cancel events that are triggered when leaving jump 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

04 Apr 15:23
0.49.0
62963dc
Compare
Choose a tag to compare
  • 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
    DoomOne
  • 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 to track-current to highlight the difference between the global tracking state set by --track and a one-off tracking action
    • track is still available as an alias
  • Added untrack-current and toggle-track-current actions
    • *-current actions are no-op when the global tracking state is set
  • Bug fixes and minor improvements

0.48.1

17 Mar 07:40
0.48.1
d579e33
Compare
Choose a tag to compare
  • CTRL-T and ALT-C bindings can be disabled by setting FZF_CTRL_T_COMMAND and FZF_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

13 Mar 15:14
0.48.0
091b7ea
Compare
Choose a tag to compare
  • 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
  • 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
  • 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

10 Mar 12:47
0.47.0
98ee5e6
Compare
Choose a tag to compare
  • 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 or proc 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.
  • Added $FZF_DEFAULT_OPTS_FILE to allow managing default options in a file
    • See #3618
    • Option precedence from lower to higher
      1. Options read from $FZF_DEFAULT_OPTS_FILE
      2. Options from $FZF_DEFAULT_OPTS
      3. Options from command-line arguments
  • Bug fixes and improvements

0.46.1

01 Feb 09:15
0.46.1
3c0a630
Compare
Choose a tag to compare

0.46.0

23 Jan 14:55
0.46.0
beb2de2
Compare
Choose a tag to compare
  • Added two new events
    • result - triggered when the filtering for the current query is complete and the result list is ready
    • resize - 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}
  • 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
  • Bug fixes