summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJunegunn Choi <junegunn.c@gmail.com>2024-01-21 15:29:53 +0900
committerJunegunn Choi <junegunn.c@gmail.com>2024-01-21 15:30:59 +0900
commit687c2741b8d5c0cfcd0b318596cd04914fecf4e9 (patch)
tree3eeabf62e896f3626ee6a4539e2555efe45bcf8a
parent2fb285e5303515a67137a07ad56b496115394733 (diff)
Add 'resize' event
Close #3570
-rw-r--r--CHANGELOG.md13
-rw-r--r--man/man1/fzf.17
-rw-r--r--src/options.go2
-rw-r--r--src/terminal.go10
4 files changed, 25 insertions, 7 deletions
diff --git a/CHANGELOG.md b/CHANGELOG.md
index fe99cc61..ed15ae66 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -3,7 +3,9 @@ CHANGELOG
0.46.0 (WIP)
------
-- Added `result` event that is triggered when the filtering for the current query is complete and the result list is ready.
+- Added two new events
+ - `result` - triggered when the filtering for the current query is complete and the result list is ready
+ - `resize` - triggered when the terminal size is changed
- fzf now exports the following environment variables to the child processes
| Variable | Description |
| --- | --- |
@@ -17,8 +19,8 @@ CHANGELOG
| `FZF_ACTION` | The name of the last action performed |
- This allows you to write sophisticated transformations like so
```sh
- # Dynamically resize preview window
- seq 10000 | fzf --bind 'result:transform:
+ # Script to dynamically resize the preview window
+ transformer='
# 1 line for info, another for prompt, and 2 more lines for preview window border
lines=$(( FZF_LINES - FZF_MATCH_COUNT - 4 ))
if [[ $FZF_MATCH_COUNT -eq 0 ]]; then
@@ -28,7 +30,10 @@ CHANGELOG
elif [[ $FZF_PREVIEW_LINES -ne 3 ]]; then
echo "change-preview-window:3"
fi
- ' --preview 'seq {} 10000' --preview-window up
+ '
+ seq 10000 | fzf --preview 'seq {} 10000' --preview-window up \
+ --bind "result:transform:$transformer" \
+ --bind "resize:transform:$transformer"
```
- And we're phasing out `{fzf:prompt}` and `{fzf:action}`
- Changed [mattn/go-runewidth](https://github.com/mattn/go-runewidth) dependency to [rivo/uniseg](https://github.com/rivo/uniseg) for accurate results
diff --git a/man/man1/fzf.1 b/man/man1/fzf.1
index 6e6417c7..2a528e22 100644
--- a/man/man1/fzf.1
+++ b/man/man1/fzf.1
@@ -1110,6 +1110,13 @@ e.g.
\fB# Change the prompt to "loaded" when the input stream is complete
(seq 10; sleep 1; seq 11 20) | fzf --prompt 'Loading> ' --bind 'load:change-prompt:Loaded> '\fR
.RE
+\fIresize\fR
+.RS
+Triggered when the terminal size is changed.
+
+e.g.
+ \fBfzf --bind 'resize:transform-header:echo Resized: ${FZF_COLUMNS}x${FZF_LINES}'\fR
+.RE
\fIresult\fR
.RS
Triggered when the filtering for the current query is complete and the result list is ready.
diff --git a/src/options.go b/src/options.go
index fc614c5b..8f1a5d6c 100644
--- a/src/options.go
+++ b/src/options.go
@@ -654,6 +654,8 @@ func parseKeyChordsImpl(str string, message string, exit func(string)) map[tui.E
add(tui.Focus)
case "result":
add(tui.Result)
+ case "resize":
+ add(tui.Resize)
case "one":
add(tui.One)
case "zero":
diff --git a/src/terminal.go b/src/terminal.go
index b5763aba..730e5a51 100644
--- a/src/terminal.go
+++ b/src/terminal.go
@@ -253,6 +253,7 @@ type Terminal struct {
hasResultActions bool
hasFocusActions bool
hasLoadActions bool
+ hasResizeActions bool
triggerLoad bool
reading bool
running bool
@@ -533,7 +534,6 @@ func defaultKeymap() map[tui.Event][]*action {
}
add(tui.Invalid, actInvalid)
- add(tui.Resize, actClearScreen)
add(tui.CtrlA, actBeginningOfLine)
add(tui.CtrlB, actBackwardChar)
add(tui.CtrlC, actAbort)
@@ -773,7 +773,7 @@ func NewTerminal(opts *Options, eventBox *util.EventBox) *Terminal {
killChan: make(chan int),
serverInputChan: make(chan []*action, 10),
serverOutputChan: make(chan string),
- eventChan: make(chan tui.Event, 5), // (load + result + zero|one) | (focus) | (GetChar)
+ eventChan: make(chan tui.Event, 6), // (load + result + zero|one) | (focus) | (resize) | (GetChar)
tui: renderer,
initFunc: func() { renderer.Init() },
executing: util.NewAtomicBool(false),
@@ -817,6 +817,7 @@ func NewTerminal(opts *Options, eventBox *util.EventBox) *Terminal {
}
}
+ _, t.hasResizeActions = t.keymap[tui.Resize.AsEvent()]
_, t.hasResultActions = t.keymap[tui.Result.AsEvent()]
_, t.hasFocusActions = t.keymap[tui.Focus.AsEvent()]
_, t.hasLoadActions = t.keymap[tui.Load.AsEvent()]
@@ -3129,6 +3130,9 @@ func (t *Terminal) Loop() {
if wasHidden && t.hasPreviewWindow() {
refreshPreview(t.previewOpts.command)
}
+ if req == reqResize && t.hasResizeActions {
+ t.eventChan <- tui.Resize.AsEvent()
+ }
case reqClose:
exit(func() int {
if t.output() {
@@ -3211,7 +3215,7 @@ func (t *Terminal) Loop() {
}
select {
case event = <-t.eventChan:
- needBarrier = !event.Is(tui.Load, tui.Result, tui.Focus, tui.One, tui.Zero)
+ needBarrier = !event.Is(tui.Load, tui.Result, tui.Focus, tui.One, tui.Zero, tui.Resize)
case serverActions := <-t.serverInputChan:
event = tui.Invalid.AsEvent()
if t.listenAddr == nil || t.listenAddr.IsLocal() || t.listenUnsafe {