diff --git a/man/man1/fzf.1 b/man/man1/fzf.1 index 98c1c79..2ef3cdd 100644 --- a/man/man1/fzf.1 +++ b/man/man1/fzf.1 @@ -197,7 +197,9 @@ Number of spaces for a tab character (default: 8) .BI "--color=" "[BASE_SCHEME][,COLOR:ANSI]" Color configuration. The name of the base color scheme is followed by custom color mappings. Ansi color code of -1 denotes terminal default -foreground/background color. +foreground/background color. You can also specify 24-bit color in \fB#rrggbb\fR +format, but the support for 24-bit colors is experimental and only works when +\fB--height\fR option is used. .RS e.g. \fBfzf --color=bg+:24\fR diff --git a/src/options.go b/src/options.go index cbb0155..bcd2458 100644 --- a/src/options.go +++ b/src/options.go @@ -493,6 +493,7 @@ func dupeTheme(theme *tui.ColorTheme) *tui.ColorTheme { func parseTheme(defaultTheme *tui.ColorTheme, str string) *tui.ColorTheme { theme := dupeTheme(defaultTheme) + rrggbb := regexp.MustCompile("^#[0-9a-fA-F]{6}$") for _, str := range strings.Split(strings.ToLower(str), ",") { switch str { case "dark": @@ -516,11 +517,17 @@ func parseTheme(defaultTheme *tui.ColorTheme, str string) *tui.ColorTheme { if len(pair) != 2 { fail() } - ansi32, err := strconv.Atoi(pair[1]) - if err != nil || ansi32 < -1 || ansi32 > 255 { - fail() + + var ansi tui.Color + if rrggbb.MatchString(pair[1]) { + ansi = tui.HexToColor(pair[1]) + } else { + ansi32, err := strconv.Atoi(pair[1]) + if err != nil || ansi32 < -1 || ansi32 > 255 { + fail() + } + ansi = tui.Color(ansi32) } - ansi := tui.Color(ansi32) switch pair[0] { case "fg": theme.Fg = ansi diff --git a/src/tui/tui.go b/src/tui/tui.go index 859eed7..11ac1e7 100644 --- a/src/tui/tui.go +++ b/src/tui/tui.go @@ -1,6 +1,7 @@ package tui import ( + "strconv" "time" ) @@ -121,6 +122,13 @@ type ColorPair struct { id int16 } +func HexToColor(rrggbb string) Color { + r, _ := strconv.ParseInt(rrggbb[1:3], 16, 0) + g, _ := strconv.ParseInt(rrggbb[3:5], 16, 0) + b, _ := strconv.ParseInt(rrggbb[5:7], 16, 0) + return Color((1 << 24) + (r << 16) + (g << 8) + b) +} + func NewColorPair(fg Color, bg Color) ColorPair { return ColorPair{fg, bg, -1} } diff --git a/src/tui/tui_test.go b/src/tui/tui_test.go new file mode 100644 index 0000000..3ba9bf3 --- /dev/null +++ b/src/tui/tui_test.go @@ -0,0 +1,20 @@ +package tui + +import "testing" + +func TestHexToColor(t *testing.T) { + assert := func(expr string, r, g, b int) { + color := HexToColor(expr) + if !color.is24() || + int((color>>16)&0xff) != r || + int((color>>8)&0xff) != g || + int((color)&0xff) != b { + t.Fail() + } + } + + assert("#ff0000", 255, 0, 0) + assert("#010203", 1, 2, 3) + assert("#102030", 16, 32, 48) + assert("#ffffff", 255, 255, 255) +}