From ddb2e08ff63fce3366f8a67a7a0d65dd6bb6326e Mon Sep 17 00:00:00 2001 From: Junegunn Choi Date: Sat, 28 Feb 2026 17:57:12 +0900 Subject: [PATCH] Empty change-with-nth restores the default --with-nth value Previously, change-with-nth() with an empty value cleared with-nth entirely. Now it restores the original --with-nth expression, matching the convention used by change-nth. --- src/terminal.go | 10 +++++++--- test/test_core.rb | 15 ++++++++++++--- 2 files changed, 19 insertions(+), 6 deletions(-) diff --git a/src/terminal.go b/src/terminal.go index fabb5b43..81af6be1 100644 --- a/src/terminal.go +++ b/src/terminal.go @@ -340,6 +340,7 @@ type Terminal struct { nthAttr tui.Attr nth []Range nthCurrent []Range + withNthDefault string withNthExpr string withNthEnabled bool acceptNth func([]Token, int32) string @@ -1093,6 +1094,7 @@ func NewTerminal(opts *Options, eventBox *util.EventBox, executor *util.Executor nthAttr: opts.Theme.Nth.Attr, nth: opts.Nth, nthCurrent: opts.Nth, + withNthDefault: opts.WithNthExpr, withNthExpr: opts.WithNthExpr, withNthEnabled: opts.WithNth != nil, tabstop: opts.Tabstop, @@ -6386,10 +6388,12 @@ func (t *Terminal) Loop() error { if len(tokens) > 1 { a.a = strings.Join(append(tokens[1:], tokens[0]), "|") } + // Empty value restores the default --with-nth + if len(withNthExpr) == 0 { + withNthExpr = t.withNthDefault + } if withNthExpr != t.withNthExpr { - if len(withNthExpr) == 0 { - newWithNth = &withNthSpec{fn: nil} - } else if factory, err := nthTransformer(withNthExpr); err == nil { + if factory, err := nthTransformer(withNthExpr); err == nil { newWithNth = &withNthSpec{fn: factory(t.delimiter)} } else { return diff --git a/test/test_core.rb b/test/test_core.rb index 9eb30f43..309bf9a8 100644 --- a/test/test_core.rb +++ b/test/test_core.rb @@ -1780,16 +1780,25 @@ class TestCore < TestInteractive end end - def test_change_with_nth_clear - tmux.send_keys %(echo -e 'a b c\nd e f' | #{FZF} --with-nth 1 --bind 'space:change-with-nth()'), :Enter + def test_change_with_nth_default + # Empty value restores the default --with-nth + tmux.send_keys %(echo -e 'a b c\nd e f' | #{FZF} --with-nth 1 --bind 'space:change-with-nth(2|)'), :Enter tmux.until do |lines| assert_equal 2, lines.item_count assert lines.any_include?('a') refute lines.any_include?('b') end + # Switch to field 2 tmux.send_keys :Space tmux.until do |lines| - assert lines.any_include?('a b c') + assert lines.any_include?('b') + refute lines.any_include?('a') + end + # Empty restores default (field 1) + tmux.send_keys :Space + tmux.until do |lines| + assert lines.any_include?('a') + refute lines.any_include?('b') end end