Add 'start' event that is triggered once when fzf finder starts

Close #1622
This commit is contained in:
Junegunn Choi 2022-10-27 00:33:05 +09:00
parent 170fc517d0
commit 168829b555
No known key found for this signature in database
GPG Key ID: 254BC280FEF9C627
6 changed files with 39 additions and 2 deletions

View File

@ -1,6 +1,15 @@
CHANGELOG
=========
0.35.0
------
- Added `start` event that is triggered only once when fzf finder starts.
Since fzf consumes the input stream asynchronously, the input list is not
available unless you use `--sync`.
```sh
seq 100 | fzf --multi --sync --bind 'start:last+select-all+preview(echo welcome)'
```
0.34.0
------
- Added support for adaptive `--height`. If the `--height` value is prefixed

View File

@ -21,7 +21,7 @@ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
..
.TH fzf 1 "Sep 2022" "fzf 0.34.0" "fzf - a command-line fuzzy finder"
.TH fzf 1 "Oct 2022" "fzf 0.35.0" "fzf - a command-line fuzzy finder"
.SH NAME
fzf - a command-line fuzzy finder
@ -811,6 +811,15 @@ e.g.
or any single character
.SS AVAILABLE EVENTS:
\fIstart\fR
.RS
Triggered only once when fzf finder starts. Since fzf consumes the input stream
asynchronously, the input list is not available unless you use \fI--sync\fR.
e.g.
\fB# Move cursor to the last item and select all items
seq 1000 | fzf --multi --sync --bind start:last+select-all\fR
.RE
\fIchange\fR
.RS
Triggered whenever the query string is changed

View File

@ -543,6 +543,8 @@ func parseKeyChords(str string, message string) map[tui.Event]string {
add(tui.Change)
case "backward-eof":
add(tui.BackwardEOF)
case "start":
add(tui.Start)
case "alt-enter", "alt-return":
chords[tui.CtrlAltKey('m')] = key
case "alt-space":

View File

@ -2362,13 +2362,21 @@ func (t *Terminal) Loop() {
}()
looping := true
_, startEvent := t.keymap[tui.Start.AsEvent()]
for looping {
var newCommand *string
changed := false
beof := false
queryChanged := false
event := t.tui.GetChar()
var event tui.Event
if startEvent {
event = tui.Start.AsEvent()
startEvent = false
} else {
event = t.tui.GetChar()
}
t.mutex.Lock()
previousInput := t.input

View File

@ -90,6 +90,7 @@ const (
Change
BackwardEOF
Start
AltBS

View File

@ -2332,6 +2332,14 @@ class TestGoFZF < TestBase
OUTPUT
tmux.until { assert_block(expected, _1) }
end
def test_start_event
tmux.send_keys 'seq 100 | fzf --multi --sync --preview-window border-none --bind "start:select-all+last+preview(echo welcome)"', :Enter
tmux.until do |lines|
assert_match(/>100.*welcome/, lines[0])
assert_includes(lines[-2], '100/100 (100)')
end
end
end
module TestShell