diff --git a/CHANGELOG.md b/CHANGELOG.md index c776f41..e9b795d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,11 @@ CHANGELOG 0.39.0 ------ +- Added `one` event that is triggered when there's only one match + ```sh + # Automatically select the only match + seq 10 | fzf --bind one:accept + ``` - Added `--track` option that makes fzf track the current selection when the result list is updated. This can be useful when browsing logs using fzf with sorting disabled. diff --git a/man/man1/fzf.1 b/man/man1/fzf.1 index 7d5ea73..4d95801 100644 --- a/man/man1/fzf.1 +++ b/man/man1/fzf.1 @@ -993,6 +993,17 @@ e.g. # Beware not to introduce an infinite loop seq 10 | fzf --bind 'focus:up' --cycle\fR .RE +\fIone\fR +.RS +Triggered when there's only one match. \fBone:accept\fR binding is comparable +to \fB--select-1\fR option, but the difference is that \fB--select-1\fR is only +effective before the interactive finder starts but \fBone\fR event is triggered +by the interactive finder. + +e.g. + \fB# Automatically select the only match + seq 10 | fzf --bind one:accept\fR +.RE \fIbackward-eof\fR .RS diff --git a/src/options.go b/src/options.go index 36ca771..8703c0e 100644 --- a/src/options.go +++ b/src/options.go @@ -622,6 +622,8 @@ func parseKeyChordsImpl(str string, message string, exit func(string)) map[tui.E add(tui.Load) case "focus": add(tui.Focus) + case "one": + add(tui.One) case "alt-enter", "alt-return": chords[tui.CtrlAltKey('m')] = key case "alt-space": diff --git a/src/terminal.go b/src/terminal.go index 57ff4f5..5ecba97 100644 --- a/src/terminal.go +++ b/src/terminal.go @@ -932,6 +932,12 @@ func (t *Terminal) UpdateList(merger *Merger, reset bool) { t.cy = count - util.Min(count, t.maxItems()) + pos } } + if !t.reading && t.merger.Length() == 1 { + one := tui.One.AsEvent() + if _, prs := t.keymap[one]; prs { + t.eventChan <- one + } + } t.mutex.Unlock() t.reqBox.Set(reqInfo, nil) t.reqBox.Set(reqList, nil) diff --git a/src/tui/tui.go b/src/tui/tui.go index 3d67c48..b8b7ae6 100644 --- a/src/tui/tui.go +++ b/src/tui/tui.go @@ -93,6 +93,7 @@ const ( Start Load Focus + One AltBS diff --git a/test/test_go.rb b/test/test_go.rb index 1556c73..8d8a981 100755 --- a/test/test_go.rb +++ b/test/test_go.rb @@ -2702,6 +2702,20 @@ class TestGoFZF < TestBase assert_equal '> 555', lines[index] end end + + def test_one + tmux.send_keys "seq 10 | #{FZF} --bind 'one:preview:echo {} is the only match'", :Enter + tmux.send_keys '1' + tmux.until do |lines| + assert_equal 2, lines.match_count + refute lines.any? { _1.include?('only match') } + end + tmux.send_keys '0' + tmux.until do |lines| + assert_equal 1, lines.match_count + assert lines.any? { _1.include?('only match') } + end + end end module TestShell