diff options
author | Junegunn Choi <junegunn.c@gmail.com> | 2020-10-23 21:37:20 +0900 |
---|---|---|
committer | Junegunn Choi <junegunn.c@gmail.com> | 2020-10-23 21:37:20 +0900 |
commit | a4d9b0b468b872180cbfa851be236098756b5e62 (patch) | |
tree | e46a5d679ad68feda614b891c5260546beac2e11 | |
parent | e2b87e0d741111fd1f437f8e06f8286d9ef47dff (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.md | 20 | ||||
-rw-r--r-- | man/man1/fzf.1 | 13 | ||||
-rw-r--r-- | src/terminal.go | 8 | ||||
-rwxr-xr-x | test/test_go.rb | 6 |
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 |