Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package fzf for openSUSE:Factory checked in at 2024-03-11 15:34:03 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/fzf (Old) and /work/SRC/openSUSE:Factory/.fzf.new.1770 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "fzf" Mon Mar 11 15:34:03 2024 rev:43 rq:1156762 version:0.47.0 Changes: -------- --- /work/SRC/openSUSE:Factory/fzf/fzf.changes 2024-02-01 18:07:47.268321992 +0100 +++ /work/SRC/openSUSE:Factory/.fzf.new.1770/fzf.changes 2024-03-11 15:41:42.919616317 +0100 @@ -1,0 +2,11 @@ +Sun Mar 10 19:38:03 UTC 2024 - Joshua Smith <jsmith...@gmail.com> + +- Update to version 0.47.0: + * Replaced default find command with built-in directory walker + to simplify the code and to achieve better performance. This + doesn't affect you if you have $FZF_DEFAULT_COMMAND set. + * Added $FZF_DEFAULT_OPTS_FILE to allow managing default options + in a file + * Bug fixes and improvements. + +------------------------------------------------------------------- Old: ---- fzf-0.46.1.tar.gz New: ---- fzf-0.47.0.tar.gz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ fzf.spec ++++++ --- /var/tmp/diff_new_pack.NyLJnd/_old 2024-03-11 15:41:43.395633863 +0100 +++ /var/tmp/diff_new_pack.NyLJnd/_new 2024-03-11 15:41:43.395633863 +0100 @@ -18,7 +18,7 @@ %global _lto_cflags %{nil} Name: fzf -Version: 0.46.1 +Version: 0.47.0 Release: 0 Summary: A command-line fuzzy finder License: MIT ++++++ fzf-0.46.1.tar.gz -> fzf-0.47.0.tar.gz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fzf-0.46.1/.github/workflows/codeql-analysis.yml new/fzf-0.47.0/.github/workflows/codeql-analysis.yml --- old/fzf-0.46.1/.github/workflows/codeql-analysis.yml 2024-02-01 10:13:00.000000000 +0100 +++ new/fzf-0.47.0/.github/workflows/codeql-analysis.yml 2024-03-10 13:43:41.000000000 +0100 @@ -27,7 +27,7 @@ steps: - name: Checkout repository - uses: actions/checkout@v3 + uses: actions/checkout@v4 with: fetch-depth: 0 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fzf-0.46.1/.github/workflows/depsreview.yaml new/fzf-0.47.0/.github/workflows/depsreview.yaml --- old/fzf-0.46.1/.github/workflows/depsreview.yaml 2024-02-01 10:13:00.000000000 +0100 +++ new/fzf-0.47.0/.github/workflows/depsreview.yaml 2024-03-10 13:43:41.000000000 +0100 @@ -9,6 +9,6 @@ runs-on: ubuntu-latest steps: - name: 'Checkout Repository' - uses: actions/checkout@v3 + uses: actions/checkout@v4 - name: 'Dependency Review' uses: actions/dependency-review-action@v4 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fzf-0.46.1/.github/workflows/linux.yml new/fzf-0.47.0/.github/workflows/linux.yml --- old/fzf-0.46.1/.github/workflows/linux.yml 2024-02-01 10:13:00.000000000 +0100 +++ new/fzf-0.47.0/.github/workflows/linux.yml 2024-03-10 13:43:41.000000000 +0100 @@ -18,7 +18,7 @@ build: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 with: fetch-depth: 0 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fzf-0.46.1/.github/workflows/macos.yml new/fzf-0.47.0/.github/workflows/macos.yml --- old/fzf-0.46.1/.github/workflows/macos.yml 2024-02-01 10:13:00.000000000 +0100 +++ new/fzf-0.47.0/.github/workflows/macos.yml 2024-03-10 13:43:41.000000000 +0100 @@ -15,7 +15,7 @@ build: runs-on: macos-latest steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 with: fetch-depth: 0 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fzf-0.46.1/.github/workflows/sponsors.yml new/fzf-0.47.0/.github/workflows/sponsors.yml --- old/fzf-0.46.1/.github/workflows/sponsors.yml 2024-02-01 10:13:00.000000000 +0100 +++ new/fzf-0.47.0/.github/workflows/sponsors.yml 2024-03-10 13:43:41.000000000 +0100 @@ -9,7 +9,7 @@ runs-on: ubuntu-latest steps: - name: Checkout ðï¸ - uses: actions/checkout@v3 + uses: actions/checkout@v4 - name: Generate Sponsors ð uses: JamesIves/github-sponsors-readme-action@v1 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fzf-0.46.1/.github/workflows/typos.yml new/fzf-0.47.0/.github/workflows/typos.yml --- old/fzf-0.46.1/.github/workflows/typos.yml 2024-02-01 10:13:00.000000000 +0100 +++ new/fzf-0.47.0/.github/workflows/typos.yml 2024-03-10 13:43:41.000000000 +0100 @@ -6,5 +6,5 @@ name: Spell Check with Typos runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 - - uses: crate-ci/typos@v1.17.2 + - uses: actions/checkout@v4 + - uses: crate-ci/typos@v1.19.0 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fzf-0.46.1/ADVANCED.md new/fzf-0.47.0/ADVANCED.md --- old/fzf-0.46.1/ADVANCED.md 2024-02-01 10:13:00.000000000 +0100 +++ new/fzf-0.47.0/ADVANCED.md 2024-03-10 13:43:41.000000000 +0100 @@ -552,7 +552,7 @@ - Press enter key on a pod to `kubectl exec` into it - Press CTRL-O to open the log in your editor - Press CTRL-R to reload the pod list -- Press CTRL-/ repeatedly to to rotate through a different sets of preview +- Press CTRL-/ repeatedly to rotate through a different sets of preview window options 1. `80%,border-bottom` 1. `hidden` diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fzf-0.46.1/BUILD.md new/fzf-0.47.0/BUILD.md --- old/fzf-0.46.1/BUILD.md 2024-02-01 10:13:00.000000000 +0100 +++ new/fzf-0.47.0/BUILD.md 2024-03-10 13:43:41.000000000 +0100 @@ -42,6 +42,8 @@ - Licensed under [MIT](http://mattn.mit-license.org) - [tcell](https://github.com/gdamore/tcell) - Licensed under [Apache License 2.0](https://github.com/gdamore/tcell/blob/master/LICENSE) +- [fastwalk](https://github.com/charlievieth/fastwalk) + - Licensed under [MIT](https://raw.githubusercontent.com/charlievieth/fastwalk/master/LICENSE) License ------- diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fzf-0.46.1/CHANGELOG.md new/fzf-0.47.0/CHANGELOG.md --- old/fzf-0.46.1/CHANGELOG.md 2024-02-01 10:13:00.000000000 +0100 +++ new/fzf-0.47.0/CHANGELOG.md 2024-03-10 13:43:41.000000000 +0100 @@ -1,6 +1,29 @@ CHANGELOG ========= +0.47.0 +------ +- Replaced ["the default find command"][find] with a built-in directory traversal 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][find], 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 would wonder why fzf implements directory traversal anyway when it's a filter program following the Unix philosophy. + But fzf has had [the traversal code for years][walker] 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 traversal is now done using the excellent [charlievieth/fastwalk][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](https://github.com/junegunn/fzf/pull/3618) + - Option precedence from lower to higher + 1. Options read from `$FZF_DEFAULT_OPTS_FILE` + 1. Options from `$FZF_DEFAULT_OPTS` + 1. Options from command-line arguments +- Bug fixes and improvements + +[find]: https://github.com/junegunn/fzf/blob/0.46.1/src/constants.go#L60-L64 +[walker]: https://github.com/junegunn/fzf/pull/1847 +[fastwalk]: https://github.com/charlievieth/fastwalk + 0.46.1 ------ - Bug fixes and improvements diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fzf-0.46.1/README-VIM.md new/fzf-0.47.0/README-VIM.md --- old/fzf-0.46.1/README-VIM.md 2024-02-01 10:13:00.000000000 +0100 +++ new/fzf-0.47.0/README-VIM.md 2024-03-10 13:43:41.000000000 +0100 @@ -238,19 +238,20 @@ ``` We haven't specified the `source`, so this is equivalent to starting fzf on -command line without standard input pipe; fzf will use find command (or -`$FZF_DEFAULT_COMMAND` if defined) to list the files under the current -directory. When you select one, it will open it with the sink, `:e` command. -If you want to open it in a new tab, you can pass `:tabedit` command instead -as the sink. +command line without standard input pipe; fzf will traverse the file system +under the current directory to get the list of files. (If +`$FZF_DEFAULT_COMMAND` is set, fzf will use the output of the command +instead.) When you select one, it will open it with the sink, `:e` command. If +you want to open it in a new tab, you can pass `:tabedit` command instead as +the sink. ```vim call fzf#run({'sink': 'tabedit'}) ``` -Instead of using the default find command, you can use any shell command as -the source. The following example will list the files managed by git. It's -equivalent to running `git ls-files | fzf` on shell. +You can use any shell command as the source to generate the list. The +following example will list the files managed by git. It's equivalent to +running `git ls-files | fzf` on shell. ```vim call fzf#run({'source': 'git ls-files', 'sink': 'e'}) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fzf-0.46.1/README.md new/fzf-0.47.0/README.md --- old/fzf-0.46.1/README.md 2024-02-01 10:13:00.000000000 +0100 +++ new/fzf-0.47.0/README.md 2024-03-10 13:43:41.000000000 +0100 @@ -1,3 +1,21 @@ +<div align="center"> +<sup>Special thanks to:</sup> +<br> +<br> +<a href="https://warp.dev/?utm_source=github&utm_medium=referral&utm_campaign=fzf_20240209"> + <div> + <img src="https://raw.githubusercontent.com/junegunn/i/master/warp.png" width="300" alt="Warp"> + </div> + <b>Warp is a modern, Rust-based terminal with AI built in so you and your team can build great software, faster.</b> + <div> + <sup>Visit warp.dev to learn more.</sup> + </div> +</a> +<br> +<hr> +</div> +<br> + <img src="https://raw.githubusercontent.com/junegunn/i/master/fzf.png" height="170" alt="fzf - a command-line fuzzy finder"> [](https://github.com/junegunn/fzf/actions) === @@ -26,7 +44,7 @@ If you'd like to sponsor this project, please visit https://github.com/sponsors/junegunn. -<!-- sponsors --><a href="https://github.com/miyanokomiya"><img src="https://github.com/miyanokomiya.png" width="60px" alt="miyanokomiya" /></a><a href="https://github.com/jonhoo"><img src="https://github.com/jonhoo.png" width="60px" alt="Jon Gjengset" /></a><a href="https://github.com/AceofSpades5757"><img src="https://github.com/AceofSpades5757.png" width="60px" alt="Kyle L. Davis" /></a><a href="https://github.com/Frederick888"><img src="https://github.com/Frederick888.png" width="60px" alt="Frederick Zhang" /></a><a href="https://github.com/moritzdietz"><img src="https://github.com/moritzdietz.png" width="60px" alt="Moritz Dietz" /></a><a href="https://github.com/mikker"><img src="https://github.com/mikker.png" width="60px" alt="Mikkel Malmberg" /></a><a href="https://github.com/pldubouilh"><img src="https://github.com/pldubouilh.png" width="60px" alt="Pierre Dubouilh" /></a><a href="https://github.com/rcorre"><img src="https://github.com/rcorre.png" width="60px" alt="Ryan Roden -Corrent" /></a><a href="https://github.com/blissdev"><img src="https://github.com/blissdev.png" width="60px" alt="Jordan Arentsen" /></a><a href="https://github.com/mislav"><img src="https://github.com/mislav.png" width="60px" alt="Mislav MarohniÄ" /></a><a href="https://github.com/aexvir"><img src="https://github.com/aexvir.png" width="60px" alt="Alex Viscreanu" /></a><a href="https://github.com/dbalatero"><img src="https://github.com/dbalatero.png" width="60px" alt="David Balatero" /></a><a href="https://github.com/comatory"><img src="https://github.com/comatory.png" width="60px" alt="Ondrej Synacek" /></a><a href="https://github.com/moobar"><img src="https://github.com/moobar.png" width="60px" alt="" /></a><a href="https://github.com/majjoha"><img src="https://github.com/majjoha.png" width="60px" alt="Mathias Jean Johansen" /></a><a href="https://github.com/benelan"><img src="https://github.com/benelan.png" width="60px" alt="Ben Elan" /></a><a href="https://github.com/pawelduda "><img src="https://github.com/pawelduda.png" width="60px" alt="PaweÅ Duda" /></a><a href="https://github.com/slezica"><img src="https://github.com/slezica.png" width="60px" alt="Santiago Lezica" /></a><a href="https://github.com/pbwn"><img src="https://github.com/pbwn.png" width="60px" alt="" /></a><a href="https://github.com/timgluz"><img src="https://github.com/timgluz.png" width="60px" alt="Timo Sulg" /></a><a href="https://github.com/pyrho"><img src="https://github.com/pyrho.png" width="60px" alt="Damien Rajon" /></a><a href="https://github.com/ArtBIT"><img src="https://github.com/ArtBIT.png" width="60px" alt="ArtBIT" /></a><a href="https://github.com/da-moon"><img src="https://github.com/da-moon.png" width="60px" alt="" /></a><a href="https://github.com/hovissimo"><img src="https://github.com/hovissimo.png" width="60px" alt="Hovis" /></a><a href="https://github.com/dariusjonda"><img src="https://github.com/dariusjonda.png" width="60px" alt="Darius Jonda" /></a><a href="https: //github.com/mortymacs"><img src="https://github.com/mortymacs.png" width="60px" alt="Morteza NourelahiAlamdari" /></a><a href="https://github.com/cristiand391"><img src="https://github.com/cristiand391.png" width="60px" alt="Cristian Dominguez" /></a><a href="https://github.com/eliangcs"><img src="https://github.com/eliangcs.png" width="60px" alt="Chang-Hung Liang" /></a><a href="https://github.com/asphaltbuffet"><img src="https://github.com/asphaltbuffet.png" width="60px" alt="Ben Lechlitner" /></a><a href="https://github.com/yash1th"><img src="https://github.com/yash1th.png" width="60px" alt="yash" /></a><a href="https://github.com/looshch"><img src="https://github.com/looshch.png" width="60px" alt="george looshch" /></a><a href="https://github.com/kg8m"><img src="https://github.com/kg8m.png" width="60px" alt="Takumi KAGIYAMA" /></a><a href="https://github.com/polm"><img src="https://github.com/polm.png" width="60px" alt="Paul O'Leary McCann" /></a><a href="https://github.com/rbe eger"><img src="https://github.com/rbeeger.png" width="60px" alt="Robert Beeger" /></a><a href="https://github.com/veebch"><img src="https://github.com/veebch.png" width="60px" alt="VEEB Projects" /></a><a href="https://github.com/khuedoan"><img src="https://github.com/khuedoan.png" width="60px" alt="Khue Doan" /></a><a href="https://github.com/yowayb"><img src="https://github.com/yowayb.png" width="60px" alt="Yoway Buorn" /></a><a href="https://github.com/scalisi"><img src="https://github.com/scalisi.png" width="60px" alt="Josh Scalisi" /></a><a href="https://github.com/alecbcs"><img src="https://github.com/alecbcs.png" width="60px" alt="Alec Scott" /></a><a href="https://github.com/the-shank"><img src="https://github.com/the-shank.png" width="60px" alt="theshank" /></a><a href="https://github.com/thnxdev"><img src="https://github.com/thnxdev.png" width="60px" alt="thanks.dev" /></a><a href="https://github.com/artursapek"><img src="https://github.com/artursapek.png" width="60px" al t="Artur Sapek" /></a><a href="https://github.com/ramnes"><img src="https://github.com/ramnes.png" width="60px" alt="Guillaume Gelin" /></a><a href="https://github.com/mikkifr"><img src="https://github.com/mikkifr.png" width="60px" alt="Mikki Freeman" /></a><a href="https://github.com/aldosch"><img src="https://github.com/aldosch.png" width="60px" alt="Aldo Schumann" /></a><a href="https://github.com/jyc"><img src="https://github.com/jyc.png" width="60px" alt="" /></a><a href="https://github.com/Bombycinous"><img src="https://github.com/Bombycinous.png" width="60px" alt="" /></a><a href="https://github.com/mrcnski"><img src="https://github.com/mrcnski.png" width="60px" alt="Marcin S." /></a><a href="https://github.com/roblevy"><img src="https://github.com/roblevy.png" width="60px" alt="Rob Levy" /></a><!-- sponsors --> +<!-- sponsors --><a href="https://github.com/miyanokomiya"><img src="https://github.com/miyanokomiya.png" width="60px" alt="miyanokomiya" /></a><a href="https://github.com/jonhoo"><img src="https://github.com/jonhoo.png" width="60px" alt="Jon Gjengset" /></a><a href="https://github.com/AceofSpades5757"><img src="https://github.com/AceofSpades5757.png" width="60px" alt="Kyle L. Davis" /></a><a href="https://github.com/Frederick888"><img src="https://github.com/Frederick888.png" width="60px" alt="Frederick Zhang" /></a><a href="https://github.com/moritzdietz"><img src="https://github.com/moritzdietz.png" width="60px" alt="Moritz Dietz" /></a><a href="https://github.com/mikker"><img src="https://github.com/mikker.png" width="60px" alt="Mikkel Malmberg" /></a><a href="https://github.com/pldubouilh"><img src="https://github.com/pldubouilh.png" width="60px" alt="Pierre Dubouilh" /></a><a href="https://github.com/rcorre"><img src="https://github.com/rcorre.png" width="60px" alt="Ryan Roden -Corrent" /></a><a href="https://github.com/blissdev"><img src="https://github.com/blissdev.png" width="60px" alt="Jordan Arentsen" /></a><a href="https://github.com/mislav"><img src="https://github.com/mislav.png" width="60px" alt="Mislav MarohniÄ" /></a><a href="https://github.com/aexvir"><img src="https://github.com/aexvir.png" width="60px" alt="Alex Viscreanu" /></a><a href="https://github.com/dbalatero"><img src="https://github.com/dbalatero.png" width="60px" alt="David Balatero" /></a><a href="https://github.com/comatory"><img src="https://github.com/comatory.png" width="60px" alt="Ondrej Synacek" /></a><a href="https://github.com/moobar"><img src="https://github.com/moobar.png" width="60px" alt="" /></a><a href="https://github.com/majjoha"><img src="https://github.com/majjoha.png" width="60px" alt="Mathias Jean Johansen" /></a><a href="https://github.com/benelan"><img src="https://github.com/benelan.png" width="60px" alt="Ben Elan" /></a><a href="https://github.com/pawelduda "><img src="https://github.com/pawelduda.png" width="60px" alt="PaweÅ Duda" /></a><a href="https://github.com/slezica"><img src="https://github.com/slezica.png" width="60px" alt="Santiago Lezica" /></a><a href="https://github.com/pbwn"><img src="https://github.com/pbwn.png" width="60px" alt="" /></a><a href="https://github.com/timgluz"><img src="https://github.com/timgluz.png" width="60px" alt="Timo Sulg" /></a><a href="https://github.com/pyrho"><img src="https://github.com/pyrho.png" width="60px" alt="Damien Rajon" /></a><a href="https://github.com/ArtBIT"><img src="https://github.com/ArtBIT.png" width="60px" alt="ArtBIT" /></a><a href="https://github.com/da-moon"><img src="https://github.com/da-moon.png" width="60px" alt="" /></a><a href="https://github.com/hovissimo"><img src="https://github.com/hovissimo.png" width="60px" alt="Hovis" /></a><a href="https://github.com/dariusjonda"><img src="https://github.com/dariusjonda.png" width="60px" alt="Darius Jonda" /></a><a href="https: //github.com/cristiand391"><img src="https://github.com/cristiand391.png" width="60px" alt="Cristian Dominguez" /></a><a href="https://github.com/eliangcs"><img src="https://github.com/eliangcs.png" width="60px" alt="Chang-Hung Liang" /></a><a href="https://github.com/asphaltbuffet"><img src="https://github.com/asphaltbuffet.png" width="60px" alt="Ben Lechlitner" /></a><a href="https://github.com/yash1th"><img src="https://github.com/yash1th.png" width="60px" alt="yash" /></a><a href="https://github.com/looshch"><img src="https://github.com/looshch.png" width="60px" alt="george looshch" /></a><a href="https://github.com/kg8m"><img src="https://github.com/kg8m.png" width="60px" alt="Takumi KAGIYAMA" /></a><a href="https://github.com/polm"><img src="https://github.com/polm.png" width="60px" alt="Paul O'Leary McCann" /></a><a href="https://github.com/rbeeger"><img src="https://github.com/rbeeger.png" width="60px" alt="Robert Beeger" /></a><a href="https://github.com/veebch"><img src="h ttps://github.com/veebch.png" width="60px" alt="VEEB Projects" /></a><a href="https://github.com/khuedoan"><img src="https://github.com/khuedoan.png" width="60px" alt="Khue Doan" /></a><a href="https://github.com/yowayb"><img src="https://github.com/yowayb.png" width="60px" alt="Yoway Buorn" /></a><a href="https://github.com/scalisi"><img src="https://github.com/scalisi.png" width="60px" alt="Josh Scalisi" /></a><a href="https://github.com/alecbcs"><img src="https://github.com/alecbcs.png" width="60px" alt="Alec Scott" /></a><a href="https://github.com/thnxdev"><img src="https://github.com/thnxdev.png" width="60px" alt="thanks.dev" /></a><a href="https://github.com/artursapek"><img src="https://github.com/artursapek.png" width="60px" alt="Artur Sapek" /></a><a href="https://github.com/ramnes"><img src="https://github.com/ramnes.png" width="60px" alt="Guillaume Gelin" /></a><a href="https://github.com/jyc"><img src="https://github.com/jyc.png" width="60px" alt="" /></a><a href="https ://github.com/mrcnski"><img src="https://github.com/mrcnski.png" width="60px" alt="Marcin S." /></a><a href="https://github.com/roblevy"><img src="https://github.com/roblevy.png" width="60px" alt="Rob Levy" /></a><a href="https://github.com/michael-dwan"><img src="https://github.com/michael-dwan.png" width="60px" alt="Michael Dwan" /></a><a href="https://github.com/glozow"><img src="https://github.com/glozow.png" width="60px" alt="Gloria Zhao" /></a><a href="https://github.com/pooriajr"><img src="https://github.com/pooriajr.png" width="60px" alt="Pooria" /></a><a href="https://github.com/wjt"><img src="https://github.com/wjt.png" width="60px" alt="Will Thompson" /></a><a href="https://github.com/faruzzy"><img src="https://github.com/faruzzy.png" width="60px" alt="Roland" /></a><!-- sponsors --> Table of Contents ----------------- @@ -150,17 +168,19 @@ ### Windows Pre-built binaries for Windows can be downloaded [here][bin]. fzf is also -available via [Chocolatey][choco], [Scoop][scoop], and [Winget][winget]: +available via [Chocolatey][choco], [Scoop][scoop], [Winget][winget], and [MSYS2][msys2]: -| Package manager | Command | -| --------------- | -------------------- | -| Chocolatey | `choco install fzf` | -| Scoop | `scoop install fzf` | -| Winget | `winget install fzf` | +| Package manager | Command | +| --------------- | ------------------------------------- | +| Chocolatey | `choco install fzf` | +| Scoop | `scoop install fzf` | +| Winget | `winget install fzf` | +| MSYS2 (pacman) | `pacman -S $MINGW_PACKAGE_PREFIX-fzf` | [choco]: https://chocolatey.org/packages/fzf [scoop]: https://github.com/ScoopInstaller/Main/blob/master/bucket/fzf.json [winget]: https://github.com/microsoft/winget-pkgs/tree/master/manifests/j/junegunn/fzf +[msys2]: https://packages.msys2.org/base/mingw-w64-fzf Known issues and limitations on Windows can be found on [the wiki page][windows-wiki]. @@ -210,9 +230,9 @@ find * -type f | fzf > selected ``` -Without STDIN pipe, fzf will use find command to fetch the list of -files excluding hidden ones. (You can override the default command with -`FZF_DEFAULT_COMMAND`) +Without STDIN pipe, fzf will traverse the file system under the current +directory to get the list of files, skipping hidden directories. (You can +override the default behavior with `FZF_DEFAULT_COMMAND`) ```sh vim $(fzf) @@ -309,6 +329,10 @@ - `FZF_DEFAULT_OPTS` - Default options - e.g. `export FZF_DEFAULT_OPTS="--layout=reverse --inline-info"` +- `FZF_DEFAULT_OPTS_FILE` + - If you prefer to manage default options in a file, set this variable to + point to the location of the file + - e.g. `export FZF_DEFAULT_OPTS_FILE=~/.fzfrc` ### Options @@ -468,8 +492,7 @@ # Options to fzf command export FZF_COMPLETION_OPTS='--border --info=inline' -# Use fd (https://github.com/sharkdp/fd) instead of the default find -# command for listing path candidates. +# Use fd (https://github.com/sharkdp/fd) for listing path candidates. # - The first argument to the function ($1) is the base path to start traversal # - See the source code (completion.{bash,zsh}) for the details. _fzf_compgen_path() { @@ -754,9 +777,8 @@ You can use [fd](https://github.com/sharkdp/fd), [ripgrep](https://github.com/BurntSushi/ripgrep), or [the silver -searcher](https://github.com/ggreer/the_silver_searcher) instead of the -default find command to traverse the file system while respecting -`.gitignore`. +searcher](https://github.com/ggreer/the_silver_searcher) to traverse the file +system while respecting `.gitignore`. ```sh # Feed the output of fd into fzf diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fzf-0.46.1/bin/fzf-tmux new/fzf-0.47.0/bin/fzf-tmux --- old/fzf-0.46.1/bin/fzf-tmux 2024-02-01 10:13:00.000000000 +0100 +++ new/fzf-0.47.0/bin/fzf-tmux 2024-03-10 13:43:41.000000000 +0100 @@ -95,9 +95,9 @@ elif [[ "$size" =~ %$ ]]; then size=${size:0:((${#size}-1))} if [[ -n "$swap" ]]; then - opt="$opt -p $(( 100 - size ))" + opt="$opt -l $(( 100 - size ))%" else - opt="$opt -p $size" + opt="$opt -l $size%" fi else if [[ -n "$swap" ]]; then diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fzf-0.46.1/doc/fzf.txt new/fzf-0.47.0/doc/fzf.txt --- old/fzf-0.46.1/doc/fzf.txt 2024-02-01 10:13:00.000000000 +0100 +++ new/fzf-0.47.0/doc/fzf.txt 2024-03-10 13:43:41.000000000 +0100 @@ -1,4 +1,4 @@ -fzf.txt fzf Last change: January 1 2024 +fzf.txt fzf Last change: February 15 2024 FZF - TABLE OF CONTENTS *fzf* *fzf-toc* ============================================================================== @@ -264,17 +264,18 @@ call fzf#run({'sink': 'e'}) < We haven't specified the `source`, so this is equivalent to starting fzf on -command line without standard input pipe; fzf will use find command (or -`$FZF_DEFAULT_COMMAND` if defined) to list the files under the current -directory. When you select one, it will open it with the sink, `:e` command. -If you want to open it in a new tab, you can pass `:tabedit` command instead -as the sink. +command line without standard input pipe; fzf will traverse the file system +under the current directory to get the list of files. (If +`$FZF_DEFAULT_COMMAND` is set, fzf will use the output of the command +instead.) When you select one, it will open it with the sink, `:e` command. If +you want to open it in a new tab, you can pass `:tabedit` command instead as +the sink. > call fzf#run({'sink': 'tabedit'}) < -Instead of using the default find command, you can use any shell command as -the source. The following example will list the files managed by git. It's -equivalent to running `git ls-files | fzf` on shell. +You can use any shell command as the source to generate the list. The +following example will list the files managed by git. It's equivalent to +running `git ls-files | fzf` on shell. > call fzf#run({'source': 'git ls-files', 'sink': 'e'}) < @@ -417,24 +418,12 @@ < fzf inside terminal buffer >________________________________________________~ *fzf-inside-terminal-buffer* -The latest versions of Vim and Neovim include builtin terminal emulator -(`:terminal`) and fzf will start in a terminal buffer in the following cases: - - - On Neovim - - On GVim - - On Terminal Vim with a non-default layout - - `callâfzf#run({'left':â'30%'})` or `letâg:fzf_layoutâ=â{'left':â'30%'}` On the latest versions of Vim and Neovim, fzf will start in a terminal buffer. If you find the default ANSI colors to be different, consider configuring the colors using `g:terminal_ansi_colors` in regular Vim or `g:terminal_color_x` in Neovim. - *g:terminal_color_15* *g:terminal_color_14* *g:terminal_color_13* -*g:terminal_color_12* *g:terminal_color_11* *g:terminal_color_10* *g:terminal_color_9* - *g:terminal_color_8* *g:terminal_color_7* *g:terminal_color_6* *g:terminal_color_5* - *g:terminal_color_4* *g:terminal_color_3* *g:terminal_color_2* *g:terminal_color_1* - *g:terminal_color_0* > " Terminal colors for seoul256 color scheme if has('nvim') diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fzf-0.46.1/go.mod new/fzf-0.47.0/go.mod --- old/fzf-0.46.1/go.mod 2024-02-01 10:13:00.000000000 +0100 +++ new/fzf-0.47.0/go.mod 2024-03-10 13:43:41.000000000 +0100 @@ -1,20 +1,19 @@ module github.com/junegunn/fzf require ( - github.com/gdamore/tcell/v2 v2.7.0 - github.com/mattn/go-isatty v0.0.17 + github.com/charlievieth/fastwalk v1.0.2 + github.com/gdamore/tcell/v2 v2.7.4 + github.com/mattn/go-isatty v0.0.20 github.com/mattn/go-shellwords v1.0.12 - github.com/rivo/uniseg v0.4.6 - github.com/saracen/walker v0.1.3 - golang.org/x/sys v0.16.0 - golang.org/x/term v0.16.0 + github.com/rivo/uniseg v0.4.7 + golang.org/x/sys v0.17.0 + golang.org/x/term v0.17.0 ) require ( github.com/gdamore/encoding v1.0.0 // indirect github.com/lucasb-eyer/go-colorful v1.2.0 // indirect github.com/mattn/go-runewidth v0.0.15 // indirect - golang.org/x/sync v0.5.0 // indirect golang.org/x/text v0.14.0 // indirect ) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fzf-0.46.1/go.sum new/fzf-0.47.0/go.sum --- old/fzf-0.46.1/go.sum 2024-02-01 10:13:00.000000000 +0100 +++ new/fzf-0.47.0/go.sum 2024-03-10 13:43:41.000000000 +0100 @@ -1,21 +1,21 @@ +github.com/charlievieth/fastwalk v1.0.2 h1:KYWo7xszmoldOGrwdNIeznSzhj9mhgk+6DwHunG99bc= +github.com/charlievieth/fastwalk v1.0.2/go.mod h1:JSfglY/gmL/rqsUS1NCsJTocB5n6sSl9ApAqif4CUbs= github.com/gdamore/encoding v1.0.0 h1:+7OoQ1Bc6eTm5niUzBa0Ctsh6JbMW6Ra+YNuAtDBdko= github.com/gdamore/encoding v1.0.0/go.mod h1:alR0ol34c49FCSBLjhosxzcPHQbf2trDkoo5dl+VrEg= -github.com/gdamore/tcell/v2 v2.7.0 h1:I5LiGTQuwrysAt1KS9wg1yFfOI3arI3ucFrxtd/xqaA= -github.com/gdamore/tcell/v2 v2.7.0/go.mod h1:hl/KtAANGBecfIPxk+FzKvThTqI84oplgbPEmVX60b8= +github.com/gdamore/tcell/v2 v2.7.4 h1:sg6/UnTM9jGpZU+oFYAsDahfchWAFW8Xx2yFinNSAYU= +github.com/gdamore/tcell/v2 v2.7.4/go.mod h1:dSXtXTSK0VsW1biw65DZLZ2NKr7j0qP/0J7ONmsraWg= github.com/lucasb-eyer/go-colorful v1.2.0 h1:1nnpGOrhyZZuNyfu1QjKiUICQ74+3FNCN69Aj6K7nkY= github.com/lucasb-eyer/go-colorful v1.2.0/go.mod h1:R4dSotOR9KMtayYi1e77YzuveK+i7ruzyGqttikkLy0= -github.com/mattn/go-isatty v0.0.17 h1:BTarxUcIeDqL27Mc+vyvdWYSL28zpIhv3RoTdsLMPng= -github.com/mattn/go-isatty v0.0.17/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= +github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= +github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= github.com/mattn/go-runewidth v0.0.15 h1:UNAjwbU9l54TA3KzvqLGxwWjHmMgBUVhBiTjelZgg3U= github.com/mattn/go-runewidth v0.0.15/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= github.com/mattn/go-shellwords v1.0.12 h1:M2zGm7EW6UQJvDeQxo4T51eKPurbeFbe8WtebGE2xrk= github.com/mattn/go-shellwords v1.0.12/go.mod h1:EZzvwXDESEeg03EKmM+RmDnNOPKG4lLtQsUlTZDWQ8Y= github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/rivo/uniseg v0.4.3/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= -github.com/rivo/uniseg v0.4.6 h1:Sovz9sDSwbOz9tgUy8JpT+KgCkPYJEN/oYzlJiYTNLg= -github.com/rivo/uniseg v0.4.6/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= -github.com/saracen/walker v0.1.3 h1:YtcKKmpRPy6XJTHJ75J2QYXXZYWnZNQxPCVqZSHVV/g= -github.com/saracen/walker v0.1.3/go.mod h1:FU+7qU8DeQQgSZDmmThMJi93kPkLFgy0oVAcLxurjIk= +github.com/rivo/uniseg v0.4.7 h1:WUdvkW8uEhrYfLC4ZzdpI2ztxP1I582+49Oc5Mq64VQ= +github.com/rivo/uniseg v0.4.7/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= @@ -26,27 +26,22 @@ golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20220601150217-0de741cfad7f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.5.0 h1:60k92dhOjHxJkrqnwsfl8KuaHbn/5dl0lUPUklKo3qE= -golang.org/x/sync v0.5.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/sys v0.16.0 h1:xWw16ngr6ZMtmxDyKyIgsE93KNKz5HKmMa3b8ALHidU= -golang.org/x/sys v0.16.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.17.0 h1:25cE3gD+tdBA7lp7QfhuV+rJiE9YXTcS3VG1SqssI/Y= +golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= -golang.org/x/term v0.15.0/go.mod h1:BDl952bC7+uMoWR75FIrCDx79TPU9oHkTZ9yRbYOrX0= -golang.org/x/term v0.16.0 h1:m+B6fahuftsE9qjo0VWp2FW0mB3MTJvR0BaMQrq0pmE= -golang.org/x/term v0.16.0/go.mod h1:yn7UURbUtPyrVJPGPq404EukNFxcm/foM+bV/bfcDsY= +golang.org/x/term v0.17.0 h1:mkTF7LCd6WGJNL3K1Ad7kwxNfYAW6a8a8QqtMblp/4U= +golang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fzf-0.46.1/install new/fzf-0.47.0/install --- old/fzf-0.46.1/install 2024-02-01 10:13:00.000000000 +0100 +++ new/fzf-0.47.0/install 2024-03-10 13:43:41.000000000 +0100 @@ -2,7 +2,7 @@ set -u -version=0.46.1 +version=0.47.0 auto_completion= key_bindings= update_config=2 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fzf-0.46.1/install.ps1 new/fzf-0.47.0/install.ps1 --- old/fzf-0.46.1/install.ps1 2024-02-01 10:13:00.000000000 +0100 +++ new/fzf-0.47.0/install.ps1 2024-03-10 13:43:41.000000000 +0100 @@ -1,4 +1,4 @@ -$version="0.46.1" +$version="0.47.0" $fzf_base=Split-Path -Parent $MyInvocation.MyCommand.Definition diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fzf-0.46.1/main.go new/fzf-0.47.0/main.go --- old/fzf-0.46.1/main.go 2024-02-01 10:13:00.000000000 +0100 +++ new/fzf-0.47.0/main.go 2024-03-10 13:43:41.000000000 +0100 @@ -5,7 +5,7 @@ "github.com/junegunn/fzf/src/protector" ) -var version string = "0.46" +var version string = "0.47" var revision string = "devel" func main() { diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fzf-0.46.1/man/man1/fzf-tmux.1 new/fzf-0.47.0/man/man1/fzf-tmux.1 --- old/fzf-0.46.1/man/man1/fzf-tmux.1 2024-02-01 10:13:00.000000000 +0100 +++ new/fzf-0.47.0/man/man1/fzf-tmux.1 2024-03-10 13:43:41.000000000 +0100 @@ -21,7 +21,7 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. .. -.TH fzf-tmux 1 "Feb 2024" "fzf 0.46.1" "fzf-tmux - open fzf in tmux split pane" +.TH fzf-tmux 1 "Mar 2024" "fzf 0.47.0" "fzf-tmux - open fzf in tmux split pane" .SH NAME fzf-tmux - open fzf in tmux split pane diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fzf-0.46.1/man/man1/fzf.1 new/fzf-0.47.0/man/man1/fzf.1 --- old/fzf-0.46.1/man/man1/fzf.1 2024-02-01 10:13:00.000000000 +0100 +++ new/fzf-0.47.0/man/man1/fzf.1 2024-03-10 13:43:41.000000000 +0100 @@ -21,7 +21,7 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. .. -.TH fzf 1 "Feb 2024" "fzf 0.46.1" "fzf - a command-line fuzzy finder" +.TH fzf 1 "Mar 2024" "fzf 0.47.0" "fzf - a command-line fuzzy finder" .SH NAME fzf - a command-line fuzzy finder @@ -865,7 +865,14 @@ this case make sure that the command is POSIX-compliant. .TP .B FZF_DEFAULT_OPTS -Default options. e.g. \fBexport FZF_DEFAULT_OPTS="--extended --cycle"\fR +Default options. +.br +e.g. \fBexport FZF_DEFAULT_OPTS="--layout=reverse --border --cycle"\fR +.TP +.B FZF_DEFAULT_OPTS_FILE +The location of the file that contains the default options. +.br +e.g. \fBexport FZF_DEFAULT_OPTS_FILE=~/.fzfrc\fR .TP .B FZF_API_KEY Can be used to require an API key when using \fB--listen\fR option. If not set, diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fzf-0.46.1/shell/completion.bash new/fzf-0.47.0/shell/completion.bash --- old/fzf-0.46.1/shell/completion.bash 2024-02-01 10:13:00.000000000 +0100 +++ new/fzf-0.47.0/shell/completion.bash 2024-03-10 13:43:41.000000000 +0100 @@ -63,6 +63,31 @@ done } +# @param $1 cmd - Command name for which the original completion is searched +# @var[out] REPLY - Original function name is returned +__fzf_orig_completion_get_orig_func() { + local cmd orig_var orig + cmd=$1 + orig_var="_fzf_orig_completion_${cmd//[^A-Za-z0-9_]/_}" + orig="${!orig_var-}" + REPLY="${orig##*#}" + [[ $REPLY ]] && type "$REPLY" &> /dev/null +} + +# @param $1 cmd - Command name for which the original completion is searched +# @param $2 func - Fzf's completion function to replace the original function +# @var[out] REPLY - Completion setting is returned as a string to "eval" +__fzf_orig_completion_instantiate() { + local cmd func orig_var orig + cmd=$1 + func=$2 + orig_var="_fzf_orig_completion_${cmd//[^A-Za-z0-9_]/_}" + orig="${!orig_var-}" + orig="${orig%#*}" + [[ $orig == *' %s '* ]] || return 1 + printf -v REPLY "$orig" "$func" +} + _fzf_opts_completion() { local cur prev opts COMPREPLY=() @@ -261,15 +286,12 @@ } _fzf_handle_dynamic_completion() { - local cmd orig_var orig ret orig_cmd orig_complete + local cmd ret REPLY orig_cmd orig_complete cmd="$1" shift orig_cmd="$1" - orig_var="_fzf_orig_completion_$cmd" - orig="${!orig_var-}" - orig="${orig##*#}" - if [[ -n "$orig" ]] && type "$orig" > /dev/null 2>&1; then - $orig "$@" + if __fzf_orig_completion_get_orig_func "$cmd"; then + "$REPLY" "$@" elif [[ -n "${_fzf_completion_loader-}" ]]; then orig_complete=$(complete -p "$orig_cmd" 2> /dev/null) _completion_loader "$@" @@ -277,6 +299,12 @@ # _completion_loader may not have updated completion for the command if [[ "$(complete -p "$orig_cmd" 2> /dev/null)" != "$orig_complete" ]]; then __fzf_orig_completion < <(complete -p "$orig_cmd" 2> /dev/null) + + # Update orig_complete by _fzf_orig_completion entry + [[ $orig_complete =~ ' -F '(_fzf_[^ ]+)' ' ]] && + __fzf_orig_completion_instantiate "$cmd" "${BASH_REMATCH[1]}" && + orig_complete=$REPLY + if [[ "${__fzf_nospace_commands-}" = *" $orig_cmd "* ]]; then eval "${orig_complete/ -F / -o nospace -F }" else @@ -293,7 +321,6 @@ if [[ $cmd == \\* ]]; then cmd="${cmd:1}" fi - cmd="${cmd//[^A-Za-z0-9_=]/_}" COMPREPLY=() trigger=${FZF_COMPLETION_TRIGGER-'**'} cur="${COMP_WORDS[COMP_CWORD]}" @@ -359,7 +386,6 @@ post="$(caller 0 | command awk '{print $2}')_post" type -t "$post" > /dev/null 2>&1 || post='command cat' - cmd="${COMP_WORDS[0]//[^A-Za-z0-9_=]/_}" trigger=${FZF_COMPLETION_TRIGGER-'**'} cur="${COMP_WORDS[COMP_CWORD]}" if [[ "$cur" == *"$trigger" ]] && [[ $cur != *'$('* ]] && [[ $cur != *':='* ]] && [[ $cur != *'`'* ]]; then @@ -488,15 +514,12 @@ fi __fzf_defc() { - local cmd func opts orig_var orig def + local cmd func opts REPLY cmd="$1" func="$2" opts="$3" - orig_var="_fzf_orig_completion_${cmd//[^A-Za-z0-9_]/_}" - orig="${!orig_var-}" - if [[ -n "$orig" ]]; then - printf -v def "$orig" "$func" - eval "$def" + if __fzf_orig_completion_instantiate "$cmd" "$func"; then + eval "$REPLY" else complete -F "$func" $opts "$cmd" fi diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fzf-0.46.1/src/algo/algo.go new/fzf-0.47.0/src/algo/algo.go --- old/fzf-0.46.1/src/algo/algo.go 2024-02-01 10:13:00.000000000 +0100 +++ new/fzf-0.47.0/src/algo/algo.go 2024-03-10 13:43:41.000000000 +0100 @@ -255,24 +255,29 @@ func bonusFor(prevClass charClass, class charClass) int16 { if class > charNonWord { - if prevClass == charWhite { + switch prevClass { + case charWhite: // Word boundary after whitespace return bonusBoundaryWhite - } else if prevClass == charDelimiter { + case charDelimiter: // Word boundary after a delimiter character return bonusBoundaryDelimiter - } else if prevClass == charNonWord { + case charNonWord: // Word boundary return bonusBoundary } } + if prevClass == charLower && class == charUpper || prevClass != charNumber && class == charNumber { // camelCase letter123 return bonusCamel123 - } else if class == charNonWord { + } + + switch class { + case charNonWord, charDelimiter: return bonusNonWord - } else if class == charWhite { + case charWhite: return bonusBoundaryWhite } return 0 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fzf-0.46.1/src/constants.go new/fzf-0.47.0/src/constants.go --- old/fzf-0.46.1/src/constants.go 2024-02-01 10:13:00.000000000 +0100 +++ new/fzf-0.47.0/src/constants.go 2024-03-10 13:43:41.000000000 +0100 @@ -2,7 +2,6 @@ import ( "math" - "os" "time" "github.com/junegunn/fzf/src/util" @@ -54,16 +53,6 @@ defaultJumpLabels string = "asdfghjklqwertyuiopzxcvbnm1234567890ASDFGHJKLQWERTYUIOPZXCVBNM`~;:,<.>/?'\"!@#$%^&*()[{]}-_=+" ) -var defaultCommand string - -func init() { - if !util.IsWindows() { - defaultCommand = `set -o pipefail; command find -L . -mindepth 1 \( -path '*/.*' -o -fstype 'sysfs' -o -fstype 'devfs' -o -fstype 'devtmpfs' -o -fstype 'proc' \) -prune -o -type f -print -o -type l -print 2> /dev/null | cut -b3-` - } else if os.Getenv("TERM") == "cygwin" { - defaultCommand = `sh -c "command find -L . -mindepth 1 -path '*/.*' -prune -o -type f -print -o -type l -print 2> /dev/null | cut -b3-"` - } -} - // fzf events const ( EvtReadNew util.EventType = iota diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fzf-0.46.1/src/core.go new/fzf-0.47.0/src/core.go --- old/fzf-0.46.1/src/core.go 2024-02-01 10:13:00.000000000 +0100 +++ new/fzf-0.47.0/src/core.go 2024-03-10 13:43:41.000000000 +0100 @@ -213,6 +213,7 @@ reading := true ticks := 0 var nextCommand *string + var nextEnviron []string eventBox.Watch(EvtReadNew) total := 0 query := []rune{} @@ -232,13 +233,13 @@ useSnapshot := false var snapshot []*Chunk var count int - restart := func(command string) { + restart := func(command string, environ []string) { reading = true chunkList.Clear() itemIndex = 0 inputRevision++ header = make([]string, 0, opts.HeaderLines) - go reader.restart(command) + go reader.restart(command, environ) } for { delay := true @@ -266,8 +267,9 @@ os.Exit(value.(int)) case EvtReadNew, EvtReadFin: if evt == EvtReadFin && nextCommand != nil { - restart(*nextCommand) + restart(*nextCommand, nextEnviron) nextCommand = nil + nextEnviron = nil break } else { reading = reading && evt == EvtReadNew @@ -292,11 +294,13 @@ case EvtSearchNew: var command *string + var environ []string var changed bool switch val := value.(type) { case searchRequest: sort = val.sort command = val.command + environ = val.environ changed = val.changed if command != nil { useSnapshot = val.sync @@ -306,8 +310,9 @@ if reading { reader.terminate() nextCommand = command + nextEnviron = environ } else { - restart(*command) + restart(*command, environ) } } if !changed { diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fzf-0.46.1/src/options.go new/fzf-0.47.0/src/options.go --- old/fzf-0.46.1/src/options.go 2024-02-01 10:13:00.000000000 +0100 +++ new/fzf-0.47.0/src/options.go 2024-03-10 13:43:41.000000000 +0100 @@ -126,8 +126,8 @@ Environment variables FZF_DEFAULT_COMMAND Default command to use when input is tty - FZF_DEFAULT_OPTS Default options - (e.g. '--layout=reverse --inline-info') + FZF_DEFAULT_OPTS Default options (e.g. '--layout=reverse --info=inline') + FZF_DEFAULT_OPTS_FILE Location of the file to read default options from FZF_API_KEY X-API-Key header for HTTP server (--listen) ` @@ -421,8 +421,10 @@ os.Exit(code) } +var errorContext = "" + func errorExit(msg string) { - os.Stderr.WriteString(msg + "\n") + os.Stderr.WriteString(errorContext + msg + "\n") os.Exit(exitError) } @@ -1864,7 +1866,7 @@ addr := defaultListenAddr if given { var err error - err, addr = parseListenAddress(str) + addr, err = parseListenAddress(str) if err != nil { errorExit(err.Error()) } @@ -1962,14 +1964,14 @@ } else if match, value := optString(arg, "--tabstop="); match { opts.Tabstop = atoi(value) } else if match, value := optString(arg, "--listen="); match { - err, addr := parseListenAddress(value) + addr, err := parseListenAddress(value) if err != nil { errorExit(err.Error()) } opts.ListenAddr = &addr opts.Unsafe = false } else if match, value := optString(arg, "--listen-unsafe="); match { - err, addr := parseListenAddress(value) + addr, err := parseListenAddress(value) if err != nil { errorExit(err.Error()) } @@ -2167,13 +2169,36 @@ } } - // Options from Env var - words, _ := shellwords.Parse(os.Getenv("FZF_DEFAULT_OPTS")) + // 1. Options from $FZF_DEFAULT_OPTS_FILE + if path := os.Getenv("FZF_DEFAULT_OPTS_FILE"); path != "" { + bytes, err := os.ReadFile(path) + if err != nil { + errorContext = "$FZF_DEFAULT_OPTS_FILE: " + errorExit(err.Error()) + } + + words, parseErr := shellwords.Parse(string(bytes)) + if parseErr != nil { + errorContext = path + ": " + errorExit(parseErr.Error()) + } + if len(words) > 0 { + parseOptions(opts, words) + } + } + + // 2. Options from $FZF_DEFAULT_OPTS string + words, parseErr := shellwords.Parse(os.Getenv("FZF_DEFAULT_OPTS")) + errorContext = "$FZF_DEFAULT_OPTS: " + if parseErr != nil { + errorExit(parseErr.Error()) + } if len(words) > 0 { parseOptions(opts, words) } - // Options from command-line arguments + // 3. Options from command-line arguments + errorContext = "" parseOptions(opts, os.Args[1:]) postProcessOptions(opts) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fzf-0.46.1/src/pattern.go new/fzf-0.47.0/src/pattern.go --- old/fzf-0.46.1/src/pattern.go 2024-02-01 10:13:00.000000000 +0100 +++ new/fzf-0.47.0/src/pattern.go 2024-03-10 13:43:41.000000000 +0100 @@ -209,11 +209,10 @@ // Flip exactness if fuzzy && !inv { typ = termExact - text = text[1:] } else { typ = termFuzzy - text = text[1:] } + text = text[1:] } else if strings.HasPrefix(text, "^") { if typ == termSuffix { typ = termEqual diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fzf-0.46.1/src/reader.go new/fzf-0.47.0/src/reader.go --- old/fzf-0.46.1/src/reader.go 2024-02-01 10:13:00.000000000 +0100 +++ new/fzf-0.47.0/src/reader.go 2024-03-10 13:43:41.000000000 +0100 @@ -6,14 +6,13 @@ "io" "os" "os/exec" - "path" "path/filepath" "sync" "sync/atomic" "time" + "github.com/charlievieth/fastwalk" "github.com/junegunn/fzf/src/util" - "github.com/saracen/walker" ) // Reader reads from command or standard input @@ -77,20 +76,19 @@ func (r *Reader) terminate() { r.mutex.Lock() - defer func() { r.mutex.Unlock() }() - r.killed = true if r.exec != nil && r.exec.Process != nil { util.KillCommand(r.exec) - } else if defaultCommand != "" { + } else { os.Stdin.Close() } + r.mutex.Unlock() } -func (r *Reader) restart(command string) { +func (r *Reader) restart(command string, environ []string) { r.event = int32(EvtReady) r.startEventPoller() - success := r.readFromCommand(nil, command) + success := r.readFromCommand(command, environ) r.fin(success) } @@ -99,26 +97,12 @@ r.startEventPoller() var success bool if util.IsTty() { - // The default command for *nix requires a shell that supports "pipefail" - // https://unix.stackexchange.com/a/654932/62171 - shell := "bash" - currentShell := os.Getenv("SHELL") - currentShellName := path.Base(currentShell) - for _, shellName := range []string{"bash", "zsh", "ksh", "ash", "hush", "mksh", "yash"} { - if currentShellName == shellName { - shell = currentShell - break - } - } cmd := os.Getenv("FZF_DEFAULT_COMMAND") if len(cmd) == 0 { - if defaultCommand != "" { - success = r.readFromCommand(&shell, defaultCommand) - } else { - success = r.readFiles() - } + success = r.readFiles() } else { - success = r.readFromCommand(nil, cmd) + // We can't export FZF_* environment variables to the default command + success = r.readFromCommand(cmd, nil) } } else { success = r.readFromStdin() @@ -163,10 +147,14 @@ func (r *Reader) readFiles() bool { r.killed = false - fn := func(path string, mode os.FileInfo) error { + conf := fastwalk.Config{Follow: true} + fn := func(path string, de os.DirEntry, err error) error { + if err != nil { + return nil + } path = filepath.Clean(path) if path != "." { - isDir := mode.Mode().IsDir() + isDir := de.IsDir() if isDir && filepath.Base(path)[0] == '.' { return filepath.SkipDir } @@ -181,20 +169,16 @@ } return nil } - cb := walker.WithErrorCallback(func(pathname string, err error) error { - return nil - }) - return walker.Walk(".", fn, cb) == nil + return fastwalk.Walk(&conf, ".", fn) == nil } -func (r *Reader) readFromCommand(shell *string, command string) bool { +func (r *Reader) readFromCommand(command string, environ []string) bool { r.mutex.Lock() r.killed = false r.command = &command - if shell != nil { - r.exec = util.ExecCommandWith(*shell, command, true) - } else { - r.exec = util.ExecCommand(command, true) + r.exec = util.ExecCommand(command, true) + if environ != nil { + r.exec.Env = environ } out, err := r.exec.StdoutPipe() if err != nil { diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fzf-0.46.1/src/reader_test.go new/fzf-0.47.0/src/reader_test.go --- old/fzf-0.46.1/src/reader_test.go 2024-02-01 10:13:00.000000000 +0100 +++ new/fzf-0.47.0/src/reader_test.go 2024-03-10 13:43:41.000000000 +0100 @@ -22,7 +22,7 @@ } // Normal command - reader.fin(reader.readFromCommand(nil, `echo abc&&echo def`)) + reader.fin(reader.readFromCommand(`echo abc&&echo def`, nil)) if len(strs) != 2 || strs[0] != "abc" || strs[1] != "def" { t.Errorf("%s", strs) } @@ -47,7 +47,7 @@ reader.startEventPoller() // Failing command - reader.fin(reader.readFromCommand(nil, `no-such-command`)) + reader.fin(reader.readFromCommand(`no-such-command`, nil)) strs = []string{} if len(strs) > 0 { t.Errorf("%s", strs) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fzf-0.46.1/src/server.go new/fzf-0.47.0/src/server.go --- old/fzf-0.46.1/src/server.go 2024-02-01 10:13:00.000000000 +0100 +++ new/fzf-0.47.0/src/server.go 2024-03-10 13:43:41.000000000 +0100 @@ -53,47 +53,47 @@ var defaultListenAddr = listenAddress{"localhost", 0} -func parseListenAddress(address string) (error, listenAddress) { +func parseListenAddress(address string) (listenAddress, error) { parts := strings.SplitN(address, ":", 3) if len(parts) == 1 { parts = []string{"localhost", parts[0]} } if len(parts) != 2 { - return fmt.Errorf("invalid listen address: %s", address), defaultListenAddr + return defaultListenAddr, fmt.Errorf("invalid listen address: %s", address) } portStr := parts[len(parts)-1] port, err := strconv.Atoi(portStr) if err != nil || port < 0 || port > 65535 { - return fmt.Errorf("invalid listen port: %s", portStr), defaultListenAddr + return defaultListenAddr, fmt.Errorf("invalid listen port: %s", portStr) } if len(parts[0]) == 0 { parts[0] = "localhost" } - return nil, listenAddress{parts[0], port} + return listenAddress{parts[0], port}, nil } -func startHttpServer(address listenAddress, actionChannel chan []*action, responseChannel chan string) (error, int) { +func startHttpServer(address listenAddress, actionChannel chan []*action, responseChannel chan string) (int, error) { host := address.host port := address.port apiKey := os.Getenv("FZF_API_KEY") if !address.IsLocal() && len(apiKey) == 0 { - return fmt.Errorf("FZF_API_KEY is required to allow remote access"), port + return port, fmt.Errorf("FZF_API_KEY is required to allow remote access") } addrStr := fmt.Sprintf("%s:%d", host, port) listener, err := net.Listen("tcp", addrStr) if err != nil { - return fmt.Errorf("failed to listen on %s", addrStr), port + return port, fmt.Errorf("failed to listen on %s", addrStr) } if port == 0 { addr := listener.Addr().String() parts := strings.Split(addr, ":") if len(parts) < 2 { - return fmt.Errorf("cannot extract port: %s", addr), port + return port, fmt.Errorf("cannot extract port: %s", addr) } var err error port, err = strconv.Atoi(parts[len(parts)-1]) if err != nil { - return err, port + return port, err } } @@ -119,7 +119,7 @@ listener.Close() }() - return nil, port + return port, nil } // Here we are writing a simplistic HTTP server without using net/http @@ -237,15 +237,13 @@ parts := strings.SplitN(pair, "=", 2) if len(parts) == 2 { switch parts[0] { - case "limit": - val, err := strconv.Atoi(parts[1]) - if err == nil { - params.limit = val - } - case "offset": - val, err := strconv.Atoi(parts[1]) - if err == nil { - params.offset = val + case "limit", "offset": + if val, err := strconv.Atoi(parts[1]); err == nil { + if parts[0] == "limit" { + params.limit = val + } else { + params.offset = val + } } } } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fzf-0.46.1/src/terminal.go new/fzf-0.47.0/src/terminal.go --- old/fzf-0.46.1/src/terminal.go 2024-02-01 10:13:00.000000000 +0100 +++ new/fzf-0.47.0/src/terminal.go 2024-03-10 13:43:41.000000000 +0100 @@ -67,7 +67,7 @@ // * https://sw.kovidgoyal.net/kitty/graphics-protocol // * https://en.wikipedia.org/wiki/Sixel // * https://iterm2.com/documentation-images.html - passThroughRegex = regexp.MustCompile(`\x1bPtmux;\x1b\x1b.*?[^\x1b]\x1b\\|\x1b(_G|P[0-9;]*q).*?\x1b\\\r?|\x1b]1337;.*?\a`) + passThroughRegex = regexp.MustCompile(`\x1bPtmux;\x1b\x1b.*?[^\x1b]\x1b\\|\x1b(_G|P[0-9;]*q).*?\x1b\\\r?|\x1b]1337;.*?(\a|\x1b\\)`) } type jumpMode int @@ -499,6 +499,7 @@ sort bool sync bool command *string + environ []string changed bool } @@ -828,7 +829,7 @@ _, t.hasLoadActions = t.keymap[tui.Load.AsEvent()] if t.listenAddr != nil { - err, port := startHttpServer(*t.listenAddr, t.serverInputChan, t.serverOutputChan) + port, err := startHttpServer(*t.listenAddr, t.serverInputChan, t.serverOutputChan) if err != nil { errorExit(err.Error()) } @@ -3160,7 +3161,7 @@ } t.previewer.lines = result.lines t.previewer.spinner = result.spinner - if t.previewer.following.Enabled() { + if t.hasPreviewWindow() && t.previewer.following.Enabled() { t.previewer.offset = util.Max(t.previewer.offset, len(t.previewer.lines)-(t.pwindow.Height()-t.previewOpts.headerLines)) } else if result.offset >= 0 { t.previewer.offset = util.Constrain(result.offset, t.previewOpts.headerLines, len(t.previewer.lines)-1) @@ -3381,6 +3382,9 @@ // Discard the preview content so that it won't accidentally appear // when preview window is re-enabled and previewDelay is triggered t.previewer.lines = nil + + // Also kill the preview process if it's still running + t.cancelPreview() } } case actTogglePreviewWrap: @@ -3987,11 +3991,18 @@ // Full redraw if !currentPreviewOpts.sameLayout(t.previewOpts) { - wasHidden := t.pwindow == nil + // Preview command can be running in the background if the size of + // the preview window is 0 but not 'hidden' + wasHidden := currentPreviewOpts.hidden updatePreviewWindow(false) if wasHidden && t.hasPreviewWindow() { + // Restart refreshPreview(t.previewOpts.command) + } else if t.previewOpts.hidden { + // Cancel + t.cancelPreview() } else { + // Refresh req(reqPreviewRefresh) } } else if !currentPreviewOpts.sameContentLayout(t.previewOpts) { @@ -4081,10 +4092,15 @@ req(reqPrompt) } + reload := changed || newCommand != nil + var reloadRequest *searchRequest + if reload { + reloadRequest = &searchRequest{sort: t.sort, sync: reloadSync, command: newCommand, environ: t.environ(), changed: changed} + } t.mutex.Unlock() // Must be unlocked before touching reqBox - if changed || newCommand != nil { - t.eventBox.Set(EvtSearchNew, searchRequest{sort: t.sort, sync: reloadSync, command: newCommand, changed: changed}) + if reload { + t.eventBox.Set(EvtSearchNew, *reloadRequest) } for _, event := range events { t.reqBox.Set(event, nil) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fzf-0.46.1/src/tui/light.go new/fzf-0.47.0/src/tui/light.go --- old/fzf-0.46.1/src/tui/light.go 2024-02-01 10:13:00.000000000 +0100 +++ new/fzf-0.47.0/src/tui/light.go 2024-03-10 13:43:41.000000000 +0100 @@ -808,13 +808,25 @@ color = ColPreviewBorder } hw := runeWidth(w.border.top) + pad := repeat(' ', w.width/hw) + + w.Move(0, 0) if top { - w.Move(0, 0) w.CPrint(color, repeat(w.border.top, w.width/hw)) + } else { + w.CPrint(color, pad) + } + + for y := 1; y < w.height-1; y++ { + w.Move(y, 0) + w.CPrint(color, pad) } + + w.Move(w.height-1, 0) if bottom { - w.Move(w.height-1, 0) w.CPrint(color, repeat(w.border.bottom, w.width/hw)) + } else { + w.CPrint(color, pad) } } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fzf-0.46.1/src/tui/tcell.go new/fzf-0.47.0/src/tui/tcell.go --- old/fzf-0.46.1/src/tui/tcell.go 2024-02-01 10:13:00.000000000 +0100 +++ new/fzf-0.47.0/src/tui/tcell.go 2024-03-10 13:43:41.000000000 +0100 @@ -544,7 +544,7 @@ height: height, normal: normal, borderStyle: borderStyle} - w.drawBorder(false) + w.Erase() return w } @@ -561,8 +561,8 @@ } func (w *TcellWindow) Erase() { - w.drawBorder(false) fill(w.left-1, w.top, w.width+1, w.height-1, w.normal, ' ') + w.drawBorder(false) } func (w *TcellWindow) EraseMaybe() bool { diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fzf-0.46.1/test/test_go.rb new/fzf-0.47.0/test/test_go.rb --- old/fzf-0.46.1/test/test_go.rb 2024-02-01 10:13:00.000000000 +0100 +++ new/fzf-0.47.0/test/test_go.rb 2024-03-10 13:43:41.000000000 +0100 @@ -1918,7 +1918,7 @@ end def test_reload - tmux.send_keys %(seq 1000 | #{FZF} --bind 'change:reload(seq {q}),a:reload(seq 100),b:reload:seq 200' --header-lines 2 --multi 2), :Enter + tmux.send_keys %(seq 1000 | #{FZF} --bind 'change:reload(seq $FZF_QUERY),a:reload(seq 100),b:reload:seq 200' --header-lines 2 --multi 2), :Enter tmux.until { |lines| assert_equal 998, lines.match_count } tmux.send_keys 'a' tmux.until do |lines| @@ -2582,6 +2582,7 @@ def test_change_preview_window_rotate tmux.send_keys "seq 100 | #{FZF} --preview-window left,border-none --preview 'echo hello' --bind '" \ "a:change-preview-window(right|down|up|hidden|)'", :Enter + tmux.until { |lines| assert(lines.any? { _1.include?('100/100') }) } 3.times do tmux.until { |lines| lines[0].start_with?('hello') } tmux.send_keys 'a' ++++++ vendor.tar.zst ++++++ Binary files /var/tmp/diff_new_pack.NyLJnd/_old and /var/tmp/diff_new_pack.NyLJnd/_new differ