aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--aerc.go2
-rw-r--r--commands/set.go69
-rw-r--r--config/config.go109
3 files changed, 129 insertions, 51 deletions
diff --git a/aerc.go b/aerc.go
index a248e18..dafdd22 100644
--- a/aerc.go
+++ b/aerc.go
@@ -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 0000000..f5366ff
--- /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 d85c3c8..89d2b49 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