import (
"fmt"
- "github.com/zyedidia/tcell"
- "io/ioutil"
"regexp"
"strconv"
"strings"
+
+ "github.com/zyedidia/tcell"
)
// Colorscheme is a map from string to style -- it represents a colorscheme
// The current colorscheme
var colorscheme Colorscheme
-var preInstalledColors = [3]string{"default", "solarized", "solarized-tc"}
+// This takes in a syntax group and returns the colorscheme's style for that group
+func GetColor(color string) tcell.Style {
+ st := defStyle
+ if color == "" {
+ return st
+ }
+ groups := strings.Split(color, ".")
+ if len(groups) > 1 {
+ curGroup := ""
+ for i, g := range groups {
+ if i != 0 {
+ curGroup += "."
+ }
+ curGroup += g
+ if style, ok := colorscheme[curGroup]; ok {
+ st = style
+ }
+ }
+ } else if style, ok := colorscheme[color]; ok {
+ st = style
+ } else {
+ st = StringToStyle(color)
+ }
+
+ return st
+}
+
+// ColorschemeExists checks if a given colorscheme exists
+func ColorschemeExists(colorschemeName string) bool {
+ return FindRuntimeFile(RTColorscheme, colorschemeName) != nil
+}
// InitColorscheme picks and initializes the colorscheme when micro starts
func InitColorscheme() {
+ colorscheme = make(Colorscheme)
+ defStyle = tcell.StyleDefault.
+ Foreground(tcell.ColorDefault).
+ Background(tcell.ColorDefault)
+ if screen != nil {
+ screen.SetStyle(defStyle)
+ }
+
LoadDefaultColorscheme()
}
// LoadDefaultColorscheme loads the default colorscheme from $(configDir)/colorschemes
func LoadDefaultColorscheme() {
- LoadColorscheme(settings.Colorscheme, configDir+"/colorschemes")
+ LoadColorscheme(globalSettings["colorscheme"].(string))
}
// LoadColorscheme loads the given colorscheme from a directory
-func LoadColorscheme(colorschemeName, dir string) {
- files, _ := ioutil.ReadDir(dir)
- for _, f := range files {
- if f.Name() == colorschemeName+".micro" {
- text, err := ioutil.ReadFile(dir + "/" + f.Name())
- if err != nil {
- fmt.Println("Error loading colorscheme:", err)
- continue
- }
- colorscheme = ParseColorscheme(string(text))
- }
- }
-
- for _, name := range preInstalledColors {
- if name == colorschemeName {
- data, err := Asset("runtime/colorschemes/" + name + ".micro")
- if err != nil {
- TermMessage("Unable to load pre-installed colorscheme " + name)
- continue
- }
+func LoadColorscheme(colorschemeName string) {
+ file := FindRuntimeFile(RTColorscheme, colorschemeName)
+ if file == nil {
+ TermMessage(colorschemeName, "is not a valid colorscheme")
+ } else {
+ if data, err := file.Data(); err != nil {
+ TermMessage("Error loading colorscheme:", err)
+ } else {
colorscheme = ParseColorscheme(string(data))
}
}
link := string(matches[1])
colors := string(matches[2])
- c[link] = StringToStyle(colors)
+ style := StringToStyle(colors)
+ c[link] = style
+
+ if link == "default" {
+ defStyle = style
+ }
+ if screen != nil {
+ screen.SetStyle(defStyle)
+ }
} else {
fmt.Println("Color-link statement is not valid:", line)
}
// The strings must be in the format "extra foregroundcolor,backgroundcolor"
// The 'extra' can be bold, reverse, or underline
func StringToStyle(str string) tcell.Style {
- var fg string
- bg := "default"
- split := strings.Split(str, ",")
+ var fg, bg string
+ spaceSplit := strings.Split(str, " ")
+ var split []string
+ if len(spaceSplit) > 1 {
+ split = strings.Split(spaceSplit[1], ",")
+ } else {
+ split = strings.Split(str, ",")
+ }
if len(split) > 1 {
fg, bg = split[0], split[1]
} else {
fg = strings.TrimSpace(fg)
bg = strings.TrimSpace(bg)
- style := tcell.StyleDefault.Foreground(StringToColor(fg)).Background(StringToColor(bg))
+ var fgColor, bgColor tcell.Color
+ if fg == "" {
+ fgColor, _, _ = defStyle.Decompose()
+ } else {
+ fgColor = StringToColor(fg)
+ }
+ if bg == "" {
+ _, bgColor, _ = defStyle.Decompose()
+ } else {
+ bgColor = StringToColor(bg)
+ }
+
+ style := defStyle.Foreground(fgColor).Background(bgColor)
if strings.Contains(str, "bold") {
style = style.Bold(true)
}