diff options
-rw-r--r-- | aerc.go | 2 | ||||
-rw-r--r-- | commands/set.go | 69 | ||||
-rw-r--r-- | config/config.go | 109 |
3 files changed, 129 insertions, 51 deletions
@@ -121,7 +121,7 @@ func main() { logger = log.New(logOut, "", log.LstdFlags) logger.Println("Starting up aerc") - conf, err := config.LoadConfig(nil, ShareDir) + conf, err := config.LoadConfigFromFile(nil, ShareDir) if err != nil { fmt.Printf("Failed to load config: %v\n", err) os.Exit(1) diff --git a/commands/set.go b/commands/set.go new file mode 100644 index 00000000..f5366ff3 --- /dev/null +++ b/commands/set.go @@ -0,0 +1,69 @@ +package commands + +import ( + "errors" + "strings" + + "git.sr.ht/~sircmpwn/aerc/widgets" + + "github.com/go-ini/ini" +) + +type Set struct{} + +func setUsage() string { + return "set <category>.<option> <value>" +} + +func init() { + register(Set{}) +} + +func (_ Set) Aliases() []string { + return []string{"set"} + +} + +func (_ Set) Complete(aerc *widgets.Aerc, args []string) []string { + return nil +} + +func SetCore(aerc *widgets.Aerc, args []string) error { + if len(args) != 3 { + return errors.New("Usage: " + setUsage()) + } + + config := aerc.Config() + + parameters := strings.Split(args[1], ".") + + if len(parameters) != 2 { + return errors.New("Usage: " + setUsage()) + } + + category := parameters[0] + option := parameters[1] + value := args[2] + + new_file := ini.Empty() + + section, err := new_file.NewSection(category) + + if err != nil { + return nil + } + + if _, err := section.NewKey(option, value); err != nil { + return err + } + + if err := config.LoadConfig(new_file); err != nil { + return err + } + + return nil +} + +func (_ Set) Execute(aerc *widgets.Aerc, args []string) error { + return SetCore(aerc, args) +} diff --git a/config/config.go b/config/config.go index d85c3c87..89d2b498 100644 --- a/config/config.go +++ b/config/config.go @@ -222,7 +222,61 @@ func installTemplate(root, sharedir, name string) error { return nil } -func LoadConfig(root *string, sharedir string) (*AercConfig, error) { +func (config *AercConfig) LoadConfig(file *ini.File) error { + if filters, err := file.GetSection("filters"); err == nil { + // TODO: Parse the filter more finely, e.g. parse the regex + for _, match := range filters.KeyStrings() { + cmd := filters.KeysHash()[match] + filter := FilterConfig{ + Command: cmd, + Filter: match, + } + if strings.Contains(match, ",~") { + filter.FilterType = FILTER_HEADER + header := filter.Filter[:strings.Index(filter.Filter, ",")] + regex := filter.Filter[strings.Index(filter.Filter, "~")+1:] + filter.Header = strings.ToLower(header) + filter.Regex, err = regexp.Compile(regex) + if err != nil { + panic(err) + } + } else if strings.ContainsRune(match, ',') { + filter.FilterType = FILTER_HEADER + header := filter.Filter[:strings.Index(filter.Filter, ",")] + value := filter.Filter[strings.Index(filter.Filter, ",")+1:] + filter.Header = strings.ToLower(header) + filter.Regex, err = regexp.Compile(regexp.QuoteMeta(value)) + } else { + filter.FilterType = FILTER_MIMETYPE + } + config.Filters = append(config.Filters, filter) + } + } + if viewer, err := file.GetSection("viewer"); err == nil { + if err := viewer.MapTo(&config.Viewer); err != nil { + return err + } + for key, val := range viewer.KeysHash() { + switch key { + case "alternatives": + config.Viewer.Alternatives = strings.Split(val, ",") + } + } + } + if compose, err := file.GetSection("compose"); err == nil { + if err := compose.MapTo(&config.Compose); err != nil { + return err + } + } + if ui, err := file.GetSection("ui"); err == nil { + if err := ui.MapTo(&config.Ui); err != nil { + return err + } + } + return nil +} + +func LoadConfigFromFile(root *string, sharedir string) (*AercConfig, error) { if root == nil { _root := path.Join(xdg.ConfigHome(), "aerc") root = &_root @@ -274,61 +328,16 @@ func LoadConfig(root *string, sharedir string) (*AercConfig, error) { } quit, _ := ParseBinding("<C-q>", ":quit<Enter>") config.Bindings.AccountWizard.Add(quit) - if filters, err := file.GetSection("filters"); err == nil { - // TODO: Parse the filter more finely, e.g. parse the regex - for _, match := range filters.KeyStrings() { - cmd := filters.KeysHash()[match] - filter := FilterConfig{ - Command: cmd, - Filter: match, - } - if strings.Contains(match, ",~") { - filter.FilterType = FILTER_HEADER - header := filter.Filter[:strings.Index(filter.Filter, ",")] - regex := filter.Filter[strings.Index(filter.Filter, "~")+1:] - filter.Header = strings.ToLower(header) - filter.Regex, err = regexp.Compile(regex) - if err != nil { - panic(err) - } - } else if strings.ContainsRune(match, ',') { - filter.FilterType = FILTER_HEADER - header := filter.Filter[:strings.Index(filter.Filter, ",")] - value := filter.Filter[strings.Index(filter.Filter, ",")+1:] - filter.Header = strings.ToLower(header) - filter.Regex, err = regexp.Compile(regexp.QuoteMeta(value)) - } else { - filter.FilterType = FILTER_MIMETYPE - } - config.Filters = append(config.Filters, filter) - } - } - if viewer, err := file.GetSection("viewer"); err == nil { - if err := viewer.MapTo(&config.Viewer); err != nil { - return nil, err - } - for key, val := range viewer.KeysHash() { - switch key { - case "alternatives": - config.Viewer.Alternatives = strings.Split(val, ",") - } - } - } - if compose, err := file.GetSection("compose"); err == nil { - if err := compose.MapTo(&config.Compose); err != nil { - return nil, err - } - } - if ui, err := file.GetSection("ui"); err == nil { - if err := ui.MapTo(&config.Ui); err != nil { - return nil, err - } + + if err = config.LoadConfig(file); err != nil { + return nil, err } if ui, err := file.GetSection("general"); err == nil { if err := ui.MapTo(&config.General); err != nil { return nil, err } } + accountsPath := path.Join(*root, "accounts.conf") if accounts, err := loadAccountConfig(accountsPath); err != nil { return nil, err |