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

  1. Set --header-lines-border=inline as well
  2. Or use --header-lines-border=none / leave it unset
  3. 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 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


AI-assisted analysis of junegunn/fzf@bd4efa277b (2026-08-15). Data as JSON: /api/errors/a2e4cae79d8a3611. Report an issue: GitHub.