From e627ca6bd7fa40ef3f9077aa49f7c9019b474997 Mon Sep 17 00:00:00 2001 From: Junegunn Choi Date: Sat, 10 Jun 2023 23:11:05 +0900 Subject: [PATCH] Add --info=inline-right Close #3322 --- CHANGELOG.md | 3 ++- man/man1/fzf.1 | 2 ++ src/options.go | 7 +++++-- src/terminal.go | 22 +++++++++++++++++++--- 4 files changed, 28 insertions(+), 6 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index fbc8222..28db9dc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,8 +1,9 @@ CHANGELOG ========= -0.41.2 +0.42.0 ------ +- Added new info style: `--info=inline-right` - Added new border style `thinblock` which uses symbols for legacy computing [one eighth block elements](https://en.wikipedia.org/wiki/Symbols_for_Legacy_Computing) - Similarly to `block`, this style is suitable when using a different diff --git a/man/man1/fzf.1 b/man/man1/fzf.1 index 518f1a6..cde0295 100644 --- a/man/man1/fzf.1 +++ b/man/man1/fzf.1 @@ -361,6 +361,8 @@ Determines the display style of finder info (match counters). .br .BR inline:SEPARATOR " Display on the same line with a non-default separator" .br +.BR inline-right " Display on the right end of the same line +.br .BR hidden " Do not display finder info" .br diff --git a/src/options.go b/src/options.go index 69e5db9..f04d7f2 100644 --- a/src/options.go +++ b/src/options.go @@ -72,7 +72,7 @@ const usage = `usage: fzf [options] (default: 0 or center) --margin=MARGIN Screen margin (TRBL | TB,RL | T,RL,B | T,R,B,L) --padding=PADDING Padding inside border (TRBL | TB,RL | T,RL,B | T,R,B,L) - --info=STYLE Finder info style [default|hidden|inline|inline:SEPARATOR] + --info=STYLE Finder info style [default|hidden|inline[:SEPARATOR]|inline-right] --separator=STR String to form horizontal separator on info line --no-separator Hide info line separator --scrollbar[=C1[C2]] Scrollbar character(s) (each for main and preview window) @@ -195,6 +195,7 @@ type infoStyle int const ( infoDefault infoStyle = iota infoInline + infoInlineRight infoHidden ) @@ -1378,6 +1379,8 @@ func parseInfoStyle(str string) (infoStyle, string) { return infoDefault, "" case "inline": return infoInline, defaultInfoSep + case "inline-right": + return infoInlineRight, "" case "hidden": return infoHidden, "" default: @@ -1385,7 +1388,7 @@ func parseInfoStyle(str string) (infoStyle, string) { if strings.HasPrefix(str, prefix) { return infoInline, strings.ReplaceAll(str[len(prefix):], "\n", " ") } - errorExit("invalid info style (expected: default|hidden|inline|inline:SEPARATOR)") + errorExit("invalid info style (expected: default|hidden|inline[:SEPARATOR]|inline-right)") } return infoDefault, "" } diff --git a/src/terminal.go b/src/terminal.go index b80fc30..08ea253 100644 --- a/src/terminal.go +++ b/src/terminal.go @@ -1464,9 +1464,7 @@ func (t *Terminal) trimMessage(message string, maxWidth int) string { func (t *Terminal) printInfo() { pos := 0 line := t.promptLine() - switch t.infoStyle { - case infoDefault: - t.move(line+1, 0, t.separatorLen == 0) + printSpinner := func() { if t.reading { duration := int64(spinnerDuration) idx := (time.Now().UnixNano() % (duration * int64(len(t.spinner)))) / duration @@ -1474,8 +1472,16 @@ func (t *Terminal) printInfo() { } else { t.window.Print(" ") // Clear spinner } + } + switch t.infoStyle { + case infoDefault: + t.move(line+1, 0, t.separatorLen == 0) + printSpinner() t.move(line+1, 2, false) pos = 2 + case infoInlineRight: + pos = t.promptLen + t.queryLen[0] + t.queryLen[1] + 1 + t.move(line, pos, true) case infoInline: pos = t.promptLen + t.queryLen[0] + t.queryLen[1] + 1 str := t.infoSep @@ -1523,6 +1529,16 @@ func (t *Terminal) printInfo() { if t.failed != nil && t.count == 0 { output = fmt.Sprintf("[Command failed: %s]", *t.failed) } + if t.infoStyle == infoInlineRight { + pos = util.Max(pos, t.window.Width()-util.StringWidth(output)-3) + if pos >= t.window.Width() { + return + } + t.move(line, pos, false) + printSpinner() + t.window.Print(" ") + pos += 2 + } maxWidth := t.window.Width() - pos output = t.trimMessage(output, maxWidth) t.window.CPrint(tui.ColInfo, output)