mirror of
https://github.com/junegunn/fzf.git
synced 2025-11-16 15:23:48 -05:00
Add support for preview window header
Fix #2373 # Display top 3 lines as the fixed header fzf --preview 'bat --style=header,grid --color=always {}' --preview-window '~3'
This commit is contained in:
@@ -1295,18 +1295,37 @@ func (t *Terminal) renderPreviewSpinner() {
|
||||
}
|
||||
}
|
||||
|
||||
func (t *Terminal) renderPreviewText(unchanged bool) {
|
||||
maxWidth := t.pwindow.Width()
|
||||
lineNo := -t.previewer.offset
|
||||
height := t.pwindow.Height()
|
||||
func (t *Terminal) renderPreviewArea(unchanged bool) {
|
||||
if unchanged {
|
||||
t.pwindow.MoveAndClear(0, 0)
|
||||
t.pwindow.MoveAndClear(0, 0) // Clear scroll offset display
|
||||
} else {
|
||||
t.previewed.filled = false
|
||||
t.pwindow.Erase()
|
||||
}
|
||||
|
||||
height := t.pwindow.Height()
|
||||
header := []string{}
|
||||
body := t.previewer.lines
|
||||
headerLines := t.previewOpts.headerLines
|
||||
// Do not enable preview header lines if it's value is too large
|
||||
if headerLines > 0 && headerLines < util.Min(len(body), height) {
|
||||
header = t.previewer.lines[0:headerLines]
|
||||
body = t.previewer.lines[headerLines:]
|
||||
// Always redraw header
|
||||
t.renderPreviewText(height, header, 0, false)
|
||||
t.pwindow.MoveAndClear(t.pwindow.Y(), 0)
|
||||
}
|
||||
t.renderPreviewText(height, body, -t.previewer.offset+headerLines, unchanged)
|
||||
|
||||
if !unchanged {
|
||||
t.pwindow.FinishFill()
|
||||
}
|
||||
}
|
||||
|
||||
func (t *Terminal) renderPreviewText(height int, lines []string, lineNo int, unchanged bool) {
|
||||
maxWidth := t.pwindow.Width()
|
||||
var ansi *ansiState
|
||||
for _, line := range t.previewer.lines {
|
||||
for _, line := range lines {
|
||||
var lbg tui.Color = -1
|
||||
if ansi != nil {
|
||||
ansi.lbg = -1
|
||||
@@ -1354,9 +1373,6 @@ func (t *Terminal) renderPreviewText(unchanged bool) {
|
||||
}
|
||||
lineNo++
|
||||
}
|
||||
if !unchanged {
|
||||
t.pwindow.FinishFill()
|
||||
}
|
||||
}
|
||||
|
||||
func (t *Terminal) printPreview() {
|
||||
@@ -1369,7 +1385,7 @@ func (t *Terminal) printPreview() {
|
||||
t.previewer.version == t.previewed.version &&
|
||||
t.previewer.offset == t.previewed.offset
|
||||
t.previewer.scrollable = t.previewer.offset > 0 || numLines > height
|
||||
t.renderPreviewText(unchanged)
|
||||
t.renderPreviewArea(unchanged)
|
||||
t.renderPreviewSpinner()
|
||||
t.previewed.numLines = numLines
|
||||
t.previewed.version = t.previewer.version
|
||||
@@ -1382,7 +1398,7 @@ func (t *Terminal) printPreviewDelayed() {
|
||||
}
|
||||
|
||||
t.previewer.scrollable = false
|
||||
t.renderPreviewText(true)
|
||||
t.renderPreviewArea(true)
|
||||
|
||||
message := t.trimMessage("Loading ..", t.pwindow.Width())
|
||||
pos := t.pwindow.Width() - len(message)
|
||||
@@ -1929,7 +1945,7 @@ func (t *Terminal) Loop() {
|
||||
cmd := util.ExecCommand(command, true)
|
||||
if pwindow != nil {
|
||||
height := pwindow.Height()
|
||||
initialOffset = util.Max(0, t.evaluateScrollOffset(items, height))
|
||||
initialOffset = util.Max(0, t.evaluateScrollOffset(items, util.Max(0, height-t.previewOpts.headerLines)))
|
||||
env := os.Environ()
|
||||
lines := fmt.Sprintf("LINES=%d", height)
|
||||
columns := fmt.Sprintf("COLUMNS=%d", pwindow.Width())
|
||||
@@ -2132,7 +2148,7 @@ func (t *Terminal) Loop() {
|
||||
if t.previewer.following {
|
||||
t.previewer.offset = len(t.previewer.lines) - t.pwindow.Height()
|
||||
} else if result.offset >= 0 {
|
||||
t.previewer.offset = util.Constrain(result.offset, 0, len(t.previewer.lines)-1)
|
||||
t.previewer.offset = util.Constrain(result.offset, t.previewOpts.headerLines, len(t.previewer.lines)-1)
|
||||
}
|
||||
t.printPreview()
|
||||
case reqPreviewRefresh:
|
||||
@@ -2205,7 +2221,7 @@ func (t *Terminal) Loop() {
|
||||
if t.previewOpts.cycle {
|
||||
newOffset = (newOffset + numLines) % numLines
|
||||
}
|
||||
newOffset = util.Constrain(newOffset, 0, numLines-1)
|
||||
newOffset = util.Constrain(newOffset, t.previewOpts.headerLines, numLines-1)
|
||||
if t.previewer.offset != newOffset {
|
||||
t.previewer.offset = newOffset
|
||||
req(reqPreviewRefresh)
|
||||
|
||||
Reference in New Issue
Block a user