Add 'one' event

Close #2629
Close #2494
Close #459
This commit is contained in:
Junegunn Choi
2023-04-01 17:16:02 +09:00
parent 1c7534f009
commit 8ec917b1c3
6 changed files with 39 additions and 0 deletions

View File

@@ -3,6 +3,11 @@ CHANGELOG
0.39.0 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 - 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 result list is updated. This can be useful when browsing logs using fzf with
sorting disabled. sorting disabled.

View File

@@ -993,6 +993,17 @@ e.g.
# Beware not to introduce an infinite loop # Beware not to introduce an infinite loop
seq 10 | fzf --bind 'focus:up' --cycle\fR seq 10 | fzf --bind 'focus:up' --cycle\fR
.RE .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 \fIbackward-eof\fR
.RS .RS

View File

@@ -622,6 +622,8 @@ func parseKeyChordsImpl(str string, message string, exit func(string)) map[tui.E
add(tui.Load) add(tui.Load)
case "focus": case "focus":
add(tui.Focus) add(tui.Focus)
case "one":
add(tui.One)
case "alt-enter", "alt-return": case "alt-enter", "alt-return":
chords[tui.CtrlAltKey('m')] = key chords[tui.CtrlAltKey('m')] = key
case "alt-space": case "alt-space":

View File

@@ -932,6 +932,12 @@ func (t *Terminal) UpdateList(merger *Merger, reset bool) {
t.cy = count - util.Min(count, t.maxItems()) + pos 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.mutex.Unlock()
t.reqBox.Set(reqInfo, nil) t.reqBox.Set(reqInfo, nil)
t.reqBox.Set(reqList, nil) t.reqBox.Set(reqList, nil)

View File

@@ -93,6 +93,7 @@ const (
Start Start
Load Load
Focus Focus
One
AltBS AltBS

View File

@@ -2702,6 +2702,20 @@ class TestGoFZF < TestBase
assert_equal '> 555', lines[index] assert_equal '> 555', lines[index]
end end
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 end
module TestShell module TestShell