Repository: junegunn/fzf
Pull request #4175 (2025-01-13 13:50:44)

Bump github.com/gdamore/tcell/v2 from 2.7.4 to 2.8.1
Bumps [github.com/gdamore/tcell/v2](https://github.com/gdamore/tcell) from 2.7.4 to 2.8.1.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a href="https://github.com/gdamore/tcell/releases">github.com/gdamore/tcell/v2's releases</a>.</em></p>
<blockquote>
<h2>Version 2.8.1  Bug Fixes</h2>
<p>This release addresses two bugs.</p>
<p>First, a bug with signed int overflow prevented building depending on the go compiler in use.</p>
<p>Second, a bug prevented color underlines from being supported on most Xterm work-a-likes.</p>
<h2>Version 2.8.0 Feature Release</h2>
<h2>Main Features</h2>
<ul>
<li>Underline Styles</li>
<li>Cursor Colors</li>
<li>Hyperlink Support for Windows</li>
<li>Clipboard Support</li>
<li>Window Title Support</li>
<li>Ghostty Terminal Support (by <a href="https://github.com/joshgoebel"><code>@​joshgoebel</code></a>)</li>
<li>Performance Fix by (by <a href="https://github.com/kivattt"><code>@​kivattt</code></a>)</li>
<li>Fix for slow Start Up Times (<a href="https://redirect.github.com/gdamore/tcell/issues/764">#764</a>)</li>
</ul>
<h2>Detailed List</h2>
<ul>
<li>Add go-tetris by <a href="https://github.com/aaronriekenberg"><code>@​aaronriekenberg</code></a> in <a href="https://redirect.github.com/gdamore/tcell/pull/695">gdamore/tcell#695</a></li>
<li>feature: underline styles by <a href="https://github.com/gdamore"><code>@​gdamore</code></a> in <a href="https://redirect.github.com/gdamore/tcell/pull/697">gdamore/tcell#697</a></li>
<li>Windows: hyperlink support by <a href="https://github.com/gdamore"><code>@​gdamore</code></a> in <a href="https://redirect.github.com/gdamore/tcell/pull/705">gdamore/tcell#705</a></li>
<li>fixes <a href="https://redirect.github.com/gdamore/tcell/issues/666">#666</a> cursor color by <a href="https://github.com/gdamore"><code>@​gdamore</code></a> in <a href="https://redirect.github.com/gdamore/tcell/pull/709">gdamore/tcell#709</a></li>
<li>fixes <a href="https://redirect.github.com/gdamore/tcell/issues/710">#710</a> Add support for setting the window title by <a href="https://github.com/gdamore"><code>@​gdamore</code></a> in <a href="https://redirect.github.com/gdamore/tcell/pull/711">gdamore/tcell#711</a></li>
<li>fixes <a href="https://redirect.github.com/gdamore/tcell/issues/561">#561</a> Add clipboard support. by <a href="https://github.com/gdamore"><code>@​gdamore</code></a> in <a href="https://redirect.github.com/gdamore/tcell/pull/714">gdamore/tcell#714</a></li>
<li>Bump codecov/codecov-action from 4.1.0 to 4.3.0 by <a href="https://github.com/dependabot"><code>@​dependabot</code></a> in <a href="https://redirect.github.com/gdamore/tcell/pull/725">gdamore/tcell#725</a></li>
<li>Fix typos by <a href="https://github.com/deining"><code>@​deining</code></a> in <a href="https://redirect.github.com/gdamore/tcell/pull/747">gdamore/tcell#747</a></li>
<li>fix warning 'Restore cache failed' by <a href="https://github.com/deining"><code>@​deining</code></a> in <a href="https://redirect.github.com/gdamore/tcell/pull/748">gdamore/tcell#748</a></li>
<li>Adding oddshub to README by <a href="https://github.com/dos-2"><code>@​dos-2</code></a> in <a href="https://redirect.github.com/gdamore/tcell/pull/737">gdamore/tcell#737</a></li>
<li>fix: add tmux-256color terminfo by <a href="https://github.com/luisdavim"><code>@​luisdavim</code></a> in <a href="https://redirect.github.com/gdamore/tcell/pull/719">gdamore/tcell#719</a></li>
<li>fixes <a href="https://redirect.github.com/gdamore/tcell/issues/716">#716</a> Improve missing terminal error message. by <a href="https://github.com/spearson78"><code>@​spearson78</code></a> in <a href="https://redirect.github.com/gdamore/tcell/pull/717">gdamore/tcell#717</a></li>
<li>Speed up SetContent by checking length of combining characters before reflect.DeepEqual by <a href="https://github.com/kivattt"><code>@​kivattt</code></a> in <a href="https://redirect.github.com/gdamore/tcell/pull/744">gdamore/tcell#744</a></li>
<li>Bump github.com/mattn/go-runewidth from 0.0.15 to 0.0.16 by <a href="https://github.com/dependabot"><code>@​dependabot</code></a> in <a href="https://redirect.github.com/gdamore/tcell/pull/743">gdamore/tcell#743</a></li>
<li>Bump golang.org/x/sys from 0.18.0 to 0.22.0 by <a href="https://github.com/dependabot"><code>@​dependabot</code></a> in <a href="https://redirect.github.com/gdamore/tcell/pull/738">gdamore/tcell#738</a></li>
<li>Bump codecov/codecov-action from 4.3.0 to 4.5.0 by <a href="https://github.com/dependabot"><code>@​dependabot</code></a> in <a href="https://redirect.github.com/gdamore/tcell/pull/736">gdamore/tcell#736</a></li>
<li>Bump golang.org/x/term from 0.18.0 to 0.25.0 by <a href="https://github.com/dependabot"><code>@​dependabot</code></a> in <a href="https://redirect.github.com/gdamore/tcell/pull/751">gdamore/tcell#751</a></li>
<li>fixes <a href="https://redirect.github.com/gdamore/tcell/issues/764">#764</a> Adding tcell as a dependency delays startup time by <a href="https://github.com/gdamore"><code>@​gdamore</code></a> in <a href="https://redirect.github.com/gdamore/tcell/pull/767">gdamore/tcell#767</a></li>
<li>Add Ghostty support by <a href="https://github.com/joshgoebel"><code>@​joshgoebel</code></a> in <a href="https://redirect.github.com/gdamore/tcell/pull/763">gdamore/tcell#763</a></li>
<li>Bump golang.org/x/term from 0.25.0 to 0.28.0 by <a href="https://github.com/dependabot"><code>@​dependabot</code></a> in <a href="https://redirect.github.com/gdamore/tcell/pull/766">gdamore/tcell#766</a></li>
<li>Bump codecov/codecov-action from 4.5.0 to 5.1.2 by <a href="https://github.com/dependabot"><code>@​dependabot</code></a> in <a href="https://redirect.github.com/gdamore/tcell/pull/762">gdamore/tcell#762</a></li>
</ul>
<h2>New Contributors</h2>
<ul>
<li><a href="https://github.com/aaronriekenberg"><code>@​aaronriekenberg</code></a> made their first contribution in <a href="https://redirect.github.com/gdamore/tcell/pull/695">gdamore/tcell#695</a></li>
<li><a href="https://github.com/deining"><code>@​deining</code></a> made their first contribution in <a href="https://redirect.github.com/gdamore/tcell/pull/747">gdamore/tcell#747</a></li>
<li><a href="https://github.com/dos-2"><code>@​dos-2</code></a> made their first contribution in <a href="https://redirect.github.com/gdamore/tcell/pull/737">gdamore/tcell#737</a></li>
<li><a href="https://github.com/luisdavim"><code>@​luisdavim</code></a> made their first contribution in <a href="https://redirect.github.com/gdamore/tcell/pull/719">gdamore/tcell#719</a></li>
<li><a href="https://github.com/spearson78"><code>@​spearson78</code></a> made their first contribution in <a href="https://redirect.github.com/gdamore/tcell/pull/717">gdamore/tcell#717</a></li>
<li><a href="https://github.com/kivattt"><code>@​kivattt</code></a> made their first contribution in <a href="https://redirect.github.com/gdamore/tcell/pull/744">gdamore/tcell#744</a></li>
<li><a href="https://github.com/joshgoebel"><code>@​joshgoebel</code></a> made their first contribution in <a href="https://redirect.github.com/gdamore/tcell/pull/763">gdamore/tcell#763</a></li>
</ul>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a href="https://github.com/gdamore/tcell/commit/eed6a79409ffa38c919dc4daf0ca4958e56cb5d4"><code>eed6a79</code></a> fixes <a href="https://redirect.github.com/gdamore/tcell/issues/769">#769</a> UnderlineStyle is displayed, but UnderlineColor is not</li>
<li><a href="https://github.com/gdamore/tcell/commit/6833fce7a89ab02f84554492091a5a25535adb2c"><code>6833fce</code></a> fixes <a href="https://redirect.github.com/gdamore/tcell/issues/768">#768</a> Compile error (signed vs unsigned int)</li>
<li><a href="https://github.com/gdamore/tcell/commit/a9475fd57f0ea55f23d908bdf7fe79bffd3d3a1a"><code>a9475fd</code></a> Bump golang.org/x/text to 0.21.0</li>
<li><a href="https://github.com/gdamore/tcell/commit/1768306a6571db2d956228299d49ff5d895d09bd"><code>1768306</code></a> Bump codecov/codecov-action from 4.5.0 to 5.1.2</li>
<li><a href="https://github.com/gdamore/tcell/commit/0fd7cf4a649ffc755a6d78166ece4d52a1a564c8"><code>0fd7cf4</code></a> Bump golang.org/x/term from 0.25.0 to 0.28.0</li>
<li><a href="https://github.com/gdamore/tcell/commit/6858527dc78dd199657ed94d603fc89fbf779390"><code>6858527</code></a> Add Ghostty support</li>
<li><a href="https://github.com/gdamore/tcell/commit/522d1e6cb63d839a3ad89fcd8915556098f7d07b"><code>522d1e6</code></a> fixes <a href="https://redirect.github.com/gdamore/tcell/issues/764">#764</a> Adding tcell as a dependency delays startup time</li>
<li><a href="https://github.com/gdamore/tcell/commit/807ae5d9624167abe6ec44596c15fbce2fdbeb99"><code>807ae5d</code></a> Bump golang.org/x/term from 0.18.0 to 0.25.0</li>
<li><a href="https://github.com/gdamore/tcell/commit/82fb941e52a70ccaca42e425f28bbf04f3849c23"><code>82fb941</code></a> Bump codecov/codecov-action from 4.3.0 to 4.5.0</li>
<li><a href="https://github.com/gdamore/tcell/commit/2cee43f3fe5192a0082f0b72db8a02bbdd399c89"><code>2cee43f</code></a> Bump golang.org/x/sys from 0.18.0 to 0.22.0</li>
<li>Additional commits viewable in <a href="https://github.com/gdamore/tcell/compare/v2.7.4...v2.8.1">compare view</a></li>
</ul>
</details>
<br />


[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=github.com/gdamore/tcell/v2&package-manager=go_modules&previous-version=2.7.4&new-version=2.8.1)](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 3e30749b..bd1dd62e 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -17,7 +17,7 @@ Also, fzf now offers "style presets" for quick customization, which can be activ
 | `minimal` | <img src="https://raw.githubusercontent.com/junegunn/i/master/fzf-style-minimal.png"/> |
 
 - Style presets (#4160)
-    - `--style=full`
+    - `--style=full[:BORDER_STYLE]`
     - `--style=default`
     - `--style=minimal`
 - Border and label for the list section (#4148)
@@ -61,6 +61,16 @@ Also, fzf now offers "style presets" for quick customization, which can be activ
         - `transform-header-label`
 - Added `--preview-border[=STYLE]` as short for `--preview-window=border[-STYLE]`
 - Added new preview border style `line` which draws a single separator line between the preview window and the rest of the interface
+- fzf will now render a dashed line (`┈┈`) in each `--gap` for better visual separation.
+  ```sh
+  # All bash/zsh functions, highlighted
+  declare -f |
+    perl -0 -pe 's/^}\n/}\0/gm' |
+    bat --plain --language bash --color always |
+    fzf --read0 --ansi --layout reverse --multi --highlight-line \
+        --gap
+  ```
+    * You can customize the line using `--gap-line[=STR]`.
 - You can specify `border-native` to `--tmux` so that native tmux border is used instead of `--border`. This can be useful if you start a different program from inside the popup.
   ```sh
   fzf --tmux border-native --bind 'enter:execute:less {}'
@@ -72,6 +82,22 @@ Also, fzf now offers "style presets" for quick customization, which can be activ
   # Start with --nth 1, then 2, then 3, then back to the default, 1
   echo 'foo foobar foobarbaz' | fzf --bind 'space:change-nth(2|3|)' --nth 1 -q foo
   ```
+- `--nth` parts of each line can now be rendered in a different text style
+  ```sh
+  # nth in a different style
+  ls -al | fzf --nth -1 --color nth:italic
+  ls -al | fzf --nth -1 --color nth:reverse
+  ls -al | fzf --nth -1 --color nth:reverse:bold
+
+  # Dim the other parts
+  ls -al | fzf --nth -1 --color nth:regular,fg:dim,current-fg:dim
+
+  # With 'change-nth'. The current nth option is exported as $FZF_NTH.
+  ps -ef | fzf --reverse --header-lines 1 --header-border bottom --input-border \
+             --color nth:regular,fg:dim,current-fg:dim \
+             --bind 'ctrl-n:change-nth(8..|1|2|3|4|5|6|7|)' \
+             --bind 'result:transform-prompt:echo "${FZF_NTH}> "'
+  ```
 - A single-character delimiter is now treated as a plain string delimiter rather than a regular expression delimiter, even if it's a regular expression meta-character.
     - This means you can just write `--delimiter '|'` instead of escaping it as `--delimiter '\|'`
 - Bug fixes
diff --git a/README.md b/README.md
index ffd57438..d681b790 100644
--- a/README.md
+++ b/README.md
@@ -43,7 +43,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/pbwn"><img src="https:&#x2F;&#x2F;github.com&#x2F;pbwn.png" width="60px" alt="User avatar: " /></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/iveteran"><img src="https:&#x2F;&#x2F;github.com&#x2F;iveteran.png" width="60px" alt="User avatar: Yu" /></a><a href="https://github.com/fvalasiad"><img src="https:&#x2F;&#x2F;github.com&#x2F;fvalasiad.png" width="60px" alt="User avatar: Fotios Valasiadis" /></a><a href="https://github.com/chillax"><img src="https:&#x2F;&#x2F;github.com&#x2F;chillax.png" width="60px" alt="User avatar: Joonas Korhonen" /></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/flanaras"><img src="https:&#x2F;&#x2F;github.com&#x2F;flanaras.png" width="60px" alt="User avatar: Filippos Lanaras" /></a><a href="https://github.com/freshleafmedia"><img src="https:&#x2F;&#x2F;github.com&#x2F;freshleafmedia.png" width="60px" alt="User avatar: Freshleaf Media" /></a><a href="https://github.com/Unambiguous"><img src="https:&#x2F;&#x2F;github.com&#x2F;Unambiguous.png" width="60px" alt="User avatar: " /></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/devmatteini"><img src="https:&#x2F;&#x2F;github.com&#x2F;devmatteini.png" width="60px" alt="User avatar: Cosimo Matteini" /></a><a href="https://github.com/Saulimedes"><img src="https:&#x2F;&#x2F;github.com&#x2F;Saulimedes.png" width="60px" alt="User avatar: Paul Becker" /></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/pbwn"><img src="https:&#x2F;&#x2F;github.com&#x2F;pbwn.png" width="60px" alt="User avatar: " /></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/flanaras"><img src="https:&#x2F;&#x2F;github.com&#x2F;flanaras.png" width="60px" alt="User avatar: Filippos Lanaras" /></a><a href="https://github.com/freshleafmedia"><img src="https:&#x2F;&#x2F;github.com&#x2F;freshleafmedia.png" width="60px" alt="User avatar: Freshleaf Media" /></a><a href="https://github.com/Unambiguous"><img src="https:&#x2F;&#x2F;github.com&#x2F;Unambiguous.png" width="60px" alt="User avatar: " /></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/devmatteini"><img src="https:&#x2F;&#x2F;github.com&#x2F;devmatteini.png" width="60px" alt="User avatar: Cosimo Matteini" /></a><a href="https://github.com/Saulimedes"><img src="https:&#x2F;&#x2F;github.com&#x2F;Saulimedes.png" width="60px" alt="User avatar: Paul Becker" /></a><!-- sponsors -->
 
 Table of Contents
 -----------------
diff --git a/go.mod b/go.mod
index 6b7743d6..2a0cfad1 100644
--- a/go.mod
+++ b/go.mod
@@ -2,7 +2,7 @@ module github.com/junegunn/fzf
 
 require (
 	github.com/charlievieth/fastwalk v1.0.9
-	github.com/gdamore/tcell/v2 v2.7.4
+	github.com/gdamore/tcell/v2 v2.8.1
 	github.com/junegunn/go-shellwords v0.0.0-20240813092932-a62c48c52e97
 	github.com/mattn/go-isatty v0.0.20
 	github.com/rivo/uniseg v0.4.7
@@ -11,10 +11,10 @@ require (
 )
 
 require (
-	github.com/gdamore/encoding v1.0.0 // indirect
+	github.com/gdamore/encoding v1.0.1 // indirect
 	github.com/lucasb-eyer/go-colorful v1.2.0 // indirect
-	github.com/mattn/go-runewidth v0.0.15 // indirect
-	golang.org/x/text v0.14.0 // indirect
+	github.com/mattn/go-runewidth v0.0.16 // indirect
+	golang.org/x/text v0.21.0 // indirect
 )
 
 go 1.20
diff --git a/go.sum b/go.sum
index 6a6c48e0..5464085d 100644
--- a/go.sum
+++ b/go.sum
@@ -1,17 +1,18 @@
 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/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.4 h1:sg6/UnTM9jGpZU+oFYAsDahfchWAFW8Xx2yFinNSAYU=
-github.com/gdamore/tcell/v2 v2.7.4/go.mod h1:dSXtXTSK0VsW1biw65DZLZ2NKr7j0qP/0J7ONmsraWg=
+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=
+github.com/gdamore/tcell/v2 v2.8.1/go.mod h1:bj8ori1BG3OYMjmb3IklZVWfZUJ1UBQt9JXrOCOhGWw=
+github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
 github.com/junegunn/go-shellwords v0.0.0-20240813092932-a62c48c52e97 h1:rqzLixVo1c/GQW6px9j1xQmlvQIn+lf/V6M1UQ7IFzw=
 github.com/junegunn/go-shellwords v0.0.0-20240813092932-a62c48c52e97/go.mod h1:6EILKtGpo5t+KLb85LNZLAF6P9LKp78hJI80PXMcn3c=
 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.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-runewidth v0.0.16 h1:E5ScNMtiwvlvB5paMFdw9p4kSQzbXFikJ5SQO6TULQc=
+github.com/mattn/go-runewidth v0.0.16/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w=
 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.7 h1:WUdvkW8uEhrYfLC4ZzdpI2ztxP1I582+49Oc5Mq64VQ=
@@ -19,15 +20,29 @@ github.com/rivo/uniseg v0.4.7/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUc
 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=
+golang.org/x/crypto v0.13.0/go.mod h1:y6Z2r+Rw4iayiXXAIxJIDAJ1zMW4yaTpebo8fPOliYc=
+golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU=
+golang.org/x/crypto v0.23.0/go.mod h1:CKFgDieR+mRhux2Lsu27y0fO304Db0wZe70UKqHu0v8=
 golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=
 golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
+golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
+golang.org/x/mod v0.15.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c=
+golang.org/x/mod v0.17.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c=
 golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
 golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
 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/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg=
+golang.org/x/net v0.15.0/go.mod h1:idbUs1IY1+zTqbi8yxTbhexhEEk5ur9LInksu6HrEpk=
+golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44=
+golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM=
 golang.org/x/sync v0.0.0-20190423024810-112230192c58/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.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y=
+golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
+golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
+golang.org/x/sync v0.10.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=
@@ -35,23 +50,36 @@ golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBc
 golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
+golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
 golang.org/x/sys v0.29.0 h1:TPYlXGxvx1MGTn2GiZDhnjPA9wZzZeGKHHmKhHYvgaU=
 golang.org/x/sys v0.29.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
+golang.org/x/telemetry v0.0.0-20240228155512-f48c80bd79b2/go.mod h1:TeRTkGYfJXctD9OcfyVLyj2J3IxLnKwHJR8f4D8a3YE=
 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.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo=
+golang.org/x/term v0.12.0/go.mod h1:owVbMEjm3cBLCHdkQu9b1opXd4ETQWc3BhuQGKgXgvU=
 golang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk=
+golang.org/x/term v0.20.0/go.mod h1:8UkIAJTvZgivsXaD6/pH6U9ecQzZ45awqEOzuCvwpFY=
 golang.org/x/term v0.28.0 h1:/Ts8HFuMR2E6IP/jlo7QVLZHggjKQbhu/7H0LJFr3Gg=
 golang.org/x/term v0.28.0/go.mod h1:Sw/lC2IAUZ92udQNf3WodGtn4k/XoLyZoh8v/8uiwek=
 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=
 golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
-golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ=
+golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=
+golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=
 golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
+golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
+golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo=
+golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ=
 golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
 golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
 golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=
 golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU=
+golang.org/x/tools v0.13.0/go.mod h1:HvlwmtVNQAhOuCjW7xxvovg8wbNq7LwfXh/k7wXUl58=
+golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d/go.mod h1:aiJjzUbINMkxbQROHiO6hDPo2LHcIPhhQsa9DLh0yGk=
 golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
diff --git a/man/man1/fzf.1 b/man/man1/fzf.1
index 85cc28f9..16efa85b 100644
--- a/man/man1/fzf.1
+++ b/man/man1/fzf.1
@@ -189,7 +189,7 @@ e.g. \fB# Avoid rendering both fzf instances at the same time
 .SS GLOBAL STYLE
 .TP
 .BI "\-\-style=" "PRESET"
-Apply a style preset [default|minimal|full]
+Apply a style preset [default|minimal|full[:BORDER_STYLE]]
 .TP
 .BI "\-\-color=" "[BASE_SCHEME][,COLOR_NAME[:ANSI_COLOR][:ANSI_ATTRIBUTES]]..."
 Color configuration. The name of the base color scheme is followed by custom
@@ -228,6 +228,7 @@ color mappings.
       \fBlist\-border         \fRBorder around the list section (\fB\-\-list\-border\fR)
         \fBscrollbar         \fRScrollbar
         \fBseparator         \fRHorizontal separator on info line
+        \fBgap\-line          \fRHorizontal line on each gap
       \fBpreview\-border      \fRBorder around the preview window (\fB\-\-preview\fR)
         \fBpreview\-scrollbar \fRScrollbar
       \fBinput\-border        \fRBorder around the input window (\fB\-\-input\-border\fR)
@@ -242,6 +243,7 @@ color mappings.
     \fBmarker                \fRMulti\-select marker
     \fBspinner               \fRStreaming input indicator
     \fBheader (header\-fg)   \fRHeader
+    \fBnth                   \fRParts of the line specified by \fB\-\-nth\fR (only supports attributes)
 
 .B ANSI COLORS:
     \fB\-1         \fRDefault terminal foreground/background color
@@ -543,6 +545,10 @@ e.g.
 .BI "\-\-gap" "[=N]"
 Render empty lines between each item
 .TP
+.BI "\-\-gap\-line" "[=STR]"
+The given string will be repeated to draw a horizontal line on each gap
+(default: '┈' or '\-' depending on \fB\-\-no\-unicode\fR).
+.TP
 .B "\-\-keep\-right"
 Keep the right end of the line visible when it's too long. Effective only when
 the query string is empty.
@@ -1190,6 +1196,8 @@ fzf exports the following environment variables to its child processes.
 .br
 .BR FZF_QUERY "           Current query string"
 .br
+.BR FZF_NTH "             Current \-\-nth option"
+.br
 .BR FZF_PROMPT "          Prompt string"
 .br
 .BR FZF_PREVIEW_LABEL "   Preview label string"
@@ -1576,7 +1584,7 @@ A key or an event can be bound to one or more of the following actions.
     \fBpreview\-half\-page\-up\fR
     \fBpreview\-bottom\fR
     \fBpreview\-top\fR
-    \fBprint(...)\fR                   (add string to the output queue and print on exit)
+    \fBprint(...)\fR                   (add string to the output queue and print on normal exit)
     \fBput\fR                          (put the character to the prompt)
     \fBput(...)\fR                     (put the given string to the prompt)
     \fBrefresh\-preview\fR
diff --git a/shell/key-bindings.fish b/shell/key-bindings.fish
index 31552357..f343bd15 100644
--- a/shell/key-bindings.fish
+++ b/shell/key-bindings.fish
@@ -31,13 +31,14 @@ function fzf_key_bindings
     set -lx dir $commandline[1]
     set -l fzf_query $commandline[2]
     set -l prefix $commandline[3]
+    set -l result
 
     test -n "$FZF_TMUX_HEIGHT"; or set FZF_TMUX_HEIGHT 40%
     begin
       set -lx FZF_DEFAULT_OPTS (__fzf_defaults "--reverse --walker=file,dir,follow,hidden --scheme=path --walker-root=$dir" "$FZF_CTRL_T_OPTS")
       set -lx FZF_DEFAULT_COMMAND "$FZF_CTRL_T_COMMAND"
       set -lx FZF_DEFAULT_OPTS_FILE ''
-      eval (__fzfcmd) -m --query=$fzf_query | while read -l r; set -a result $r; end
+      set result (eval (__fzfcmd) -m --query=$fzf_query)
     end
     if test -z "$result"
       commandline -f repaint
@@ -57,32 +58,25 @@ function fzf_key_bindings
   function fzf-history-widget -d "Show command history"
     test -n "$FZF_TMUX_HEIGHT"; or set FZF_TMUX_HEIGHT 40%
     begin
-      set -l FISH_MAJOR (string split -- '.' $version)[1]
-      set -l FISH_MINOR (string split -- '.' $version)[2]
-
       # merge history from other sessions before searching
       test -z "$fish_private_mode"; and builtin history merge
 
-      # history's -z flag is needed for multi-line support.
-      # history's -z flag was added in fish 2.4.0, so don't use it for versions
-      # before 2.4.0.
-      if test "$FISH_MAJOR" -gt 2 -o \( "$FISH_MAJOR" -eq 2 -a "$FISH_MINOR" -ge 4 \)
-        set -lx FZF_DEFAULT_OPTS (__fzf_defaults "" "-n2..,.. --scheme=history --bind=ctrl-r:toggle-sort --wrap-sign '"\t"↳ ' --highlight-line $FZF_CTRL_R_OPTS +m")
-        set -lx FZF_DEFAULT_OPTS_FILE ''
-        if type -q perl
-          builtin history -z --reverse | command perl -0 -pe 's/^/$.\t/g; s/\n/\n\t/gm' | eval (__fzfcmd) --tac --read0 --print0 -q '(commandline)' | string replace -r '^\d*\t' '' | read -lz result
-          and commandline -- $result
-        else
-          set -l h (builtin history -z | string split0)
-          for i in (seq (count $h) -1 1)
-            string join0 -- $i\t(string replace -a -- \n \n\t $h[$i] | string collect)
-          end | eval (__fzfcmd) --read0 --print0 -q '(commandline)' | string replace -r '^\d*\t' '' | read -lz result
-          and commandline -- $result
-        end
+      set -lx FZF_DEFAULT_OPTS (__fzf_defaults "" "-n2..,.. --scheme=history --bind=ctrl-r:toggle-sort --wrap-sign '"\t"↳ ' --highlight-line +m $FZF_CTRL_R_OPTS")
+      set -lx FZF_DEFAULT_OPTS_FILE ''
+      set -lx FZF_DEFAULT_COMMAND
+      string match -q -r -- '/fish$' $SHELL; or set -lx SHELL (type -p fish)
+      if type -q perl
+        set -a FZF_DEFAULT_OPTS '--tac'
+        set FZF_DEFAULT_COMMAND 'builtin history -z --reverse | command perl -0 -pe \'s/^/$.\t/g; s/\n/\n\t/gm\''
       else
-        builtin history | eval (__fzfcmd) -q '(commandline)' | read -l result
-        and commandline -- $result
+        set FZF_DEFAULT_COMMAND \
+          'set -l h (builtin history -z --reverse | string split0);' \
+          'for i in (seq (count $h) -1 1);' \
+          'string join0 -- $i\t(string replace -a -- \n \n\t $h[$i] | string collect);' \
+          'end'
       end
+      set -l result (eval "$FZF_DEFAULT_COMMAND | $(__fzfcmd) --read0 --print0 -q (commandline) --bind='enter:become:string replace -a -- \n\t \n {2..} | string collect'")
+      and commandline -- $result
     end
     commandline -f repaint
   end
@@ -98,7 +92,7 @@ function fzf_key_bindings
       set -lx FZF_DEFAULT_OPTS (__fzf_defaults "--reverse --walker=dir,follow,hidden --scheme=path --walker-root=$dir" "$FZF_ALT_C_OPTS")
       set -lx FZF_DEFAULT_OPTS_FILE ''
       set -lx FZF_DEFAULT_COMMAND "$FZF_ALT_C_COMMAND"
-      eval (__fzfcmd) +m --query=$fzf_query | read -l result
+      set -l result (eval (__fzfcmd) +m --query=$fzf_query)
 
       if test -n "$result"
         cd -- $result
diff --git a/src/algo/algo.go b/src/algo/algo.go
index f0569185..c0022475 100644
--- a/src/algo/algo.go
+++ b/src/algo/algo.go
@@ -401,7 +401,7 @@ func debugV2(T []rune, pattern []rune, F []int32, lastIdx int, H []int16, C []in
 		if i == 0 {
 			fmt.Print("  ")
 			for j := int(f); j <= lastIdx; j++ {
-				fmt.Printf(" " + string(T[j]) + " ")
+				fmt.Print(" " + string(T[j]) + " ")
 			}
 			fmt.Println()
 		}
diff --git a/src/options.go b/src/options.go
index 3932cb56..cb077a17 100644
--- a/src/options.go
+++ b/src/options.go
@@ -56,7 +56,7 @@ Usage: fzf [options]
     --sync                   Synchronous search for multi-staged filtering
 
   GLOBAL STYLE
-    --style=PRESET           Apply a style preset [default|minimal|full]
+    --style=PRESET           Apply a style preset [default|minimal|full[:BORDER_STYLE]
     --color=COLSPEC          Base scheme (dark|light|16|bw) and/or custom colors
     --no-color               Disable colors
     --no-bold                Do not use bold text
@@ -97,6 +97,8 @@ Usage: fzf [options]
     --track                  Track the current selection when the result is updated
     --tac                    Reverse the order of the input
     --gap[=N]                Render empty lines between each item
+    --gap-line[=STR]         Draw horizontal line on each gap using the string
+                             (default: '┈' or '-')
     --keep-right             Keep the right end of the line visible on overflow
     --scroll-off=LINES       Number of screen lines to keep above or below when
                              scrolling to the top or to the bottom (default: 0)
@@ -127,7 +129,8 @@ Usage: fzf [options]
     --info=STYLE             Finder info style
                              [default|right|hidden|inline[-right][:PREFIX]]
     --info-command=COMMAND   Command to generate info line
-    --separator=STR          String to form horizontal separator on info line
+    --separator=STR          Draw horizontal separator on info line using the string
+                             (default: '─' or '-')
     --no-separator           Hide info line separator
     --filepath-word          Make word-wise movements respect path separators
     --input-border[=STYLE]   Draw border around the input section
@@ -211,6 +214,9 @@ Usage: fzf [options]
 
 `
 
+// Can be changed by --style
+var defaultBorderShape tui.BorderShape = tui.DefaultBorderShape
+
 const defaultInfoPrefix = " < "
 
 // Case denotes case-sensitivity of search
@@ -582,6 +588,7 @@ type Options struct {
 	HeaderLines       int
 	HeaderFirst       bool
 	Gap               int
+	GapLine           *string
 	Ellipsis          *string
 	Scrollbar         *string
 	Margin            [4]sizeSpec
@@ -624,7 +631,7 @@ func filterNonEmpty(input []string) []string {
 }
 
 func defaultPreviewOpts(command string) previewOpts {
-	return previewOpts{command, posRight, sizeSpec{50, true}, "", false, false, false, false, true, tui.DefaultBorderShape, 0, 0, nil}
+	return previewOpts{command, posRight, sizeSpec{50, true}, "", false, false, false, false, true, defaultBorderShape, 0, 0, nil}
 }
 
 func defaultOptions() *Options {
@@ -838,7 +845,7 @@ func parseBorder(str string, optional bool, allowLine bool) (tui.BorderShape, er
 		return tui.BorderNone, nil
 	}
 	if optional && str == "" {
-		return tui.DefaultBorderShape, nil
+		return defaultBorderShape, nil
 	}
 	return tui.BorderNone, errors.New("invalid border style (expected: rounded|sharp|bold|block|thinblock|double|horizontal|vertical|top|bottom|left|right|none)")
 }
@@ -1203,6 +1210,8 @@ func parseTheme(defaultTheme *tui.ColorTheme, str string) (*tui.ColorTheme, erro
 				mergeAttr(&theme.SelectedFg)
 			case "selected-bg":
 				mergeAttr(&theme.SelectedBg)
+			case "nth":
+				mergeAttr(&theme.Nth)
 			case "gutter":
 				mergeAttr(&theme.Gutter)
 			case "hl":
@@ -1253,6 +1262,8 @@ func parseTheme(defaultTheme *tui.ColorTheme, str string) (*tui.ColorTheme, erro
 				mergeAttr(&theme.Header)
 			case "header-bg":
 				mergeAttr(&theme.HeaderBg)
+			case "gap-line":
+				mergeAttr(&theme.GapLine)
 			default:
 				fail()
 			}
@@ -2567,6 +2578,15 @@ func parseOptions(index *int, opts *Options, allArgs []string) error {
 			}
 		case "--no-gap":
 			opts.Gap = 0
+		case "--gap-line":
+			if given, bar := optionalNextString(); given {
+				opts.GapLine = &bar
+			} else {
+				opts.GapLine = nil
+			}
+		case "--no-gap-line":
+			empty := ""
+			opts.GapLine = &empty
 		case "--ellipsis":
 			str, err := nextString("ellipsis string required")
 			if err != nil {
@@ -2714,7 +2734,7 @@ func parseOptions(index *int, opts *Options, allArgs []string) error {
 				return err
 			}
 		case "--style":
-			preset, err := nextString("preset name required: [default|minimal|full]")
+			preset, err := nextString("preset name required: [default|minimal|full[:BORDER_STYLE]]")
 			if err != nil {
 				return err
 			}
@@ -2867,12 +2887,15 @@ func parseOptions(index *int, opts *Options, allArgs []string) error {
 }
 
 func applyPreset(opts *Options, preset string) error {
+	// Reset to the platform default
+	defaultBorderShape = tui.DefaultBorderShape
+
 	switch strings.ToLower(preset) {
 	case "default":
 		opts.ListBorderShape = tui.BorderUndefined
 		opts.InputBorderShape = tui.BorderUndefined
 		opts.HeaderBorderShape = tui.BorderUndefined
-		opts.Preview.border = tui.DefaultBorderShape
+		opts.Preview.border = defaultBorderShape
 		opts.Preview.info = true
 		opts.InfoStyle = infoDefault
 		opts.Theme.Gutter = tui.NewColorAttr()
@@ -2891,19 +2914,29 @@ func applyPreset(opts *Options, preset string) error {
 		opts.Separator = &empty
 		opts.Scrollbar = &empty
 		opts.CursorLine = false
-	case "full":
-		opts.ListBorderShape = tui.DefaultBorderShape
-		opts.InputBorderShape = tui.DefaultBorderShape
-		opts.HeaderBorderShape = tui.DefaultBorderShape
-		opts.Preview.border = tui.DefaultBorderShape
+	default:
+		tokens := strings.SplitN(preset, ":", 2)
+		if tokens[0] != "full" {
+			return errors.New("unsupported style preset: " + preset)
+		}
+		if len(tokens) == 2 && len(tokens[1]) > 0 {
+			var err error
+			defaultBorderShape, err = parseBorder(tokens[1], false, false)
+			if err != nil {
+				return err
+			}
+		}
+
+		opts.ListBorderShape = defaultBorderShape
+		opts.InputBorderShape = defaultBorderShape
+		opts.HeaderBorderShape = defaultBorderShape
+		opts.Preview.border = defaultBorderShape
 		opts.Preview.info = true
 		opts.InfoStyle = infoInlineRight
 		opts.Theme.Gutter = tui.NewColorAttr()
 		opts.Separator = nil
 		opts.Scrollbar = nil
 		opts.CursorLine = true
-	default:
-		return errors.New("unsupported style preset: " + preset)
 	}
 	return nil
 }
@@ -2953,6 +2986,10 @@ func validateOptions(opts *Options) error {
 		}
 	}
 
+	if opts.Theme.Nth.IsColorDefined() {
+		return errors.New("only ANSI attributes are allowed for 'nth' (regular, bold, underline, reverse, dim, italic, strikethrough)")
+	}
+
 	return nil
 }
 
@@ -2987,6 +3024,14 @@ func postProcessOptions(opts *Options) error {
 		opts.Pointer = &defaultPointer
 	}
 
+	if opts.GapLine == nil {
+		defaultGapLine := "┈"
+		if !opts.Unicode {
+			defaultGapLine = "-"
+		}
+		opts.GapLine = &defaultGapLine
+	}
+
 	markerLen := 1
 	if opts.Marker == nil {
 		if opts.MarkerMulti != nil && opts.MarkerMulti[0] == "" {
diff --git a/src/result.go b/src/result.go
index f10db19b..ada31d59 100644
--- a/src/result.go
+++ b/src/result.go
@@ -104,11 +104,11 @@ func minRank() Result {
 	return Result{item: &minItem, points: [4]uint16{math.MaxUint16, 0, 0, 0}}
 }
 
-func (result *Result) colorOffsets(matchOffsets []Offset, theme *tui.ColorTheme, colBase tui.ColorPair, colMatch tui.ColorPair, current bool) []colorOffset {
+func (result *Result) colorOffsets(matchOffsets []Offset, nthOffsets []Offset, theme *tui.ColorTheme, colBase tui.ColorPair, colMatch tui.ColorPair, attrNth tui.Attr, current bool) []colorOffset {
 	itemColors := result.item.Colors()
 
 	// No ANSI codes
-	if len(itemColors) == 0 {
+	if len(itemColors) == 0 && len(nthOffsets) == 0 {
 		var offsets []colorOffset
 		for _, off := range matchOffsets {
 			offsets = append(offsets, colorOffset{offset: [2]int32{off[0], off[1]}, color: colMatch, match: true})
@@ -118,7 +118,7 @@ func (result *Result) colorOffsets(matchOffsets []Offset, theme *tui.ColorTheme,
 
 	// Find max column
 	var maxCol int32
-	for _, off := range matchOffsets {
+	for _, off := range append(matchOffsets, nthOffsets...) {
 		if off[1] > maxCol {
 			maxCol = off[1]
 		}
@@ -129,20 +129,33 @@ func (result *Result) colorOffsets(matchOffsets []Offset, theme *tui.ColorTheme,
 		}
 	}
 
-	cols := make([]int, maxCol)
+	type cellInfo struct {
+		index int
+		color bool
+		match bool
+		nth   bool
+	}
+
+	cols := make([]cellInfo, maxCol)
 	for colorIndex, ansi := range itemColors {
 		for i := ansi.offset[0]; i < ansi.offset[1]; i++ {
-			cols[i] = colorIndex + 1 // 1-based index of itemColors
+			cols[i] = cellInfo{colorIndex, true, false, false}
 		}
 	}
 
 	for _, off := range matchOffsets {
 		for i := off[0]; i < off[1]; i++ {
-			// Negative of 1-based index of itemColors
-			// - The extra -1 means highlighted
-			if cols[i] >= 0 {
-				cols[i] = cols[i]*-1 - 1
-			}
+			cols[i].match = true
+		}
+	}
+
+	for _, off := range nthOffsets {
+		// Exclude the whole line
+		if int(off[1])-int(off[0]) == result.item.text.Length() {
+			continue
+		}
+		for i := off[0]; i < off[1]; i++ {
+			cols[i].nth = true
 		}
 	}
 
@@ -152,7 +165,7 @@ func (result *Result) colorOffsets(matchOffsets []Offset, theme *tui.ColorTheme,
 	// ------------  ----  --  ----
 	//   ++++++++      ++++++++++
 	// --++++++++--  --++++++++++---
-	curr := 0
+	var curr cellInfo = cellInfo{0, false, false, false}
 	start := 0
 	ansiToColorPair := func(ansi ansiOffset, base tui.ColorPair) tui.ColorPair {
 		fg := ansi.color.fg
@@ -175,12 +188,12 @@ func (result *Result) colorOffsets(matchOffsets []Offset, theme *tui.ColorTheme,
 	}
 	var colors []colorOffset
 	add := func(idx int) {
-		if curr != 0 && idx > start {
-			if curr < 0 {
+		if (curr.color || curr.nth || curr.match) && idx > start {
+			if curr.match {
 				color := colMatch
 				var url *url
-				if curr < -1 && theme.Colored {
-					ansi := itemColors[-curr-2]
+				if curr.color && theme.Colored {
+					ansi := itemColors[curr.index]
 					url = ansi.color.url
 					origColor := ansiToColorPair(ansi, colMatch)
 					// hl or hl+ only sets the foreground color, so colMatch is the
@@ -197,15 +210,28 @@ func (result *Result) colorOffsets(matchOffsets []Offset, theme *tui.ColorTheme,
 						color = origColor.MergeNonDefault(color)
 					}
 				}
+				if curr.nth {
+					color = color.WithAttr(attrNth)
+				}
 				colors = append(colors, colorOffset{
 					offset: [2]int32{int32(start), int32(idx)}, color: color, match: true, url: url})
-			} else {
-				ansi := itemColors[curr-1]
+			} else if curr.color {
+				ansi := itemColors[curr.index]
+				color := ansiToColorPair(ansi, colBase)
+				if curr.nth {
+					color = color.WithAttr(attrNth)
+				}
 				colors = append(colors, colorOffset{
 					offset: [2]int32{int32(start), int32(idx)},
-					color:  ansiToColorPair(ansi, colBase),
+					color:  color,
 					match:  false,
 					url:    ansi.color.url})
+			} else {
+				colors = append(colors, colorOffset{
+					offset: [2]int32{int32(start), int32(idx)},
+					color:  colBase.WithAttr(attrNth),
+					match:  false,
+					url:    nil})
 			}
 		}
 	}
diff --git a/src/terminal.go b/src/terminal.go
index d7ca89b6..a5d8f767 100644
--- a/src/terminal.go
+++ b/src/terminal.go
@@ -267,6 +267,8 @@ type Terminal struct {
 	hscrollOff         int
 	scrollOff          int
 	gap                int
+	gapLine            labelPrinter
+	gapLineLen         int
 	wordRubout         string
 	wordNext           string
 	cx                 int
@@ -299,7 +301,9 @@ type Terminal struct {
 	scrollbar          string
 	previewScrollbar   string
 	ansi               bool
+	nthAttr            tui.Attr
 	nth                []Range
+	nthCurrent         []Range
 	tabstop            int
 	margin             [4]sizeSpec
 	padding            [4]sizeSpec
@@ -883,7 +887,9 @@ func NewTerminal(opts *Options, eventBox *util.EventBox, executor *util.Executor
 		header:             []string{},
 		header0:            opts.Header,
 		ansi:               opts.Ansi,
+		nthAttr:            opts.Theme.Nth.Attr,
 		nth:                opts.Nth,
+		nthCurrent:         opts.Nth,
 		tabstop:            opts.Tabstop,
 		hasStartActions:    false,
 		hasResultActions:   false,
@@ -949,6 +955,11 @@ func NewTerminal(opts *Options, eventBox *util.EventBox, executor *util.Executor
 		t.separator, t.separatorLen = t.ansiLabelPrinter(bar, &tui.ColSeparator, true)
 	}
 
+	// Gap line
+	if t.gap > 0 && len(*opts.GapLine) > 0 {
+		t.gapLine, t.gapLineLen = t.ansiLabelPrinter(*opts.GapLine, &tui.ColGapLine, true)
+	}
+
 	if opts.Ellipsis != nil {
 		t.ellipsis = *opts.Ellipsis
 	} else if t.unicode {
@@ -1035,6 +1046,9 @@ func (t *Terminal) environImpl(forPreview bool) []string {
 	env = append(env, "FZF_PREVIEW_LABEL="+t.previewLabelOpts.label)
 	env = append(env, "FZF_BORDER_LABEL="+t.borderLabelOpts.label)
 	env = append(env, "FZF_LIST_LABEL="+t.listLabelOpts.label)
+	if len(t.nthCurrent) > 0 {
+		env = append(env, "FZF_NTH="+RangesToString(t.nthCurrent))
+	}
 	env = append(env, fmt.Sprintf("FZF_TOTAL_COUNT=%d", t.count))
 	env = append(env, fmt.Sprintf("FZF_MATCH_COUNT=%d", t.merger.Length()))
 	env = append(env, fmt.Sprintf("FZF_SELECT_COUNT=%d", len(t.selected)))
@@ -1164,7 +1178,7 @@ func (t *Terminal) ansiLabelPrinter(str string, color *tui.ColorPair, fill bool)
 	printFn := func(window tui.Window, limit int) {
 		if offsets == nil {
 			// tui.Col* are not initialized until renderer.Init()
-			offsets = result.colorOffsets(nil, t.theme, *color, *color, false)
+			offsets = result.colorOffsets(nil, nil, t.theme, *color, *color, t.nthAttr, false)
 		}
 		for limit > 0 {
 			if length > limit {
@@ -2446,9 +2460,7 @@ func (t *Terminal) canSpanMultiLines() bool {
 	return t.multiLine || t.wrap || t.gap > 0
 }
 
-func (t *Terminal) renderEmptyLine(line int, barRange [2]int) {
-	t.move(line, 0, true)
-	t.markEmptyLine(line)
+func (t *Terminal) renderBar(line int, barRange [2]int) {
 	// If the screen is not filled with the list in non-multi-line mode,
 	// scrollbar is not visible at all. But in multi-line mode, we may need
 	// to redraw the scrollbar character at the end.
@@ -2457,6 +2469,29 @@ func (t *Terminal) renderEmptyLine(line int, barRange [2]int) {
 	}
 }
 
+func (t *Terminal) renderEmptyLine(line int, barRange [2]int) {
+	t.move(line, 0, true)
+	t.markEmptyLine(line)
+	t.renderBar(line, barRange)
+}
+
+func (t *Terminal) renderGapLine(line int, barRange [2]int, drawLine bool) {
+	t.move(line, 0, false)
+	t.window.CPrint(tui.ColCursorEmpty, t.pointerEmpty)
+	t.window.Print(t.markerEmpty)
+	x := t.pointerLen + t.markerLen
+
+	width := t.window.Width() - x - 1
+	if drawLine && t.gapLine != nil {
+		t.gapLine(t.window, width)
+	} else {
+		t.move(line, x, true)
+	}
+	t.markOtherLine(line)
+	t.renderBar(line, barRange)
+	t.prevLines[line].width = width
+}
+
 func (t *Terminal) printList() {
 	t.constrain()
 	barLength, barStart := t.getScrollbar()
@@ -2629,7 +2664,7 @@ func (t *Terminal) printItem(result Result, line int, maxLine int, index int, cu
 	}
 	for i := 0; i < t.gap && finalLineNum < maxLine; i++ {
 		finalLineNum++
-		t.renderEmptyLine(finalLineNum, barRange)
+		t.renderGapLine(finalLineNum, barRange, i == t.gap-1)
 	}
 	return finalLineNum
 }
@@ -2689,7 +2724,41 @@ func (t *Terminal) printHighlighted(result Result, colBase tui.ColorPair, colMat
 		}
 		sort.Sort(ByOrder(charOffsets))
 	}
-	allOffsets := result.colorOffsets(charOffsets, t.theme, colBase, colMatch, current)
+
+	wholeCovered := len(t.nthCurrent) == 0
+	for _, nth := range t.nthCurrent {
+		// Do we still want to apply a different style when the current nth
+		// covers the whole string? Probably not. And we can simplify the logic.
+		if nth.IsFull() {
+			wholeCovered = true
+			break
+		}
+	}
+	// But if 'nth' is set to 'regular', it's a sign that you're applying
+	// a different style to the rest of the string. e.g. 'nth:regular,fg:dim'
+	// In this case, we still need to apply and clear the style.
+	// We do the same when postTask is nil, which means we're printing header lines.
+	if t.nthAttr == tui.AttrRegular && wholeCovered || postTask == nil {
+		if t.nthAttr == tui.AttrRegular {
+			colBase = colBase.WithAttr(t.nthAttr)
+		}
+	}
+	var nthOffsets []Offset
+	if !wholeCovered && t.nthAttr > 0 && postTask != nil {
+		var tokens []Token
+		if item.transformed != nil {
+			tokens = item.transformed.tokens
+		} else {
+			tokens = Transform(Tokenize(item.text.ToString(), t.delimiter), t.nthCurrent)
+		}
+		for _, token := range tokens {
+			start := token.prefixLength
+			end := start + int32(token.text.Length())
+			nthOffsets = append(nthOffsets, Offset{int32(start), int32(end)})
+		}
+		sort.Sort(ByOrder(nthOffsets))
+	}
+	allOffsets := result.colorOffsets(charOffsets, nthOffsets, t.theme, colBase, colMatch, t.nthAttr, current)
 
 	maxLines := 1
 	if t.canSpanMultiLines() {
@@ -4639,6 +4708,7 @@ func (t *Terminal) Loop() error {
 					// The default
 					newNth = &t.nth
 				}
+				t.nthCurrent = *newNth
 				// Cycle
 				if len(tokens) > 1 {
 					a.a = strings.Join(append(tokens[1:], tokens[0]), "|")
diff --git a/src/tmux.go b/src/tmux.go
index e459000a..87ea38cc 100644
--- a/src/tmux.go
+++ b/src/tmux.go
@@ -12,7 +12,9 @@ func runTmux(args []string, opts *Options) (int, error) {
 	fzf, rest := args[0], args[1:]
 	args = []string{"--bind=ctrl-z:ignore"}
 	if !opts.Tmux.border && opts.BorderShape == tui.BorderUndefined {
-		args = append(args, "--border")
+		// We append --border option at the end, because `--style=full:STYLE`
+		// may have changed the default border style.
+		rest = append(rest, "--border")
 	}
 	if opts.Tmux.border && opts.Margin == defaultMargin() {
 		args = append(args, "--margin=0,1")
diff --git a/src/tokenizer.go b/src/tokenizer.go
index 6b2ef72b..e5a8e977 100644
--- a/src/tokenizer.go
+++ b/src/tokenizer.go
@@ -18,6 +18,36 @@ type Range struct {
 	end   int
 }
 
+func (r Range) IsFull() bool {
+	return r.begin == rangeEllipsis && r.end == rangeEllipsis
+}
+
+func RangesToString(ranges []Range) string {
+	strs := []string{}
+	for _, r := range ranges {
+		s := ""
+		if r.begin == rangeEllipsis && r.end == rangeEllipsis {
+			s = ".."
+		} else if r.begin == r.end {
+			s = strconv.Itoa(r.begin)
+		} else {
+			if r.begin != rangeEllipsis {
+				s += strconv.Itoa(r.begin)
+			}
+
+			if r.begin != -1 {
+				s += ".."
+				if r.end != rangeEllipsis {
+					s += strconv.Itoa(r.end)
+				}
+			}
+		}
+		strs = append(strs, s)
+	}
+
+	return strings.Join(strs, ",")
+}
+
 // Token contains the tokenized part of the strings and its prefix length
 type Token struct {
 	text         *util.Chars
@@ -41,7 +71,7 @@ func (d Delimiter) String() string {
 }
 
 func newRange(begin int, end int) Range {
-	if begin == 1 {
+	if begin == 1 && end != 1 {
 		begin = rangeEllipsis
 	}
 	if end == -1 {
@@ -73,7 +103,7 @@ func ParseRange(str *string) (Range, bool) {
 		}
 		begin, err1 := strconv.Atoi(ns[0])
 		end, err2 := strconv.Atoi(ns[1])
-		if err1 != nil || err2 != nil || begin == 0 || end == 0 {
+		if err1 != nil || err2 != nil || begin == 0 || end == 0 || begin < 0 && end > 0 {
 			return Range{}, false
 		}
 		return newRange(begin, end), true
diff --git a/src/tui/dummy.go b/src/tui/dummy.go
index a49677c6..aaa9a7ea 100644
--- a/src/tui/dummy.go
+++ b/src/tui/dummy.go
@@ -11,6 +11,10 @@ func HasFullscreenRenderer() bool {
 var DefaultBorderShape = BorderRounded
 
 func (a Attr) Merge(b Attr) Attr {
+	if b == AttrRegular {
+		return b
+	}
+
 	return a | b
 }
 
diff --git a/src/tui/ttyname_windows.go b/src/tui/ttyname_windows.go
index 0313c608..dfe89eb3 100644
--- a/src/tui/ttyname_windows.go
+++ b/src/tui/ttyname_windows.go
@@ -15,7 +15,7 @@ func TtyIn() (*os.File, error) {
 	return os.Stdin, nil
 }
 
-// TtyIn on Windows returns nil
+// TtyOut on Windows returns nil
 func TtyOut() (*os.File, error) {
 	return nil, nil
 }
diff --git a/src/tui/tui.go b/src/tui/tui.go
index 0ab4874b..212a1bed 100644
--- a/src/tui/tui.go
+++ b/src/tui/tui.go
@@ -205,6 +205,10 @@ type ColorAttr struct {
 	Attr  Attr
 }
 
+func (a ColorAttr) IsColorDefined() bool {
+	return a.Color != colUndefined
+}
+
 func NewColorAttr() ColorAttr {
 	return ColorAttr{Color: colUndefined, Attr: AttrUndefined}
 }
@@ -305,6 +309,7 @@ type ColorTheme struct {
 	Bg               ColorAttr
 	ListFg           ColorAttr
 	ListBg           ColorAttr
+	Nth              ColorAttr
 	SelectedFg       ColorAttr
 	SelectedBg       ColorAttr
 	SelectedMatch    ColorAttr
@@ -336,6 +341,7 @@ type ColorTheme struct {
 	BorderLabel      ColorAttr
 	ListLabel        ColorAttr
 	ListBorder       ColorAttr
+	GapLine          ColorAttr
 }
 
 type Event struct {
@@ -650,6 +656,7 @@ var (
 	ColHeaderLabel          ColorPair
 	ColSeparator            ColorPair
 	ColScrollbar            ColorPair
+	ColGapLine              ColorPair
 	ColBorder               ColorPair
 	ColPreview              ColorPair
 	ColPreviewBorder        ColorPair
@@ -703,6 +710,8 @@ func EmptyTheme() *ColorTheme {
 		HeaderBg:         ColorAttr{colUndefined, AttrUndefined},
 		HeaderBorder:     ColorAttr{colUndefined, AttrUndefined},
 		HeaderLabel:      ColorAttr{colUndefined, AttrUndefined},
+		GapLine:          ColorAttr{colUndefined, AttrUndefined},
+		Nth:              ColorAttr{colUndefined, AttrUndefined},
 	}
 }
 
@@ -746,6 +755,8 @@ func NoColorTheme() *ColorTheme {
 		HeaderBg:         ColorAttr{colDefault, AttrUndefined},
 		HeaderBorder:     ColorAttr{colDefault, AttrUndefined},
 		HeaderLabel:      ColorAttr{colDefault, AttrUndefined},
+		GapLine:          ColorAttr{colDefault, AttrUndefined},
+		Nth:              ColorAttr{colUndefined, AttrUndefined},
 	}
 }
 
@@ -786,6 +797,8 @@ func init() {
 		InputBg:          ColorAttr{colUndefined, AttrUndefined},
 		InputBorder:      ColorAttr{colUndefined, AttrUndefined},
 		InputLabel:       ColorAttr{colUndefined, AttrUndefined},
+		GapLine:          ColorAttr{colUndefined, AttrUndefined},
+		Nth:              ColorAttr{colUndefined, AttrUndefined},
 	}
 	Dark256 = &ColorTheme{
 		Colored:          true,
@@ -823,6 +836,8 @@ func init() {
 		InputBg:          ColorAttr{colUndefined, AttrUndefined},
 		InputBorder:      ColorAttr{colUndefined, AttrUndefined},
 		InputLabel:       ColorAttr{colUndefined, AttrUndefined},
+		GapLine:          ColorAttr{colUndefined, AttrUndefined},
+		Nth:              ColorAttr{colUndefined, AttrUndefined},
 	}
 	Light256 = &ColorTheme{
 		Colored:          true,
@@ -863,6 +878,8 @@ func init() {
 		HeaderBg:         ColorAttr{colUndefined, AttrUndefined},
 		HeaderBorder:     ColorAttr{colUndefined, AttrUndefined},
 		HeaderLabel:      ColorAttr{colUndefined, AttrUndefined},
+		GapLine:          ColorAttr{colUndefined, AttrUndefined},
+		Nth:              ColorAttr{colUndefined, AttrUndefined},
 	}
 }
 
@@ -917,6 +934,7 @@ func InitTheme(theme *ColorTheme, baseTheme *ColorTheme, forceBlack bool, hasInp
 	theme.ListBorder = o(theme.Border, theme.ListBorder)
 	theme.Separator = o(theme.ListBorder, theme.Separator)
 	theme.Scrollbar = o(theme.ListBorder, theme.Scrollbar)
+	theme.GapLine = o(theme.ListBorder, theme.GapLine)
 	/*
 		--color list-border:green
 		--color scrollbar:red
@@ -982,6 +1000,7 @@ func initPalette(theme *ColorTheme) {
 	ColInfo = pair(theme.Info, theme.InputBg)
 	ColSeparator = pair(theme.Separator, theme.InputBg)
 	ColScrollbar = pair(theme.Scrollbar, theme.ListBg)
+	ColGapLine = pair(theme.GapLine, theme.ListBg)
 	ColBorder = pair(theme.Border, theme.Bg)
 	ColBorderLabel = pair(theme.BorderLabel, theme.Bg)
 	ColPreviewLabel = pair(theme.PreviewLabel, theme.PreviewBg)


Test patch:
diff --git a/src/result_test.go b/src/result_test.go
index c11e1ab5..520ee4b1 100644
--- a/src/result_test.go
+++ b/src/result_test.go
@@ -131,7 +131,7 @@ func TestColorOffset(t *testing.T) {
 
 	colBase := tui.NewColorPair(89, 189, tui.AttrUndefined)
 	colMatch := tui.NewColorPair(99, 199, tui.AttrUndefined)
-	colors := item.colorOffsets(offsets, tui.Dark256, colBase, colMatch, true)
+	colors := item.colorOffsets(offsets, nil, tui.Dark256, colBase, colMatch, tui.AttrUndefined, true)
 	assert := func(idx int, b int32, e int32, c tui.ColorPair) {
 		o := colors[idx]
 		if o.offset[0] != b || o.offset[1] != e || o.color != c {
@@ -155,20 +155,30 @@ func TestColorOffset(t *testing.T) {
 
 	colRegular := tui.NewColorPair(-1, -1, tui.AttrUndefined)
 	colUnderline := tui.NewColorPair(-1, -1, tui.Underline)
-	colors = item.colorOffsets(offsets, tui.Dark256, colRegular, colUnderline, true)
 
-	// [{[0 5] {1 5 0}} {[5 15] {1 5 8}} {[15 20] {1 5 0}}
-	//  {[22 25] {2 6 1}} {[25 27] {2 6 9}} {[27 30] {-1 -1 8}}
-	//  {[30 32] {3 7 8}} {[32 33] {-1 -1 8}} {[33 35] {4 8 9}}
-	//  {[35 40] {4 8 1}}]
-	assert(0, 0, 5, tui.NewColorPair(1, 5, tui.AttrUndefined))
-	assert(1, 5, 15, tui.NewColorPair(1, 5, tui.Underline))
-	assert(2, 15, 20, tui.NewColorPair(1, 5, tui.AttrUndefined))
-	assert(3, 22, 25, tui.NewColorPair(2, 6, tui.Bold))
-	assert(4, 25, 27, tui.NewColorPair(2, 6, tui.Bold|tui.Underline))
-	assert(5, 27, 30, colUnderline)
-	assert(6, 30, 32, tui.NewColorPair(3, 7, tui.Underline))
-	assert(7, 32, 33, colUnderline)
-	assert(8, 33, 35, tui.NewColorPair(4, 8, tui.Bold|tui.Underline))
-	assert(9, 35, 40, tui.NewColorPair(4, 8, tui.Bold))
+	nthOffsets := []Offset{{37, 39}, {42, 45}}
+	for _, attr := range []tui.Attr{tui.AttrRegular, tui.StrikeThrough} {
+		colors = item.colorOffsets(offsets, nthOffsets, tui.Dark256, colRegular, colUnderline, attr, true)
+
+		// [{[0 5] {1 5 0}} {[5 15] {1 5 8}} {[15 20] {1 5 0}}
+		//  {[22 25] {2 6 1}} {[25 27] {2 6 9}} {[27 30] {-1 -1 8}}
+		//  {[30 32] {3 7 8}} {[32 33] {-1 -1 8}} {[33 35] {4 8 9}}
+		//  {[35 37] {4 8 1}} {[37 39] {4 8 x|1}} {[39 40] {4 8 x|1}}]
+		assert(0, 0, 5, tui.NewColorPair(1, 5, tui.AttrUndefined))
+		assert(1, 5, 15, tui.NewColorPair(1, 5, tui.Underline))
+		assert(2, 15, 20, tui.NewColorPair(1, 5, tui.AttrUndefined))
+		assert(3, 22, 25, tui.NewColorPair(2, 6, tui.Bold))
+		assert(4, 25, 27, tui.NewColorPair(2, 6, tui.Bold|tui.Underline))
+		assert(5, 27, 30, colUnderline)
+		assert(6, 30, 32, tui.NewColorPair(3, 7, tui.Underline))
+		assert(7, 32, 33, colUnderline)
+		assert(8, 33, 35, tui.NewColorPair(4, 8, tui.Bold|tui.Underline))
+		assert(9, 35, 37, tui.NewColorPair(4, 8, tui.Bold))
+		expected := tui.Bold | attr
+		if attr == tui.AttrRegular {
+			expected = tui.AttrRegular
+		}
+		assert(10, 37, 39, tui.NewColorPair(4, 8, expected))
+		assert(11, 39, 40, tui.NewColorPair(4, 8, tui.Bold))
+	}
 }
diff --git a/src/tokenizer_test.go b/src/tokenizer_test.go
index 3119f797..39f32dc8 100644
--- a/src/tokenizer_test.go
+++ b/src/tokenizer_test.go
@@ -40,6 +40,18 @@ func TestParseRange(t *testing.T) {
 			t.Errorf("%v", r)
 		}
 	}
+	{
+		i := "1..3..5"
+		if r, ok := ParseRange(&i); ok {
+			t.Errorf("%v", r)
+		}
+	}
+	{
+		i := "-3..3"
+		if r, ok := ParseRange(&i); ok {
+			t.Errorf("%v", r)
+		}
+	}
 }
 
 func TestTokenize(t *testing.T) {
diff --git a/test/test_go.rb b/test/test_go.rb
index 6a7f2ce4..e782b979 100755
--- a/test/test_go.rb
+++ b/test/test_go.rb
@@ -3423,28 +3423,28 @@ class TestGoFZF < TestBase
       │ >
       │   100/100 ──────
       │ > 1
-      │
+      │   ┈┈┈┈┈┈┈┈┈┈┈┈┈┈
       │   2
-      │
+      │   ┈┈┈┈┈┈┈┈┈┈┈┈┈┈
       │   3
-      │
+      │   ┈┈┈┈┈┈┈┈┈┈┈┈┈┈
       │   4
     BLOCK
     tmux.until { assert_block(block, _1) }
   end
 
   def test_gap_2
-    tmux.send_keys %(seq 100 | #{FZF} --gap=2 --border --reverse), :Enter
+    tmux.send_keys %(seq 100 | #{FZF} --gap=2 --gap-line xyz --border --reverse), :Enter
     block = <<~BLOCK
       ╭─────────────────
       │ >
       │   100/100 ──────
       │ > 1
       │
-      │
+      │   xyzxyzxyzxyzxy
       │   2
       │
-      │
+      │   xyzxyzxyzxyzxy
       │   3
     BLOCK
     tmux.until { assert_block(block, _1) }
@@ -3719,6 +3719,24 @@ class TestGoFZF < TestBase
     tmux.until { assert_block(block, _1) }
   end
 
+  def test_style_full_adaptive_height_double
+    tmux.send_keys %(seq 1| #{FZF} --style=full:double --border --height=~100% --header-lines=1 --info=default), :Enter
+    block = <<~BLOCK
+      ╔══════════
+      ║ ╔════════
+      ║ ╚════════
+      ║ ╔════════
+      ║ ║   1
+      ║ ╚════════
+      ║ ╔════════
+      ║ ║   0/0
+      ║ ║ >
+      ║ ╚════════
+      ╚══════════
+    BLOCK
+    tmux.until { assert_block(block, _1) }
+  end
+
   def test_change_nth
     input = [
       *[''] * 1000,
@@ -3729,19 +3747,38 @@ class TestGoFZF < TestBase
       *[''] * 1000
     ]
     writelines(input)
-    tmux.send_keys %(#{FZF} -qfoo -n1 --bind 'space:change-nth:2|3|4|5|' < #{tempname}), :Enter
+    nths = '1,2..4,-1,-3..,..2'
+    tmux.send_keys %(#{FZF} -qfoo -n#{nths} --bind 'space:change-nth(2|3|4|5|),result:transform-prompt:echo "[$FZF_NTH] "' < #{tempname}), :Enter
 
-    tmux.until { |lines| assert_equal 4, lines.match_count }
+    tmux.until do |lines|
+      assert lines.any_include?("[#{nths}] foo")
+      assert_equal 4, lines.match_count
+    end
     tmux.send_keys :Space
-    tmux.until { |lines| assert_equal 3, lines.match_count }
+    tmux.until do |lines|
+      assert lines.any_include?('[2] foo')
+      assert_equal 3, lines.match_count
+    end
     tmux.send_keys :Space
-    tmux.until { |lines| assert_equal 2, lines.match_count }
+    tmux.until do |lines|
+      assert lines.any_include?('[3] foo')
+      assert_equal 2, lines.match_count
+    end
     tmux.send_keys :Space
-    tmux.until { |lines| assert_equal 1, lines.match_count }
+    tmux.until do |lines|
+      assert lines.any_include?('[4] foo')
+      assert_equal 1, lines.match_count
+    end
     tmux.send_keys :Space
-    tmux.until { |lines| assert_equal 0, lines.match_count }
+    tmux.until do |lines|
+      assert lines.any_include?('[5] foo')
+      assert_equal 0, lines.match_count
+    end
     tmux.send_keys :Space
-    tmux.until { |lines| assert_equal 4, lines.match_count }
+    tmux.until do |lines|
+      assert lines.any_include?("[#{nths}] foo")
+      assert_equal 4, lines.match_count
+    end
   end
 end