"errors"
"io/ioutil"
"os"
+ "path/filepath"
"reflect"
"strconv"
"strings"
- "github.com/flynn/json5"
"github.com/zyedidia/glob"
+ "github.com/zyedidia/json5"
"github.com/zyedidia/micro/internal/util"
"golang.org/x/text/encoding/htmlindex"
)
}
func ReadSettings() error {
- filename := ConfigDir + "/settings.json"
+ filename := filepath.Join(ConfigDir, "settings.json")
if _, e := os.Stat(filename); e == nil {
input, err := ioutil.ReadFile(filename)
if err != nil {
if err != nil {
return errors.New("Error reading settings.json: " + err.Error())
}
+
+ // check if autosave is a boolean and convert it to float if so
+ if v, ok := parsedSettings["autosave"]; ok {
+ s, ok := v.(bool)
+ if ok {
+ if s {
+ parsedSettings["autosave"] = 8.0
+ } else {
+ parsedSettings["autosave"] = 0.0
+ }
+ }
+ }
}
}
return nil
return err
}
-// RegisterCommonOption creates a new option. This is meant to be called by plugins to add options.
-func RegisterCommonOption(name string, defaultvalue interface{}) error {
+func OverwriteSettings(filename string) error {
+ var err error
+ if _, e := os.Stat(ConfigDir); e == nil {
+ txt, _ := json.MarshalIndent(GlobalSettings, "", " ")
+ err = ioutil.WriteFile(filename, append(txt, '\n'), 0644)
+ }
+ return err
+}
+
+// RegisterCommonOptionPlug creates a new option (called pl.name). This is meant to be called by plugins to add options.
+func RegisterCommonOptionPlug(pl string, name string, defaultvalue interface{}) error {
+ name = pl + "." + name
if v, ok := GlobalSettings[name]; !ok {
defaultCommonSettings[name] = defaultvalue
GlobalSettings[name] = defaultvalue
- err := WriteSettings(ConfigDir + "/settings.json")
+ err := WriteSettings(filepath.Join(ConfigDir, "settings.json"))
if err != nil {
return errors.New("Error writing settings.json file: " + err.Error())
}
return nil
}
+// RegisterGlobalOptionPlug creates a new global-only option (named pl.name)
+func RegisterGlobalOptionPlug(pl string, name string, defaultvalue interface{}) error {
+ return RegisterGlobalOption(pl+"."+name, defaultvalue)
+}
+
+// RegisterGlobalOption creates a new global-only option
func RegisterGlobalOption(name string, defaultvalue interface{}) error {
if v, ok := GlobalSettings[name]; !ok {
- defaultGlobalSettings[name] = defaultvalue
+ DefaultGlobalOnlySettings[name] = defaultvalue
GlobalSettings[name] = defaultvalue
- err := WriteSettings(ConfigDir + "/settings.json")
+ err := WriteSettings(filepath.Join(ConfigDir, "settings.json"))
if err != nil {
return errors.New("Error writing settings.json file: " + err.Error())
}
} else {
- defaultGlobalSettings[name] = v
+ DefaultGlobalOnlySettings[name] = v
}
return nil
}
var defaultCommonSettings = map[string]interface{}{
"autoindent": true,
+ "autosu": false,
+ "backup": true,
"basename": false,
"colorcolumn": float64(0),
"cursorline": true,
+ "diffgutter": false,
"encoding": "utf-8",
"eofnewline": false,
- "fastdirty": true,
+ "fastdirty": false,
"fileformat": "unix",
"filetype": "unknown",
"ignorecase": false,
"softwrap": false,
"splitbottom": true,
"splitright": true,
- "statusformatl": "$(filename) $(modified)($(line),$(col)) | ft:$(opt:filetype) | $(opt:fileformat) | $(opt:encoding)",
- "statusformatr": "$(bind:ToggleKeyMenu): show bindings, $(bind:ToggleHelp): toggle help",
+ "statusformatl": "$(filename) $(modified)($(line),$(col)) $(status.paste)| ft:$(opt:filetype) | $(opt:fileformat) | $(opt:encoding)",
+ "statusformatr": "$(bind:ToggleKeyMenu): bindings, $(bind:ToggleHelp): help",
"statusline": true,
"syntax": true,
"tabmovement": false,
return commonsettings
}
-var defaultGlobalSettings = map[string]interface{}{
- "autosave": float64(0),
- "colorscheme": "default",
- "infobar": true,
- "keymenu": false,
- "mouse": true,
- "savehistory": true,
- "sucmd": "sudo",
- "termtitle": false,
+// a list of settings that should only be globally modified and their
+// default values
+var DefaultGlobalOnlySettings = map[string]interface{}{
+ "autosave": float64(0),
+ "colorscheme": "default",
+ "infobar": true,
+ "keymenu": false,
+ "mouse": true,
+ "paste": false,
+ "savehistory": true,
+ "sucmd": "sudo",
+ "pluginchannels": []string{"https://raw.githubusercontent.com/micro-editor/plugin-channel/master/channel.json"},
+ "pluginrepos": []string{},
+ "xterm": false,
+}
+
+// a list of settings that should never be globally modified
+var LocalSettings = []string{
+ "filetype",
+ "readonly",
}
// DefaultGlobalSettings returns the default global settings for micro
for k, v := range defaultCommonSettings {
globalsettings[k] = v
}
- for k, v := range defaultGlobalSettings {
+ for k, v := range DefaultGlobalOnlySettings {
globalsettings[k] = v
}
return globalsettings
for k, v := range defaultCommonSettings {
allsettings[k] = v
}
- for k, v := range defaultGlobalSettings {
+ for k, v := range DefaultGlobalOnlySettings {
allsettings[k] = v
}
return allsettings
}
+// GetNativeValue parses and validates a value for a given option
func GetNativeValue(option string, realValue interface{}, value string) (interface{}, error) {
var native interface{}
kind := reflect.TypeOf(realValue).Kind()