solarized-emacs

a fork of Bozhidar Batsov's solarized-emacs
git clone https://git.trogloxene.org/solarized-emacs.git
Log | Files | Refs | README

commit cfca786ef2529da49bfd6ff9bfea1003c51077d7
parent 78befd05842d86ac8e6a21699103c97ba97d5c4a
Author: Thomas Frössman <thomasf@jossystem.se>
Date:   Wed,  6 Nov 2019 02:25:30 +0100

Improved diff/merge palettes + color handling improvements

- colors are now blended using LAB

- external program generates palettes (for now), basic elisp version supported
as well.

Diffstat:
Acolorlab/go.mod | 8++++++++
Acolorlab/go.sum | 6++++++
Acolorlab/main.go | 828+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Mminimal-init/init.el | 4++++
Msolarized-dark-high-contrast-theme.el | 18------------------
Msolarized-dark-theme.el | 3++-
Msolarized-faces.el | 12++++++++++++
Msolarized-light-high-contrast-theme.el | 20--------------------
Msolarized-light-theme.el | 3++-
Msolarized-palettes.el | 504+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++----------------
Msolarized.el | 157++++++++++++++++++++++++++++++++++++++++++++++++++++++++-----------------------
11 files changed, 1378 insertions(+), 185 deletions(-)

