To recap: given the absence of other credible alternatives I had two options:
- Re-hack mutt to give me a sidebar that will show only folders containing new messages.
- Look at writing a "simple mail client". Haha. Ha. Hah.
I think there is room for a new console client, because mutt is showing its age and does feel like it should have a real extension language - be it guile, lisp, javascript(!), Lua, or something else.
So I distilled what I thought I wanted into three sections:
- mode-ful. There would be a "folder-browsing mode", a "message-browsing mode" and a "read-a-single-message" mode.
- There would be scripting. Real scripting. I chose Lua.
- You give it ~/Maildir as the configuration. Nothing else. If the damn computer cannot find your mailboxes something is wrong.
So how did I do? I wrote a ncurses-based client which has Lua backed into it. You can fully explore the sidebar-mode - which lets you select multiple folders.
From there you can view the messages in a list.
What you can't do is anything "real":
- Update a messages flags. new -> read, etc.
- GPG-validation.
- MIME-handling.
- Attachment viewing.
For a two-day hack it is remarkably robust, and allowing scripting shows awesomeness. Consider this:
--
-- show all folders in the Maildir-list.
--
function all()
-- ensure that the sidebar displays all folders
sidebar_mode = "all";
-- we're going to be in "maildir browsing mode"
cmail_mode = "sidebar";
reset_sidebar();
refresh_screen();
end
--
-- Test code, show that the pattern-searching works.
--
-- To use this press ":" to enter the prompt, then enter "livejournal".
--
-- OR press "l" when in the sidebar-mode.
--
function livejournal()
sidebar_pattern = "/.livejournal.2";
sidebar_mode = "pattern";
reset_sidebar();
refresh_screen();
end
--
-- There is a different table for each mode.
--
keymap = {}
keymap['sidebar'] = {}
keymap['index'] = {}
keymap['message'] = {}
--
-- In the sidebar-mode "b" toggles the sidebar <-> index.
--
-- ":" invokes the evaluator.
-- "q" quits the browser and goes to the index-mode.
-- "Q" quits the program entirely.
--
keymap['sidebar'][':'] = "prompt-eval"
keymap['sidebar']['b'] = "toggle"
keymap['sidebar']['q'] = "toggle"
keymap['sidebar']['Q'] = "exit"
-- show all/unread/livejournal folders
keymap['sidebar']['a'] = "all"
keymap['sidebar']['u'] = "unread"
keymap['sidebar']['l'] = "livejournal"
Neat, huh? See the cmail.lua file on github for more details.
My decision hasn't really progressed any further, though I can see that if this client were complete I'd love to use it. Its just that the remaining parts are the fiddly ones.
I guess I'll re-hack mutt, and keep this on the back-burner.
The code is ropey in places, but should you wish to view:
And damn C is kicking my ass.
Tags: cmail, console, development, lua, mail 4 comments