12 // The options that the user can set
13 var settings map[string]interface{}
15 // InitSettings initializes the options map and sets all options to their default values
17 defaults := DefaultSettings()
18 var parsed map[string]interface{}
20 filename := configDir + "/settings.json"
21 if _, e := os.Stat(filename); e == nil {
22 input, err := ioutil.ReadFile(filename)
24 TermMessage("Error reading settings.json file: " + err.Error())
28 err = json.Unmarshal(input, &parsed)
30 TermMessage("Error reading settings.json:", err.Error())
34 settings = make(map[string]interface{})
35 for k, v := range defaults {
38 for k, v := range parsed {
42 err := WriteSettings(filename)
44 TermMessage("Error writing settings.json file: " + err.Error())
48 // WriteSettings writes the settings to the specified filename as JSON
49 func WriteSettings(filename string) error {
51 if _, e := os.Stat(configDir); e == nil {
52 txt, _ := json.MarshalIndent(settings, "", " ")
53 err = ioutil.WriteFile(filename, txt, 0644)
58 // AddOption creates a new option. This is meant to be called by plugins to add options.
59 func AddOption(name string, value interface{}) {
60 settings[name] = value
61 err := WriteSettings(configDir + "/settings.json")
63 TermMessage("Error writing settings.json file: " + err.Error())
67 // GetOption returns the specified option. This is meant to be called by plugins to add options.
68 func GetOption(name string) interface{} {
72 // DefaultSettings returns the default settings for micro
73 func DefaultSettings() map[string]interface{} {
74 return map[string]interface{}{
76 "colorscheme": "monokai",
83 "scrollspeed": float64(2),
84 "scrollmargin": float64(3),
87 "tabsize": float64(4),
88 "tabstospaces": false,
92 // SetOption prompts the user to set an option and checks that the response is valid
93 func SetOption(view *View, args []string) {
94 filename := configDir + "/settings.json"
96 option := strings.TrimSpace(args[0])
97 value := strings.TrimSpace(args[1])
99 if _, ok := settings[option]; !ok {
100 messenger.Error(option + " is not a valid option")
104 kind := reflect.TypeOf(settings[option]).Kind()
105 if kind == reflect.Bool {
106 b, err := ParseBool(value)
108 messenger.Error("Invalid value for " + option)
112 } else if kind == reflect.String {
113 settings[option] = value
114 } else if kind == reflect.Float64 {
115 i, err := strconv.Atoi(value)
117 messenger.Error("Invalid value for " + option)
120 settings[option] = float64(i)
123 if option == "colorscheme" {
125 view.Buf.UpdateRules()
128 if option == "statusline" {
129 view.Resize(screen.Size())
132 err := WriteSettings(filename)
134 messenger.Error("Error writing to settings.json: " + err.Error())
138 messenger.Error("No value given")