aboutsummaryrefslogtreecommitdiff
path: root/config/statusline.go
diff options
context:
space:
mode:
Diffstat (limited to 'config/statusline.go')
-rw-r--r--config/statusline.go138
1 files changed, 133 insertions, 5 deletions
diff --git a/config/statusline.go b/config/statusline.go
index 483241c0..7cc2140c 100644
--- a/config/statusline.go
+++ b/config/statusline.go
@@ -1,21 +1,50 @@
package config
import (
+ "regexp"
+ "strings"
+
+ "git.sr.ht/~rjarry/aerc/lib/templates"
"git.sr.ht/~rjarry/aerc/log"
"github.com/go-ini/ini"
)
type StatuslineConfig struct {
+ StatusColumns []*ColumnDef `ini:"-"`
+ ColumnSeparator string `ini:"column-separator"`
+ Separator string `ini:"separator"`
+ DisplayMode string `ini:"display-mode"`
+ // deprecated
RenderFormat string `ini:"render-format"`
- Separator string
- DisplayMode string `ini:"display-mode"`
}
func defaultStatuslineConfig() *StatuslineConfig {
+ left, _ := templates.ParseTemplate("column-left", `[{{.Account}}] {{.StatusInfo}}`)
+ center, _ := templates.ParseTemplate("column-center", `{{.PendingKeys}}`)
+ right, _ := templates.ParseTemplate("column-right", `{{.TrayInfo}}`)
return &StatuslineConfig{
- RenderFormat: "[%a] %S %>%T",
- Separator: " | ",
- DisplayMode: "",
+ StatusColumns: []*ColumnDef{
+ {
+ Name: "left",
+ Template: left,
+ Flags: ALIGN_LEFT | WIDTH_AUTO,
+ },
+ {
+ Name: "center",
+ Template: center,
+ Flags: ALIGN_CENTER | WIDTH_FIT,
+ },
+ {
+ Name: "right",
+ Template: right,
+ Flags: ALIGN_RIGHT | WIDTH_AUTO,
+ },
+ },
+ ColumnSeparator: " ",
+ Separator: " | ",
+ DisplayMode: "text",
+ // deprecated
+ RenderFormat: "",
}
}
@@ -29,7 +58,106 @@ func parseStatusline(file *ini.File) error {
if err := statusline.MapTo(&Statusline); err != nil {
return err
}
+
+ if key, err := statusline.GetKey("status-columns"); err == nil {
+ columns, err := ParseColumnDefs(key, statusline)
+ if err != nil {
+ return err
+ }
+ Statusline.StatusColumns = columns
+ } else if Statusline.RenderFormat != "" {
+ columns, err := convertRenderFormat()
+ if err != nil {
+ return err
+ }
+ Statusline.StatusColumns = columns
+ log.Warnf("%s %s",
+ "The [statusline] render-format setting has been replaced by status-columns.",
+ "render-format will be removed in aerc 0.17.")
+ Warnings = append(Warnings, Warning{
+ Title: "DEPRECATION WARNING: [statusline].render-format",
+ Body: `
+The render-format setting is deprecated. It has been replaced by status-columns.
+
+Your configuration in this instance was automatically converted to:
+
+[statusline]
+` + ColumnDefsToIni(columns, "status-columns") + `
+Your configuration file was not changed. To make this change permanent and to
+dismiss this deprecation warning on launch, copy the above lines into aerc.conf
+and remove index-format from it. See aerc-config(5) for more details.
+
+index-format will be removed in aerc 0.17.
+`,
+ })
+ }
+
out:
log.Debugf("aerc.conf: [statusline] %#v", Statusline)
return nil
}
+
+var (
+ renderFmtRe = regexp.MustCompile(`%(-?\d+)?(\.\d+)?[acdmSTp]`)
+ statuslineMute = false
+)
+
+func convertRenderFormat() ([]*ColumnDef, error) {
+ var columns []*ColumnDef
+
+ tokens := strings.Split(Statusline.RenderFormat, "%>")
+
+ left := renderFmtRe.ReplaceAllStringFunc(
+ tokens[0], renderVerbToTemplate)
+ left = strings.TrimSpace(left)
+ t, err := templates.ParseTemplate("column-left", left)
+ if err != nil {
+ return nil, err
+ }
+ columns = append(columns, &ColumnDef{
+ Name: "left",
+ Template: t,
+ Flags: ALIGN_LEFT | WIDTH_AUTO,
+ })
+
+ if len(tokens) == 2 {
+ right := renderFmtRe.ReplaceAllStringFunc(
+ tokens[1], renderVerbToTemplate)
+ right = strings.TrimSpace(right)
+ t, err := templates.ParseTemplate("column-right", right)
+ if err != nil {
+ return nil, err
+ }
+ columns = append(columns, &ColumnDef{
+ Name: "right",
+ Template: t,
+ Flags: ALIGN_RIGHT | WIDTH_AUTO,
+ })
+ }
+
+ if statuslineMute {
+ columns = nil
+ }
+
+ return columns, nil
+}
+
+func renderVerbToTemplate(verb string) (template string) {
+ switch verb[len(verb)-1] {
+ case 'a':
+ template = `{{.Account}}`
+ case 'c':
+ template = `{{.ConnectionInfo}}`
+ case 'd':
+ template = `{{.Folder}}`
+ case 'S':
+ template = `{{.StatusInfo}}`
+ case 'T':
+ template = `{{.TrayInfo}}`
+ case 'p':
+ template = `{{cwd}}`
+ case 'm':
+ statuslineMute = true
+ }
+ return template
+}