]> git.lizzy.rs Git - micro.git/blobdiff - internal/config/settings.go
Fix v2 import path for go mod
[micro.git] / internal / config / settings.go
index b7cdaa691250fd15c8f8024d0738060b69469aff..0c24987bb8fc965596dc103f292c194cf7c8d024 100644 (file)
@@ -5,13 +5,14 @@ import (
        "errors"
        "io/ioutil"
        "os"
+       "path/filepath"
        "reflect"
        "strconv"
        "strings"
 
-       "github.com/flynn/json5"
        "github.com/zyedidia/glob"
-       "github.com/zyedidia/micro/internal/util"
+       "github.com/zyedidia/json5"
+       "github.com/zyedidia/micro/v2/internal/util"
        "golang.org/x/text/encoding/htmlindex"
 )
 
@@ -28,6 +29,10 @@ var (
        parsedSettings map[string]interface{}
 )
 
+func init() {
+       parsedSettings = make(map[string]interface{})
+}
+
 // Options with validators
 var optionValidators = map[string]optionValidator{
        "autosave":     validateNonNegativeValue,
@@ -41,7 +46,7 @@ var optionValidators = map[string]optionValidator{
 }
 
 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 {
@@ -53,6 +58,18 @@ func ReadSettings() error {
                        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
@@ -115,12 +132,22 @@ func WriteSettings(filename string) error {
        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())
                }
@@ -130,16 +157,22 @@ func RegisterCommonOption(name string, defaultvalue interface{}) 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
 }
@@ -151,19 +184,21 @@ func GetGlobalOption(name string) interface{} {
 
 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,
+       "eofnewline":     true,
+       "fastdirty":      false,
        "fileformat":     "unix",
        "filetype":       "unknown",
        "ignorecase":     false,
        "indentchar":     " ",
        "keepautoindent": false,
-       "matchbrace":     false,
-       "matchbraceleft": false,
+       "matchbrace":     true,
        "mkparents":      false,
        "readonly":       false,
        "rmtrailingws":   false,
@@ -177,8 +212,8 @@ var defaultCommonSettings = map[string]interface{}{
        "softwrap":       false,
        "splitbottom":    true,
        "splitright":     true,
-       "statusformatl":  "$(filename) $(modified)($(line),$(col)) $(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,
@@ -208,15 +243,26 @@ func DefaultCommonSettings() map[string]interface{} {
        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
@@ -226,7 +272,7 @@ func DefaultGlobalSettings() map[string]interface{} {
        for k, v := range defaultCommonSettings {
                globalsettings[k] = v
        }
-       for k, v := range defaultGlobalSettings {
+       for k, v := range DefaultGlobalOnlySettings {
                globalsettings[k] = v
        }
        return globalsettings
@@ -239,12 +285,13 @@ func DefaultAllSettings() map[string]interface{} {
        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()