Repository: junegunn/fzf
Pull request #4307 (2025-03-10 13:24:46)

Bump github.com/charlievieth/fastwalk from 1.0.9 to 1.0.10
Bumps [github.com/charlievieth/fastwalk](https://github.com/charlievieth/fastwalk) from 1.0.9 to 1.0.10.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a href="https://github.com/charlievieth/fastwalk/releases">github.com/charlievieth/fastwalk's releases</a>.</em></p>
<blockquote>
<h2>v1.0.10 Update default number of workers used on macOS/Darwin</h2>
<p><code>v1.0.10</code></p>
<p>This release primarily updates <a href="https://github.com/charlievieth/fastwalk/blob/91fba48336ab14b5ffd91aaecf3c4a88af2117a2/fastwalk.go#L75"><code>DefaultNumWorkers</code></a> for recent versions of Darwin/macOS since APFS performance has improved for parallel access. The rest of the commits simply update CI tests.</p>
<p>commit 91fba48336ab14b5ffd91aaecf3c4a88af2117a2
Author: Charlie Vieth <a href="mailto:charlie.vieth@gmail.com">charlie.vieth@gmail.com</a>
Date:   Fri Mar 7 21:22:04 2025 -0500</p>
<pre><code>fastwalk: update Darwin values for DefaultNumWorkers
<p>This commit updates DefaultNumWorkers for recent versions of<br />
Darwin/macOS since APFS performance has improved for parallel<br />
access.</p>
<pre><code>$ go test -run XXX -bench 'BenchmarkFastWalkNumWorkers' -benchmem -count 3
goos: darwin
goarch: arm64
pkg: github.com/charlievieth/fastwalk
cpu: Apple M4 Pro
BenchmarkFastWalkNumWorkers/NoOp/2-14                 79          14148633 ns/op         2609565 B/op      47022 allocs/op
BenchmarkFastWalkNumWorkers/NoOp/2-14                 80          14094588 ns/op         2609550 B/op      47022 allocs/op
BenchmarkFastWalkNumWorkers/NoOp/2-14                 84          14637930 ns/op         2609919 B/op      47023 allocs/op
BenchmarkFastWalkNumWorkers/NoOp/4-14                120          12065573 ns/op         2605615 B/op      47024 allocs/op
BenchmarkFastWalkNumWorkers/NoOp/4-14                120           9889337 ns/op         2605887 B/op      47024 allocs/op
BenchmarkFastWalkNumWorkers/NoOp/4-14                120          10195627 ns/op         2605582 B/op      47024 allocs/op
BenchmarkFastWalkNumWorkers/NoOp/6-14                100          10942185 ns/op         2609385 B/op      47028 allocs/op
BenchmarkFastWalkNumWorkers/NoOp/6-14                100          10971918 ns/op         2608213 B/op      47028 allocs/op
BenchmarkFastWalkNumWorkers/NoOp/6-14                100          10973288 ns/op         2606743 B/op      47026 allocs/op
BenchmarkFastWalkNumWorkers/NoOp/8-14                100          10754362 ns/op         2611974 B/op      47030 allocs/op
BenchmarkFastWalkNumWorkers/NoOp/8-14                100          10785432 ns/op         2611854 B/op      47029 allocs/op
BenchmarkFastWalkNumWorkers/NoOp/8-14                100          10737051 ns/op         2611918 B/op      47031 allocs/op
BenchmarkFastWalkNumWorkers/NoOp/10-14               100          10858743 ns/op         2613452 B/op      47035 allocs/op
BenchmarkFastWalkNumWorkers/NoOp/10-14               100          10822169 ns/op         2612663 B/op      47035 allocs/op
BenchmarkFastWalkNumWorkers/NoOp/10-14               100          10894342 ns/op         2612256 B/op      47033 allocs/op
BenchmarkFastWalkNumWorkers/NoOp/12-14               100          11385580 ns/op         2612864 B/op      47036 allocs/op
BenchmarkFastWalkNumWorkers/NoOp/12-14               100          11716318 ns/op         2612726 B/op      47035 allocs/op
BenchmarkFastWalkNumWorkers/NoOp/12-14               100          11700127 ns/op         2613368 B/op      47035 allocs/op
BenchmarkFastWalkNumWorkers/NoOp/14-14                88          12586038 ns/op         2612940 B/op      47038 allocs/op
BenchmarkFastWalkNumWorkers/NoOp/14-14                90          12985992 ns/op         2614281 B/op      47037 allocs/op
BenchmarkFastWalkNumWorkers/NoOp/14-14                84          13034864 ns/op         2613378 B/op      47037 allocs/op
BenchmarkFastWalkNumWorkers/NoIO/2-14                 72          16765335 ns/op         4299840 B/op      91473 allocs/op
BenchmarkFastWalkNumWorkers/NoIO/2-14                 63          17172566 ns/op         4299872 B/op      91474 allocs/op
BenchmarkFastWalkNumWorkers/NoIO/2-14                 70          17179273 ns/op         4299852 B/op      91473 allocs/op
BenchmarkFastWalkNumWorkers/NoIO/4-14                 91          12105571 ns/op         4297481 B/op      91489 allocs/op
BenchmarkFastWalkNumWorkers/NoIO/4-14                 93          11821604 ns/op         4297340 B/op      91488 allocs/op
BenchmarkFastWalkNumWorkers/NoIO/4-14                 93          11905724 ns/op         4296724 B/op      91488 allocs/op
BenchmarkFastWalkNumWorkers/NoIO/6-14                100          12188158 ns/op         4300834 B/op      91496 allocs/op
BenchmarkFastWalkNumWorkers/NoIO/6-14                100          12116235 ns/op         4301021 B/op      91498 allocs/op
&lt;/code&gt;&lt;/pre&gt;
&lt;!-- raw HTML omitted --&gt;
&lt;/blockquote&gt;
&lt;p&gt;... (truncated)&lt;/p&gt;
&lt;/details&gt;
&lt;details&gt;
&lt;summary&gt;Commits&lt;/summary&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/charlievieth/fastwalk/commit/91fba48336ab14b5ffd91aaecf3c4a88af2117a2&quot;&gt;&lt;code&gt;91fba48&lt;/code&gt;&lt;/a&gt; fastwalk: update Darwin values for DefaultNumWorkers&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/charlievieth/fastwalk/commit/1815fbbf90cbc47fca4b56326c6e33be95bd893d&quot;&gt;&lt;code&gt;1815fbb&lt;/code&gt;&lt;/a&gt; ci: test on go1.24&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/charlievieth/fastwalk/commit/ae83727c70324442afb2175b46b239a9560b4121&quot;&gt;&lt;code&gt;ae83727&lt;/code&gt;&lt;/a&gt; gh: add code coverage&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/charlievieth/fastwalk/commit/d3051b94bca5066cc0b79d9b9e5cc0adbe5ffede&quot;&gt;&lt;code&gt;d3051b9&lt;/code&gt;&lt;/a&gt; gh: add code coverage&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/charlievieth/fastwalk/commit/156a45f32b8859d7c6d2c6743e80e3c120aca2a6&quot;&gt;&lt;code&gt;156a45f&lt;/code&gt;&lt;/a&gt; gh: add code coverage&lt;/li&gt;
&lt;li&gt;See full diff in &lt;a href=&quot;https://github.com/charlievieth/fastwalk/compare/v1.0.9...v1.0.10&quot;&gt;compare view&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/details&gt;

&lt;br /&gt;
</code></pre>


[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=github.com/charlievieth/fastwalk&package-manager=go_modules&previous-version=1.0.9&new-version=1.0.10)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it
- `@dependabot merge` will merge this PR after your CI passes on it
- `@dependabot squash and merge` will squash and merge this PR after your CI passes on it
- `@dependabot cancel merge` will cancel a previously requested merge and block automerging
- `@dependabot reopen` will reopen this PR if it is closed
- `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
- `@dependabot show <dependency name> ignore conditions` will show all of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)


</details>


Patch:
diff --git a/CHANGELOG.md b/CHANGELOG.md
index eb883a6c..06dc3e77 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,6 +1,16 @@
 CHANGELOG
 =========
 
+0.61.0
+------
+- Added `--ghost=TEXT` to display a ghost text when the input is empty
+  ```sh
+  # Display "Type to search" when the input is empty
+  fzf --ghost "Type to search"
+  ```
+- Added `change-pointer` and `transform-pointer` actions for dynamically changing the pointer sign
+- Bug fixes and improvements
+
 0.60.3
 ------
 - Bug fixes and improvements
diff --git a/README.md b/README.md
index 65805db4..88fb7ba9 100644
--- a/README.md
+++ b/README.md
@@ -980,7 +980,7 @@ I would like to thank all the sponsors of this project who make it possible for
 
 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:&#x2F;&#x2F;github.com&#x2F;miyanokomiya.png" width="60px" alt="User avatar: miyanokomiya" /></a><a href="https://github.com/jonhoo"><img src="https:&#x2F;&#x2F;github.com&#x2F;jonhoo.png" width="60px" alt="User avatar: Jon Gjengset" /></a><a href="https://github.com/AceofSpades5757"><img src="https:&#x2F;&#x2F;github.com&#x2F;AceofSpades5757.png" width="60px" alt="User avatar: Kyle L. Davis" /></a><a href="https://github.com/Frederick888"><img src="https:&#x2F;&#x2F;github.com&#x2F;Frederick888.png" width="60px" alt="User avatar: Frederick Zhang" /></a><a href="https://github.com/moritzdietz"><img src="https:&#x2F;&#x2F;github.com&#x2F;moritzdietz.png" width="60px" alt="User avatar: Moritz Dietz" /></a><a href="https://github.com/mikker"><img src="https:&#x2F;&#x2F;github.com&#x2F;mikker.png" width="60px" alt="User avatar: Mikkel Malmberg" /></a><a href="https://github.com/pldubouilh"><img src="https:&#x2F;&#x2F;github.com&#x2F;pldubouilh.png" width="60px" alt="User avatar: Pierre Dubouilh" /></a><a href="https://github.com/trantor"><img src="https:&#x2F;&#x2F;github.com&#x2F;trantor.png" width="60px" alt="User avatar: Fulvio Scapin" /></a><a href="https://github.com/rcorre"><img src="https:&#x2F;&#x2F;github.com&#x2F;rcorre.png" width="60px" alt="User avatar: Ryan Roden-Corrent" /></a><a href="https://github.com/blissdev"><img src="https:&#x2F;&#x2F;github.com&#x2F;blissdev.png" width="60px" alt="User avatar: Jordan Arentsen" /></a><a href="https://github.com/aexvir"><img src="https:&#x2F;&#x2F;github.com&#x2F;aexvir.png" width="60px" alt="User avatar: Alex Viscreanu" /></a><a href="https://github.com/dbalatero"><img src="https:&#x2F;&#x2F;github.com&#x2F;dbalatero.png" width="60px" alt="User avatar: David Balatero" /></a><a href="https://github.com/moobar"><img src="https:&#x2F;&#x2F;github.com&#x2F;moobar.png" width="60px" alt="User avatar: " /></a><a href="https://github.com/benelan"><img src="https:&#x2F;&#x2F;github.com&#x2F;benelan.png" width="60px" alt="User avatar: Ben Elan" /></a><a href="https://github.com/pawelduda"><img src="https:&#x2F;&#x2F;github.com&#x2F;pawelduda.png" width="60px" alt="User avatar: Paweł Duda" /></a><a href="https://github.com/pyrho"><img src="https:&#x2F;&#x2F;github.com&#x2F;pyrho.png" width="60px" alt="User avatar: Damien Rajon" /></a><a href="https://github.com/ArtBIT"><img src="https:&#x2F;&#x2F;github.com&#x2F;ArtBIT.png" width="60px" alt="User avatar: ArtBIT" /></a><a href="https://github.com/da-moon"><img src="https:&#x2F;&#x2F;github.com&#x2F;da-moon.png" width="60px" alt="User avatar: " /></a><a href="https://github.com/hovissimo"><img src="https:&#x2F;&#x2F;github.com&#x2F;hovissimo.png" width="60px" alt="User avatar: Hovis" /></a><a href="https://github.com/dariusjonda"><img src="https:&#x2F;&#x2F;github.com&#x2F;dariusjonda.png" width="60px" alt="User avatar: Darius Jonda" /></a><a href="https://github.com/cristiand391"><img src="https:&#x2F;&#x2F;github.com&#x2F;cristiand391.png" width="60px" alt="User avatar: Cristian Dominguez" /></a><a href="https://github.com/eliangcs"><img src="https:&#x2F;&#x2F;github.com&#x2F;eliangcs.png" width="60px" alt="User avatar: Chang-Hung Liang" /></a><a href="https://github.com/asphaltbuffet"><img src="https:&#x2F;&#x2F;github.com&#x2F;asphaltbuffet.png" width="60px" alt="User avatar: Ben Lechlitner" /></a><a href="https://github.com/looshch"><img src="https:&#x2F;&#x2F;github.com&#x2F;looshch.png" width="60px" alt="User avatar: george looshch" /></a><a href="https://github.com/kg8m"><img src="https:&#x2F;&#x2F;github.com&#x2F;kg8m.png" width="60px" alt="User avatar: Takumi KAGIYAMA" /></a><a href="https://github.com/polm"><img src="https:&#x2F;&#x2F;github.com&#x2F;polm.png" width="60px" alt="User avatar: Paul OLeary McCann" /></a><a href="https://github.com/rbeeger"><img src="https:&#x2F;&#x2F;github.com&#x2F;rbeeger.png" width="60px" alt="User avatar: Robert Beeger" /></a><a href="https://github.com/yowayb"><img src="https:&#x2F;&#x2F;github.com&#x2F;yowayb.png" width="60px" alt="User avatar: Yoway Buorn" /></a><a href="https://github.com/scalisi"><img src="https:&#x2F;&#x2F;github.com&#x2F;scalisi.png" width="60px" alt="User avatar: Josh Scalisi" /></a><a href="https://github.com/alecbcs"><img src="https:&#x2F;&#x2F;github.com&#x2F;alecbcs.png" width="60px" alt="User avatar: Alec Scott" /></a><a href="https://github.com/thnxdev"><img src="https:&#x2F;&#x2F;github.com&#x2F;thnxdev.png" width="60px" alt="User avatar: thanks.dev" /></a><a href="https://github.com/artursapek"><img src="https:&#x2F;&#x2F;github.com&#x2F;artursapek.png" width="60px" alt="User avatar: Artur Sapek" /></a><a href="https://github.com/ramnes"><img src="https:&#x2F;&#x2F;github.com&#x2F;ramnes.png" width="60px" alt="User avatar: Guillaume Gelin" /></a><a href="https://github.com/jyc"><img src="https:&#x2F;&#x2F;github.com&#x2F;jyc.png" width="60px" alt="User avatar: " /></a><a href="https://github.com/roblevy"><img src="https:&#x2F;&#x2F;github.com&#x2F;roblevy.png" width="60px" alt="User avatar: Rob Levy" /></a><a href="https://github.com/glozow"><img src="https:&#x2F;&#x2F;github.com&#x2F;glozow.png" width="60px" alt="User avatar: Gloria Zhao" /></a><a href="https://github.com/toupeira"><img src="https:&#x2F;&#x2F;github.com&#x2F;toupeira.png" width="60px" alt="User avatar: Markus Koller" /></a><a href="https://github.com/rkpatel33"><img src="https:&#x2F;&#x2F;github.com&#x2F;rkpatel33.png" width="60px" alt="User avatar: " /></a><a href="https://github.com/jamesob"><img src="https:&#x2F;&#x2F;github.com&#x2F;jamesob.png" width="60px" alt="User avatar: jamesob" /></a><a href="https://github.com/jlebray"><img src="https:&#x2F;&#x2F;github.com&#x2F;jlebray.png" width="60px" alt="User avatar: Johan Le Bray" /></a><a href="https://github.com/panosl1"><img src="https:&#x2F;&#x2F;github.com&#x2F;panosl1.png" width="60px" alt="User avatar: Panos Lampropoulos" /></a><a href="https://github.com/bespinian"><img src="https:&#x2F;&#x2F;github.com&#x2F;bespinian.png" width="60px" alt="User avatar: bespinian" /></a><a href="https://github.com/scosu"><img src="https:&#x2F;&#x2F;github.com&#x2F;scosu.png" width="60px" alt="User avatar: Markus Schneider-Pargmann" /></a><a href="https://github.com/smithbm2316"><img src="https:&#x2F;&#x2F;github.com&#x2F;smithbm2316.png" width="60px" alt="User avatar: Ben Smith" /></a><a href="https://github.com/charlieegan3"><img src="https:&#x2F;&#x2F;github.com&#x2F;charlieegan3.png" width="60px" alt="User avatar: Charlie Egan" /></a><a href="https://github.com/thobbs"><img src="https:&#x2F;&#x2F;github.com&#x2F;thobbs.png" width="60px" alt="User avatar: Tyler Hobbs" /></a><a href="https://github.com/neilparikh"><img src="https:&#x2F;&#x2F;github.com&#x2F;neilparikh.png" width="60px" alt="User avatar: Neil Parikh" /></a><a href="https://github.com/shkm"><img src="https:&#x2F;&#x2F;github.com&#x2F;shkm.png" width="60px" alt="User avatar: Jamie Schembri" /></a><a href="https://github.com/BasedScience"><img src="https:&#x2F;&#x2F;github.com&#x2F;BasedScience.png" width="60px" alt="User avatar: dockien" /></a><a href="https://github.com/RussellGilmore"><img src="https:&#x2F;&#x2F;github.com&#x2F;RussellGilmore.png" width="60px" alt="User avatar: Russell Gilmore" /></a><a href="https://github.com/meribold"><img src="https:&#x2F;&#x2F;github.com&#x2F;meribold.png" width="60px" alt="User avatar: Lukas Waymann" /></a><a href="https://github.com/terminaldweller"><img src="https:&#x2F;&#x2F;github.com&#x2F;terminaldweller.png" width="60px" alt="User avatar: Farzad Sadeghi" /></a><a href="https://github.com/jaydee-coder"><img src="https:&#x2F;&#x2F;github.com&#x2F;jaydee-coder.png" width="60px" alt="User avatar: " /></a><a href="https://github.com/brpaz"><img src="https:&#x2F;&#x2F;github.com&#x2F;brpaz.png" width="60px" alt="User avatar: Bruno Paz" /></a><a href="https://github.com/timobenn"><img src="https:&#x2F;&#x2F;github.com&#x2F;timobenn.png" width="60px" alt="User avatar: Timothy Bennett" /></a><a href="https://github.com/danhorner"><img src="https:&#x2F;&#x2F;github.com&#x2F;danhorner.png" width="60px" alt="User avatar: Daniel Horner" /></a><a href="https://github.com/syeo66"><img src="https:&#x2F;&#x2F;github.com&#x2F;syeo66.png" width="60px" alt="User avatar: Red Ochsenbein" /></a><a href="https://github.com/nekhaevskiy"><img src="https:&#x2F;&#x2F;github.com&#x2F;nekhaevskiy.png" width="60px" alt="User avatar: Yury" /></a><a href="https://github.com/cange"><img src="https:&#x2F;&#x2F;github.com&#x2F;cange.png" width="60px" alt="User avatar: Christian Angermann" /></a><a href="https://github.com/lajarre"><img src="https:&#x2F;&#x2F;github.com&#x2F;lajarre.png" width="60px" alt="User avatar: " /></a><!-- sponsors -->
+<!-- sponsors --><a href="https://github.com/miyanokomiya"><img src="https:&#x2F;&#x2F;github.com&#x2F;miyanokomiya.png" width="60px" alt="User avatar: miyanokomiya" /></a><a href="https://github.com/jonhoo"><img src="https:&#x2F;&#x2F;github.com&#x2F;jonhoo.png" width="60px" alt="User avatar: Jon Gjengset" /></a><a href="https://github.com/AceofSpades5757"><img src="https:&#x2F;&#x2F;github.com&#x2F;AceofSpades5757.png" width="60px" alt="User avatar: Kyle L. Davis" /></a><a href="https://github.com/Frederick888"><img src="https:&#x2F;&#x2F;github.com&#x2F;Frederick888.png" width="60px" alt="User avatar: Frederick Zhang" /></a><a href="https://github.com/moritzdietz"><img src="https:&#x2F;&#x2F;github.com&#x2F;moritzdietz.png" width="60px" alt="User avatar: Moritz Dietz" /></a><a href="https://github.com/mikker"><img src="https:&#x2F;&#x2F;github.com&#x2F;mikker.png" width="60px" alt="User avatar: Mikkel Malmberg" /></a><a href="https://github.com/pldubouilh"><img src="https:&#x2F;&#x2F;github.com&#x2F;pldubouilh.png" width="60px" alt="User avatar: Pierre Dubouilh" /></a><a href="https://github.com/trantor"><img src="https:&#x2F;&#x2F;github.com&#x2F;trantor.png" width="60px" alt="User avatar: Fulvio Scapin" /></a><a href="https://github.com/rcorre"><img src="https:&#x2F;&#x2F;github.com&#x2F;rcorre.png" width="60px" alt="User avatar: Ryan Roden-Corrent" /></a><a href="https://github.com/blissdev"><img src="https:&#x2F;&#x2F;github.com&#x2F;blissdev.png" width="60px" alt="User avatar: Jordan Arentsen" /></a><a href="https://github.com/aexvir"><img src="https:&#x2F;&#x2F;github.com&#x2F;aexvir.png" width="60px" alt="User avatar: Alex Viscreanu" /></a><a href="https://github.com/dbalatero"><img src="https:&#x2F;&#x2F;github.com&#x2F;dbalatero.png" width="60px" alt="User avatar: David Balatero" /></a><a href="https://github.com/moobar"><img src="https:&#x2F;&#x2F;github.com&#x2F;moobar.png" width="60px" alt="User avatar: " /></a><a href="https://github.com/benelan"><img src="https:&#x2F;&#x2F;github.com&#x2F;benelan.png" width="60px" alt="User avatar: Ben Elan" /></a><a href="https://github.com/pawelduda"><img src="https:&#x2F;&#x2F;github.com&#x2F;pawelduda.png" width="60px" alt="User avatar: Paweł Duda" /></a><a href="https://github.com/pyrho"><img src="https:&#x2F;&#x2F;github.com&#x2F;pyrho.png" width="60px" alt="User avatar: Damien Rajon" /></a><a href="https://github.com/ArtBIT"><img src="https:&#x2F;&#x2F;github.com&#x2F;ArtBIT.png" width="60px" alt="User avatar: ArtBIT" /></a><a href="https://github.com/da-moon"><img src="https:&#x2F;&#x2F;github.com&#x2F;da-moon.png" width="60px" alt="User avatar: " /></a><a href="https://github.com/hovissimo"><img src="https:&#x2F;&#x2F;github.com&#x2F;hovissimo.png" width="60px" alt="User avatar: Hovis" /></a><a href="https://github.com/dariusjonda"><img src="https:&#x2F;&#x2F;github.com&#x2F;dariusjonda.png" width="60px" alt="User avatar: Darius Jonda" /></a><a href="https://github.com/cristiand391"><img src="https:&#x2F;&#x2F;github.com&#x2F;cristiand391.png" width="60px" alt="User avatar: Cristian Dominguez" /></a><a href="https://github.com/eliangcs"><img src="https:&#x2F;&#x2F;github.com&#x2F;eliangcs.png" width="60px" alt="User avatar: Chang-Hung Liang" /></a><a href="https://github.com/asphaltbuffet"><img src="https:&#x2F;&#x2F;github.com&#x2F;asphaltbuffet.png" width="60px" alt="User avatar: Ben Lechlitner" /></a><a href="https://github.com/looshch"><img src="https:&#x2F;&#x2F;github.com&#x2F;looshch.png" width="60px" alt="User avatar: george looshch" /></a><a href="https://github.com/kg8m"><img src="https:&#x2F;&#x2F;github.com&#x2F;kg8m.png" width="60px" alt="User avatar: Takumi KAGIYAMA" /></a><a href="https://github.com/polm"><img src="https:&#x2F;&#x2F;github.com&#x2F;polm.png" width="60px" alt="User avatar: Paul OLeary McCann" /></a><a href="https://github.com/rbeeger"><img src="https:&#x2F;&#x2F;github.com&#x2F;rbeeger.png" width="60px" alt="User avatar: Robert Beeger" /></a><a href="https://github.com/scalisi"><img src="https:&#x2F;&#x2F;github.com&#x2F;scalisi.png" width="60px" alt="User avatar: Josh Scalisi" /></a><a href="https://github.com/alecbcs"><img src="https:&#x2F;&#x2F;github.com&#x2F;alecbcs.png" width="60px" alt="User avatar: Alec Scott" /></a><a href="https://github.com/thnxdev"><img src="https:&#x2F;&#x2F;github.com&#x2F;thnxdev.png" width="60px" alt="User avatar: thanks.dev" /></a><a href="https://github.com/artursapek"><img src="https:&#x2F;&#x2F;github.com&#x2F;artursapek.png" width="60px" alt="User avatar: Artur Sapek" /></a><a href="https://github.com/ramnes"><img src="https:&#x2F;&#x2F;github.com&#x2F;ramnes.png" width="60px" alt="User avatar: Guillaume Gelin" /></a><a href="https://github.com/jyc"><img src="https:&#x2F;&#x2F;github.com&#x2F;jyc.png" width="60px" alt="User avatar: " /></a><a href="https://github.com/roblevy"><img src="https:&#x2F;&#x2F;github.com&#x2F;roblevy.png" width="60px" alt="User avatar: Rob Levy" /></a><a href="https://github.com/glozow"><img src="https:&#x2F;&#x2F;github.com&#x2F;glozow.png" width="60px" alt="User avatar: Gloria Zhao" /></a><a href="https://github.com/toupeira"><img src="https:&#x2F;&#x2F;github.com&#x2F;toupeira.png" width="60px" alt="User avatar: Markus Koller" /></a><a href="https://github.com/rkpatel33"><img src="https:&#x2F;&#x2F;github.com&#x2F;rkpatel33.png" width="60px" alt="User avatar: " /></a><a href="https://github.com/jamesob"><img src="https:&#x2F;&#x2F;github.com&#x2F;jamesob.png" width="60px" alt="User avatar: jamesob" /></a><a href="https://github.com/jlebray"><img src="https:&#x2F;&#x2F;github.com&#x2F;jlebray.png" width="60px" alt="User avatar: Johan Le Bray" /></a><a href="https://github.com/panosl1"><img src="https:&#x2F;&#x2F;github.com&#x2F;panosl1.png" width="60px" alt="User avatar: Panos Lampropoulos" /></a><a href="https://github.com/bespinian"><img src="https:&#x2F;&#x2F;github.com&#x2F;bespinian.png" width="60px" alt="User avatar: bespinian" /></a><a href="https://github.com/scosu"><img src="https:&#x2F;&#x2F;github.com&#x2F;scosu.png" width="60px" alt="User avatar: Markus Schneider-Pargmann" /></a><a href="https://github.com/smithbm2316"><img src="https:&#x2F;&#x2F;github.com&#x2F;smithbm2316.png" width="60px" alt="User avatar: Ben Smith" /></a><a href="https://github.com/charlieegan3"><img src="https:&#x2F;&#x2F;github.com&#x2F;charlieegan3.png" width="60px" alt="User avatar: Charlie Egan" /></a><a href="https://github.com/thobbs"><img src="https:&#x2F;&#x2F;github.com&#x2F;thobbs.png" width="60px" alt="User avatar: Tyler Hobbs" /></a><a href="https://github.com/neilparikh"><img src="https:&#x2F;&#x2F;github.com&#x2F;neilparikh.png" width="60px" alt="User avatar: Neil Parikh" /></a><a href="https://github.com/shkm"><img src="https:&#x2F;&#x2F;github.com&#x2F;shkm.png" width="60px" alt="User avatar: Jamie Schembri" /></a><a href="https://github.com/BasedScience"><img src="https:&#x2F;&#x2F;github.com&#x2F;BasedScience.png" width="60px" alt="User avatar: dockien" /></a><a href="https://github.com/RussellGilmore"><img src="https:&#x2F;&#x2F;github.com&#x2F;RussellGilmore.png" width="60px" alt="User avatar: Russell Gilmore" /></a><a href="https://github.com/meribold"><img src="https:&#x2F;&#x2F;github.com&#x2F;meribold.png" width="60px" alt="User avatar: Lukas Waymann" /></a><a href="https://github.com/terminaldweller"><img src="https:&#x2F;&#x2F;github.com&#x2F;terminaldweller.png" width="60px" alt="User avatar: Farzad Sadeghi" /></a><a href="https://github.com/jaydee-coder"><img src="https:&#x2F;&#x2F;github.com&#x2F;jaydee-coder.png" width="60px" alt="User avatar: " /></a><a href="https://github.com/brpaz"><img src="https:&#x2F;&#x2F;github.com&#x2F;brpaz.png" width="60px" alt="User avatar: Bruno Paz" /></a><a href="https://github.com/timobenn"><img src="https:&#x2F;&#x2F;github.com&#x2F;timobenn.png" width="60px" alt="User avatar: Timothy Bennett" /></a><a href="https://github.com/danhorner"><img src="https:&#x2F;&#x2F;github.com&#x2F;danhorner.png" width="60px" alt="User avatar: Daniel Horner" /></a><a href="https://github.com/syeo66"><img src="https:&#x2F;&#x2F;github.com&#x2F;syeo66.png" width="60px" alt="User avatar: Red Ochsenbein" /></a><a href="https://github.com/nekhaevskiy"><img src="https:&#x2F;&#x2F;github.com&#x2F;nekhaevskiy.png" width="60px" alt="User avatar: Yury" /></a><a href="https://github.com/cange"><img src="https:&#x2F;&#x2F;github.com&#x2F;cange.png" width="60px" alt="User avatar: Christian Angermann" /></a><a href="https://github.com/lajarre"><img src="https:&#x2F;&#x2F;github.com&#x2F;lajarre.png" width="60px" alt="User avatar: " /></a><a href="https://github.com/aus10d"><img src="https:&#x2F;&#x2F;github.com&#x2F;aus10d.png" width="60px" alt="User avatar: Austen" /></a><!-- sponsors -->
 
 ---
 
diff --git a/go.mod b/go.mod
index e9b76d75..d4f0b170 100644
--- a/go.mod
+++ b/go.mod
@@ -1,7 +1,7 @@
 module github.com/junegunn/fzf
 
 require (
-	github.com/charlievieth/fastwalk v1.0.9
+	github.com/charlievieth/fastwalk v1.0.10
 	github.com/gdamore/tcell/v2 v2.8.1
 	github.com/junegunn/go-shellwords v0.0.0-20250127100254-2aa3b3277741
 	github.com/mattn/go-isatty v0.0.20
diff --git a/go.sum b/go.sum
index 6619d8ee..e37721c5 100644
--- a/go.sum
+++ b/go.sum
@@ -1,5 +1,5 @@
-github.com/charlievieth/fastwalk v1.0.9 h1:Odb92AfoReO3oFBfDGT5J+nwgzQPF/gWAw6E6/lkor0=
-github.com/charlievieth/fastwalk v1.0.9/go.mod h1:yGy1zbxog41ZVMcKA/i8ojXLFsuayX5VvwhQVoj9PBI=
+github.com/charlievieth/fastwalk v1.0.10 h1:0qUbvA2O+K+X+IrTfZTC0UH2DK5MOA+KjVfStAHUnGg=
+github.com/charlievieth/fastwalk v1.0.10/go.mod h1:yGy1zbxog41ZVMcKA/i8ojXLFsuayX5VvwhQVoj9PBI=
 github.com/gdamore/encoding v1.0.1 h1:YzKZckdBL6jVt2Gc+5p82qhrGiqMdG/eNs6Wy0u3Uhw=
 github.com/gdamore/encoding v1.0.1/go.mod h1:0Z0cMFinngz9kS1QfMjCP8TY7em3bZYeeklsSDPivEo=
 github.com/gdamore/tcell/v2 v2.8.1 h1:KPNxyqclpWpWQlPLx6Xui1pMk8S+7+R37h3g07997NU=
diff --git a/man/man1/fzf.1 b/man/man1/fzf.1
index 29dd89da..33ea2609 100644
--- a/man/man1/fzf.1
+++ b/man/man1/fzf.1
@@ -21,7 +21,7 @@ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 THE SOFTWARE.
 ..
-.TH fzf 1 "Mar 2025" "fzf 0.60.3" "fzf - a command-line fuzzy finder"
+.TH fzf 1 "Mar 2025" "fzf 0.61.0" "fzf - a command-line fuzzy finder"
 
 .SH NAME
 fzf - a command-line fuzzy finder
@@ -709,6 +709,10 @@ ANSI color codes are supported.
 Do not display horizontal separator on the info line. A synonym for
 \fB\-\-separator=''\fB
 
+.TP
+.BI "\-\-ghost=" "TEXT"
+Ghost text to display when the input is empty
+
 .TP
 .B "\-\-filepath\-word"
 Make word-wise movements and actions respect path separators. The following
@@ -1612,6 +1616,7 @@ A key or an event can be bound to one or more of the following actions.
     \fBchange\-multi\fR                 (enable multi-select mode with no limit)
     \fBchange\-multi(...)\fR            (enable multi-select mode with a limit or disable it with 0)
     \fBchange\-nth(...)\fR              (change \fB\-\-nth\fR option; rotate through the multiple options separated by '|')
+    \fBchange\-pointer(...)\fR          (change \fB\-\-pointer\fR option)
     \fBchange\-preview(...)\fR          (change \fB\-\-preview\fR option)
     \fBchange\-preview\-label(...)\fR    (change \fB\-\-preview\-label\fR to the given string)
     \fBchange\-preview\-window(...)\fR   (change \fB\-\-preview\-window\fR option; rotate through the multiple option sets separated by '|')
@@ -1705,6 +1710,7 @@ A key or an event can be bound to one or more of the following actions.
     \fBtransform\-input\-label(...)\fR   (transform input label using an external command)
     \fBtransform\-list\-label(...)\fR    (transform list label using an external command)
     \fBtransform\-nth(...)\fR           (transform nth using an external command)
+    \fBtransform\-pointer(...)\fR       (transform pointer using an external command)
     \fBtransform\-preview\-label(...)\fR (transform preview label using an external command)
     \fBtransform\-prompt(...)\fR        (transform prompt string using an external command)
     \fBtransform\-query(...)\fR         (transform query string using an external command)
diff --git a/plugin/fzf.vim b/plugin/fzf.vim
index b865162a..63857ce3 100644
--- a/plugin/fzf.vim
+++ b/plugin/fzf.vim
@@ -358,7 +358,7 @@ endfunction
 
 function! s:get_color(attr, ...)
   " Force 24 bit colors: g:fzf_force_termguicolors (temporary workaround for https://github.com/junegunn/fzf.vim/issues/1152)
-  let gui = get(g:, 'fzf_force_termguicolors', 0) || (!s:is_win && !has('win32unix') && has('termguicolors') && &termguicolors)
+  let gui = get(g:, 'fzf_force_termguicolors', 0) || (!s:is_win && !has('win32unix') && (has('gui_running') || has('termguicolors') && &termguicolors))
   let fam = gui ? 'gui' : 'cterm'
   let pat = gui ? '^#[a-f0-9]\+' : '^[0-9]\+$'
   for group in a:000
diff --git a/shell/completion.bash b/shell/completion.bash
index d1fc57b9..48f1a547 100644
--- a/shell/completion.bash
+++ b/shell/completion.bash
@@ -311,12 +311,12 @@ __fzf_generic_path_completion() {
           else
             if [[ $1 =~ dir ]]; then
               walker=dir,follow
-              rest=${FZF_COMPLETION_DIR_OPTS-}
+              eval "rest=(${FZF_COMPLETION_DIR_OPTS-})"
             else
               walker=file,dir,follow,hidden
-              rest=${FZF_COMPLETION_PATH_OPTS-}
+              eval "rest=(${FZF_COMPLETION_PATH_OPTS-})"
             fi
-            __fzf_comprun "$4" -q "$leftover" --walker "$walker" --walker-root="$dir" $rest
+            __fzf_comprun "$4" -q "$leftover" --walker "$walker" --walker-root="$dir" "${rest[@]}"
           fi | while read -r item; do
             printf "%q " "${item%$3}$3"
           done
diff --git a/src/actiontype_string.go b/src/actiontype_string.go
index 46b63c59..19b5ea72 100644
--- a/src/actiontype_string.go
+++ b/src/actiontype_string.go
@@ -12,139 +12,143 @@ func _() {
 	_ = x[actStart-1]
 	_ = x[actClick-2]
 	_ = x[actInvalid-3]
-	_ = x[actChar-4]
-	_ = x[actMouse-5]
-	_ = x[actBeginningOfLine-6]
-	_ = x[actAbort-7]
-	_ = x[actAccept-8]
-	_ = x[actAcceptNonEmpty-9]
-	_ = x[actAcceptOrPrintQuery-10]
-	_ = x[actBackwardChar-11]
-	_ = x[actBackwardDeleteChar-12]
-	_ = x[actBackwardDeleteCharEof-13]
-	_ = x[actBackwardWord-14]
-	_ = x[actCancel-15]
-	_ = x[actChangeBorderLabel-16]
-	_ = x[actChangeListLabel-17]
-	_ = x[actChangeInputLabel-18]
-	_ = x[actChangeHeader-19]
-	_ = x[actChangeHeaderLabel-20]
-	_ = x[actChangeMulti-21]
-	_ = x[actChangePreviewLabel-22]
-	_ = x[actChangePrompt-23]
-	_ = x[actChangeQuery-24]
-	_ = x[actChangeNth-25]
-	_ = x[actClearScreen-26]
-	_ = x[actClearQuery-27]
-	_ = x[actClearSelection-28]
-	_ = x[actClose-29]
-	_ = x[actDeleteChar-30]
-	_ = x[actDeleteCharEof-31]
-	_ = x[actEndOfLine-32]
-	_ = x[actFatal-33]
-	_ = x[actForwardChar-34]
-	_ = x[actForwardWord-35]
-	_ = x[actKillLine-36]
-	_ = x[actKillWord-37]
-	_ = x[actUnixLineDiscard-38]
-	_ = x[actUnixWordRubout-39]
-	_ = x[actYank-40]
-	_ = x[actBackwardKillWord-41]
-	_ = x[actSelectAll-42]
-	_ = x[actDeselectAll-43]
-	_ = x[actToggle-44]
-	_ = x[actToggleSearch-45]
-	_ = x[actToggleAll-46]
-	_ = x[actToggleDown-47]
-	_ = x[actToggleUp-48]
-	_ = x[actToggleIn-49]
-	_ = x[actToggleOut-50]
-	_ = x[actToggleTrack-51]
-	_ = x[actToggleTrackCurrent-52]
-	_ = x[actToggleHeader-53]
-	_ = x[actToggleWrap-54]
-	_ = x[actToggleMultiLine-55]
-	_ = x[actToggleHscroll-56]
-	_ = x[actTrackCurrent-57]
-	_ = x[actToggleInput-58]
-	_ = x[actHideInput-59]
-	_ = x[actShowInput-60]
-	_ = x[actUntrackCurrent-61]
-	_ = x[actDown-62]
-	_ = x[actUp-63]
-	_ = x[actPageUp-64]
-	_ = x[actPageDown-65]
-	_ = x[actPosition-66]
-	_ = x[actHalfPageUp-67]
-	_ = x[actHalfPageDown-68]
-	_ = x[actOffsetUp-69]
-	_ = x[actOffsetDown-70]
-	_ = x[actOffsetMiddle-71]
-	_ = x[actJump-72]
-	_ = x[actJumpAccept-73]
-	_ = x[actPrintQuery-74]
-	_ = x[actRefreshPreview-75]
-	_ = x[actReplaceQuery-76]
-	_ = x[actToggleSort-77]
-	_ = x[actShowPreview-78]
-	_ = x[actHidePreview-79]
-	_ = x[actTogglePreview-80]
-	_ = x[actTogglePreviewWrap-81]
-	_ = x[actTransform-82]
-	_ = x[actTransformBorderLabel-83]
-	_ = x[actTransformListLabel-84]
-	_ = x[actTransformInputLabel-85]
-	_ = x[actTransformHeader-86]
-	_ = x[actTransformHeaderLabel-87]
-	_ = x[actTransformNth-88]
-	_ = x[actTransformPreviewLabel-89]
-	_ = x[actTransformPrompt-90]
-	_ = x[actTransformQuery-91]
-	_ = x[actTransformSearch-92]
-	_ = x[actSearch-93]
-	_ = x[actPreview-94]
-	_ = x[actChangePreview-95]
-	_ = x[actChangePreviewWindow-96]
-	_ = x[actPreviewTop-97]
-	_ = x[actPreviewBottom-98]
-	_ = x[actPreviewUp-99]
-	_ = x[actPreviewDown-100]
-	_ = x[actPreviewPageUp-101]
-	_ = x[actPreviewPageDown-102]
-	_ = x[actPreviewHalfPageUp-103]
-	_ = x[actPreviewHalfPageDown-104]
-	_ = x[actPrevHistory-105]
-	_ = x[actPrevSelected-106]
-	_ = x[actPrint-107]
-	_ = x[actPut-108]
-	_ = x[actNextHistory-109]
-	_ = x[actNextSelected-110]
-	_ = x[actExecute-111]
-	_ = x[actExecuteSilent-112]
-	_ = x[actExecuteMulti-113]
-	_ = x[actSigStop-114]
-	_ = x[actFirst-115]
-	_ = x[actLast-116]
-	_ = x[actReload-117]
-	_ = x[actReloadSync-118]
-	_ = x[actDisableSearch-119]
-	_ = x[actEnableSearch-120]
-	_ = x[actSelect-121]
-	_ = x[actDeselect-122]
-	_ = x[actUnbind-123]
-	_ = x[actRebind-124]
-	_ = x[actToggleBind-125]
-	_ = x[actBecome-126]
-	_ = x[actShowHeader-127]
-	_ = x[actHideHeader-128]
-	_ = x[actBell-129]
-	_ = x[actExclude-130]
-	_ = x[actExcludeMulti-131]
+	_ = x[actBracketedPasteBegin-4]
+	_ = x[actBracketedPasteEnd-5]
+	_ = x[actChar-6]
+	_ = x[actMouse-7]
+	_ = x[actBeginningOfLine-8]
+	_ = x[actAbort-9]
+	_ = x[actAccept-10]
+	_ = x[actAcceptNonEmpty-11]
+	_ = x[actAcceptOrPrintQuery-12]
+	_ = x[actBackwardChar-13]
+	_ = x[actBackwardDeleteChar-14]
+	_ = x[actBackwardDeleteCharEof-15]
+	_ = x[actBackwardWord-16]
+	_ = x[actCancel-17]
+	_ = x[actChangeBorderLabel-18]
+	_ = x[actChangeListLabel-19]
+	_ = x[actChangeInputLabel-20]
+	_ = x[actChangeHeader-21]
+	_ = x[actChangeHeaderLabel-22]
+	_ = x[actChangeMulti-23]
+	_ = x[actChangePreviewLabel-24]
+	_ = x[actChangePrompt-25]
+	_ = x[actChangeQuery-26]
+	_ = x[actChangeNth-27]
+	_ = x[actClearScreen-28]
+	_ = x[actClearQuery-29]
+	_ = x[actClearSelection-30]
+	_ = x[actClose-31]
+	_ = x[actDeleteChar-32]
+	_ = x[actDeleteCharEof-33]
+	_ = x[actEndOfLine-34]
+	_ = x[actFatal-35]
+	_ = x[actForwardChar-36]
+	_ = x[actForwardWord-37]
+	_ = x[actKillLine-38]
+	_ = x[actKillWord-39]
+	_ = x[actUnixLineDiscard-40]
+	_ = x[actUnixWordRubout-41]
+	_ = x[actYank-42]
+	_ = x[actBackwardKillWord-43]
+	_ = x[actSelectAll-44]
+	_ = x[actDeselectAll-45]
+	_ = x[actToggle-46]
+	_ = x[actToggleSearch-47]
+	_ = x[actToggleAll-48]
+	_ = x[actToggleDown-49]
+	_ = x[actToggleUp-50]
+	_ = x[actToggleIn-51]
+	_ = x[actToggleOut-52]
+	_ = x[actToggleTrack-53]
+	_ = x[actToggleTrackCurrent-54]
+	_ = x[actToggleHeader-55]
+	_ = x[actToggleWrap-56]
+	_ = x[actToggleMultiLine-57]
+	_ = x[actToggleHscroll-58]
+	_ = x[actTrackCurrent-59]
+	_ = x[actToggleInput-60]
+	_ = x[actHideInput-61]
+	_ = x[actShowInput-62]
+	_ = x[actUntrackCurrent-63]
+	_ = x[actDown-64]
+	_ = x[actUp-65]
+	_ = x[actPageUp-66]
+	_ = x[actPageDown-67]
+	_ = x[actPosition-68]
+	_ = x[actHalfPageUp-69]
+	_ = x[actHalfPageDown-70]
+	_ = x[actOffsetUp-71]
+	_ = x[actOffsetDown-72]
+	_ = x[actOffsetMiddle-73]
+	_ = x[actJump-74]
+	_ = x[actJumpAccept-75]
+	_ = x[actPrintQuery-76]
+	_ = x[actRefreshPreview-77]
+	_ = x[actReplaceQuery-78]
+	_ = x[actToggleSort-79]
+	_ = x[actShowPreview-80]
+	_ = x[actHidePreview-81]
+	_ = x[actTogglePreview-82]
+	_ = x[actTogglePreviewWrap-83]
+	_ = x[actTransform-84]
+	_ = x[actTransformBorderLabel-85]
+	_ = x[actTransformListLabel-86]
+	_ = x[actTransformInputLabel-87]
+	_ = x[actTransformHeader-88]
+	_ = x[actTransformHeaderLabel-89]
+	_ = x[actTransformNth-90]
+	_ = x[actTransformPointer-91]
+	_ = x[actTransformPreviewLabel-92]
+	_ = x[actTransformPrompt-93]
+	_ = x[actTransformQuery-94]
+	_ = x[actTransformSearch-95]
+	_ = x[actSearch-96]
+	_ = x[actPreview-97]
+	_ = x[actChangePointer-98]
+	_ = x[actChangePreview-99]
+	_ = x[actChangePreviewWindow-100]
+	_ = x[actPreviewTop-101]
+	_ = x[actPreviewBottom-102]
+	_ = x[actPreviewUp-103]
+	_ = x[actPreviewDown-104]
+	_ = x[actPreviewPageUp-105]
+	_ = x[actPreviewPageDown-106]
+	_ = x[actPreviewHalfPageUp-107]
+	_ = x[actPreviewHalfPageDown-108]
+	_ = x[actPrevHistory-109]
+	_ = x[actPrevSelected-110]
+	_ = x[actPrint-111]
+	_ = x[actPut-112]
+	_ = x[actNextHistory-113]
+	_ = x[actNextSelected-114]
+	_ = x[actExecute-115]
+	_ = x[actExecuteSilent-116]
+	_ = x[actExecuteMulti-117]
+	_ = x[actSigStop-118]
+	_ = x[actFirst-119]
+	_ = x[actLast-120]
+	_ = x[actReload-121]
+	_ = x[actReloadSync-122]
+	_ = x[actDisableSearch-123]
+	_ = x[actEnableSearch-124]
+	_ = x[actSelect-125]
+	_ = x[actDeselect-126]
+	_ = x[actUnbind-127]
+	_ = x[actRebind-128]
+	_ = x[actToggleBind-129]
+	_ = x[actBecome-130]
+	_ = x[actShowHeader-131]
+	_ = x[actHideHeader-132]
+	_ = x[actBell-133]
+	_ = x[actExclude-134]
+	_ = x[actExcludeMulti-135]
 }
 
-const _actionType_name = "actIgnoreactStartactClickactInvalidactCharactMouseactBeginningOfLineactAbortactAcceptactAcceptNonEmptyactAcceptOrPrintQueryactBackwardCharactBackwardDeleteCharactBackwardDeleteCharEofactBackwardWordactCancelactChangeBorderLabelactChangeListLabelactChangeInputLabelactChangeHeaderactChangeHeaderLabelactChangeMultiactChangePreviewLabelactChangePromptactChangeQueryactChangeNthactClearScreenactClearQueryactClearSelectionactCloseactDeleteCharactDeleteCharEofactEndOfLineactFatalactForwardCharactForwardWordactKillLineactKillWordactUnixLineDiscardactUnixWordRuboutactYankactBackwardKillWordactSelectAllactDeselectAllactToggleactToggleSearchactToggleAllactToggleDownactToggleUpactToggleInactToggleOutactToggleTrackactToggleTrackCurrentactToggleHeaderactToggleWrapactToggleMultiLineactToggleHscrollactTrackCurrentactToggleInputactHideInputactShowInputactUntrackCurrentactDownactUpactPageUpactPageDownactPositionactHalfPageUpactHalfPageDownactOffsetUpactOffsetDownactOffsetMiddleactJumpactJumpAcceptactPrintQueryactRefreshPreviewactReplaceQueryactToggleSortactShowPreviewactHidePreviewactTogglePreviewactTogglePreviewWrapactTransformactTransformBorderLabelactTransformListLabelactTransformInputLabelactTransformHeaderactTransformHeaderLabelactTransformNthactTransformPreviewLabelactTransformPromptactTransformQueryactTransformSearchactSearchactPreviewactChangePreviewactChangePreviewWindowactPreviewTopactPreviewBottomactPreviewUpactPreviewDownactPreviewPageUpactPreviewPageDownactPreviewHalfPageUpactPreviewHalfPageDownactPrevHistoryactPrevSelectedactPrintactPutactNextHistoryactNextSelectedactExecuteactExecuteSilentactExecuteMultiactSigStopactFirstactLastactReloadactReloadSyncactDisableSearchactEnableSearchactSelectactDeselectactUnbindactRebindactToggleBindactBecomeactShowHeaderactHideHeaderactBellactExcludeactExcludeMulti"
+const _actionType_name = "actIgnoreactStartactClickactInvalidactBracketedPasteBeginactBracketedPasteEndactCharactMouseactBeginningOfLineactAbortactAcceptactAcceptNonEmptyactAcceptOrPrintQueryactBackwardCharactBackwardDeleteCharactBackwardDeleteCharEofactBackwardWordactCancelactChangeBorderLabelactChangeListLabelactChangeInputLabelactChangeHeaderactChangeHeaderLabelactChangeMultiactChangePreviewLabelactChangePromptactChangeQueryactChangeNthactClearScreenactClearQueryactClearSelectionactCloseactDeleteCharactDeleteCharEofactEndOfLineactFatalactForwardCharactForwardWordactKillLineactKillWordactUnixLineDiscardactUnixWordRuboutactYankactBackwardKillWordactSelectAllactDeselectAllactToggleactToggleSearchactToggleAllactToggleDownactToggleUpactToggleInactToggleOutactToggleTrackactToggleTrackCurrentactToggleHeaderactToggleWrapactToggleMultiLineactToggleHscrollactTrackCurrentactToggleInputactHideInputactShowInputactUntrackCurrentactDownactUpactPageUpactPageDownactPositionactHalfPageUpactHalfPageDownactOffsetUpactOffsetDownactOffsetMiddleactJumpactJumpAcceptactPrintQueryactRefreshPreviewactReplaceQueryactToggleSortactShowPreviewactHidePreviewactTogglePreviewactTogglePreviewWrapactTransformactTransformBorderLabelactTransformListLabelactTransformInputLabelactTransformHeaderactTransformHeaderLabelactTransformNthactTransformPointeractTransformPreviewLabelactTransformPromptactTransformQueryactTransformSearchactSearchactPreviewactChangePointeractChangePreviewactChangePreviewWindowactPreviewTopactPreviewBottomactPreviewUpactPreviewDownactPreviewPageUpactPreviewPageDownactPreviewHalfPageUpactPreviewHalfPageDownactPrevHistoryactPrevSelectedactPrintactPutactNextHistoryactNextSelectedactExecuteactExecuteSilentactExecuteMultiactSigStopactFirstactLastactReloadactReloadSyncactDisableSearchactEnableSearchactSelectactDeselectactUnbindactRebindactToggleBindactBecomeactShowHeaderactHideHeaderactBellactExcludeactExcludeMulti"
 
-var _actionType_index = [...]uint16{0, 9, 17, 25, 35, 42, 50, 68, 76, 85, 102, 123, 138, 159, 183, 198, 207, 227, 245, 264, 279, 299, 313, 334, 349, 363, 375, 389, 402, 419, 427, 440, 456, 468, 476, 490, 504, 515, 526, 544, 561, 568, 587, 599, 613, 622, 637, 649, 662, 673, 684, 696, 710, 731, 746, 759, 777, 793, 808, 822, 834, 846, 863, 870, 875, 884, 895, 906, 919, 934, 945, 958, 973, 980, 993, 1006, 1023, 1038, 1051, 1065, 1079, 1095, 1115, 1127, 1150, 1171, 1193, 1211, 1234, 1249, 1273, 1291, 1308, 1326, 1335, 1345, 1361, 1383, 1396, 1412, 1424, 1438, 1454, 1472, 1492, 1514, 1528, 1543, 1551, 1557, 1571, 1586, 1596, 1612, 1627, 1637, 1645, 1652, 1661, 1674, 1690, 1705, 1714, 1725, 1734, 1743, 1756, 1765, 1778, 1791, 1798, 1808, 1823}
+var _actionType_index = [...]uint16{0, 9, 17, 25, 35, 57, 77, 84, 92, 110, 118, 127, 144, 165, 180, 201, 225, 240, 249, 269, 287, 306, 321, 341, 355, 376, 391, 405, 417, 431, 444, 461, 469, 482, 498, 510, 518, 532, 546, 557, 568, 586, 603, 610, 629, 641, 655, 664, 679, 691, 704, 715, 726, 738, 752, 773, 788, 801, 819, 835, 850, 864, 876, 888, 905, 912, 917, 926, 937, 948, 961, 976, 987, 1000, 1015, 1022, 1035, 1048, 1065, 1080, 1093, 1107, 1121, 1137, 1157, 1169, 1192, 1213, 1235, 1253, 1276, 1291, 1310, 1334, 1352, 1369, 1387, 1396, 1406, 1422, 1438, 1460, 1473, 1489, 1501, 1515, 1531, 1549, 1569, 1591, 1605, 1620, 1628, 1634, 1648, 1663, 1673, 1689, 1704, 1714, 1722, 1729, 1738, 1751, 1767, 1782, 1791, 1802, 1811, 1820, 1833, 1842, 1855, 1868, 1875, 1885, 1900}
 
 func (i actionType) String() string {
 	if i < 0 || i >= actionType(len(_actionType_index)-1) {
diff --git a/src/options.go b/src/options.go
index 8a9e33ff..80e428e3 100644
--- a/src/options.go
+++ b/src/options.go
@@ -136,6 +136,7 @@ Usage: fzf [options]
     --separator=STR          Draw horizontal separator on info line using the string
                              (default: '─' or '-')
     --no-separator           Hide info line separator
+    --ghost=TEXT             Ghost text to display when the input is empty
     --filepath-word          Make word-wise movements respect path separators
     --input-border[=STYLE]   Draw border around the input section
                              [rounded|sharp|bold|block|thinblock|double|horizontal|vertical|
@@ -574,6 +575,7 @@ type Options struct {
 	InfoStyle         infoStyle
 	InfoPrefix        string
 	InfoCommand       string
+	Ghost             string
 	Separator         *string
 	JumpLabels        string
 	Prompt            string
@@ -689,6 +691,7 @@ func defaultOptions() *Options {
 		ScrollOff:    3,
 		FileWord:     false,
 		InfoStyle:    infoDefault,
+		Ghost:        "",
 		Separator:    nil,
 		JumpLabels:   defaultJumpLabels,
 		Prompt:       "> ",
@@ -1401,7 +1404,7 @@ const (
 
 func init() {
 	executeRegexp = regexp.MustCompile(
-		`(?si)[:+](become|execute(?:-multi|-silent)?|reload(?:-sync)?|preview|(?:change|transform)-(?:query|prompt|(?:border|list|preview|input|header)-label|header|search|nth)|transform|change-(?:preview-window|preview|multi)|(?:re|un|toggle-)bind|pos|put|print|search)`)
+		`(?si)[:+](become|execute(?:-multi|-silent)?|reload(?:-sync)?|preview|(?:change|transform)-(?:query|prompt|(?:border|list|preview|input|header)-label|header|search|nth|pointer)|transform|change-(?:preview-window|preview|multi)|(?:re|un|toggle-)bind|pos|put|print|search)`)
 	splitRegexp = regexp.MustCompile("[,:]+")
 	actionNameRegexp = regexp.MustCompile("(?i)^[a-z-]+")
 }
@@ -1796,6 +1799,8 @@ func isExecuteAction(str string) actionType {
 		return actChangeInputLabel
 	case "change-header-label":
 		return actChangeHeaderLabel
+	case "change-pointer":
+		return actChangePointer
 	case "change-preview-window":
 		return actChangePreviewWindow
 	case "change-preview":
@@ -1836,6 +1841,8 @@ func isExecuteAction(str string) actionType {
 		return actTransformHeader
 	case "transform-nth":
 		return actTransformNth
+	case "transform-pointer":
+		return actTransformPointer
 	case "transform-prompt":
 		return actTransformPrompt
 	case "transform-query":
@@ -2597,6 +2604,10 @@ func parseOptions(index *int, opts *Options, allArgs []string) error {
 		case "--no-separator":
 			nosep := ""
 			opts.Separator = &nosep
+		case "--ghost":
+			if opts.Ghost, err = nextString("ghost text required"); err != nil {
+				return err
+			}
 		case "--scrollbar":
 			given, bar := optionalNextString()
 			if given {
diff --git a/src/terminal.go b/src/terminal.go
index 19230a9d..ec6e5d9b 100644
--- a/src/terminal.go
+++ b/src/terminal.go
@@ -234,6 +234,7 @@ type Terminal struct {
 	wrap               bool
 	wrapSign           string
 	wrapSignWidth      int
+	ghost              string
 	separator          labelPrinter
 	separatorLen       int
 	spinner            []string
@@ -278,6 +279,7 @@ type Terminal struct {
 	yanked             []rune
 	input              []rune
 	inputOverride      *[]rune
+	pasting            *[]rune
 	multi              int
 	multiLine          bool
 	sort               bool
@@ -458,6 +460,8 @@ const (
 	actStart
 	actClick
 	actInvalid
+	actBracketedPasteBegin
+	actBracketedPasteEnd
 	actChar
 	actMouse
 	actBeginningOfLine
@@ -543,12 +547,14 @@ const (
 	actTransformHeader
 	actTransformHeaderLabel
 	actTransformNth
+	actTransformPointer
 	actTransformPreviewLabel
 	actTransformPrompt
 	actTransformQuery
 	actTransformSearch
 	actSearch
 	actPreview
+	actChangePointer
 	actChangePreview
 	actChangePreviewWindow
 	actPreviewTop
@@ -667,6 +673,8 @@ func defaultKeymap() map[tui.Event][]*action {
 
 	add(tui.Fatal, actFatal)
 	add(tui.Invalid, actInvalid)
+	add(tui.BracketedPasteBegin, actBracketedPasteBegin)
+	add(tui.BracketedPasteEnd, actBracketedPasteEnd)
 	add(tui.CtrlA, actBeginningOfLine)
 	add(tui.CtrlB, actBackwardChar)
 	add(tui.CtrlC, actAbort)
@@ -847,6 +855,7 @@ func NewTerminal(opts *Options, eventBox *util.EventBox, executor *util.Executor
 		infoCommand:        opts.InfoCommand,
 		infoStyle:          opts.InfoStyle,
 		infoPrefix:         opts.InfoPrefix,
+		ghost:              opts.Ghost,
 		separator:          nil,
 		spinner:            makeSpinner(opts.Unicode),
 		promptString:       opts.Prompt,
@@ -1299,8 +1308,11 @@ func (t *Terminal) parsePrompt(prompt string) (func(), int) {
 		t.wrap = false
 		t.withWindow(t.inputWindow, func() {
 			line := t.promptLine()
+			preTask := func(markerClass) int {
+				return 1
+			}
 			t.printHighlighted(
-				Result{item: item}, tui.ColPrompt, tui.ColPrompt, false, false, line, line, true, nil, nil)
+				Result{item: item}, tui.ColPrompt, tui.ColPrompt, false, false, line, line, true, preTask, nil)
 		})
 		t.wrap = wrap
 	}
@@ -1408,10 +1420,7 @@ func (t *Terminal) Input() (bool, []rune) {
 	t.mutex.Lock()
 	defer t.mutex.Unlock()
 	paused := t.paused
-	var src []rune
-	if !t.inputless {
-		src = t.input
-	}
+	src := t.input
 	if t.inputOverride != nil {
 		paused = false
 		src = *t.inputOverride
@@ -2334,15 +2343,18 @@ func (t *Terminal) placeCursor() {
 	if t.inputless {
 		return
 	}
+	x := t.promptLen + t.queryLen[0]
 	if t.inputWindow != nil {
 		y := t.inputWindow.Height() - 1
 		if t.layout == layoutReverse {
 			y = 0
 		}
-		t.inputWindow.Move(y, t.promptLen+t.queryLen[0])
+		x = util.Min(x, t.inputWindow.Width()-1)
+		t.inputWindow.Move(y, x)
 		return
 	}
-	t.move(t.promptLine(), t.promptLen+t.queryLen[0], false)
+	x = util.Min(x, t.window.Width()-1)
+	t.move(t.promptLine(), x, false)
 }
 
 func (t *Terminal) printPrompt() {
@@ -2359,6 +2371,11 @@ func (t *Terminal) printPrompt() {
 	t.prompt()
 
 	before, after := t.updatePromptOffset()
+	if len(before) == 0 && len(after) == 0 && len(t.ghost) > 0 {
+		w.CPrint(tui.ColInput.WithAttr(tui.Dim), t.ghost)
+		return
+	}
+
 	color := tui.ColInput
 	if t.paused {
 		color = tui.ColDisabled
@@ -2478,6 +2495,10 @@ func (t *Terminal) printInfoImpl() {
 		outputPrinter, outputLen = t.ansiLabelPrinter(output, &tui.ColInfo, false)
 	}
 
+	shiftLen := t.queryLen[0] + t.queryLen[1] + 1
+	if shiftLen == 1 && len(t.ghost) > 0 {
+		shiftLen = util.StringWidth(t.ghost)
+	}
 	switch t.infoStyle {
 	case infoDefault:
 		if !move(line+1, 0, t.separatorLen == 0) {
@@ -2491,9 +2512,9 @@ func (t *Terminal) printInfoImpl() {
 			return
 		}
 	case infoInlineRight:
-		pos = t.promptLen + t.queryLen[0] + t.queryLen[1] + 1
+		pos = t.promptLen + shiftLen
 	case infoInline:
-		pos = t.promptLen + t.queryLen[0] + t.queryLen[1] + 1
+		pos = t.promptLen + shiftLen
 		printInfoPrefix()
 	}
 
@@ -4606,11 +4627,7 @@ func (t *Terminal) Loop() error {
 				//  U t.uiMutex                 |
 				t.uiMutex.Lock()
 				t.mutex.Lock()
-				printInfo := util.RunOnce(func() {
-					if !t.resizeIfNeeded() {
-						t.printInfo()
-					}
-				})
+				info := false
 				for _, key := range keys {
 					req := util.EventType(key)
 					value := (*events)[req]
@@ -4618,16 +4635,15 @@ func (t *Terminal) Loop() error {
 					case reqPrompt:
 						t.printPrompt()
 						if t.infoStyle == infoInline || t.infoStyle == infoInlineRight {
-							printInfo()
+							info = true
 						}
 					case reqInfo:
-						printInfo()
+						info = true
 					case reqList:
 						t.printList()
 						currentIndex := t.currentIndex()
 						focusChanged := focusedIndex != currentIndex
-						info := false
-						if focusChanged && t.track == trackCurrent {
+						if focusChanged && focusedIndex >= 0 && t.track == trackCurrent {
 							t.track = trackDisabled
 							info = true
 						}
@@ -4638,9 +4654,6 @@ func (t *Terminal) Loop() error {
 								info = true
 							}
 						}
-						if info {
-							printInfo()
-						}
 						if focusChanged || version != t.version {
 							version = t.version
 							focusedIndex = currentIndex
@@ -4732,6 +4745,9 @@ func (t *Terminal) Loop() error {
 						return
 					}
 				}
+				if info && !t.resizeIfNeeded() {
+					t.printInfo()
+				}
 				t.flush()
 				t.mutex.Unlock()
 				t.uiMutex.Unlock()
@@ -4915,6 +4931,14 @@ func (t *Terminal) Loop() error {
 			return true
 		}
 		doAction = func(a *action) bool {
+			// Keep track of the current query before the action is executed,
+			// so we can restore it when the input section is hidden (--no-input).
+			// * By doing this, we don't have to add a conditional branch to each
+			//   query modifying action.
+			// * We restore the query after each action instead of after a set of
+			//   actions to allow changing the query even when the input is hidden
+			//     e.g. fzf --no-input --bind 'space:show-input+change-query(foo)+hide-input'
+			currentInput := t.input
 		Action:
 			switch a.t {
 			case actIgnore, actStart, actClick:
@@ -4966,6 +4990,14 @@ func (t *Terminal) Loop() error {
 			case actInvalid:
 				t.mutex.Unlock()
 				return false
+			case actBracketedPasteBegin:
+				current := []rune(t.input)
+				t.pasting = &current
+			case actBracketedPasteEnd:
+				if t.pasting != nil {
+					queryChanged = string(t.input) != string(*t.pasting)
+					t.pasting = nil
+				}
 			case actTogglePreview, actShowPreview, actHidePreview:
 				var act bool
 				switch a.t {
@@ -5462,6 +5494,7 @@ func (t *Terminal) Loop() error {
 				t.scrollOff = t.window.Height()
 				t.constrain()
 				t.scrollOff = soff
+				req(reqList)
 			case actJump:
 				t.jumping = jumpEnabled
 				req(reqJump)
@@ -5836,7 +5869,7 @@ func (t *Terminal) Loop() error {
 
 				if me.Down {
 					mxCons := util.Constrain(mx-t.promptLen, 0, len(t.input))
-					if t.inputWindow == nil && my == t.promptLine() && mxCons >= 0 {
+					if !t.inputless && t.inputWindow == nil && my == t.promptLine() && mxCons >= 0 {
 						// Prompt
 						t.cx = mxCons + t.xoffset
 					} else if my >= min {
@@ -5920,6 +5953,21 @@ func (t *Terminal) Loop() error {
 						}
 					}
 				}
+			case actChangePointer, actTransformPointer:
+				pointer := a.a
+				if a.t == actTransformPointer {
+					pointer = t.captureLine(a.a)
+				}
+				length := uniseg.StringWidth(pointer)
+				if length <= 2 {
+					if length != t.pointerLen {
+						t.forceRerenderList()
+					}
+					t.pointer = pointer
+					t.pointerLen = length
+					t.pointerEmpty = strings.Repeat(" ", t.pointerLen)
+					req(reqList)
+				}
 			case actChangePreview:
 				if t.previewOpts.command != a.a {
 					t.previewOpts.command = a.a
@@ -5997,6 +6045,15 @@ func (t *Terminal) Loop() error {
 			if !processExecution(a.t) {
 				t.lastAction = a.t
 			}
+
+			if t.inputless {
+				// Always just discard the change
+				t.input = currentInput
+				t.cx = len(t.input)
+				beof = false
+			} else if string(t.input) != string(currentInput) {
+				t.inputOverride = nil
+			}
 			return true
 		}
 
@@ -6017,18 +6074,10 @@ func (t *Terminal) Loop() error {
 			} else if !doActions(actions) {
 				continue
 			}
-			if t.inputless {
-				// Always just discard the change
-				t.input = previousInput
-				t.cx = len(t.input)
-				beof = false
-			} else {
+			if !t.inputless {
 				t.truncateQuery()
 			}
-			queryChanged = string(previousInput) != string(t.input)
-			if queryChanged {
-				t.inputOverride = nil
-			}
+			queryChanged = queryChanged || t.pasting == nil && string(previousInput) != string(t.input)
 			changed = changed || queryChanged
 			if onChanges, prs := t.keymap[tui.Change.AsEvent()]; queryChanged && prs && !doActions(onChanges) {
 				continue
diff --git a/src/tui/eventtype_string.go b/src/tui/eventtype_string.go
index df57ccc1..a37d123e 100644
--- a/src/tui/eventtype_string.go
+++ b/src/tui/eventtype_string.go
@@ -84,35 +84,37 @@ func _() {
 	_ = x[CtrlAlt-73]
 	_ = x[Invalid-74]
 	_ = x[Fatal-75]
-	_ = x[Mouse-76]
-	_ = x[DoubleClick-77]
-	_ = x[LeftClick-78]
-	_ = x[RightClick-79]
-	_ = x[SLeftClick-80]
-	_ = x[SRightClick-81]
-	_ = x[ScrollUp-82]
-	_ = x[ScrollDown-83]
-	_ = x[SScrollUp-84]
-	_ = x[SScrollDown-85]
-	_ = x[PreviewScrollUp-86]
-	_ = x[PreviewScrollDown-87]
-	_ = x[Resize-88]
-	_ = x[Change-89]
-	_ = x[BackwardEOF-90]
-	_ = x[Start-91]
-	_ = x[Load-92]
-	_ = x[Focus-93]
-	_ = x[One-94]
-	_ = x[Zero-95]
-	_ = x[Result-96]
-	_ = x[Jump-97]
-	_ = x[JumpCancel-98]
-	_ = x[ClickHeader-99]
+	_ = x[BracketedPasteBegin-76]
+	_ = x[BracketedPasteEnd-77]
+	_ = x[Mouse-78]
+	_ = x[DoubleClick-79]
+	_ = x[LeftClick-80]
+	_ = x[RightClick-81]
+	_ = x[SLeftClick-82]
+	_ = x[SRightClick-83]
+	_ = x[ScrollUp-84]
+	_ = x[ScrollDown-85]
+	_ = x[SScrollUp-86]
+	_ = x[SScrollDown-87]
+	_ = x[PreviewScrollUp-88]
+	_ = x[PreviewScrollDown-89]
+	_ = x[Resize-90]
+	_ = x[Change-91]
+	_ = x[BackwardEOF-92]
+	_ = x[Start-93]
+	_ = x[Load-94]
+	_ = x[Focus-95]
+	_ = x[One-96]
+	_ = x[Zero-97]
+	_ = x[Result-98]
+	_ = x[Jump-99]
+	_ = x[JumpCancel-100]
+	_ = x[ClickHeader-101]
 }
 
-const _EventType_name = "RuneCtrlACtrlBCtrlCCtrlDCtrlECtrlFCtrlGCtrlHTabCtrlJCtrlKCtrlLEnterCtrlNCtrlOCtrlPCtrlQCtrlRCtrlSCtrlTCtrlUCtrlVCtrlWCtrlXCtrlYCtrlZEscCtrlSpaceCtrlDeleteCtrlBackSlashCtrlRightBracketCtrlCaretCtrlSlashShiftTabBackspaceDeletePageUpPageDownUpDownLeftRightHomeEndInsertShiftUpShiftDownShiftLeftShiftRightShiftDeleteF1F2F3F4F5F6F7F8F9F10F11F12AltBackspaceAltUpAltDownAltLeftAltRightAltShiftUpAltShiftDownAltShiftLeftAltShiftRightAltCtrlAltInvalidFatalMouseDoubleClickLeftClickRightClickSLeftClickSRightClickScrollUpScrollDownSScrollUpSScrollDownPreviewScrollUpPreviewScrollDownResizeChangeBackwardEOFStartLoadFocusOneZeroResultJumpJumpCancelClickHeader"
+const _EventType_name = "RuneCtrlACtrlBCtrlCCtrlDCtrlECtrlFCtrlGCtrlHTabCtrlJCtrlKCtrlLEnterCtrlNCtrlOCtrlPCtrlQCtrlRCtrlSCtrlTCtrlUCtrlVCtrlWCtrlXCtrlYCtrlZEscCtrlSpaceCtrlDeleteCtrlBackSlashCtrlRightBracketCtrlCaretCtrlSlashShiftTabBackspaceDeletePageUpPageDownUpDownLeftRightHomeEndInsertShiftUpShiftDownShiftLeftShiftRightShiftDeleteF1F2F3F4F5F6F7F8F9F10F11F12AltBackspaceAltUpAltDownAltLeftAltRightAltShiftUpAltShiftDownAltShiftLeftAltShiftRightAltCtrlAltInvalidFatalBracketedPasteBeginBracketedPasteEndMouseDoubleClickLeftClickRightClickSLeftClickSRightClickScrollUpScrollDownSScrollUpSScrollDownPreviewScrollUpPreviewScrollDownResizeChangeBackwardEOFStartLoadFocusOneZeroResultJumpJumpCancelClickHeader"
 
-var _EventType_index = [...]uint16{0, 4, 9, 14, 19, 24, 29, 34, 39, 44, 47, 52, 57, 62, 67, 72, 77, 82, 87, 92, 97, 102, 107, 112, 117, 122, 127, 132, 135, 144, 154, 167, 183, 192, 201, 209, 218, 224, 230, 238, 240, 244, 248, 253, 257, 260, 266, 273, 282, 291, 301, 312, 314, 316, 318, 320, 322, 324, 326, 328, 330, 333, 336, 339, 351, 356, 363, 370, 378, 388, 400, 412, 425, 428, 435, 442, 447, 452, 463, 472, 482, 492, 503, 511, 521, 530, 541, 556, 573, 579, 585, 596, 601, 605, 610, 613, 617, 623, 627, 637, 648}
+var _EventType_index = [...]uint16{0, 4, 9, 14, 19, 24, 29, 34, 39, 44, 47, 52, 57, 62, 67, 72, 77, 82, 87, 92, 97, 102, 107, 112, 117, 122, 127, 132, 135, 144, 154, 167, 183, 192, 201, 209, 218, 224, 230, 238, 240, 244, 248, 253, 257, 260, 266, 273, 282, 291, 301, 312, 314, 316, 318, 320, 322, 324, 326, 328, 330, 333, 336, 339, 351, 356, 363, 370, 378, 388, 400, 412, 425, 428, 435, 442, 447, 466, 483, 488, 499, 508, 518, 528, 539, 547, 557, 566, 577, 592, 609, 615, 621, 632, 637, 641, 646, 649, 653, 659, 663, 673, 684}
 
 func (i EventType) String() string {
 	if i < 0 || i >= EventType(len(_EventType_index)-1) {
diff --git a/src/tui/light.go b/src/tui/light.go
index 3b940646..805bee80 100644
--- a/src/tui/light.go
+++ b/src/tui/light.go
@@ -214,6 +214,7 @@ func (r *LightRenderer) Init() error {
 	}
 
 	r.enableMouse()
+	r.csi("?2004h") // Enable bracketed paste mode
 	r.csi(fmt.Sprintf("%dA", r.MaxY()-1))
 	r.csi("G")
 	r.csi("K")
@@ -462,10 +463,11 @@ func (r *LightRenderer) escSequence(sz *int) Event {
 				}
 				// Bracketed paste mode: \e[200~ ... \e[201~
 				if len(r.buffer) > 5 && r.buffer[3] == '0' && (r.buffer[4] == '0' || r.buffer[4] == '1') && r.buffer[5] == '~' {
-					// Immediately discard the sequence from the buffer and reread input
-					r.buffer = r.buffer[6:]
-					*sz = 0
-					return r.GetChar()
+					*sz = 6
+					if r.buffer[4] == '0' {
+						return Event{BracketedPasteBegin, 0, nil}
+					}
+					return Event{BracketedPasteEnd, 0, nil}
 				}
 				return Event{Invalid, 0, nil} // INS
 			case '3':
diff --git a/src/tui/tcell.go b/src/tui/tcell.go
index dffd235f..a2630463 100644
--- a/src/tui/tcell.go
+++ b/src/tui/tcell.go
@@ -197,6 +197,7 @@ func (r *FullscreenRenderer) initScreen() error {
 	if e = s.Init(); e != nil {
 		return e
 	}
+	s.EnablePaste()
 	if r.mouse {
 		s.EnableMouse()
 	} else {
@@ -266,6 +267,11 @@ func (r *FullscreenRenderer) Size() TermSize {
 func (r *FullscreenRenderer) GetChar() Event {
 	ev := _screen.PollEvent()
 	switch ev := ev.(type) {
+	case *tcell.EventPaste:
+		if ev.Start() {
+			return Event{BracketedPasteBegin, 0, nil}
+		}
+		return Event{BracketedPasteEnd, 0, nil}
 	case *tcell.EventResize:
 		// Ignore the first resize event
 		// https://github.com/gdamore/tcell/blob/v2.7.0/TUTORIAL.md?plain=1#L18
diff --git a/src/tui/tui.go b/src/tui/tui.go
index 4f2fe2c6..e181deaa 100644
--- a/src/tui/tui.go
+++ b/src/tui/tui.go
@@ -103,6 +103,8 @@ const (
 
 	Invalid
 	Fatal
+	BracketedPasteBegin
+	BracketedPasteEnd
 
 	Mouse
 	DoubleClick
diff --git a/src/util/chars.go b/src/util/chars.go
index dd037caa..e5234303 100644
--- a/src/util/chars.go
+++ b/src/util/chars.go
@@ -294,9 +294,10 @@ func (chars *Chars) Lines(multiLine bool, maxLines int, wrapCols int, wrapSignWi
 			line = line[:len(line)-1]
 		}
 
+		hasWrapSign := false
 		for {
 			cols := wrapCols
-			if len(wrapped) > 0 {
+			if hasWrapSign {
 				cols -= wrapSignWidth
 			}
 			_, overflowIdx := RunesWidth(line, 0, tabstop, cols)
@@ -309,9 +310,11 @@ func (chars *Chars) Lines(multiLine bool, maxLines int, wrapCols int, wrapSignWi
 					return wrapped, true
 				}
 				wrapped = append(wrapped, line[:overflowIdx])
+				hasWrapSign = true
 				line = line[overflowIdx:]
 				continue
 			}
+			hasWrapSign = false
 
 			// Restore trailing '\n'
 			if newline {
diff --git a/src/util/eventbox.go b/src/util/eventbox.go
index b710cf1e..91b9274e 100644
--- a/src/util/eventbox.go
+++ b/src/util/eventbox.go
@@ -6,7 +6,7 @@ import "sync"
 type EventType int
 
 // Events is a type that associates EventType to any data
-type Events map[EventType]interface{}
+type Events map[EventType]any
 
 // EventBox is used for coordinating events
 type EventBox struct {
@@ -36,7 +36,7 @@ func (b *EventBox) Wait(callback func(*Events)) {
 }
 
 // Set turns on the event type on the box
-func (b *EventBox) Set(event EventType, value interface{}) {
+func (b *EventBox) Set(event EventType, value any) {
 	b.cond.L.Lock()
 	b.events[event] = value
 	if _, found := b.ignore[event]; !found {


Test patch:
diff --git a/src/terminal_test.go b/src/terminal_test.go
index 4d55d80e..1d50767b 100644
--- a/src/terminal_test.go
+++ b/src/terminal_test.go
@@ -565,7 +565,7 @@ func (item *Item) String() string {
 }
 
 // Helper function to parse, execute and convert "text/template" to string. Panics on error.
-func templateToString(format string, data interface{}) string {
+func templateToString(format string, data any) string {
 	bb := &bytes.Buffer{}
 
 	err := template.Must(template.New("").Parse(format)).Execute(bb, data)
diff --git a/src/tui/tcell_test.go b/src/tui/tcell_test.go
index 63bcd8ce..8efd0ad8 100644
--- a/src/tui/tcell_test.go
+++ b/src/tui/tcell_test.go
@@ -10,7 +10,7 @@ import (
 	"github.com/junegunn/fzf/src/util"
 )
 
-func assert(t *testing.T, context string, got interface{}, want interface{}) bool {
+func assert(t *testing.T, context string, got any, want any) bool {
 	if got == want {
 		return true
 	} else {
diff --git a/src/util/chars_test.go b/src/util/chars_test.go
index 0d3e4f37..c3d6c994 100644
--- a/src/util/chars_test.go
+++ b/src/util/chars_test.go
@@ -76,7 +76,7 @@ func TestCharsLines(t *testing.T) {
 	check(true, 100, 3, 1, 1, 8, false)
 
 	// With wrap sign (3 + 2)
-	check(true, 100, 3, 2, 1, 12, false)
+	check(true, 100, 3, 2, 1, 10, false)
 
 	// With wrap sign (3 + 2) and no multi-line
 	check(false, 100, 3, 2, 1, 13, false)
diff --git a/test/test_core.rb b/test/test_core.rb
index 59cdfac4..ec0a1da8 100644
--- a/test/test_core.rb
+++ b/test/test_core.rb
@@ -1813,4 +1813,111 @@ class TestCore < TestInteractive
       assert_equal ['[0] 1st: foo, 3rd: baz, 2nd: bar'], File.readlines(tempname, chomp: true)
     end
   end
+
+  def test_ghost
+    tmux.send_keys %(seq 100 | #{FZF} --prompt 'X ' --ghost 'Type in query ...'), :Enter
+    tmux.until do |lines|
+      assert_equal 100, lines.match_count
+      assert_includes lines, 'X Type in query ...'
+    end
+    tmux.send_keys '100'
+    tmux.until do |lines|
+      assert_equal 1, lines.match_count
+      assert_includes lines, 'X 100'
+    end
+    tmux.send_keys 'C-u'
+    tmux.until do |lines|
+      assert_equal 100, lines.match_count
+      assert_includes lines, 'X Type in query ...'
+    end
+  end
+
+  def test_ghost_inline
+    tmux.send_keys %(seq 100 | #{FZF} --info 'inline: Y' --no-separator --prompt 'X ' --ghost 'Type in query ...'), :Enter
+    tmux.until do |lines|
+      assert_includes lines, 'X Type in query ... Y100/100'
+    end
+    tmux.send_keys '100'
+    tmux.until do |lines|
+      assert_includes lines, 'X 100  Y1/100'
+    end
+    tmux.send_keys 'C-u'
+    tmux.until do |lines|
+      assert_includes lines, 'X Type in query ... Y100/100'
+    end
+  end
+
+  def test_offset_middle
+    tmux.send_keys %(seq 1000 | #{FZF} --sync --no-input --reverse --height 5 --scroll-off 0 --bind space:offset-middle), :Enter
+    line = nil
+    tmux.until { |lines| line = lines.index('> 1') }
+    tmux.send_keys :PgDn
+    tmux.until { |lines| assert_includes lines[line + 4], "> 5" }
+    tmux.send_keys :Space
+    tmux.until { |lines| assert_includes lines[line + 2], "> 5" }
+  end
+
+  def test_no_input_query
+    tmux.send_keys %(seq 1000 | #{FZF} --no-input --query 555 --bind space:toggle-input), :Enter
+    tmux.until { |lines| assert_includes lines, '> 555' }
+    tmux.send_keys :Space
+    tmux.until do |lines|
+      assert_equal 1, lines.match_count
+      assert_includes lines, '> 555'
+    end
+  end
+
+  def test_no_input_change_query
+    tmux.send_keys %(seq 1000 | #{FZF} --multi --query 999 --no-input --bind 'enter:show-input+change-query(555)+hide-input,space:change-query(555)+select'), :Enter
+    tmux.until { |lines| assert_includes lines, '> 999' }
+    tmux.send_keys :Space
+    tmux.until do |lines|
+      assert_includes lines, '>>999'
+      refute_includes lines, '> 555'
+    end
+    tmux.send_keys :Enter
+    tmux.until do |lines|
+      refute_includes lines, '>>999'
+      assert_includes lines, '> 555'
+    end
+  end
+
+  def test_search_override_query_in_no_input_mode
+    tmux.send_keys %(seq 1000 | #{FZF} --sync --no-input --bind 'enter:show-input+change-query(555)+hide-input+search(999),space:search(111)+show-input+change-query(777)'), :Enter
+    tmux.until { |lines| assert_includes lines, '> 1' }
+    tmux.send_keys :Enter
+    tmux.until { |lines| assert_includes lines, '> 999' }
+    tmux.send_keys :Space
+    tmux.until { |lines| assert_includes lines, '> 777' }
+  end
+
+  def test_change_pointer
+    tmux.send_keys %(seq 2 | #{FZF} --bind 'a:change-pointer(a),b:change-pointer(bb),c:change-pointer(),d:change-pointer(ddd)'), :Enter
+    tmux.until { |lines| assert_includes lines, '> 1' }
+    tmux.send_keys 'a'
+    tmux.until { |lines| assert_includes lines, 'a 1' }
+    tmux.send_keys 'b'
+    tmux.until { |lines| assert_includes lines, 'bb 1' }
+    tmux.send_keys 'c'
+    tmux.until { |lines| assert_includes lines, ' 1' }
+    tmux.send_keys 'd'
+    tmux.until { |lines| refute_includes lines, 'ddd 1' }
+    tmux.send_keys :Up
+    tmux.until { |lines| assert_includes lines, ' 2' }
+  end
+
+  def test_transform_pointer
+    tmux.send_keys %(seq 2 | #{FZF} --bind 'a:transform-pointer(echo a),b:transform-pointer(echo bb),c:transform-pointer(),d:transform-pointer(echo ddd)'), :Enter
+    tmux.until { |lines| assert_includes lines, '> 1' }
+    tmux.send_keys 'a'
+    tmux.until { |lines| assert_includes lines, 'a 1' }
+    tmux.send_keys 'b'
+    tmux.until { |lines| assert_includes lines, 'bb 1' }
+    tmux.send_keys 'c'
+    tmux.until { |lines| assert_includes lines, ' 1' }
+    tmux.send_keys 'd'
+    tmux.until { |lines| refute_includes lines, 'ddd 1' }
+    tmux.send_keys :Up
+    tmux.until { |lines| assert_includes lines, ' 2' }
+  end
 end