From 39c93d2897af5bb0c145ef4f99f542bf42babdab Mon Sep 17 00:00:00 2001 From: Drew DeVault Date: Tue, 9 Jan 2018 19:18:19 -0500 Subject: [PATCH] Load UI configuration --- Makefile | 2 +- cmd/aerc/main.go | 11 ++- config/accounts.conf | 17 ++++ config/aerc.conf | 179 +++++++++++++++++++++++++++++++++++++++++++ config/config.go | 85 ++++++++++++++++++++ 5 files changed, 292 insertions(+), 2 deletions(-) create mode 100644 config/accounts.conf create mode 100644 config/aerc.conf create mode 100644 config/config.go diff --git a/Makefile b/Makefile index 064c86b..fed3d69 100644 --- a/Makefile +++ b/Makefile @@ -21,4 +21,4 @@ aerc: .go clean: rm -rf .go aerc -.PHONY: get test clean +.PHONY: aerc get test clean diff --git a/cmd/aerc/main.go b/cmd/aerc/main.go index 24dcac8..96a8e0c 100644 --- a/cmd/aerc/main.go +++ b/cmd/aerc/main.go @@ -2,8 +2,17 @@ package main import ( "fmt" + + "git.sr.ht/~sircmpwn/aerc2/config" ) func main() { - fmt.Println("Hello world") + var ( + c *config.AercConfig + err error + ) + if c, err = config.LoadConfig(nil); err != nil { + panic(err) + } + fmt.Printf("%+v\n", *c) } diff --git a/config/accounts.conf b/config/accounts.conf new file mode 100644 index 0000000..a25c64e --- /dev/null +++ b/config/accounts.conf @@ -0,0 +1,17 @@ +# +# aerc accounts configuration +# +# This file configures each of the available mail accounts. + +# You may add an arbitrary number of sections like so: +# +# [Personal] +# source=imaps://username[:password]@hostname[:port] +# +# [Work] +# source=imaps://username[:password]@hostname[:port] +# folders=INBOX,Sent,Archives +# default=Archives +# +# Each supported protocol may have some arbitrary number of extra configuration +# options. See aerc-[protocol](5) for details (i.e. aerc-imap). diff --git a/config/aerc.conf b/config/aerc.conf new file mode 100644 index 0000000..76b0310 --- /dev/null +++ b/config/aerc.conf @@ -0,0 +1,179 @@ +# +# aerc main configuration + +[ui] +# +# Describes the format for each row in a mailbox view. This field is compatible +# with mutt's printf-like syntax. TODO: document properly +# +# Default: +index-format=%4C %Z %D %-17.17n %s + +# +# See strftime(3) +# +# Default: %F %l:%M %p (ISO 8501 + 12 hour time) +timestamp-format=%F %l:%M %p + +# +# Which headers to show when viewing an email. +# +# Default: From,To,Cc,Bcc,Subject,Date +show-headers=From,To,Cc,Bcc,Subject,Date + +# +# The frames of animation to use in the UI for things that are still loading. +# Seperate each frame with a comma. +# +# Default: "[..] , [..] , [..], [..] " (note extra spaces) +loading-frames=[..] , [..] , [..], [..] + +# +# One of "on", "off", or "auto". +# +# Default: auto +render-account-tabs=auto + +# +# Width of the sidebar, including the border. +# +# Default: 20 +sidebar-width=20 + +# +# Height of the message preview, including the border. +# +# Default: 12 +preview-height=12 + +# +# Message to display when viewing an empty folder. +# +# Default: (no messages) +empty-message=(no messages) + +[viewer] +# +# We can use different programs to display various kinds of email attachments. +# These programs will have the mail piped into them and are expected to output +# it ready to display on a terminal (you can include terminal control +# characters if you like, for colors and such). Emails will be stripped of +# non-printable characters before being piped into these commands, and will be +# encoded with UTF-8. These commands are invoked with sh and run +# non-interactively, and their output is piped into your pager command +# (interactively). The following environment variables will be set: +# +# $WIDTH: the width of the terminal window +# $HEIGHT: the height of the terminal window +# $MIMETYPE: the email's mimetype +# +# You can use * as a wildcard for any subtype of a given mimetype. When +# displaying a text/* message and no command matches, the message will just be +# piped directly into your pager (after being stripped of non-printable +# characters). + +# Examples: +# +#text/html=w3m -T text/html -cols $WIDTH -dump -o display_image=false -o display_link_number=true +text/*=fold -sw $WIDTH + +# +# Default: less -r +pager=less -r + +# +# If an email offers several versions (multipart), you can configure which +# mimetype to prefer. For example, this can be used to prefer plaintext over +# html emails. +# +# Default: text/plain,text/html +alternatives=text/plain,text/html + +[lbinds] +# +# Binds are of the form = +# To use '=' in a key sequence, substitute it with "Eq": "" +# If you wish to bind #, you can wrap the key sequence in quotes: "#" = quit +# +# lbinds are bindings that take effect in the list view +# mbinds are bindings that take effect in the message view +q=:quit +=:quit + +j=:next-message +=:next-message +=:next-message --scroll 50% +=:next-message --scroll 100% +=:next-message --scroll 100% +=:next-message --scroll 1 + +k=:previous-message +=:previous-message +=:previous-message --scroll 50% +=:previous-message --scroll 100% +=:previous-message --scroll 100% +=:previous-message --scroll 1 +g=:select-message 0 +G=:select-message -1 + +J=:next-folder +K=:previous-folder +l = :next-account + = :next-account +h = :previous-account + = :previous-account + +=:view-message +d=:confirm 'Really delete this message?' ':delete-message' + +c=:cd +$=:term-exec + +[mbinds] +# +# Any key not bound is passed through to the sub-terminal. + + = :previous-account + = :next-account + +[colors] +# +# Colors are configured in one of two ways: +# +# "foreground" or "background:foreground" +# +# You can specify colors according to the base 8 names: +# default, black, red, green, yellow, blue, magenta, cyan, white +# +# or you can use numbers for the 256 color palette, +# e.g. "127:118" (a particularly ugly combination FYI) +# +# Add one or more of the following characters to the beginning +# of the foreground color to add modifiers: +# +# * bold +# _ underline +# ^ reverse +# +# e.g. "default:_*^default" would reverse the default colors and +# with bold and underlined modifiers +borders=default:^default +loading-indicator=default:default + +account-unselected=white:black +account-selected=default:default +account-error=red:black + +folder-unselected=default:default +folder-selected=white:black + +status-line=white:black +status-line-error=red:black + +ex-line=default:default + +message-list-selected=white:black +message-list-selected-unread=white:_black +message-list-unselected=default:default +message-list-unselected-unread=default:*default +message-list-empty=default:default diff --git a/config/config.go b/config/config.go new file mode 100644 index 0000000..b620258 --- /dev/null +++ b/config/config.go @@ -0,0 +1,85 @@ +package config + +import ( + "github.com/go-ini/ini" + "github.com/kyoh86/xdg" + + "path" + "unicode" +) + +type UIConfig struct { + IndexFormat string + TimestampFormat string + ShowHeaders []string `delim:","` + LoadingFrames []string `delim:","` + RenderAccountTabs string + SidebarWidth int + PreviewHeight int + EmptyMessage string +} + +type AccountConfig struct { + ConfigPath string + Name string + Source string + Folders []string + Params map[string]string +} + +type AercConfig struct { + Ini *ini.File `ini:"-"` + Accounts []AccountConfig `ini:"-"` + Ui UIConfig +} + +// Input: TimestampFormat +// Output: timestamp-format +func mapName(raw string) string { + newstr := make([]rune, 0, len(raw)) + for i, chr := range raw { + if isUpper := 'A' <= chr && chr <= 'Z'; isUpper { + if i > 0 { + newstr = append(newstr, '-') + } + } + newstr = append(newstr, unicode.ToLower(chr)) + } + return string(newstr) +} + +func LoadConfig(root *string) (*AercConfig, error) { + var ( + err error + file *ini.File + ) + if root == nil { + _root := path.Join(xdg.ConfigHome(), "aerc") + root = &_root + } + if file, err = ini.Load(path.Join(*root, "aerc.conf")); err != nil { + return nil, err + } + file.NameMapper = mapName + config := &AercConfig{ + Ini: file, + Ui: UIConfig{ + IndexFormat: "%4C %Z %D %-17.17n %s", + TimestampFormat: "%F %l:%M %p", + ShowHeaders: []string{ + "From", "To", "Cc", "Bcc", "Subject", "Date", + }, + LoadingFrames: []string{ + "[..] ", " [..] ", " [..]", " [..] ", + }, + RenderAccountTabs: "auto", + SidebarWidth: 20, + PreviewHeight: 12, + EmptyMessage: "(no messages)", + }, + } + if ui, err := file.GetSection("ui"); err != nil { + ui.MapTo(config.Ui) + } + return config, nil +}