From 53348feb8959754497453232ffacd4bd3f1154ea Mon Sep 17 00:00:00 2001 From: Junegunn Choi Date: Sat, 4 Mar 2017 11:29:31 +0900 Subject: [PATCH] Add --no-clear option --- man/man1/fzf.1 | 6 ++++++ src/options.go | 6 ++++++ src/terminal.go | 4 ++-- src/tui/light.go | 24 ++++++++++++++++-------- 4 files changed, 30 insertions(+), 10 deletions(-) diff --git a/man/man1/fzf.1 b/man/man1/fzf.1 index 59710d5..dde187d 100644 --- a/man/man1/fzf.1 +++ b/man/man1/fzf.1 @@ -339,6 +339,12 @@ Read input delimited by ASCII NUL characters instead of newline characters .B "--print0" Print output delimited by ASCII NUL characters instead of newline characters .TP +.B "--no-clear" +Do not clear finder interface on exit. If fzf was started in full screen mode, +it will not switch back to the original screen, so you'll have to manually run +\fBtput rmcup\fR to return. This option can be used to avoid flickering of the +screen when your application needs to start fzf multiple times in order. +.TP .B "--sync" Synchronous search for multi-staged filtering. If specified, fzf will launch ncurses finder only after the input stream is complete. diff --git a/src/options.go b/src/options.go index c78d2bf..7a3d60c 100644 --- a/src/options.go +++ b/src/options.go @@ -186,6 +186,7 @@ type Options struct { Margin [4]sizeSpec Bordered bool Tabstop int + ClearOnExit bool Version bool } @@ -234,6 +235,7 @@ func defaultOptions() *Options { HeaderLines: 0, Margin: defaultMargin(), Tabstop: 8, + ClearOnExit: true, Version: false} } @@ -1099,6 +1101,10 @@ func parseOptions(opts *Options, allArgs []string) { nextString(allArgs, &i, "margin required (TRBL / TB,RL / T,RL,B / T,R,B,L)")) case "--tabstop": opts.Tabstop = nextInt(allArgs, &i, "tab stop required") + case "--clear": + opts.ClearOnExit = true + case "--no-clear": + opts.ClearOnExit = false case "--version": opts.Version = true default: diff --git a/src/terminal.go b/src/terminal.go index f556bad..3a83bad 100644 --- a/src/terminal.go +++ b/src/terminal.go @@ -316,11 +316,11 @@ func NewTerminal(opts *Options, eventBox *util.EventBox) *Terminal { } return util.Min(termHeight, util.Max(maxHeight, effectiveMinHeight)) } - renderer = tui.NewLightRenderer(opts.Theme, opts.Black, opts.Mouse, opts.Tabstop, maxHeightFunc) + renderer = tui.NewLightRenderer(opts.Theme, opts.Black, opts.Mouse, opts.Tabstop, opts.ClearOnExit, maxHeightFunc) } else if tui.HasFullscreenRenderer() { renderer = tui.NewFullscreenRenderer(opts.Theme, opts.Black, opts.Mouse) } else { - renderer = tui.NewLightRenderer(opts.Theme, opts.Black, opts.Mouse, opts.Tabstop, + renderer = tui.NewLightRenderer(opts.Theme, opts.Black, opts.Mouse, opts.Tabstop, opts.ClearOnExit, func(h int) int { return h }) } wordRubout := "[^[:alnum:]][[:alnum:]]" diff --git a/src/tui/light.go b/src/tui/light.go index fb8f4f0..2af31c4 100644 --- a/src/tui/light.go +++ b/src/tui/light.go @@ -74,6 +74,7 @@ type LightRenderer struct { theme *ColorTheme mouse bool forceBlack bool + clearOnExit bool prevDownTime time.Time clickY []int ttyin *os.File @@ -106,11 +107,12 @@ type LightWindow struct { bg Color } -func NewLightRenderer(theme *ColorTheme, forceBlack bool, mouse bool, tabstop int, maxHeightFunc func(int) int) Renderer { +func NewLightRenderer(theme *ColorTheme, forceBlack bool, mouse bool, tabstop int, clearOnExit bool, maxHeightFunc func(int) int) Renderer { r := LightRenderer{ theme: theme, forceBlack: forceBlack, mouse: mouse, + clearOnExit: clearOnExit, ttyin: openTtyIn(), yoffset: 0, tabstop: tabstop, @@ -571,14 +573,20 @@ func (r *LightRenderer) Refresh() { func (r *LightRenderer) Close() { // r.csi("u") - if r.fullscreen { - r.rmcup() - } else { - r.origin() - if r.upOneLine { - r.csi("A") + if r.clearOnExit { + if r.fullscreen { + r.rmcup() + } else { + r.origin() + if r.upOneLine { + r.csi("A") + } + r.csi("J") } - r.csi("J") + } else if r.fullscreen { + r.csi("G") + } else { + r.move(r.height, 0) } if r.mouse { r.csi("?1000l")