junegunn/fzf · error
--header-border=inline requires --header-lines-border to be
Error message
--header-border=inline requires --header-lines-border to be inline or unset
What it means
A header can contain both a fixed header (--header / --header-lines with --header-border=inline) and header lines taken from the input (--header-lines with --header-lines-border). Drawing an inline border under the fixed header while the header-lines border is a different visible shape would produce inconsistent stacked segments, so fzf requires --header-lines-border to be inline, unset, or none when --header-border=inline (options.go:3671).
Source
Thrown at src/options.go:3671
}
}
}
if opts.Theme.Nth.IsColorDefined() {
return errors.New("only ANSI attributes are allowed for 'nth' (regular, bold, underline, reverse, dim, italic, strikethrough)")
}
if opts.BorderShape == tui.BorderInline ||
opts.ListBorderShape == tui.BorderInline ||
opts.InputBorderShape == tui.BorderInline ||
opts.Preview.border == tui.BorderInline {
return errors.New("inline border is only supported for --header-border, --header-lines-border, and --footer-border")
}
if opts.HeaderBorderShape == tui.BorderInline &&
opts.HeaderLinesShape != tui.BorderInline &&
opts.HeaderLinesShape != tui.BorderUndefined &&
opts.HeaderLinesShape != tui.BorderNone {
return errors.New("--header-border=inline requires --header-lines-border to be inline or unset")
}
return nil
}
func noSeparatorLine(style infoStyle, separator bool) bool {
switch style {
case infoInline:
return true
case infoHidden, infoInlineRight:
return !separator
}
return false
}
func (opts *Options) useTmux() bool {
return opts.Tmux != nil && len(os.Getenv("TMUX")) > 0 && opts.Tmux.index >= opts.Height.index
}View on GitHub (pinned to bd4efa277b)
Solutions
- Set --header-lines-border=inline as well
- Or use --header-lines-border=none / leave it unset
- Or change --header-border to a non-inline shape
Example fix
# before fzf --header-border=inline --header-lines-border=rounded # after fzf --header-border=inline --header-lines-border=inline
Defensive patterns
Strategy: validation
Validate before calling
// Shell: keep the two inline borders consistent if [ "$header_border" = inline ] && [ "$header_lines_border" != inline ] \ && [ -n "$header_lines_border" ] && [ "$header_lines_border" != none ]; then header_lines_border=inline fi exec fzf --header-border="$header_border" --header-lines-border="$header_lines_border"
Prevention
- When using --header-border=inline, set --header-lines-border=inline too or leave it unset/none
- Avoid per-option theme dicts that set every border independently
- Keep header border configuration in one snippet so the two stay in sync
When it happens
Trigger: Combining --header-border=inline with --header-lines-border set to a different shape, e.g. --header-border=inline --header-lines-border=rounded. The condition fires when HeaderBorderShape is inline but HeaderLinesShape is not inline, undefined, or none.
Common situations: Theme configs that set every border option to a distinct shape; incremental migration to inline headers while old header-lines settings remain in shell rc files.
Related errors
- list border cannot be 'line'
- header lines must be a non-negative integer
- inline border is only supported for --header-border, --heade
- unknown action: ${spec}
- invalid layout (expected: default / reverse / reverse-list)
AI-assisted analysis of junegunn/fzf@bd4efa277b (2026-08-15).
Data as JSON: /api/errors/a2e4cae79d8a3611.
Report an issue: GitHub.