Skip to content

Commit b79f7ad

Browse files
committed
colorscheme: Add capability to include schemes
1 parent 16e38b9 commit b79f7ad

File tree

4 files changed

+56
-50
lines changed

4 files changed

+56
-50
lines changed

internal/config/colorscheme.go

+50-14
Original file line numberDiff line numberDiff line change
@@ -52,51 +52,87 @@ func InitColorscheme() error {
5252
Colorscheme = make(map[string]tcell.Style)
5353
DefStyle = tcell.StyleDefault
5454

55-
return LoadDefaultColorscheme()
55+
c, err := LoadDefaultColorscheme()
56+
if err == nil {
57+
Colorscheme = c
58+
}
59+
60+
return err
5661
}
5762

5863
// LoadDefaultColorscheme loads the default colorscheme from $(ConfigDir)/colorschemes
59-
func LoadDefaultColorscheme() error {
60-
return LoadColorscheme(GlobalSettings["colorscheme"].(string))
64+
func LoadDefaultColorscheme() (map[string]tcell.Style, error) {
65+
var parsedColorschemes []string
66+
return LoadColorscheme(GlobalSettings["colorscheme"].(string), &parsedColorschemes)
6167
}
6268

6369
// LoadColorscheme loads the given colorscheme from a directory
64-
func LoadColorscheme(colorschemeName string) error {
70+
func LoadColorscheme(colorschemeName string, parsedColorschemes *[]string) (map[string]tcell.Style, error) {
71+
c := make(map[string]tcell.Style)
6572
file := FindRuntimeFile(RTColorscheme, colorschemeName)
6673
if file == nil {
67-
return errors.New(colorschemeName + " is not a valid colorscheme")
74+
return c, errors.New(colorschemeName + " is not a valid colorscheme")
6875
}
6976
if data, err := file.Data(); err != nil {
70-
return errors.New("Error loading colorscheme: " + err.Error())
77+
return c, errors.New("Error loading colorscheme: " + err.Error())
7178
} else {
72-
Colorscheme, err = ParseColorscheme(string(data))
79+
var err error
80+
c, err = ParseColorscheme(file.Name(), string(data), parsedColorschemes)
7381
if err != nil {
74-
return err
82+
return c, err
7583
}
7684
}
77-
return nil
85+
return c, nil
7886
}
7987

8088
// ParseColorscheme parses the text definition for a colorscheme and returns the corresponding object
8189
// Colorschemes are made up of color-link statements linking a color group to a list of colors
8290
// For example, color-link keyword (blue,red) makes all keywords have a blue foreground and
8391
// red background
84-
func ParseColorscheme(text string) (map[string]tcell.Style, error) {
92+
func ParseColorscheme(name string, text string, parsedColorschemes *[]string) (map[string]tcell.Style, error) {
8593
var err error
86-
parser := regexp.MustCompile(`color-link\s+(\S*)\s+"(.*)"`)
87-
94+
colorParser := regexp.MustCompile(`color-link\s+(\S*)\s+"(.*)"`)
95+
includeParser := regexp.MustCompile(`include\s+"(.*)"`)
8896
lines := strings.Split(text, "\n")
89-
9097
c := make(map[string]tcell.Style)
9198

99+
if parsedColorschemes != nil {
100+
*parsedColorschemes = append(*parsedColorschemes, name)
101+
}
102+
103+
lineLoop:
92104
for _, line := range lines {
93105
if strings.TrimSpace(line) == "" ||
94106
strings.TrimSpace(line)[0] == '#' {
95107
// Ignore this line
96108
continue
97109
}
98110

99-
matches := parser.FindSubmatch([]byte(line))
111+
matches := includeParser.FindSubmatch([]byte(line))
112+
if len(matches) == 2 {
113+
// support includes only in case parsedColorschemes are given
114+
if parsedColorschemes != nil {
115+
include := string(matches[1])
116+
for _, name := range *parsedColorschemes {
117+
// check for circular includes...
118+
if name == include {
119+
// ...and prevent them
120+
continue lineLoop
121+
}
122+
}
123+
includeScheme, err := LoadColorscheme(include, parsedColorschemes)
124+
if err != nil {
125+
return c, err
126+
} else {
127+
for k, v := range includeScheme {
128+
c[k] = v
129+
}
130+
}
131+
}
132+
continue
133+
}
134+
135+
matches = colorParser.FindSubmatch([]byte(line))
100136
if len(matches) == 3 {
101137
link := string(matches[1])
102138
colors := string(matches[2])

internal/config/colorscheme_test.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ color-link constant "#AE81FF,#282828"
6565
color-link constant.string "#E6DB74,#282828"
6666
color-link constant.string.char "#BDE6AD,#282828"`
6767

68-
c, err := ParseColorscheme(testColorscheme)
68+
c, err := ParseColorscheme("testColorscheme", testColorscheme, nil)
6969
assert.Nil(t, err)
7070

7171
fg, bg, _ := c["comment"].Decompose()

runtime/colorschemes/default.micro

+1-34
Original file line numberDiff line numberDiff line change
@@ -1,34 +1 @@
1-
color-link default "#F8F8F2,#282828"
2-
color-link comment "#75715E,#282828"
3-
color-link identifier "#66D9EF,#282828"
4-
color-link constant "#AE81FF,#282828"
5-
color-link constant.string "#E6DB74,#282828"
6-
color-link constant.string.char "#BDE6AD,#282828"
7-
color-link statement "#F92672,#282828"
8-
color-link symbol.operator "#F92671,#282828"
9-
color-link preproc "#CB4B16,#282828"
10-
color-link type "#66D9EF,#282828"
11-
color-link special "#A6E22E,#282828"
12-
color-link underlined "#D33682,#282828"
13-
color-link error "bold #CB4B16,#282828"
14-
color-link todo "bold #D33682,#282828"
15-
color-link hlsearch "#282828,#E6DB74"
16-
color-link statusline "#282828,#F8F8F2"
17-
color-link tabbar "#282828,#F8F8F2"
18-
color-link indent-char "#505050,#282828"
19-
color-link line-number "#AAAAAA,#323232"
20-
color-link current-line-number "#AAAAAA,#282828"
21-
color-link diff-added "#00AF00"
22-
color-link diff-modified "#FFAF00"
23-
color-link diff-deleted "#D70000"
24-
color-link gutter-error "#CB4B16,#282828"
25-
color-link gutter-warning "#E6DB74,#282828"
26-
color-link cursor-line "#323232"
27-
color-link color-column "#323232"
28-
#No extended types; Plain brackets.
29-
color-link type.extended "default"
30-
#color-link symbol.brackets "default"
31-
color-link symbol.tag "#AE81FF,#282828"
32-
color-link match-brace "#282828,#AE81FF"
33-
color-link tab-error "#D75F5F"
34-
color-link trailingws "#D75F5F"
1+
include "monokai"

runtime/help/colors.md

+4-1
Original file line numberDiff line numberDiff line change
@@ -236,7 +236,10 @@ Here's a list of subgroups used in micro's built-in syntax files.
236236
* type.keyword (If you want a special highlight for keywords like `private`)
237237

238238
In the future, plugins may also be able to use color groups for styling.
239-
239+
Last but not least it's even possible to use `include` followed by the
240+
colorscheme name as string to include a different colorscheme within a new one.
241+
Additionally the groups can then be extended or overwritten. The `default.micro`
242+
theme can be seen as an example, which links to the chosen default colorscheme.
240243

241244
## Syntax files
242245

0 commit comments

Comments
 (0)