Load UI configuration
This commit is contained in:
parent
aeb700577b
commit
39c93d2897
5 changed files with 292 additions and 2 deletions
2
Makefile
2
Makefile
|
@ -21,4 +21,4 @@ aerc: .go
|
||||||
clean:
|
clean:
|
||||||
rm -rf .go aerc
|
rm -rf .go aerc
|
||||||
|
|
||||||
.PHONY: get test clean
|
.PHONY: aerc get test clean
|
||||||
|
|
|
@ -2,8 +2,17 @@ package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
|
|
||||||
|
"git.sr.ht/~sircmpwn/aerc2/config"
|
||||||
)
|
)
|
||||||
|
|
||||||
func main() {
|
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)
|
||||||
}
|
}
|
||||||
|
|
17
config/accounts.conf
Normal file
17
config/accounts.conf
Normal file
|
@ -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).
|
179
config/aerc.conf
Normal file
179
config/aerc.conf
Normal file
|
@ -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 <key sequence> = <command to run>
|
||||||
|
# To use '=' in a key sequence, substitute it with "Eq": "<Ctrl+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<Enter>
|
||||||
|
<Ctrl+c>=:quit<Enter>
|
||||||
|
|
||||||
|
j=:next-message<Enter>
|
||||||
|
<Down>=:next-message<Enter>
|
||||||
|
<Ctrl+d>=:next-message --scroll 50%<Enter>
|
||||||
|
<Ctrl+f>=:next-message --scroll 100%<Enter>
|
||||||
|
<PageDown>=:next-message --scroll 100%<Enter>
|
||||||
|
<WheelDown>=:next-message --scroll 1<Enter>
|
||||||
|
|
||||||
|
k=:previous-message<Enter>
|
||||||
|
<Up>=:previous-message<Enter>
|
||||||
|
<Ctrl+u>=:previous-message --scroll 50%<Enter>
|
||||||
|
<Ctrl+b>=:previous-message --scroll 100%<Enter>
|
||||||
|
<PageUp>=:previous-message --scroll 100%<Enter>
|
||||||
|
<WheelUp>=:previous-message --scroll 1<Enter>
|
||||||
|
g=:select-message 0<Enter>
|
||||||
|
G=:select-message -1<Enter>
|
||||||
|
|
||||||
|
J=:next-folder<Enter>
|
||||||
|
K=:previous-folder<Enter>
|
||||||
|
l = :next-account<Enter>
|
||||||
|
<Right> = :next-account<Enter>
|
||||||
|
h = :previous-account<Enter>
|
||||||
|
<Left> = :previous-account<Enter>
|
||||||
|
|
||||||
|
<Enter>=:view-message<Enter>
|
||||||
|
d=:confirm 'Really delete this message?' ':delete-message<Enter>'<Enter>
|
||||||
|
|
||||||
|
c=:cd
|
||||||
|
$=:term-exec
|
||||||
|
|
||||||
|
[mbinds]
|
||||||
|
#
|
||||||
|
# Any key not bound is passed through to the sub-terminal.
|
||||||
|
|
||||||
|
<Ctrl+h> = :previous-account<Enter>
|
||||||
|
<Ctrl+l> = :next-account<Enter>
|
||||||
|
|
||||||
|
[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
|
85
config/config.go
Normal file
85
config/config.go
Normal file
|
@ -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
|
||||||
|
}
|
Loading…
Reference in a new issue