Load UI configuration
This commit is contained in:
parent
aeb700577b
commit
39c93d2897
2
Makefile
2
Makefile
|
@ -21,4 +21,4 @@ aerc: .go
|
|||
clean:
|
||||
rm -rf .go aerc
|
||||
|
||||
.PHONY: get test clean
|
||||
.PHONY: aerc get test clean
|
||||
|
|
|
@ -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)
|
||||
}
|
||||
|
|
|
@ -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).
|
|
@ -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
|
|
@ -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 New Issue