transform-(with-)nth: use whole output, no cycling

- Rotation of '|'-separated values applied to transform and
  bg-transform variants, where a.a is the command template
- Output '1|2' turned the binding into '2|1', run as a shell
  command on the next key press
- Output was also cut at '|', breaking --with-nth templates
  like '{2}|{1}'
- Split and rotate only for change-nth and change-with-nth
This commit is contained in:
Junegunn Choi committed 2026-10-20 14:09:55 +09:00
1 parent 55c122f1a0
commit a0f6bac731
4 files changed
+34 -5

No files matched your search

+4
View File
@@ -5,6 +5,10 @@ CHANGELOG
------
- Fixed `--with-shell` on Windows not detecting cmd, PowerShell, and pwsh, which made fzf quote commands and entries for a POSIX shell (#4936) (@vimkim)
- e.g. With `--with-shell "cmd.exe /d /c"`, `--preview '"C:\Program Files\nu\bin\nu.exe" --version'` failed
- `transform-nth` and `transform-with-nth` (and their `bg-` variants) no longer split the output at `|`
- Only `change-nth` and `change-with-nth` rotate through `|`-separated values
- Fixed the bound command being replaced with the output. e.g. With `transform-nth(echo '1|2')`, the next key press ran `2|1` as a shell command.
- A `--with-nth` template in the output can now contain `|`. e.g. `{2}|{1}` was cut to `{2}`.
- nushell
- The completion integration now requires nushell 0.116.1 or above, where an interactive completer can take the terminal through the `@interactive` attribute (#4934) (@sim590)
+2 -2
View File
@@ -2166,8 +2166,8 @@ A key or an event can be bound to one or more of the following actions.
\fBtransform\-header\-label(...)\fR (transform header label using an external command)
\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\-with\-nth(...)\fR (transform with-nth using an external command)
\fBtransform\-nth(...)\fR (transform nth using an external command; no rotation, output is used as a whole)
\fBtransform\-with\-nth(...)\fR (transform with-nth using an external command; no rotation, output is used as a whole)
\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)
+9 -3
View File
@@ -7304,8 +7304,11 @@ func (t *Terminal) Loop() error {
req(reqList, reqInfo)
case actChangeNth, actTransformNth, actBgTransformNth:
capture(true, func(expr string) {
// Split nth expression
tokens := strings.Split(expr, "|")
// Only change-nth cycles through '|'-separated values
tokens := []string{expr}
if a.t == actChangeNth {
tokens = strings.Split(expr, "|")
}
if nth, err := splitNth(tokens[0]); err == nil || len(expr) == 0 {
// Changed
newNth = &nth
@@ -7328,7 +7331,10 @@ func (t *Terminal) Loop() error {
break Action
}
capture(true, func(expr string) {
tokens := strings.Split(expr, "|")
tokens := []string{expr}
if a.t == actChangeWithNth {
tokens = strings.Split(expr, "|")
}
withNthExpr := tokens[0]
if len(tokens) > 1 {
a.a = strings.Join(append(tokens[1:], tokens[0]), "|")
+19
View File
@@ -2374,6 +2374,25 @@ class TestCore < TestInteractive
tmux.until { |lines| assert lines.any_include?('a b c') || lines.any_include?('d e f') }
end
def test_transform_nth_output_does_not_replace_command
# '|' in the output must not be treated as a list to cycle through
File.write(tempname, '')
tmux.send_keys %(echo 'a b' | #{FZF} --with-nth .. --bind "space:transform-nth(echo >> #{tempname}; echo '1|2')+transform-with-nth(echo >> #{tempname}; echo '1|2')"), :Enter
tmux.until { |lines| assert_equal 1, lines.item_count }
3.times do |i|
tmux.send_keys :Space
wait { assert_equal 2 * (i + 1), File.readlines(tempname).length }
end
end
def test_transform_with_nth_output_with_pipe
File.write(tempname, '{2}|{1}')
tmux.send_keys %(echo 'a b' | #{FZF} --with-nth .. --bind 'space:transform-with-nth(cat #{tempname})'), :Enter
tmux.until { |lines| assert lines.any_include?('a b') }
tmux.send_keys :Space
tmux.until { |lines| assert lines.any_include?('b|a') }
end
# Regression: actions emitted by bg-transform must affect the iteration that
# processes the async result, not the (no-longer-active) iteration that
# scheduled the transform. Covers reload (newCommand) and exclude (denylist).