From c5fb0c43f9222e72ff00290162b68e34a8f0d5d7 Mon Sep 17 00:00:00 2001 From: Junegunn Choi Date: Tue, 7 May 2024 01:33:42 +0900 Subject: [PATCH] Add --cursor-line to highlight the whole current line Similar to 'set cursorline' of Vim. --- man/man1/fzf.1 | 3 +++ src/options.go | 6 ++++++ src/terminal.go | 17 ++++++++++++++--- 3 files changed, 23 insertions(+), 3 deletions(-) diff --git a/man/man1/fzf.1 b/man/man1/fzf.1 index dd2608fb..929b161e 100644 --- a/man/man1/fzf.1 +++ b/man/man1/fzf.1 @@ -534,6 +534,9 @@ color mappings. --color='pointer:#E12672,marker:#E17899,prompt:#98BEDE,hl+:#98BC99'\fR .RE .TP +.B "--cursor-line" +Highlight the whole current line +.TP .B "--no-bold" Do not use bold text .TP diff --git a/src/options.go b/src/options.go index d7f2b476..fda51cba 100644 --- a/src/options.go +++ b/src/options.go @@ -92,6 +92,7 @@ const Usage = `usage: fzf [options] --ansi Enable processing of ANSI color codes --tabstop=SPACES Number of spaces for a tab character (default: 8) --color=COLSPEC Base scheme (dark|light|16|bw) and/or custom colors + --cursor-line Highlight the whole current line --no-bold Do not use bold text History @@ -322,6 +323,7 @@ type Options struct { MinHeight int Layout layoutType Cycle bool + CursorLine bool KeepRight bool Hscroll bool HscrollOff int @@ -1948,6 +1950,10 @@ func parseOptions(opts *Options, allArgs []string) error { opts.Layout = layoutDefault case "--cycle": opts.Cycle = true + case "--cursor-line": + opts.CursorLine = true + case "--no-cursor-line": + opts.CursorLine = false case "--no-cycle": opts.Cycle = false case "--keep-right": diff --git a/src/terminal.go b/src/terminal.go index 18915035..c5f718a2 100644 --- a/src/terminal.go +++ b/src/terminal.go @@ -229,6 +229,7 @@ type Terminal struct { printQuery bool history *History cycle bool + cursorLine bool headerVisible bool headerFirst bool headerLines int @@ -754,6 +755,7 @@ func NewTerminal(opts *Options, eventBox *util.EventBox, executor *util.Executor executor: executor, paused: opts.Phony, cycle: opts.Cycle, + cursorLine: opts.CursorLine, headerVisible: true, headerFirst: opts.HeaderFirst, headerLines: opts.HeaderLines, @@ -1912,9 +1914,18 @@ func (t *Terminal) printItem(result Result, line int, i int, current bool, bar b } newLine.width = t.printHighlighted(result, tui.ColNormal, tui.ColMatch, false, true) } - fillSpaces := prevLine.width - newLine.width - if fillSpaces > 0 { - t.window.Print(strings.Repeat(" ", fillSpaces)) + if current && t.cursorLine { + maxWidth := t.window.Width() - (t.pointerLen + t.markerLen + 1) + fillSpaces := maxWidth - newLine.width + newLine.width = maxWidth + if fillSpaces > 0 { + t.window.CPrint(tui.ColCurrent, strings.Repeat(" ", fillSpaces)) + } + } else { + fillSpaces := prevLine.width - newLine.width + if fillSpaces > 0 { + t.window.Print(strings.Repeat(" ", fillSpaces)) + } } printBar() t.prevLines[i] = newLine