m/fzf
1
0
mirror of https://github.com/junegunn/fzf.git synced 2025-11-17 15:53:39 -05:00

Add gap line

Close #4182
This commit is contained in:
Junegunn Choi
2025-01-15 22:23:52 +09:00
parent 56fef7c8df
commit 9d6637c1b3
4 changed files with 66 additions and 10 deletions

View File

@@ -582,6 +582,7 @@ type Options struct {
HeaderLines int
HeaderFirst bool
Gap int
GapLine *string
Ellipsis *string
Scrollbar *string
Margin [4]sizeSpec
@@ -2567,6 +2568,15 @@ func parseOptions(index *int, opts *Options, allArgs []string) error {
}
case "--no-gap":
opts.Gap = 0
case "--gap-line":
if given, bar := optionalNextString(); given {
opts.GapLine = &bar
} else {
opts.GapLine = nil
}
case "--no-gap-line":
empty := ""
opts.GapLine = &empty
case "--ellipsis":
str, err := nextString("ellipsis string required")
if err != nil {
@@ -2987,6 +2997,14 @@ func postProcessOptions(opts *Options) error {
opts.Pointer = &defaultPointer
}
if opts.GapLine == nil {
defaultGapLine := "┈"
if !opts.Unicode {
defaultGapLine = "-"
}
opts.GapLine = &defaultGapLine
}
markerLen := 1
if opts.Marker == nil {
if opts.MarkerMulti != nil && opts.MarkerMulti[0] == "" {

View File

@@ -267,6 +267,8 @@ type Terminal struct {
hscrollOff int
scrollOff int
gap int
gapLine labelPrinter
gapLineLen int
wordRubout string
wordNext string
cx int
@@ -949,6 +951,11 @@ func NewTerminal(opts *Options, eventBox *util.EventBox, executor *util.Executor
t.separator, t.separatorLen = t.ansiLabelPrinter(bar, &tui.ColSeparator, true)
}
// Gap line
if t.gap > 0 && len(*opts.GapLine) > 0 {
t.gapLine, t.gapLineLen = t.ansiLabelPrinter(*opts.GapLine, &tui.ColListBorder, true)
}
if opts.Ellipsis != nil {
t.ellipsis = *opts.Ellipsis
} else if t.unicode {
@@ -2446,9 +2453,7 @@ func (t *Terminal) canSpanMultiLines() bool {
return t.multiLine || t.wrap || t.gap > 0
}
func (t *Terminal) renderEmptyLine(line int, barRange [2]int) {
t.move(line, 0, true)
t.markEmptyLine(line)
func (t *Terminal) renderBar(line int, barRange [2]int) {
// If the screen is not filled with the list in non-multi-line mode,
// scrollbar is not visible at all. But in multi-line mode, we may need
// to redraw the scrollbar character at the end.
@@ -2457,6 +2462,29 @@ func (t *Terminal) renderEmptyLine(line int, barRange [2]int) {
}
}
func (t *Terminal) renderEmptyLine(line int, barRange [2]int) {
t.move(line, 0, true)
t.markEmptyLine(line)
t.renderBar(line, barRange)
}
func (t *Terminal) renderGapLine(line int, barRange [2]int, drawLine bool) {
t.move(line, 0, false)
t.window.CPrint(tui.ColCursorEmpty, t.pointerEmpty)
t.window.Print(t.markerEmpty)
x := t.pointerLen + t.markerLen
width := t.window.Width() - x - 1
if drawLine && t.gapLine != nil {
t.gapLine(t.window, width)
} else {
t.move(line, x, true)
}
t.markOtherLine(line)
t.renderBar(line, barRange)
t.prevLines[line].width = width
}
func (t *Terminal) printList() {
t.constrain()
barLength, barStart := t.getScrollbar()
@@ -2629,7 +2657,7 @@ func (t *Terminal) printItem(result Result, line int, maxLine int, index int, cu
}
for i := 0; i < t.gap && finalLineNum < maxLine; i++ {
finalLineNum++
t.renderEmptyLine(finalLineNum, barRange)
t.renderGapLine(finalLineNum, barRange, i == t.gap-1)
}
return finalLineNum
}