tvl-depot/users/Profpatsch/aerc.dhall
Profpatsch 3c3713c69f refactor(users/Profpatsch/aerc): move ini stuff out
First shot at generating a dhall FFI standard.

Change-Id: I1cdf7eeaa6b2668a49282315f308a8e51abd0cf6
Reviewed-on: https://cl.tvl.fyi/c/depot/+/5887
Reviewed-by: Profpatsch <mail@profpatsch.de>
Tested-by: BuildkiteCI
2022-06-19 13:29:02 +00:00

139 lines
5 KiB
Text

let Lib = ./dhall/lib.dhall
let List/map = Lib.List/map
let Ini = ./ini/ini.dhall
in λ ( imports
: { -- Take an aerc filter from the aerc distribution /share directory
aercFilter : Text → Text
, Ini/externs : Ini.Externs
}
) →
{ accounts =
imports.Ini/externs.renderIni
{ globalSection = [] : Ini.Section
, sections =
[ { name = "mail"
, value =
[ { name = "archive", value = "Archive" }
, { name = "copy-to", value = "Sent" }
, { name = "default", value = "INBOX" }
, { name = "from", value = "Profpatsch <mail@profpatsch.de>" }
, { name = "source", value = "maildir://~/.Mail/mail" }
, { name = "postpone", value = "Drafts" }
]
}
]
}
, aerc =
imports.Ini/externs.renderIni
{ globalSection = [] : Ini.Section
, sections =
[ { name = "filters"
, value =
[ { name = "text/html", value = imports.aercFilter "html" }
, let _ = "-- TODO: this awk should be taken from nix!"
in { name = "text/*"
, value = "awk -f ${imports.aercFilter "plaintext"}"
}
]
}
]
}
, binds =
let
-- keybinding and command to run
Key =
{ ctrl : Bool, key : Text, cmd : Text }
in let
-- render a key to config format
renderKey =
λ(k : Key) →
if k.ctrl
then { name = "<C-${k.key}>", value = k.cmd }
else { name = k.key, value = k.cmd }
let
-- render a list of keys to config format
renderKeys =
λ(keys : List Key) →
List/map Key (Ini.NameVal Text) renderKey keys
let
-- create a section whith a name and a list of keys
sect =
λ(section : Text) →
λ(keys : List Key) →
{ name = section, value = renderKeys keys }
let
-- set key without modifiers
key =
λ(key : Text) → { key }
let
-- set special key without modifiers
special =
λ(key : Text) → { key = "<${key}>" }
let
-- no modifier
none =
{ ctrl = False }
let
-- set control key
ctrl =
{ ctrl = True }
let
-- set a command to execute
cmd =
λ(cmd : Text) → { cmd = ":${cmd}<Enter>" }
let
-- set a command, but stay on the prompt
prompt =
λ(cmd : Text) → { cmd = ":${cmd}<Space>" }
let config =
{ globalSection =
renderKeys
[ ctrl ∧ key "p" ∧ cmd "prev-tab"
, ctrl ∧ key "n" ∧ cmd "next-tab"
, ctrl ∧ key "t" ∧ cmd "term"
]
, sections =
[ sect
"messages"
[ ctrl ∧ key "q" ∧ cmd "quit"
, none ∧ special "Up" ∧ cmd "prev"
, none ∧ special "Down" ∧ cmd "next"
, none ∧ special "PgUp" ∧ cmd "prev 100%"
, none ∧ special "PgDn" ∧ cmd "next 100%"
, none ∧ key "g" ∧ cmd "select 0"
, none ∧ key "G" ∧ cmd "select -1"
, ctrl ∧ key "Up" ∧ cmd "prev-folder"
, ctrl ∧ key "Down" ∧ cmd "next-folder"
, none ∧ key "v" ∧ cmd "mark -t"
, none ∧ key "V" ∧ cmd "mark -v"
, none ∧ special "Enter" ∧ cmd "view"
, none ∧ key "c" ∧ cmd "compose"
, none ∧ key "|" ∧ prompt "pipe"
, none ∧ key "t" ∧ prompt "term"
, none ∧ key "/" ∧ prompt "search"
, none ∧ key "n" ∧ cmd "next-result"
, none ∧ key "N" ∧ cmd "prev-result"
, none ∧ special "Esc" ∧ cmd "clear"
]
, sect "view" [ none ∧ key "q" ∧ cmd "close" ]
]
}
in imports.Ini/externs.renderIni config
}