summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJunegunn Choi <junegunn.c@gmail.com>2020-10-23 21:37:20 +0900
committerJunegunn Choi <junegunn.c@gmail.com>2020-10-23 21:37:20 +0900
commita4d9b0b468b872180cbfa851be236098756b5e62 (patch)
treee46a5d679ad68feda614b891c5260546beac2e11
parente2b87e0d741111fd1f437f8e06f8286d9ef47dff (diff)
Support ANSI escape sequence for clearing display in preview window
fzf --preview 'for i in $(seq 100000); do (( i % 200 == 0 )) && printf "\033[2J" echo "$i" sleep 0.01 done'
-rw-r--r--CHANGELOG.md20
-rw-r--r--man/man1/fzf.113
-rw-r--r--src/terminal.go8
-rwxr-xr-xtest/test_go.rb6
4 files changed, 45 insertions, 2 deletions
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 75595df0..c11585ef 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -3,9 +3,27 @@ CHANGELOG
0.24.0
------
-- fzf can render preview window before the command completes
+- Real-time rendering of preview window
```sh
+ # fzf can render preview window before the command completes
fzf --preview 'sleep 1; for i in $(seq 100); do echo $i; sleep 0.01; done'
+
+ # Preview window can process ANSI escape sequence (CSI 2 J) for clearing the display
+ fzf --preview 'for i in $(seq 100000); do
+ (( i % 200 == 0 )) && printf "\033[2J"
+ echo "$i"
+ sleep 0.01
+ done'
+ ```
+- To indicate if `--multi` mode is enabled, fzf will print the number of
+ selected items even when no item is selected
+ ```sh
+ seq 100 | fzf
+ # 100/100
+ seq 100 | fzf --multi
+ # 100/100 (0)
+ seq 100 | fzf --multi 5
+ # 100/100 (0/5)
```
0.23.1
diff --git a/man/man1/fzf.1 b/man/man1/fzf.1
index d0e27908..f48c8424 100644
--- a/man/man1/fzf.1
+++ b/man/man1/fzf.1
@@ -379,6 +379,18 @@ Note that you can escape a placeholder pattern by prepending a backslash.
Preview window will be updated even when there is no match for the current
query if any of the placeholder expressions evaluates to a non-empty string.
+
+Since 0.24.0, fzf can render partial preview content before the preview command
+completes. ANSI escape sequence for clearing the display (\fBCSI 2 J\fR) is
+supported, so you can use it to implement preview window that is constantly
+updating.
+
+e.g.
+ \fBfzf --preview 'for i in $(seq 100000); do
+ (( i % 200 == 0 )) && printf "\\033[2J"
+ echo "$i"
+ sleep 0.01
+ done'\fR
.RE
.TP
.BI "--preview-window=" "[POSITION][:SIZE[%]][:rounded|sharp|noborder][:[no]wrap][:[no]cycle][:[no]hidden][:+SCROLL[-OFFSET]][:default]"
@@ -389,7 +401,6 @@ query if any of the placeholder expressions evaluates to a non-empty string.
\fBdown
\fBleft
\fBright
-.RE
\fRDetermines the layout of the preview window. If the argument contains
\fB:hidden\fR, the preview window will be hidden by default until
diff --git a/src/terminal.go b/src/terminal.go
index e1c5c7bf..17a4377f 100644
--- a/src/terminal.go
+++ b/src/terminal.go
@@ -26,6 +26,7 @@ var numericPrefix *regexp.Regexp
var activeTempFiles []string
const ellipsis string = ".."
+const clearCode string = "\x1b[2J"
func init() {
placeholder = regexp.MustCompile(`\\?(?:{[+sf]*[0-9,-.]*}|{q}|{\+?f?nf?})`)
@@ -1834,6 +1835,13 @@ func (t *Terminal) Loop() {
line := eachLine.line
err := eachLine.err
if len(line) > 0 {
+ clearIndex := strings.Index(line, clearCode)
+ if clearIndex >= 0 {
+ lines = []string{}
+ line = line[clearIndex+len(clearCode):]
+ version--
+ offset = 0
+ }
lines = append(lines, line)
}
if err != nil {
diff --git a/test/test_go.rb b/test/test_go.rb
index 2861235e..3ff118c1 100755
--- a/test/test_go.rb
+++ b/test/test_go.rb
@@ -1817,6 +1817,12 @@ class TestGoFZF < TestBase
assert_equal %w[A Á], `#{echoes} | #{FZF} -f A`.lines.map(&:chomp)
assert_equal %w[Á], `#{echoes} | #{FZF} -f Á`.lines.map(&:chomp)
end
+
+ def test_preview_clear_screen
+ tmux.send_keys %{seq 100 | #{FZF} --preview 'for i in $(seq 300); do (( i % 200 == 0 )) && printf "\\033[2J"; echo "[$i]"; sleep 0.001; done'}, :Enter
+ tmux.until { |lines| lines.item_count == 100 }
+ tmux.until { |lines| lines[1]&.include?('[200]') }
+ end
end
module TestShell