Add support for making buffer local options in settings.json

This commit is contained in:
Zachary Yedidia 2016-08-25 20:15:58 -04:00
parent e634b4e180
commit b4e470b6e2
5 changed files with 97 additions and 10 deletions

View file

@ -93,6 +93,8 @@ func NewBuffer(txt []byte, path string) *Buffer {
buf: b,
}
InitLocalSettings(b)
if b.Settings["savecursor"].(bool) || b.Settings["saveundo"].(bool) {
// If either savecursor or saveundo is turned on, we need to load the serialized information
// from ~/.config/micro/buffers

View file

@ -210,7 +210,7 @@ func main() {
InitConfigDir()
// Load the user's settings
InitSettings()
InitGlobalSettings()
InitCommands()
InitBindings()

File diff suppressed because one or more lines are too long

View file

@ -7,13 +7,16 @@ import (
"os"
"reflect"
"strconv"
"strings"
"github.com/zyedidia/glob"
)
// The options that the user can set
var globalSettings map[string]interface{}
// InitSettings initializes the options map and sets all options to their default values
func InitSettings() {
// InitGlobalSettings initializes the options map and sets all options to their default values
func InitGlobalSettings() {
defaults := DefaultGlobalSettings()
var parsed map[string]interface{}
@ -36,12 +39,52 @@ func InitSettings() {
globalSettings[k] = v
}
for k, v := range parsed {
globalSettings[k] = v
if !strings.HasPrefix(reflect.TypeOf(v).String(), "map") {
globalSettings[k] = v
}
}
err := WriteSettings(filename)
if err != nil {
TermMessage("Error writing settings.json file: " + err.Error())
if _, err := os.Stat(filename); os.IsNotExist(err) {
err := WriteSettings(filename)
if err != nil {
TermMessage("Error writing settings.json file: " + err.Error())
}
}
}
// InitLocalSettings scans the json in settings.json and sets the options locally based
// on whether the buffer matches the glob
func InitLocalSettings(buf *Buffer) {
var parsed map[string]interface{}
filename := configDir + "/settings.json"
if _, e := os.Stat(filename); e == nil {
input, err := ioutil.ReadFile(filename)
if err != nil {
TermMessage("Error reading settings.json file: " + err.Error())
return
}
err = json.Unmarshal(input, &parsed)
if err != nil {
TermMessage("Error reading settings.json:", err.Error())
}
}
for k, v := range parsed {
if strings.HasPrefix(reflect.TypeOf(v).String(), "map") {
g, err := glob.Compile(k)
if err != nil {
TermMessage("Error with glob setting ", k, ": ", err)
continue
}
if g.MatchString(buf.Path) {
for k1, v1 := range v.(map[string]interface{}) {
buf.Settings[k1] = v1
}
}
}
}
}
@ -49,7 +92,30 @@ func InitSettings() {
func WriteSettings(filename string) error {
var err error
if _, e := os.Stat(configDir); e == nil {
txt, _ := json.MarshalIndent(globalSettings, "", " ")
var parsed map[string]interface{}
filename := configDir + "/settings.json"
if _, e := os.Stat(filename); e == nil {
input, err := ioutil.ReadFile(filename)
if err != nil {
return err
}
err = json.Unmarshal(input, &parsed)
if err != nil {
TermMessage("Error reading settings.json:", err.Error())
}
}
for k, v := range parsed {
if !strings.HasPrefix(reflect.TypeOf(v).String(), "map") {
if _, ok := globalSettings[k]; ok {
parsed[k] = globalSettings[k]
}
}
}
txt, _ := json.MarshalIndent(parsed, "", " ")
err = ioutil.WriteFile(filename, txt, 0644)
}
return err

View file

@ -131,3 +131,22 @@ in all buffers.
The `colorscheme` option is global only, and the `filetype` option is local only. To
set an option locally, use `setlocal` instead of `set`.
In the `settings.json` file you can also put set options locally by specifying a glob.
Here is an example which has `tabstospaces` on for all files except Go files, and
`tabsize` 4 for all files except Ruby files:
```
{
"*.go": {
"tabstospaces": false
},
"*.rb": {
"tabsize": 2
}
"tabstospaces": true,
"tabsize": 4,
}
```
As you can see it is quite easy to set options locally using the `settings.json` file.