diff --git a/colorlab/go.mod b/colorlab/go.mod @@ -0,0 +1,8 @@ +module github.com/bbatsov/solarized-emacs/colorlab + +go 1.13 + +require ( + github.com/davecgh/go-spew v1.1.1 + github.com/lucasb-eyer/go-colorful v1.0.2 +) diff --git a/colorlab/go.sum b/colorlab/go.sum @@ -0,0 +1,6 @@ +github.com/DATA-DOG/go-sqlmock v1.3.3 h1:CWUqKXe0s8A2z6qCgkP4Kru7wC11YoAnoupUKFDnH08= +github.com/DATA-DOG/go-sqlmock v1.3.3/go.mod h1:f/Ixk793poVmq4qj/V1dPUg2JEAKC73Q5eFN3EC/SaM= +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/lucasb-eyer/go-colorful v1.0.2 h1:mCMFu6PgSozg9tDNMMK3g18oJBX7oYGrC09mS6CXfO4= +github.com/lucasb-eyer/go-colorful v1.0.2/go.mod h1:0MS4r+7BZKSJ5mw4/S5MPN+qHFF1fYclkSPilDOKW0s= diff --git a/colorlab/main.go b/colorlab/main.go @@ -0,0 +1,828 @@ +// this is just a WIP where color.el can be a bit cumbersome and it *might* not +// have every color feature we need so at least initial experimentation is done +// here. If the process can be automated or needs manual ajdustments or needs +// porting of colorspace code to elisp we don't know. +package main + +import ( + "bufio" + "fmt" + "io" + "io/ioutil" + "log" + "math" + "os" + "sort" + "strconv" + "strings" + + "bytes" + + colorful "github.com/lucasb-eyer/go-colorful" +) + +var palettes = []Palette{ + { + Name: "solarized-dark", + Solarized: solarized, + }, + { + Name: "solarized-light", + Solarized: solarized, + Inverse: true, + }, + { + Name: "solarized-dark-high-contrast", + Solarized: solarizedDarkHighContrast, + }, + { + Name: "solarized-light-high-contrast", + Solarized: solarizedLightHighContrast, + Inverse: true, + }, + { + Name: "gruvbox-dark", + Solarized: gruvboxDark, + }, + { + Name: "gruvbox-light", + Solarized: gruvboxLight, + Inverse: true, + }, +} + +func main() { + + for _, pal := range palettes { + pal.Generate() + } + fmt.Println("\n-----\n") +} + +func (p Palette) Generate() { + + pal := p.Solarized + + corrected := pal + if p.Inverse { + corrected = pal.Inverse() + } + bgs, fgs := createComplementaryColors(corrected, 0.85, 0.3, 0.01) + // hbgs, hfgs := createComplementaryColors(corrected, 0.7, 0.2, -0.05) + hbgs, hfgs := createComplementaryColors(corrected, 0.6, 0.45, 0.04) + cols := Merge( + pal.NamedColors(), + oldLightAccents.NamedColors().WithSuffix("-l"), + oldDarkAccents.NamedColors().WithSuffix("-d"), + fgs.NamedColors().WithSuffix("-1fg"), + bgs.NamedColors().WithSuffix("-1bg"), + hfgs.NamedColors().WithSuffix("-2fg"), + hbgs.NamedColors().WithSuffix("-2bg"), + ) + rewriteTheme(cols, p.Name) + +} + +func createComplementaryColors(sol Solarized, blendBg, blendFg, gamma float64) (accentBgs, accentFgs Accents) { + sol = sol.Clone() + cs := sol.Accents.Colors() + + light := func(c colorful.Color) float64 { + l, _, _ := c.Lab() + return l + } + var bgs, fgs [8]colorful.Color + for idx, v := range cs { + fmt.Println(" ") + + blendBgColor := sol.Base03.Color() + blendFgColor := sol.Base0.Color() + brightOnDark := true + if light(blendFgColor) < light(blendBgColor) { + brightOnDark = false + } + for _, v := range sol.Base.Colors() { + if brightOnDark { + if light(v) > light(blendFgColor) { + blendFgColor = v + } + if light(v) < light(blendBgColor) { + blendBgColor = v + } + } else { + if light(v) < light(blendFgColor) { + blendFgColor = v + } + if light(v) > light(blendBgColor) { + blendBgColor = v + } + } + } + + bg := v.BlendLab(blendBgColor, blendBg) + fg := v.BlendLab(blendFgColor, blendFg) + { + l, _, _ := blendBgColor.Lab() + fmt.Printf(" | b1 %.2f %s", l, sol.Base03) + } + { + l, _, _ := blendFgColor.Lab() + fmt.Printf(" f1 %.2f %s", l, sol.Base0) + } + + lFg := light(blendFgColor) + lBg := light(blendBgColor) + + lc := lFg - lBg + fmt.Printf(" lc %.2f", lc) + bl, ba, bb := bg.Lab() + fl, fa, fb := fg.Lab() + + fmt.Printf(" | b2 %.2f %s", bl, bg.Clamped().Hex()) + fmt.Printf(" f2 %.2f %s", fl, fg.Clamped().Hex()) + fmt.Printf(" lc %.2f", fl-bl) + + // nlb := bl + (fl-bl)*0.5 + lc*0.5 + // nlf := bl + (fl-bl)*0.5 - lc*0.5 + // nlf := lFg + // nlb := lBg + + nlb := bl + nlf := fl + if fl > bl { + nlb = nlb - gamma + nlf = nlf - gamma + } else { + nlb = nlb + gamma + nlf = nlf + gamma + } + + const minimumLightnessDiff = 0.35 + // const minimumLightnessDiff = 0.45 + if (math.Max(nlf, nlb) - math.Min(nlf, nlb)) < minimumLightnessDiff { + diff := (minimumLightnessDiff - (math.Max(math.Abs(nlf), math.Abs(nlb)) - math.Min(math.Abs(nlf), math.Abs(nlb)))) + m := 1.0 + if bl > fl { + m = -1 + } + nlf = nlf + nlf/1*diff*m + nlb = nlb - nlb/1*diff*m + fmt.Printf(" adj %.2f ", diff) + } else { + fmt.Printf(" ") + } + + fg = colorful.Lab(nlf, fa, fb) + bg = colorful.Lab(nlb, ba, bb) + + fmt.Printf(" | b3 %.2f %s", nlb, bg.Clamped().Hex()) + fmt.Printf(" f3 %.2f %s", nlf, fg.Clamped().Hex()) + fmt.Printf(" lc %.2f", nlf-nlb) + + bgs[idx] = bg + fgs[idx] = fg + + } + fmt.Println("\n\n") + return NewAccents(bgs), NewAccents(fgs) +} + +func createComplementaryColorsPrev(sol Solarized, blendBg, blendFg float64) (accentBgs, accentFgs Accents) { + sol = sol.Clone() + cs := sol.Accents.Colors() + + light := func(c colorful.Color) float64 { + l, _, _ := c.Lab() + return l + } + var bgs, fgs [8]colorful.Color + for idx, v := range cs { + fmt.Println(" ") + bg := v.BlendLab(sol.Base03.Color(), blendBg) + fg := v.BlendLab(sol.Base0.Color(), blendFg) + + { + l, _, _ := sol.Base03.Color().Lab() + fmt.Printf(" | b1 %.2f %s", l, sol.Base03) + } + + { + l, _, _ := sol.Base0.Color().Lab() + fmt.Printf(" f1 %.2f %s", l, sol.Base0) + } + + lFg := light(sol.Base0.Color()) + lBg := light(sol.Base03.Color()) + + lc := lFg - lBg + fmt.Printf(" lc %.2f", lc) + bl, ba, bb := bg.Lab() + fl, fa, fb := fg.Lab() + + fmt.Printf(" | b2 %.2f %s", bl, bg.Clamped().Hex()) + fmt.Printf(" f2 %.2f %s", fl, fg.Clamped().Hex()) + fmt.Printf(" lc %.2f", fl-bl) + + // nlb := bl + (fl-bl)*0.5 + lc*0.5 + // nlf := bl + (fl-bl)*0.5 - lc*0.5 + // nlf := lFg + // nlb := lBg + + nlb := bl + nlf := fl + if bl < fl { + nlb = nlb + 0.01 + nlf = nlf + 0.01 + } else { + nlb = nlb - 0.01 + nlf = nlf - 0.01 + } + + fg = colorful.Lab(nlf, fa, fb) + bg = colorful.Lab(nlb, ba, bb) + + fmt.Printf(" | b3 %.2f %s", nlb, bg.Clamped().Hex()) + fmt.Printf(" f3 %.2f %s", nlf, fg.Clamped().Hex()) + fmt.Printf(" lc %.2f", nlf-nlb) + + bgs[idx] = bg + fgs[idx] = fg + + } + fmt.Println("\n\n") + return NewAccents(bgs), NewAccents(fgs) +} + +type Solarized struct { + Base + Accents + // AccentsBg Accents + // AccentsFg Accents +} + +func (s Solarized) Clone() Solarized { + return Solarized{ + Base: s.Base.Clone(), + Accents: s.Accents.Clone(), + // AccentsFg: s.AccentsFg, + // AccentsBg: s.AccentsBg, + } +} + +func (s Solarized) Inverse() Solarized { + return Solarized{ + Base: s.Base.Inverse(), + Accents: s.Accents.Clone(), + // AccentsFg: s.AccentsFg, + // AccentsBg: s.AccentsBg, + } +} +func (s Solarized) NamedColors() NamedColors { + return Merge(s.Base.NamedColors(), s.Accents.NamedColors()) + +} + +type HexColor string + +func (h HexColor) Color() colorful.Color { + col, err := colorful.Hex(string(h)) + if err != nil { + panic(err) + } + return col +} + +type Base struct { + Base03 HexColor + Base02 HexColor + Base01 HexColor + Base00 HexColor + Base0 HexColor + Base1 HexColor + Base2 HexColor + Base3 HexColor +} + +func NewBase(bc [8]colorful.Color) Base { + return Base{ + Base03: HexColor(bc[0].Clamped().Hex()), + Base02: HexColor(bc[1].Clamped().Hex()), + Base01: HexColor(bc[2].Clamped().Hex()), + Base00: HexColor(bc[3].Clamped().Hex()), + Base0: HexColor(bc[4].Clamped().Hex()), + Base1: HexColor(bc[5].Clamped().Hex()), + Base2: HexColor(bc[6].Clamped().Hex()), + Base3: HexColor(bc[7].Clamped().Hex()), + } +} +func (s Base) Clone() Base { + return Base{ + Base03: s.Base03, + Base02: s.Base02, + Base01: s.Base01, + Base00: s.Base00, + Base0: s.Base0, + Base1: s.Base1, + Base2: s.Base2, + Base3: s.Base3, + } +} +func (s Base) NamedColors() NamedColors { + nc := make(NamedColors, 8) + arr := s.colorArray() + for idx, hex := range arr { + nc[baseNames[idx]] = hex + } + return nc +} + +func (s Base) Colors() BaseColors { + a := s.colorArray() + return [8]colorful.Color{ + a[0].Color(), + a[1].Color(), + a[2].Color(), + a[3].Color(), + a[4].Color(), + a[5].Color(), + a[6].Color(), + a[7].Color(), + } +} +func (s Base) colorArray() [8]HexColor { + return [8]HexColor{ + s.Base03, + s.Base02, + s.Base01, + s.Base00, + s.Base0, + s.Base1, + s.Base2, + s.Base3, + } +} + +var baseNames = [8]string{ + 0: "base03", + 1: "base02", + 2: "base01", + 3: "base00", + 4: "base0", + 5: "base1", + 6: "base2", + 7: "base3", +} + +type BaseColors [8]colorful.Color + +func (s Base) Inverse() Base { + return Base{ + Base03: s.Base3, + Base02: s.Base2, + Base01: s.Base1, + Base00: s.Base0, + Base0: s.Base00, + Base1: s.Base01, + Base2: s.Base02, + Base3: s.Base03, + } +} +func (b Base) ChangeLightness(amountFgs, amountBgs float64) Base { + cc := b.Colors() + lightness := func(c colorful.Color, v float64) colorful.Color { + l, a, b := c.Lab() + l = l + v + return colorful.Lab(l, a, b) + } + cc[0] = lightness(cc[0], amountBgs) + cc[1] = lightness(cc[1], amountBgs) + cc[2] = lightness(cc[2], amountFgs) + cc[3] = lightness(cc[3], amountBgs) + cc[4] = lightness(cc[4], amountFgs) + cc[5] = lightness(cc[5], amountFgs) + cc[6] = lightness(cc[6], amountFgs) + cc[7] = lightness(cc[7], amountFgs) + return NewBase(cc) +} + +// Accents . +type Accents struct { + Yellow HexColor + Orange HexColor + Red HexColor + Magenta HexColor + Violet HexColor + Blue HexColor + Cyan HexColor + Green HexColor +} + +func NewAccents(cc [8]colorful.Color) Accents { + return Accents{ + Yellow: HexColor(cc[0].Clamped().Hex()), + Orange: HexColor(cc[1].Clamped().Hex()), + Red: HexColor(cc[2].Clamped().Hex()), + Magenta: HexColor(cc[3].Clamped().Hex()), + Violet: HexColor(cc[4].Clamped().Hex()), + Blue: HexColor(cc[5].Clamped().Hex()), + Cyan: HexColor(cc[6].Clamped().Hex()), + Green: HexColor(cc[7].Clamped().Hex()), + } +} +func (s Accents) Clone() Accents { + return Accents{ + Yellow: s.Yellow, + Orange: s.Orange, + Red: s.Red, + Magenta: s.Magenta, + Violet: s.Violet, + Blue: s.Blue, + Cyan: s.Cyan, + Green: s.Green, + } +} + +func (s Accents) Colors() AccentColors { + a := s.colorArray() + return [8]colorful.Color{ + a[0].Color(), + a[1].Color(), + a[2].Color(), + a[3].Color(), + a[4].Color(), + a[5].Color(), + a[6].Color(), + a[7].Color(), + } +} +func (a Accents) ChangeLightness(amount float64) Accents { + cc := a.Colors() + lightness := func(c colorful.Color, v float64) colorful.Color { + l, a, b := c.Lab() + l = l + v + return colorful.Lab(l, a, b) + } + cc[0] = lightness(cc[0], amount) + cc[1] = lightness(cc[1], amount) + cc[2] = lightness(cc[2], amount) + cc[3] = lightness(cc[3], amount) + cc[4] = lightness(cc[4], amount) + cc[5] = lightness(cc[5], amount) + cc[6] = lightness(cc[6], amount) + cc[7] = lightness(cc[7], amount) + return NewAccents(cc) +} +func (ac Accents) NamedColors() NamedColors { + nc := make(NamedColors, 8) + arr := ac.colorArray() + for idx, hex := range arr { + nc[accentNames[idx]] = hex + } + return nc +} + +func (s Accents) colorArray() [8]HexColor { + return [8]HexColor{ + s.Yellow, + s.Orange, + s.Red, + s.Magenta, + s.Violet, + s.Blue, + s.Cyan, + s.Green, + } +} + +var accentNames = [8]string{ + 0: "yellow", + 1: "orange", + 2: "red", + 3: "magenta", + 4: "violet", + 5: "blue", + 6: "cyan", + 7: "green", +} + +type AccentColors [8]colorful.Color + +type NamedColors map[string]HexColor + +func (n NamedColors) WithPrefix(prefix string) NamedColors { + nc := make(NamedColors, len(n)) + for k, v := range n { + nc[fmt.Sprintf("%s%s", prefix, k)] = v + } + return nc +} + +func (n NamedColors) WithSuffix(suffix string) NamedColors { + nc := make(NamedColors, len(n)) + for k, v := range n { + nc[fmt.Sprintf("%s%s", k, suffix)] = v + } + return nc +} + +func (n NamedColors) PrintAlist(w io.Writer, indent int) (int, error) { + keys := n.OrderedKeys() + var longestKey int + for _, n := range keys { + l := len(n) + if l > longestKey { + longestKey = l + } + } + longestKey = longestKey + prefix := "" + for i := 0; i < indent; i++ { + prefix += " " + + } + var nt int + + for _, name := range keys { + n, err := fmt.Fprintf(w, "%s(%-"+strconv.Itoa(longestKey)+"s . \"%s\")\n", prefix, name, n[name]) + n = n + nt + if err != nil { + return nt, err + } + + } + return nt, nil +} + +// Orderedkeys returns the keys in a order that is like how solarized names should be ordered. +// +// primary orer is: +// +// 1. base names +// 2. accent colors +// 3. names that contain base names +// 4. names that contain accent color names +// 5. the rest +// +// secondary sort order is by string comparison. +// +func (n NamedColors) OrderedKeys() []string { + var names []string + for k, _ := range n { + names = append(names, k) + } + sort.Sort(sort.StringSlice(names)) + + var allNames []string + for _, n := range baseNames { + allNames = append(allNames, n) + } + for _, n := range accentNames { + allNames = append(allNames, n) + } + score := func(idx int, exact bool) int { + s := (len(allNames) - idx) + 1 + if exact { + s = s + len(allNames) + } + return s + } + sort.SliceStable(names, func(i int, j int) bool { + var is, js int // scores + in := names[i] + jn := names[j] + scoring: + for sortIdx, sortName := range allNames { + if is == 0 { + // log.Println(in, sortName) + if strings.Contains(in, sortName) { + is = score(sortIdx, in == sortName) + // fmt.Println("score in", in, sortName, is) + } + } + if js == 0 { + if strings.Contains(jn, sortName) { + js = score(sortIdx, jn == sortName) + // fmt.Println("score j", jn, sortName, js) + } + } + if is != 0 && js != 0 { + break scoring + } + } + // log.Println(is, js, in,jn) + return is > js + }) + return names +} + +func Merge(nc ...NamedColors) NamedColors { + res := make(NamedColors) + for _, nc := range nc { + for k, v := range nc { + res[k] = v + } + } + return res +} + +var ( // The original solarized color palette + solarized = Solarized{ + Base: Base{ + Base03: SolarizedBase03, + Base02: SolarizedBase02, + Base01: SolarizedBase01, + Base00: SolarizedBase00, + Base0: SolarizedBase0, + Base1: SolarizedBase1, + Base2: SolarizedBase2, + Base3: SolarizedBase3, + }, + Accents: Accents{ + Blue: SolarizedBlue, + Cyan: SolarizedCyan, + Green: SolarizedGreen, + Magenta: SolarizedMagenta, + Orange: SolarizedOrange, + Red: SolarizedRed, + Violet: SolarizedViolet, + Yellow: SolarizedYellow, + }, + } + solarizedDarkHighContrast = Solarized{ + Base: solarized.Base.Clone().ChangeLightness(0.04, -0.02), + Accents: solarized.Accents.Clone().ChangeLightness(0.05), + } + solarizedLightHighContrast = Solarized{ + Base: solarized.Base.Clone().ChangeLightness(0.02, -0.05), + Accents: solarized.Accents.Clone().ChangeLightness(-0.05), + } + + // the current -d colors in the emacs theme + oldDarkAccents = Accents{ + Blue: "#00629D", + Cyan: "#00736F", + Green: "#546E00", + Magenta: "#93115C", + Orange: "#8B2C02", + Red: "#990A1B", + Violet: "#3F4D91", + Yellow: "#7B6000", + } + // the current -l colors in the emacs theme + oldLightAccents = Accents{ + Blue: "#69B7F0", + Cyan: "#69CABF", + Green: "#B4C342", + Magenta: "#F771AC", + Orange: "#F2804F", + Red: "#FF6E64", + Violet: "#9EA0E5", + Yellow: "#DEB542", + } + gruvboxDark = Solarized{ + Base: Base{ + Base03: GruvboxDark0, + Base02: GruvboxDark0Soft, + Base01: GruvboxDark4, + Base00: GruvboxDark0, + Base0: GruvboxLight4, + Base1: GruvboxLight3, + Base2: GruvboxLight4, + Base3: GruvboxLight0, + }, + Accents: Accents{ + Blue: GruvboxBlue, + Cyan: GruvboxAqua, + Green: GruvboxGreen, + Magenta: GruvboxBrightPurple, + Orange: GruvboxOrange, + Red: GruvboxBrightRed, + Violet: GruvboxPurple, + Yellow: GruvboxYellow, + }, + } + // note: not inversed here + gruvboxLight = Solarized{ + Base: Base{ + Base03: GruvboxDark0, + Base02: GruvboxDark0Soft, + Base01: GruvboxDark3, + Base00: GruvboxDark4, + Base0: GruvboxDark1, + Base1: GruvboxLight4, + Base2: GruvboxLight1, + Base3: GruvboxLight0, + }, + Accents: Accents{ + Blue: GruvboxDarkBlue, + Cyan: GruvboxAqua, + Green: GruvboxGreen, + Magenta: GruvboxBrightPurple, + Orange: GruvboxDarkOrange, + Red: GruvboxDarkRed, + Violet: GruvboxDarkPurple, + Yellow: GruvboxDarkYellow, + }, + } +) + +const ( + SolarizedBase03 = HexColor("#002b36") + SolarizedBase02 = HexColor("#073642") + SolarizedBase01 = HexColor("#586e75") + SolarizedBase00 = HexColor("#657b83") + SolarizedBase0 = HexColor("#839496") + SolarizedBase1 = HexColor("#93a1a1") + SolarizedBase2 = HexColor("#eee8d5") + SolarizedBase3 = HexColor("#fdf6e3") + SolarizedBlue = HexColor("#268bd2") + SolarizedCyan = HexColor("#2aa198") + SolarizedGreen = HexColor("#859900") + SolarizedMagenta = HexColor("#d33682") + SolarizedOrange = HexColor("#cb4b16") + SolarizedRed = HexColor("#dc322f") + SolarizedViolet = HexColor("#6c71c4") + SolarizedYellow = HexColor("#b58900") + + GruvboxDark0Hard = HexColor("#1d2021") + GruvboxDark0 = HexColor("#282828") + GruvboxDark0Soft = HexColor("#32302f") + GruvboxDark1 = HexColor("#3c3836") + GruvboxDark2 = HexColor("#504945") + GruvboxDark3 = HexColor("#665c54") + GruvboxDark4 = HexColor("#7c6f64") + GruvboxGray = HexColor("#928374") + GruvboxLight0Hard = HexColor("#f9f5d7") + GruvboxLight0 = HexColor("#fbf1c7") + GruvboxLight0Soft = HexColor("#f2e5bc") + GruvboxLight1 = HexColor("#ebdbb2") + GruvboxLight2 = HexColor("#d5c4a1") + GruvboxLight3 = HexColor("#bdae93") + GruvboxLight4 = HexColor("#a89984") + GruvboxRed = HexColor("#cc241d") + GruvboxGreen = HexColor("#98971a") + GruvboxYellow = HexColor("#d79921") + GruvboxBlue = HexColor("#458588") + GruvboxPurple = HexColor("#b16286") + GruvboxAqua = HexColor("#689d6a") + GruvboxOrange = HexColor("#d65d0e") + GruvboxBrightRed = HexColor("#fb4933") + GruvboxBrightGreen = HexColor("#b8bb26") + GruvboxBrightYellow = HexColor("#fabd2f") + GruvboxBrightBlue = HexColor("#83a598") + GruvboxBrightPurple = HexColor("#d3869b") + GruvboxBrightAqua = HexColor("#8ec07c") + GruvboxBrightOrange = HexColor("#fe8019") + GruvboxDarkRed = HexColor("#9d0006") + GruvboxDarkGreen = HexColor("#79740e") + GruvboxDarkYellow = HexColor("#b57614") + GruvboxDarkBlue = HexColor("#076678") + GruvboxDarkPurple = HexColor("#8f3f71") + GruvboxDarkAqua = HexColor("#427b58") + GruvboxDarkOrange = HexColor("#af3a03") +) + +// Palette . +type Palette struct { + Name string + Inverse bool + Solarized Solarized +} + +func rewriteTheme(nc NamedColors, paletteName string) { + + var dst bytes.Buffer + + file, err := os.Open("../solarized-palettes.el") + if err != nil { + log.Fatal(err) + } + defer file.Close() + + scanner := bufio.NewScanner(file) + var insideReplacement bool + for scanner.Scan() { + txt := scanner.Text() + if insideReplacement && strings.HasSuffix(txt, ";; palette end") { + insideReplacement = false + } + if !insideReplacement { + dst.WriteString(txt) + dst.WriteString("\n") + + } + if strings.HasSuffix(txt, fmt.Sprintf(";; %s palette", paletteName)) { + insideReplacement = true + nc.PrintAlist(&dst, 4) + } + } + + if err := scanner.Err(); err != nil { + log.Fatal(err) + } + + file.Close() + + ioutil.WriteFile("../solarized-palettes.el", dst.Bytes(), 0x776) + +} diff --git a/minimal-init/init.el b/minimal-init/init.el @@ -116,6 +116,10 @@ (dev-save-elisp-buffers) (ignore-errors (unload-feature 'solarized t)) + (ignore-errors + (unload-feature 'solarized-faces t)) + (ignore-errors + (unload-feature 'solarized-palettes t)) (dev-set-solarized-settings) (load-library "solarized") (let ((themes (reverse (or dev-reload-theme-last-setting diff --git a/solarized-dark-high-contrast-theme.el b/solarized-dark-high-contrast-theme.el @@ -23,24 +23,6 @@ (require 'solarized) -(defvar solarized-dark-high-contrast-palette-alist - (copy-alist solarized-color-palette-alist)) - -(let ((p solarized-dark-high-contrast-palette-alist) - (o solarized-color-palette-alist) - (a 0.9) - (a2 0.85) - (white "#ffffe8") - (black "#051018")) - (setcdr (assq 'base03 p) (solarized-color-blend (alist-get 'base03 o) black a 2)) - (setcdr (assq 'base02 p) (solarized-color-blend (alist-get 'base02 o) black a 2)) - (setcdr (assq 'base01 p) (solarized-color-blend (alist-get 'base01 o) white a 2)) - (setcdr (assq 'base00 p) (solarized-color-blend (alist-get 'base00 o) white a2 2)) - (setcdr (assq 'base0 p) (solarized-color-blend (alist-get 'base0 o) white a2 2)) - (setcdr (assq 'base1 p) (solarized-color-blend (alist-get 'base1 o) white a2 2)) - (setcdr (assq 'base2 p) (solarized-color-blend (alist-get 'base2 o) black a 2)) - (setcdr (assq 'base3 p) (solarized-color-blend (alist-get 'base3 o) black a 2))) - (deftheme solarized-dark-high-contrast "The dark variant of the Solarized colour theme with slightly higher text contrast") diff --git a/solarized-dark-theme.el b/solarized-dark-theme.el @@ -25,7 +25,8 @@ (deftheme solarized-dark "The dark variant of the Solarized colour theme") -(solarized-create-theme 'dark 'solarized-dark) +(solarized-definition 'dark 'solarized-dark + solarized-dark-color-palette-alist) (provide-theme 'solarized-dark) diff --git a/solarized-faces.el b/solarized-faces.el @@ -1164,6 +1164,18 @@ customize the resulting theme." `(markdown-bold-face ((,class (:inherit bold)))) `(markdown-code-face ((,class (:inherit fixed-pitch :foreground ,base01 :background unspecified)))) + + `(magit-diff-added ((,class (:background ,green-1bg :foreground ,green-1fg)))) + `(magit-diff-added-highlight ((,class (:background ,green-2bg :foreground ,green-2fg)))) + `(magit-diff-base ((,class (:background ,yellow-1bg :foreground ,yellow-1fg)))) + `(magit-diff-base-highlight ((,class (:background ,yellow-2bg :foreground ,yellow-2bg)))) + + `(magit-diff-conflict-heading ((,class (:inherit magit-diff-hunk-heading)))) + `(magit-diff-context ((,class (:foreground ,base0)))) + `(magit-diff-removed ((,class (:background ,red-1bg :foreground ,red-1fg)))) + `(magit-diff-removed-highlight ((,class (:background ,red-2bg :foreground ,red-2fg)))) + + `(markdown-comment-face ((,class (:foreground ,base01 :strike-through t)))) `(markdown-footnote-face ((,class (:inherit default)))) `(markdown-header-delimiter-face ((,class (:foreground ,base01)))) diff --git a/solarized-light-high-contrast-theme.el b/solarized-light-high-contrast-theme.el @@ -23,26 +23,6 @@ (require 'solarized) -(defvar solarized-light-high-contrast-palette-alist - (copy-alist solarized-color-palette-alist)) - -(let ((p solarized-light-high-contrast-palette-alist) - (o solarized-color-palette-alist) - (a 0.9) - (a2 0.8) - (a3 0.7) - (white "#ffffe8") - (black "#051018") - (grey "#a0a0a0")) - (setcdr (assq 'base03 p) (solarized-color-blend (alist-get 'base03 o) black a 2)) - (setcdr (assq 'base02 p) (solarized-color-blend (alist-get 'base02 o) black a 2)) - (setcdr (assq 'base01 p) (solarized-color-blend (alist-get 'base01 o) grey a3 2)) - (setcdr (assq 'base00 p) (solarized-color-blend (alist-get 'base00 o) black a 2)) - (setcdr (assq 'base0 p) (solarized-color-blend (alist-get 'base0 o) black a2 2)) - (setcdr (assq 'base1 p) (solarized-color-blend (alist-get 'base1 o) black a3 2)) - (setcdr (assq 'base2 p) (solarized-color-blend (alist-get 'base2 o) white a 2)) - (setcdr (assq 'base3 p) (solarized-color-blend (alist-get 'base3 o) white a 2))) - (deftheme solarized-light-high-contrast "The light variant of the Solarized colour theme with slightly higher text contrast") diff --git a/solarized-light-theme.el b/solarized-light-theme.el @@ -25,7 +25,8 @@ (deftheme solarized-light "The light variant of the Solarized colour theme") -(solarized-create-theme 'light 'solarized-light) +(solarized-definition 'light 'solarized-light + solarized-light-color-palette-alist) (provide-theme 'solarized-light) diff --git a/solarized-palettes.el b/solarized-palettes.el @@ -10,40 +10,282 @@ ;;; Code: -(defvar solarized-color-palette-alist - '(;; solarized palette - (base03 . "#002b36") - (base02 . "#073642") - (base01 . "#586e75") - (base00 . "#657b83") - (base0 . "#839496") - (base1 . "#93a1a1") - (base2 . "#eee8d5") - (base3 . "#fdf6e3") - (yellow . "#b58900") - (orange . "#cb4b16") - (red . "#dc322f") - (magenta . "#d33682") - (violet . "#6c71c4") - (blue . "#268bd2") - (cyan . "#2aa198") - (green . "#859900") - (yellow-d . "#7B6000") - (yellow-l . "#DEB542") - (orange-d . "#8B2C02") - (orange-l . "#F2804F") - (red-d . "#990A1B") - (red-l . "#FF6E64") - (magenta-d . "#93115C") - (magenta-l . "#F771AC") - (violet-d . "#3F4D91") - (violet-l . "#9EA0E5") - (blue-d . "#00629D") - (blue-l . "#69B7F0") - (cyan-d . "#00736F") - (cyan-l . "#69CABF") - (green-d . "#546E00") - (green-l . "#B4C342") +(defvar solarized-dark-color-palette-alist + '(;; solarized-dark palette + (base03 . "#002b36") + (base02 . "#073642") + (base01 . "#586e75") + (base00 . "#657b83") + (base0 . "#839496") + (base1 . "#93a1a1") + (base2 . "#eee8d5") + (base3 . "#fdf6e3") + (yellow . "#b58900") + (orange . "#cb4b16") + (red . "#dc322f") + (magenta . "#d33682") + (violet . "#6c71c4") + (blue . "#268bd2") + (cyan . "#2aa198") + (green . "#859900") + (yellow-1bg . "#273632") + (yellow-1fg . "#cca551") + (yellow-2bg . "#4a4527") + (yellow-2fg . "#cfad68") + (yellow-d . "#7B6000") + (yellow-l . "#DEB542") + (orange-1bg . "#2d3031") + (orange-1fg . "#df7d50") + (orange-2bg . "#553325") + (orange-2fg . "#df8f66") + (orange-d . "#8B2C02") + (orange-l . "#F2804F") + (red-1bg . "#302f33") + (red-1fg . "#ec745f") + (red-2bg . "#5b2e2c") + (red-2fg . "#e98871") + (red-d . "#990A1B") + (red-l . "#FF6E64") + (magenta-1bg . "#2a2f3e") + (magenta-1fg . "#e1769b") + (magenta-2bg . "#543049") + (magenta-2fg . "#e08aa2") + (magenta-d . "#93115C") + (magenta-l . "#F771AC") + (violet-1bg . "#0f3347") + (violet-1fg . "#9994cb") + (violet-2bg . "#233d61") + (violet-2fg . "#a6a0c8") + (violet-d . "#3F4D91") + (violet-l . "#9EA0E5") + (blue-1bg . "#003649") + (blue-1fg . "#7ca7d5") + (blue-2bg . "#004666") + (blue-2fg . "#92aecf") + (blue-d . "#00629D") + (blue-l . "#69B7F0") + (cyan-1bg . "#013941") + (cyan-1fg . "#76b8ab") + (cyan-2bg . "#004e52") + (cyan-2fg . "#8cbcae") + (cyan-d . "#00736F") + (cyan-l . "#69CABF") + (green-1bg . "#1d3732") + (green-1fg . "#a8b152") + (green-2bg . "#374a27") + (green-2fg . "#b2b769") + (green-d . "#546E00") + (green-l . "#B4C342") + ;; palette end + ) + "The solarized color palette alist.") + +(defvar solarized-light-color-palette-alist + '(;; solarized-light palette + (base03 . "#002b36") + (base02 . "#073642") + (base01 . "#586e75") + (base00 . "#657b83") + (base0 . "#839496") + (base1 . "#93a1a1") + (base2 . "#eee8d5") + (base3 . "#fdf6e3") + (yellow . "#b58900") + (orange . "#cb4b16") + (red . "#dc322f") + (magenta . "#d33682") + (violet . "#6c71c4") + (blue . "#268bd2") + (cyan . "#2aa198") + (green . "#859900") + (yellow-1bg . "#f8e8c6") + (yellow-1fg . "#876d26") + (yellow-2bg . "#f1d49b") + (yellow-2fg . "#766634") + (yellow-d . "#7B6000") + (yellow-l . "#DEB542") + (orange-1bg . "#fedfc5") + (orange-1fg . "#974727") + (orange-2bg . "#ffbd99") + (orange-2fg . "#854a33") + (orange-d . "#8B2C02") + (orange-l . "#F2804F") + (red-1bg . "#ffdec8") + (red-1fg . "#a33c35") + (red-2bg . "#ffb9a1") + (red-2fg . "#8e433d") + (red-d . "#990A1B") + (red-l . "#FF6E64") + (magenta-1bg . "#fdded7") + (magenta-1fg . "#9a3f6c") + (magenta-2bg . "#fdbac6") + (magenta-2fg . "#854568") + (magenta-d . "#93115C") + (magenta-l . "#F771AC") + (violet-1bg . "#ebe4e2") + (violet-1fg . "#4f5e99") + (violet-2bg . "#d1c9e3") + (violet-2fg . "#475a8b") + (violet-d . "#3F4D91") + (violet-l . "#9EA0E5") + (blue-1bg . "#e7e8e4") + (blue-1fg . "#1e6fa2") + (blue-2bg . "#c3d5e9") + (blue-2fg . "#246792") + (blue-d . "#00629D") + (blue-l . "#69B7F0") + (cyan-1bg . "#e4ecda") + (cyan-1fg . "#207e7b") + (cyan-2bg . "#bedfcf") + (cyan-2fg . "#247374") + (cyan-d . "#00736F") + (cyan-l . "#69CABF") + (green-1bg . "#efeac7") + (green-1fg . "#657827") + (green-2bg . "#dbdb9c") + (green-2fg . "#5b6e35") + (green-d . "#546E00") + (green-l . "#B4C342") + ;; palette end + ) + "The solarized color palette alist.") + +(defvar solarized-dark-high-contrast-palette-alist + '(;; solarized-dark-high-contrast palette + (base03 . "#002732") + (base02 . "#01323d") + (base01 . "#62787f") + (base00 . "#60767e") + (base0 . "#8d9fa1") + (base1 . "#9eacac") + (base2 . "#faf3e0") + (base3 . "#ffffee") + (yellow . "#c49619") + (orange . "#db5823") + (red . "#ec423a") + (magenta . "#e2468f") + (violet . "#7a7ed2") + (blue . "#3c98e0") + (cyan . "#3cafa5") + (green . "#93a61a") + (yellow-1bg . "#273430") + (yellow-1fg . "#d7b15d") + (yellow-2bg . "#4d4729") + (yellow-2fg . "#d8b974") + (yellow-d . "#7B6000") + (yellow-l . "#DEB542") + (orange-1bg . "#2d2e2f") + (orange-1fg . "#eb895c") + (orange-2bg . "#583427") + (orange-2fg . "#e99a72") + (orange-d . "#8B2C02") + (orange-l . "#F2804F") + (red-1bg . "#2f2d32") + (red-1fg . "#f8806a") + (red-2bg . "#5e302e") + (red-2fg . "#f4937c") + (red-d . "#990A1B") + (red-l . "#FF6E64") + (magenta-1bg . "#2a2d3d") + (magenta-1fg . "#ed82a8") + (magenta-2bg . "#57324c") + (magenta-2fg . "#e995ae") + (magenta-d . "#93115C") + (magenta-l . "#F771AC") + (violet-1bg . "#113145") + (violet-1fg . "#a2a0d8") + (violet-2bg . "#273f63") + (violet-2fg . "#aeabd4") + (violet-d . "#3F4D91") + (violet-l . "#9EA0E5") + (blue-1bg . "#023447") + (blue-1fg . "#85b3e2") + (blue-2bg . "#014868") + (blue-2fg . "#99badc") + (blue-d . "#00629D") + (blue-l . "#69B7F0") + (cyan-1bg . "#03373f") + (cyan-1fg . "#7fc4b8") + (cyan-2bg . "#055054") + (cyan-2fg . "#93c8ba") + (cyan-d . "#00736F") + (cyan-l . "#69CABF") + (green-1bg . "#1e3531") + (green-1fg . "#b3bd5f") + (green-2bg . "#3a4c29") + (green-2fg . "#bbc275") + (green-d . "#546E00") + (green-l . "#B4C342") + ;; palette end + ) + "The solarized color palette alist.") + +(defvar solarized-light-high-contrast-palette-alist + '(;; solarized-light-high-contrast palette + (base03 . "#00212b") + (base02 . "#002b37") + (base01 . "#5d737a") + (base00 . "#596e76") + (base0 . "#88999b") + (base1 . "#98a6a6") + (base2 . "#f4eedb") + (base3 . "#fffce9") + (yellow . "#a67c00") + (orange . "#bb3e06") + (red . "#cc1f24") + (magenta . "#c42475") + (violet . "#5e65b6") + (blue . "#007ec4") + (cyan . "#11948b") + (green . "#778c00") + (yellow-1bg . "#f7ebcb") + (yellow-1fg . "#7a6120") + (yellow-2bg . "#ecd29c") + (yellow-2fg . "#6b5a2c") + (yellow-d . "#7B6000") + (yellow-l . "#DEB542") + (orange-1bg . "#fee2c8") + (orange-1fg . "#8a3b1c") + (orange-2bg . "#fabc97") + (orange-2fg . "#793e28") + (orange-d . "#8B2C02") + (orange-l . "#F2804F") + (red-1bg . "#ffe1cb") + (red-1fg . "#952f2a") + (red-2bg . "#ffb79f") + (red-2fg . "#823731") + (red-d . "#990A1B") + (red-l . "#FF6E64") + (magenta-1bg . "#fce1da") + (magenta-1fg . "#8e3160") + (magenta-2bg . "#f9b9c4") + (magenta-2fg . "#7a395c") + (magenta-d . "#93115C") + (magenta-l . "#F771AC") + (violet-1bg . "#ebe7e5") + (violet-1fg . "#44528c") + (violet-2bg . "#cdc8e1") + (violet-2fg . "#3d4f7e") + (violet-d . "#3F4D91") + (violet-l . "#9EA0E5") + (blue-1bg . "#e6ebe7") + (blue-1fg . "#0a6395") + (blue-2bg . "#bfd2e6") + (blue-2fg . "#185b85") + (blue-d . "#00629D") + (blue-l . "#69B7F0") + (cyan-1bg . "#e4efdd") + (cyan-1fg . "#10716f") + (cyan-2bg . "#b9ddcd") + (cyan-2fg . "#196767") + (cyan-d . "#00736F") + (cyan-l . "#69CABF") + (green-1bg . "#eeedcb") + (green-1fg . "#596c21") + (green-2bg . "#d5d99d") + (green-2fg . "#51622d") + (green-d . "#546E00") + (green-l . "#B4C342") ;; palette end ) "The solarized color palette alist.") @@ -94,78 +336,140 @@ (defvar solarized-gruvbox-dark-color-palette-alist '(;; gruvbox-dark palette - (base00 . (alist-get 'dark4 solarized-gruvbox-colors)) - (base01 . (alist-get 'dark3 solarized-gruvbox-colors)) - (base02 . (alist-get 'dark0_soft solarized-gruvbox-colors)) - (base03 . (alist-get 'dark0 solarized-gruvbox-colors)) - (base0 . (alist-get 'light4 solarized-gruvbox-colors)) - (base1 . (alist-get 'light3 solarized-gruvbox-colors)) - (base2 . (alist-get 'light4 solarized-gruvbox-colors)) - (base3 . (alist-get 'light0 solarized-gruvbox-colors)) - (yellow . (alist-get 'yellow solarized-gruvbox-colors)) - (orange . (alist-get 'orange solarized-gruvbox-colors)) - (red . (alist-get 'bright_red solarized-gruvbox-colors)) - (magenta . (alist-get 'bright_purple solarized-gruvbox-colors)) - (violet . (alist-get 'purple solarized-gruvbox-colors)) - (blue . (alist-get 'bright_blue solarized-gruvbox-colors)) - (cyan . (alist-get 'aqua solarized-gruvbox-colors)) - (green . (alist-get 'green solarized-gruvbox-colors)) - - (yellow-d . (solarized-color-blend (alist-get 'dark_yellow solarized-gruvbox-colors) (alist-get 'dark0 solarized-gruvbox-colors) 0.80 2)) - (yellow-l . (solarized-color-blend (alist-get 'bright_yellow solarized-gruvbox-colors) (alist-get 'light0 solarized-gruvbox-colors) 0.80 2)) - (orange-d . (solarized-color-blend (alist-get 'dark_orange solarized-gruvbox-colors) (alist-get 'dark0 solarized-gruvbox-colors) 0.80 2)) - (orange-l . (solarized-color-blend (alist-get 'bright_orange solarized-gruvbox-colors) (alist-get 'light0 solarized-gruvbox-colors) 0.80 2)) - (red-d . (solarized-color-blend (alist-get 'dark_red solarized-gruvbox-colors) (alist-get 'dark0 solarized-gruvbox-colors) 0.80 2)) - (red-l . (solarized-color-blend (alist-get 'bright_red solarized-gruvbox-colors) (alist-get 'light0 solarized-gruvbox-colors) 0.80 2)) - (magenta-d . (solarized-color-blend (alist-get 'dark_purple solarized-gruvbox-colors) (alist-get 'dark0 solarized-gruvbox-colors) 0.80 2)) - (magenta-l . (solarized-color-blend (alist-get 'bright_purple solarized-gruvbox-colors) (alist-get 'light0 solarized-gruvbox-colors) 0.80 2)) - (violet-d . (solarized-color-blend (alist-get 'dark_purple solarized-gruvbox-colors) (alist-get 'dark0 solarized-gruvbox-colors) 0.80 2)) - (violet-l . (solarized-color-blend (alist-get 'bright_purple solarized-gruvbox-colors) (alist-get 'light0 solarized-gruvbox-colors) 0.80 2)) - (blue-d . (solarized-color-blend (alist-get 'dark_blue solarized-gruvbox-colors) (alist-get 'dark0 solarized-gruvbox-colors) 0.80 2)) - (blue-l . (solarized-color-blend (alist-get 'bright_blue solarized-gruvbox-colors) (alist-get 'light0 solarized-gruvbox-colors) 0.80 2)) - (cyan-d . (solarized-color-blend (alist-get 'dark_aqua solarized-gruvbox-colors) (alist-get 'dark0 solarized-gruvbox-colors) 0.80 2)) - (cyan-l . (solarized-color-blend (alist-get 'bright_aqua solarized-gruvbox-colors) (alist-get 'light0 solarized-gruvbox-colors) 0.80 2)) - (green-d . (solarized-color-blend (alist-get 'dark_green solarized-gruvbox-colors) (alist-get 'dark0 solarized-gruvbox-colors) 0.80 2)) - (green-l . (solarized-color-blend (alist-get 'bright_green solarized-gruvbox-colors) (alist-get 'light0 solarized-gruvbox-colors) 0.80 2)) + (base03 . "#282828") + (base02 . "#32302f") + (base01 . "#7c6f64") + (base00 . "#282828") + (base0 . "#a89984") + (base1 . "#bdae93") + (base2 . "#a89984") + (base3 . "#fbf1c7") + (yellow . "#d79921") + (orange . "#d65d0e") + (red . "#fb4933") + (magenta . "#d3869b") + (violet . "#b16286") + (blue . "#458588") + (cyan . "#689d6a") + (green . "#98971a") + (yellow-1bg . "#3f3528") + (yellow-1fg . "#e2b055") + (yellow-2bg . "#614923") + (yellow-2fg . "#dfb566") + (yellow-d . "#7B6000") + (yellow-l . "#DEB542") + (orange-1bg . "#402e25") + (orange-1fg . "#e48847") + (orange-2bg . "#62351c") + (orange-2fg . "#e2965a") + (orange-d . "#8B2C02") + (orange-l . "#F2804F") + (red-1bg . "#452e28") + (red-1fg . "#ff815b") + (red-2bg . "#6f3125") + (red-2fg . "#f89169") + (red-d . "#990A1B") + (red-l . "#FF6E64") + (magenta-1bg . "#3d3335") + (magenta-1fg . "#dda3a6") + (magenta-2bg . "#5e434a") + (magenta-2fg . "#dbaba4") + (magenta-d . "#93115C") + (magenta-l . "#F771AC") + (violet-1bg . "#392f33") + (violet-1fg . "#c68a97") + (violet-2bg . "#523642") + (violet-2fg . "#c89798") + (violet-d . "#3F4D91") + (violet-l . "#9EA0E5") + (blue-1bg . "#2c3333") + (blue-1fg . "#7da298") + (blue-2bg . "#2d4243") + (blue-2fg . "#90aa99") + (blue-d . "#00629D") + (blue-l . "#69B7F0") + (cyan-1bg . "#2f362f") + (cyan-1fg . "#91b382") + (cyan-2bg . "#384a38") + (cyan-2fg . "#9fb888") + (cyan-d . "#00736F") + (cyan-l . "#69CABF") + (green-1bg . "#363527") + (green-1fg . "#b4ae51") + (green-2bg . "#4a4821") + (green-2fg . "#bab462") + (green-d . "#546E00") + (green-l . "#B4C342") ;; palette end ) "The solarized gruvbox dark palette color alist.") (defvar solarized-gruvbox-light-color-palette-alist '(;; gruvbox-light palette - (base00 . (alist-get 'dark4 solarized-gruvbox-colors)) - (base01 . (alist-get 'dark3 solarized-gruvbox-colors)) - (base02 . (alist-get 'dark0_soft solarized-gruvbox-colors)) - (base03 . (alist-get 'dark0 solarized-gruvbox-colors)) - (base0 . (alist-get 'dark1 solarized-gruvbox-colors)) - (base1 . (alist-get 'light4 solarized-gruvbox-colors)) - (base2 . (alist-get 'light1 solarized-gruvbox-colors)) - (base3 . (alist-get 'light0 solarized-gruvbox-colors)) - (yellow . (alist-get 'dark_yellow solarized-gruvbox-colors)) - (orange . (alist-get 'dark_orange solarized-gruvbox-colors)) - (red . (alist-get 'dark_red solarized-gruvbox-colors)) - (magenta . (alist-get 'bright_purple solarized-gruvbox-colors)) - (violet . (alist-get 'dark_purple solarized-gruvbox-colors)) - (blue . (alist-get 'blue solarized-gruvbox-colors)) - (cyan . (alist-get 'aqua solarized-gruvbox-colors)) - (green . (alist-get 'green solarized-gruvbox-colors)) - - (yellow-d . (solarized-color-blend (alist-get 'dark_yellow solarized-gruvbox-colors) (alist-get 'dark0 solarized-gruvbox-colors) 0.80 2)) - (yellow-l . (solarized-color-blend (alist-get 'bright_yellow solarized-gruvbox-colors) (alist-get 'light0 solarized-gruvbox-colors) 0.80 2)) - (orange-d . (solarized-color-blend (alist-get 'dark_orange solarized-gruvbox-colors) (alist-get 'dark0 solarized-gruvbox-colors) 0.80 2)) - (orange-l . (solarized-color-blend (alist-get 'bright_orange solarized-gruvbox-colors) (alist-get 'light0 solarized-gruvbox-colors) 0.80 2)) - (red-d . (solarized-color-blend (alist-get 'dark_red solarized-gruvbox-colors) (alist-get 'dark0 solarized-gruvbox-colors) 0.80 2)) - (red-l . (solarized-color-blend (alist-get 'bright_red solarized-gruvbox-colors) (alist-get 'light0 solarized-gruvbox-colors) 0.80 2)) - (magenta-d . (solarized-color-blend (alist-get 'dark_purple solarized-gruvbox-colors) (alist-get 'dark0 solarized-gruvbox-colors) 0.80 2)) - (magenta-l . (solarized-color-blend (alist-get 'bright_purple solarized-gruvbox-colors) (alist-get 'light0 solarized-gruvbox-colors) 0.80 2)) - (violet-d . (solarized-color-blend (alist-get 'dark_purple solarized-gruvbox-colors) (alist-get 'dark0 solarized-gruvbox-colors) 0.80 2)) - (violet-l . (solarized-color-blend (alist-get 'bright_purple solarized-gruvbox-colors) (alist-get 'light0 solarized-gruvbox-colors) 0.80 2)) - (blue-d . (solarized-color-blend (alist-get 'dark_blue solarized-gruvbox-colors) (alist-get 'dark0 solarized-gruvbox-colors) 0.80 2)) - (blue-l . (solarized-color-blend (alist-get 'bright_blue solarized-gruvbox-colors) (alist-get 'light0 solarized-gruvbox-colors) 0.80 2)) - (cyan-d . (solarized-color-blend (alist-get 'dark_aqua solarized-gruvbox-colors) (alist-get 'dark0 solarized-gruvbox-colors) 0.80 2)) - (cyan-l . (solarized-color-blend (alist-get 'bright_aqua solarized-gruvbox-colors) (alist-get 'light0 solarized-gruvbox-colors) 0.80 2)) - (green-d . (solarized-color-blend (alist-get 'dark_green solarized-gruvbox-colors) (alist-get 'dark0 solarized-gruvbox-colors) 0.80 2)) - (green-l . (solarized-color-blend (alist-get 'bright_green solarized-gruvbox-colors) (alist-get 'light0 solarized-gruvbox-colors) 0.80 2)) + (base03 . "#282828") + (base02 . "#32302f") + (base01 . "#665c54") + (base00 . "#7c6f64") + (base0 . "#3c3836") + (base1 . "#a89984") + (base2 . "#ebdbb2") + (base3 . "#fbf1c7") + (yellow . "#b57614") + (orange . "#af3a03") + (red . "#9d0006") + (magenta . "#d3869b") + (violet . "#8f3f71") + (blue . "#076678") + (cyan . "#689d6a") + (green . "#98971a") + (yellow-1bg . "#f6e1af") + (yellow-1fg . "#8c6023") + (yellow-2bg . "#efc98b") + (yellow-2fg . "#7f5b2d") + (yellow-d . "#7B6000") + (yellow-l . "#DEB542") + (orange-1bg . "#f7d8ab") + (orange-1fg . "#893a18") + (orange-2bg . "#f0b382") + (orange-2fg . "#7e3e23") + (orange-d . "#8B2C02") + (orange-l . "#F2804F") + (red-1bg . "#f5d4aa") + (red-1fg . "#7e2115") + (red-2bg . "#eaa67f") + (red-2fg . "#752d21") + (red-d . "#990A1B") + (red-l . "#FF6E64") + (magenta-1bg . "#f9e4c3") + (magenta-1fg . "#9e6b78") + (magenta-2bg . "#f8d1c0") + (magenta-2fg . "#8c646e") + (magenta-d . "#93115C") + (magenta-l . "#F771AC") + (violet-1bg . "#eed8bd") + (violet-1fg . "#713c5c") + (violet-2bg . "#dcb3af") + (violet-2fg . "#694058") + (violet-d . "#3F4D91") + (violet-l . "#9EA0E5") + (blue-1bg . "#dedebe") + (blue-1fg . "#245561") + (blue-2bg . "#b1c2b2") + (blue-2fg . "#30535c") + (blue-d . "#00629D") + (blue-l . "#69B7F0") + (cyan-1bg . "#e7e7bb") + (cyan-1fg . "#577a58") + (cyan-2bg . "#cbdaab") + (cyan-2fg . "#556f55") + (cyan-d . "#00736F") + (cyan-l . "#69CABF") + (green-1bg . "#f0e6b1") + (green-1fg . "#787628") + (green-2bg . "#e0d78f") + (green-2fg . "#6f6c32") + (green-d . "#546E00") + (green-l . "#B4C342") ;; palette end ) "The solarized gruvbox light color palette alist.") diff --git a/solarized.el b/solarized.el @@ -133,7 +133,7 @@ Related discussion: https://github.com/bbatsov/solarized-emacs/issues/158" ;;; Utilities ;;;###autoload -(defun solarized-color-blend (color1 color2 alpha &optional digits-per-component) +(defun solarized-color-blend-rgb (color1 color2 alpha &optional digits-per-component) "Blends COLOR1 onto COLOR2 with ALPHA. COLOR1 and COLOR2 should be color names (e.g. \"white\") or RGB @@ -150,6 +150,37 @@ use the latter if you need a 24-bit specification of a color." (color-name-to-rgb color2)) ,digits-per-component))) +(defun solarized-color-lightness (color) + "Returns the LAB lightness value of a color, the range is from 0-100." + (car (apply 'color-srgb-to-lab (color-name-to-rgb hexrgb)))) + +(defun solarized-color-clamp-lab (lab) + "Restricts a LAB colorspace color if it is out of bounds." + (list (min (max (nth 0 lab) 0.0) 100.0) + (min (max (nth 1 lab) -128) 127) + (min (max (nth 2 lab) -128) 127))) + +(defun solarized-color-blend (color1 color2 alpha &optional digits-per-component) +"Blends COLOR1 onto COLOR2 with ALPHA. + +COLOR1 and COLOR2 should be color names (e.g. \"white\") or RGB +triplet strings (e.g. \"#ff12ec\"). + +Alpha should be a float between 0 and 1. + +Optional argument DIGITS-PER-COMPONENT can be either 4 (the default) or 2; +use the latter if you need a 24-bit specification of a color." + (apply 'color-rgb-to-hex + (nconc + (mapcar 'color-clamp + (apply 'color-lab-to-srgb + (solarized-color-clamp-lab + (cl-mapcar + '(lambda (v1 v2) (+ v1 (* alpha (- v2 v1)))) + (apply 'color-srgb-to-lab (color-name-to-rgb color2)) + (apply 'color-srgb-to-lab (color-name-to-rgb color1)))))) + '(2)))) + ;;;###autoload (defun solarized-create-color-palette (core-palette) "Create color-palette from CORE-PALETTE. @@ -165,6 +196,7 @@ The Returned color-palette has the same format as `solarized-color-palette'" (blue (nth 7 core-palette)) (cyan (nth 8 core-palette)) (green (nth 9 core-palette))) + `((base03 . ,(solarized-color-blend darkest-base brightest-base 1.00 2)) (base02 . ,(solarized-color-blend darkest-base brightest-base 0.97 2)) (base01 . ,(solarized-color-blend darkest-base brightest-base 0.65 2)) @@ -186,22 +218,60 @@ The Returned color-palette has the same format as `solarized-color-palette'" ;; Darker and lighter accented colors ;; Only use these in exceptional circumstances! - (yellow-d . ,(solarized-color-blend yellow darkest-base 0.80 2)) - (yellow-l . ,(solarized-color-blend yellow brightest-base 0.80 2)) - (orange-d . ,(solarized-color-blend orange darkest-base 0.80 2)) - (orange-l . ,(solarized-color-blend orange brightest-base 0.80 2)) - (red-d . ,(solarized-color-blend red darkest-base 0.80 2)) - (red-l . ,(solarized-color-blend red brightest-base 0.80 2)) - (magenta-d . ,(solarized-color-blend magenta darkest-base 0.80 2)) - (magenta-l . ,(solarized-color-blend magenta brightest-base 0.80 2)) - (violet-d . ,(solarized-color-blend violet darkest-base 0.80 2)) - (violet-l . ,(solarized-color-blend violet brightest-base 0.80 2)) - (blue-d . ,(solarized-color-blend blue darkest-base 0.80 2)) - (blue-l . ,(solarized-color-blend blue brightest-base 0.80 2)) - (cyan-d . ,(solarized-color-blend cyan darkest-base 0.80 2)) - (cyan-l . ,(solarized-color-blend cyan brightest-base 0.80 2)) - (green-d . ,(solarized-color-blend green darkest-base 0.80 2)) - (green-l . ,(solarized-color-blend green brightest-base 0.80 2))))) + (yellow-d . ,(solarized-color-blend darkest-base yellow 0.80 2)) + (yellow-l . ,(solarized-color-blend brightest-base yellow 0.80 2)) + (orange-d . ,(solarized-color-blend darkest-base orange 0.80 2)) + (orange-l . ,(solarized-color-blend brightest-base orange 0.80 2)) + (red-d . ,(solarized-color-blend darkest-base red 0.80 2)) + (red-l . ,(solarized-color-blend brightest-base red 0.80 2)) + (magenta-d . ,(solarized-color-blend darkest-base magenta 0.80 2)) + (magenta-l . ,(solarized-color-blend brightest-base magenta 0.80 2)) + (violet-d . ,(solarized-color-blend darkest-base violet 0.80 2)) + (violet-l . ,(solarized-color-blend brightest-base violet 0.80 2)) + (blue-d . ,(solarized-color-blend darkest-base blue 0.80 2)) + (blue-l . ,(solarized-color-blend brightest-base blue 0.80 2)) + (cyan-d . ,(solarized-color-blend darkest-base cyan 0.80 2)) + (cyan-l . ,(solarized-color-blend brightest-base cyan 0.80 2)) + (green-d . ,(solarized-color-blend darkest-base green 0.80 2)) + (green-l . ,(solarized-color-blend brightest-base green 0.80 2)) + + (yellow-1bg . ,(solarized-color-blend darkest-base yellow 0.85 2)) + (orange-1bg . ,(solarized-color-blend darkest-base orange 0.85 2)) + (red-1bg . ,(solarized-color-blend darkest-base red 0.85 2)) + (magenta-1bg . ,(solarized-color-blend darkest-base magenta 0.85 2)) + (blue-1bg . ,(solarized-color-blend darkest-base blue 0.85 2)) + (cyan-1bg . ,(solarized-color-blend darkest-base cyan 0.85 2)) + (green-1bg . ,(solarized-color-blend darkest-base green 0.85 2)) + (violet-1bg . ,(solarized-color-blend darkest-base violet 0.85 2)) + + (yellow-1fg . ,(solarized-color-blend brightest-base yellow 0.30 2)) + (orange-1fg . ,(solarized-color-blend brightest-base orange 0.30 2)) + (red-1fg . ,(solarized-color-blend brightest-base red 0.30 2)) + (magenta-1fg . ,(solarized-color-blend brightest-base magenta 0.30 2)) + (violet-1fg . ,(solarized-color-blend brightest-base violet 0.30 2)) + (blue-1fg . ,(solarized-color-blend brightest-base blue 0.30 2)) + (cyan-1fg . ,(solarized-color-blend brightest-base cyan 0.30 2)) + (green-1fg . ,(solarized-color-blend brightest-base green 0.30 2)) + + (yellow-2bg . ,(solarized-color-blend darkest-base yellow 0.60 2)) + (orange-2bg . ,(solarized-color-blend darkest-base orange 0.60 2)) + (red-2bg . ,(solarized-color-blend darkest-base red 0.60 2)) + (magenta-2bg . ,(solarized-color-blend darkest-base magenta 0.60 2)) + (violet-2bg . ,(solarized-color-blend darkest-base violet 0.60 2)) + (blue-2bg . ,(solarized-color-blend darkest-base blue 0.60 2)) + (cyan-2bg . ,(solarized-color-blend darkest-base cyan 0.60 2)) + (green-2bg . ,(solarized-color-blend darkest-base green 0.60 2)) + + (yellow-2fg . ,(solarized-color-blend brightest-base yellow 0.45 2)) + (orange-2fg . ,(solarized-color-blend brightest-base orange 0.45 2)) + (red-2fg . ,(solarized-color-blend brightest-base red 0.45 2)) + (magenta-2fg . ,(solarized-color-blend brightest-base magenta 0.45 2)) + (violet-2fg . ,(solarized-color-blend brightest-base violet 0.45 2)) + (blue-2fg . ,(solarized-color-blend brightest-base blue 0.45 2)) + (cyan-2fg . ,(solarized-color-blend brightest-base cyan 0.45 2)) + (green-2fg . ,(solarized-color-blend brightest-base green 0.45 2)) + + ))) @@ -296,33 +366,27 @@ VARIANT is 'dark or 'light." base02 base02)) ;; diff colors - (s-diff-A-bg (if (eq variant 'light) "#ffdddd" "#553333")) - (s-diff-A-fg (if (eq variant 'light) "#aa2222" "#ffdddd")) - (s-diff-fine-A-bg (if (eq variant 'light) - (solarized-color-blend "#ffdddd" red 0.7) - (solarized-color-blend "#664444" red 0.7))) - (s-diff-fine-A-fg (if (eq variant 'light) "#aa2222" "#eecccc")) - - (s-diff-B-bg (if (eq variant 'light) "#ddffdd" "#335533")) - (s-diff-B-fg (if (eq variant 'light) "#22aa22" "#ddffdd")) - (s-diff-fine-B-bg (if (eq variant 'light) - (solarized-color-blend "#ddffdd" green 0.7) - (solarized-color-blend "#446644" green 0.7))) - (s-diff-fine-B-fg (if (eq variant 'light) "#336633" "#cceecc")) - - (s-diff-Ancestor-bg (if (eq variant 'light) "#ffffcc" "#555522")) - (s-diff-Ancestor-fg (if (eq variant 'light) "#aaaa11" "#ffffcc")) - (s-diff-fine-Ancestor-bg (if (eq variant 'light) "#eeeebb" "#666622")) - (s-diff-fine-Ancestor-fg (if (eq variant 'light) "#aaaa11" "#eeeebb")) - - (s-diff-C-bg (if (eq variant 'light) "#d1e2f2" "#004d7b")) - (s-diff-C-fg (if (eq variant 'light) "#004d7b" "#d1e2f2")) - (s-diff-fine-C-bg (if (eq variant 'light) - (solarized-color-blend "#d6e5e5" blue 0.7) - (solarized-color-blend "#00547f" blue 0.7))) - (s-diff-fine-C-fg (if (eq variant 'light) "#00547f" "#d6e5e5")) - (s-diff-context-fg (if (eq variant 'light) base0 (solarized-color-blend base1 base2 0.6))) - (s-diff-heading-bg (if (eq variant 'light) (solarized-color-blend yellow base03 0.1) base02)) + (s-diff-A-bg red-1bg) + (s-diff-A-fg red-1fg) + (s-diff-fine-A-bg red-2bg) + (s-diff-fine-A-fg red-2fg) + + (s-diff-B-bg green-1bg) + (s-diff-B-fg green-1fg) + (s-diff-fine-B-bg green-2bg) + (s-diff-fine-B-fg green-2fg) + + (s-diff-Ancestor-bg yellow-1bg) + (s-diff-Ancestor-fg yellow-1fg) + (s-diff-fine-Ancestor-bg yellow-2bg) + (s-diff-fine-Ancestor-fg yellow-2fg) + + (s-diff-C-bg blue-1bg) + (s-diff-C-fg blue-1fg) + (s-diff-fine-C-bg blue-2bg) + (s-diff-fine-C-fg blue-2fg) + (s-diff-context-fg base0) + (s-diff-heading-bg base02) (s-diffstat-added-fg green) (s-diffstat-changed-fg blue) @@ -363,7 +427,10 @@ If OVERWRITE is non-nil, overwrite theme file if exist." When optional argument CHILDTHEME function is supplied it's invoked to further customize the resulting theme." - (solarized-definition variant theme-name solarized-color-palette-alist childtheme)) + (solarized-definition variant theme-name (if (eq variant 'light) + solarized-light-color-palette-alist + solarized-dark-color-palette-alist) + childtheme)) (defun solarized-create-theme-with-palette (variant theme-name core-palette &optional childtheme) "Create a VARIANT of the theme named THEME-NAME with CORE-PALETTE.