From 6b5886c034800c46d25a02c8b91c2797ec5fb6d6 Mon Sep 17 00:00:00 2001 From: Junegunn Choi Date: Tue, 18 Jul 2017 20:50:38 +0900 Subject: [PATCH] Adjust --no-clear option for repetitive relaunching Related: https://gist.github.com/junegunn/4963bab6ace453f7f529d2d0e01b1d85 Close #974 --- src/terminal.go | 24 +++++++++++++++--------- src/tui/light.go | 20 +++++++++++++------- test/test_go.rb | 7 ++++--- 3 files changed, 32 insertions(+), 19 deletions(-) diff --git a/src/terminal.go b/src/terminal.go index d4f4c85..2863f1a 100644 --- a/src/terminal.go +++ b/src/terminal.go @@ -87,6 +87,7 @@ type Terminal struct { margin [4]sizeSpec strong tui.Attr bordered bool + cleanExit bool border tui.Window window tui.Window pborder tui.Window @@ -366,6 +367,7 @@ func NewTerminal(opts *Options, eventBox *util.EventBox) *Terminal { history: opts.History, margin: opts.Margin, bordered: opts.Bordered, + cleanExit: opts.ClearOnExit, strong: strongAttr, cycle: opts.Cycle, header: header, @@ -1341,7 +1343,14 @@ func (t *Terminal) Loop() { }() } - exit := func(code int) { + exit := func(code int, printQuery bool) { + if !t.cleanExit && t.fullscreen && t.inlineInfo { + t.placeCursor() + } + t.tui.Close() + if printQuery { + t.printer(string(t.input)) + } if code <= exitNoMatch && t.history != nil { t.history.append(string(t.input)) } @@ -1389,11 +1398,11 @@ func (t *Terminal) Loop() { case reqRedraw: t.redraw() case reqClose: - t.tui.Close() if t.output() { - exit(exitOk) + exit(exitOk, false) + } else { + exit(exitNoMatch, false) } - exit(exitNoMatch) case reqPreviewDisplay: t.previewer.text = value.(string) t.previewer.lines = strings.Count(t.previewer.text, "\n") @@ -1402,12 +1411,9 @@ func (t *Terminal) Loop() { case reqPreviewRefresh: t.printPreview() case reqPrintQuery: - t.tui.Close() - t.printer(string(t.input)) - exit(exitOk) + exit(exitOk, true) case reqQuit: - t.tui.Close() - exit(exitInterrupt) + exit(exitInterrupt, false) } } t.placeCursor() diff --git a/src/tui/light.go b/src/tui/light.go index c19c8dc..5159aaf 100644 --- a/src/tui/light.go +++ b/src/tui/light.go @@ -182,10 +182,18 @@ func (r *LightRenderer) Init() { if r.fullscreen { r.smcup() } else { - r.csi("J") + // We assume that --no-clear is used for repetitive relaunching of fzf. + // So we do not clear the lower bottom of the screen. + if r.clearOnExit { + r.csi("J") + } y, x := r.findOffset() r.mouse = r.mouse && y >= 0 - if x > 0 { + // When --no-clear is used for repetitive relaunching, there is a small + // time frame between fzf processes where the user keystrokes are not + // captured by either of fzf process which can cause x offset to be + // increased and we're left with unwanted extra new line. + if x > 0 && r.clearOnExit { r.upOneLine = true r.makeSpace() } @@ -200,7 +208,7 @@ func (r *LightRenderer) Init() { r.csi(fmt.Sprintf("%dA", r.MaxY()-1)) r.csi("G") r.csi("K") - // r.csi("s") + r.csi("s") if !r.fullscreen && r.mouse { r.yoffset, _ = r.findOffset() } @@ -586,10 +594,8 @@ func (r *LightRenderer) Close() { } r.csi("J") } - } else if r.fullscreen { - r.csi("G") - } else { - r.move(r.height, 0) + } else if !r.fullscreen { + r.csi("u") } if r.mouse { r.csi("?1000l") diff --git a/test/test_go.rb b/test/test_go.rb index f88d96f..6c9a90d 100644 --- a/test/test_go.rb +++ b/test/test_go.rb @@ -1253,11 +1253,12 @@ class TestGoFZF < TestBase end def test_no_clear - tmux.send_keys 'seq 100 | fzf --no-clear --inline-info --height 5', :Enter - prompt = '> < 100/100' + tmux.send_keys "seq 10 | fzf --no-clear --inline-info --height 5 > #{tempname}", :Enter + prompt = '> < 10/10' tmux.until { |lines| lines[-1] == prompt } tmux.send_keys :Enter - tmux.until { |lines| lines[-2] == prompt && lines[-1] == '1' } + tmux.until { |_| %w[1] == File.readlines(tempname).map(&:chomp) } + tmux.until { |lines| lines[-1] == prompt } end def test_change_top