From 373c6d8d55066251dc7af58598de6af4ff4570cf Mon Sep 17 00:00:00 2001 From: Junegunn Choi Date: Wed, 11 Mar 2020 22:35:24 +0900 Subject: [PATCH] Add --keep-right option to keep the right end of the line visible Close #1652 --- CHANGELOG.md | 2 ++ man/man1/fzf.1 | 4 ++++ src/options.go | 7 +++++++ src/terminal.go | 19 +++++++++++++------ test/test_go.rb | 5 +++++ 5 files changed, 31 insertions(+), 6 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 41d949e..e9f26ee 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,8 @@ CHANGELOG - Added `--pointer` and `--marker` options - `--height` option is now available on Windows binary (@kelleyma49) - More keys and actions for `--bind` +- Added `--keep-right` option that keeps the right end of the line visible + when it's too long - Bug fixes and improvements - Vim plugin: Floating windows support - bash: Various improvements in key bindings (CTRL-T, CTRL-R, ALT-C) diff --git a/man/man1/fzf.1 b/man/man1/fzf.1 index 5c39f36..cb8f51e 100644 --- a/man/man1/fzf.1 +++ b/man/man1/fzf.1 @@ -130,6 +130,10 @@ the details. .B "--cycle" Enable cyclic scroll .TP +.B "--keep-right" +Keep the right end of the line visible when it's too long. Effective only when +the query string is empty. +.TP .B "--no-hscroll" Disable horizontal scroll .TP diff --git a/src/options.go b/src/options.go index 0fd9705..32c50af 100644 --- a/src/options.go +++ b/src/options.go @@ -44,6 +44,7 @@ const usage = `usage: fzf [options] --no-mouse Disable mouse --bind=KEYBINDS Custom key bindings. Refer to the man page. --cycle Enable cyclic scroll + --keep-right Keep the right end of the line visible on overflow --no-hscroll Disable horizontal scroll --hscroll-off=COL Number of screen columns to keep to the right of the highlighted substring (default: 10) @@ -187,6 +188,7 @@ type Options struct { MinHeight int Layout layoutType Cycle bool + KeepRight bool Hscroll bool HscrollOff int FileWord bool @@ -242,6 +244,7 @@ func defaultOptions() *Options { MinHeight: 10, Layout: layoutDefault, Cycle: false, + KeepRight: false, Hscroll: true, HscrollOff: 10, FileWord: false, @@ -1174,6 +1177,10 @@ func parseOptions(opts *Options, allArgs []string) { opts.Cycle = true case "--no-cycle": opts.Cycle = false + case "--keep-right": + opts.KeepRight = true + case "--no-keep-right": + opts.KeepRight = false case "--hscroll": opts.Hscroll = true case "--no-hscroll": diff --git a/src/terminal.go b/src/terminal.go index a6a5c5b..0cb45c9 100644 --- a/src/terminal.go +++ b/src/terminal.go @@ -25,6 +25,8 @@ import ( var placeholder *regexp.Regexp var activeTempFiles []string +const ellipsis string = ".." + func init() { placeholder = regexp.MustCompile(`\\?(?:{[+sf]*[0-9,-.]*}|{q}|{\+?f?nf?})`) activeTempFiles = []string{} @@ -73,6 +75,7 @@ type Terminal struct { queryLen [2]int layout layoutType fullscreen bool + keepRight bool hscroll bool hscrollOff int wordRubout string @@ -397,6 +400,7 @@ func NewTerminal(opts *Options, eventBox *util.EventBox) *Terminal { queryLen: [2]int{0, 0}, layout: opts.Layout, fullscreen: fullscreen, + keepRight: opts.KeepRight, hscroll: opts.Hscroll, hscrollOff: opts.HscrollOff, wordRubout: wordRubout, @@ -1000,14 +1004,17 @@ func (t *Terminal) printHighlighted(result Result, attr tui.Attr, col1 tui.Color displayWidth := t.displayWidthWithLimit(text, 0, maxWidth) if displayWidth > maxWidth { if t.hscroll { - // Stri.. - if !t.overflow(text[:maxe], maxWidth-2) { + if t.keepRight && pos == nil { + text, _ = t.trimLeft(text, maxWidth-2) + text = append([]rune(ellipsis), text...) + } else if !t.overflow(text[:maxe], maxWidth-2) { + // Stri.. text, _ = t.trimRight(text, maxWidth-2) - text = append(text, []rune("..")...) + text = append(text, []rune(ellipsis)...) } else { // Stri.. if t.overflow(text[maxe:], 2) { - text = append(text[:maxe], []rune("..")...) + text = append(text[:maxe], []rune(ellipsis)...) } // ..ri.. var diff int32 @@ -1022,11 +1029,11 @@ func (t *Terminal) printHighlighted(result Result, attr tui.Attr, col1 tui.Color offsets[idx].offset[0] = b offsets[idx].offset[1] = util.Max32(b, e) } - text = append([]rune(".."), text...) + text = append([]rune(ellipsis), text...) } } else { text, _ = t.trimRight(text, maxWidth-2) - text = append(text, []rune("..")...) + text = append(text, []rune(ellipsis)...) for idx, offset := range offsets { offsets[idx].offset[0] = util.Min32(offset.offset[0], int32(maxWidth-2)) diff --git a/test/test_go.rb b/test/test_go.rb index c640e2f..ca862a5 100755 --- a/test/test_go.rb +++ b/test/test_go.rb @@ -1728,6 +1728,11 @@ class TestGoFZF < TestBase tmux.send_keys :Enter end end + + def test_keep_right + tmux.send_keys("seq 10000 | #{FZF} --read0 --keep-right", :Enter) + tmux.until { |lines| lines.any_include?('9999 10000') } + end end module TestShell