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:"status-columns" parse:"ParseColumns" default:"left<*,center>=,right>*"` ColumnSeparator string `ini:"column-separator" default:" "` Separator string `ini:"separator" default:" | "` DisplayMode string `ini:"display-mode" default:"text"` } var Statusline = new(StatuslineConfig) func parseStatusline(file *ini.File) error { statusline := file.Section("statusline") if err := MapToStruct(statusline, Statusline, true); err != nil { return err } if key, err := statusline.GetKey("render-format"); err == nil { columns, err := convertRenderFormat(key.String()) 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 render-format from it. See aerc-config(5) for more details. render-format will be removed in aerc 0.17. `, }) } log.Debugf("aerc.conf: [statusline] %#v", Statusline) return nil } func (s *StatuslineConfig) ParseColumns(sec *ini.Section, key *ini.Key) ([]*ColumnDef, error) { if !sec.HasKey("column-left") { _, _ = sec.NewKey("column-left", "[{{.Account}}] {{.StatusInfo}}") } if !sec.HasKey("column-center") { _, _ = sec.NewKey("column-center", "{{.PendingKeys}}") } if !sec.HasKey("column-right") { _, _ = sec.NewKey("column-right", "{{.TrayInfo}}") } return ParseColumnDefs(key, sec) } var ( renderFmtRe = regexp.MustCompile(`%(-?\d+)?(\.\d+)?[acdmSTp]`) statuslineMute = false ) func convertRenderFormat(renderFormat string) ([]*ColumnDef, error) { var columns []*ColumnDef tokens := strings.Split(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 }