So the work on lumail2 is going well, and already I can see that it is a good idea. The main reason for (re)writing it is to unify a lot of the previous ad-hoc primitives (i.e. lua functions) and to try and push as much of the code into Lua, and out of C++, as possible. This work is already paying off with the introduction of new display-modes and simpler implementation.
View modes are an important part of lumail, because it is a modal mail-client. You're always in one mode:
- Shows you lists of Maildir-folders.
- Shows you lists of messages inside the maildir you selected.
- Shows you a single message.
This is nothing new, but there are two new modes:
- Shows you the attachments associated with the current message.
- Shows you your configuration-settings and trivia.
Each of these modes draws lines of text on the screen, and those lines consist of things that Lua generated. So there is a direct mapping:
With that in mind it is possible to write a function to scroll to the next line containing a pattern like so:
local pattern = Screen:get_line( "Search for:" )
-- Get the global mode.
local mode = Config:get("global.mode")
-- Use that to get the lines we're currently displaying
loadstring( "out = " .. mode .. "_view()" )()
-- At this point "out" is a table containing lines that
-- the current mode wishes to display.
-- .. do searching here.
Thus the whole thing is dynamic and mode-agnostic.
The other big change is pushing things to lua. So to reply to an email, populating the new message, appending your ~/.signature, is handled by Lua. As is forwarding a message, or composing a new mail.
The downside is that the configuration-file is now almost 1000 lines long, thanks to the many little function definitions, and key-binding setup.
At this rate the first test-release will be out at the weekend, but API documentation, and sample configuration file might make interesting reading until then.
16 November 2015 21:50
I'm pleased with the way that Lumail2 development is proceeding, and it is reaching a point where there will be a second source-release.
I've made a lot of changes to the repository recently, and most of them boil down to moving code from the C++ side of the application, over to the Lua side.
This morning, for example, I updated the handing of index.limit to be entirely Lua based.
When you open a Maildir folder you see the list of messages it contains, as you would expect.
The notion of the index.limit is that you can limit the messages displayed, for example:
- See all messages: Config:set( "index.limit", "all")
- See only new/unread messages: Config:set( "index.limit", "new")
- See only messages which arrived today: Config:set( "index.limit", "today")
- See only messages which contain "Steve" in their formatted version: Config:set( "index.limit", "steve")
These are just examples that are present as defaults, but they give an idea of how things can work. I guess it isn't so different to Mutt's "limit" facilities - but thanks to the dynamic Lua nature of the application you can add your own with relative ease.
One of the biggest changes, recently, was the ability to display coloured text! That was always possible before, but a single line could only be one colour. Now colours can be mixed within a line, so this works as you might imagine:
Panel:append( "$[RED]This is red, $[GREEN]green, $[WHITE]white, and $[CYAN]cyan!" )
Other changes include a persistant cache of "stuff", which is Lua-based, the inclusion of at least one luarocks library to parse Date: headers, and a simple API for all our objects.
All good stuff. Perhaps time for a break in the next few weeks, but right now I think I'm making useful updates every other evening or so.
Tags: lua, lumail2
25 November 2015 21:50
For the past few years all my important work has been stored in
git repositories. Thanks to the mr tool I have a single
configuration file that allows me to pull/maintain a bunch of
repositories with ease.
Having recently wiped & reinstalled a pair of desktop systems I'm
now wondering if I can switch to using a totally transient
The basic intention is that:
- Every time I login "rm -rf $HOME/*" will be executed.
I see only three problems with this:
- Every time I login I'll have to reclone my "dotfiles", passwords,
- Some programs will need their configuration updated,
- SSH key management will be a pain.
My dotfiles contain my my bookmarks,
passwords, etc. But they don't contain setup for GNOME, etc.
So there might be some configuration that will become annoying - For
example I like "Ctrl-Alt-t" to open a new
gnome-terminal command. That's configured on each new system I
login to the first time.
My images/videos/books are all stored beneath /srv and not in my
home directory - so the only thing I'll be losing is program configuration, caches, and similar.
Ideally I'd be using a smartcard for my SSH keys - but I don't have
one - so for the moment I might just have to rsync them into place, but
that's grossly bad.
I'll be interesting to see how well this works out, but I see a
potential gain in portability and discipline at the very least.
Tags: management. configuration-management, revision-control
29 November 2015 21:50
This weekend I've mostly been tidying up some personal projects and things.
This was updated to use recaptcha on the sign-up page, which is my attempt to cut down on the 400+ spam-registrations it receives every day.
I've purged a few thousand bogus-accounts, which largely existed to point to spam-sites in their profile-pages. I go through phases where I do this, but my heuristics have always been a little weak.
This site offers free dynamic DNS for a few hundred users. I closed fresh signups due to it being abused by spammers, but it does have some users and I sometimes add new people who ask politely.
Unfortunately some users hammer it, trying to update their DNS records every 60 seconds or so. (One user has spent the past few months updating their IP address every 30 seconds, ironically their external IP hadn't changed in all that time!)
So I suspended a few users, and implemented a minimum-update threshold: Nobody can update their IP address more than once every fifteen minutes now.
- Literate Emacs Configuration File
Working towards my stateless home-directory I've been tweaking my dotfiles, and the last thing I did today was move my Emacs configuration over to a literate fashion.
My main emacs configuration-file is now a markdown file, which contains inline-code. The inline-code is parsed at runtime, and executed when Emacs launches. The init.el file which parses/evals is pretty simple, and I'm quite pleased with it. Over time I'll extend the documantion and move some of the small snippets into it.
- Offsite backups
My home system(s) always had a local backup, maintained on an external 2Tb disk-drive, along with a remote copy of some static files which were maintained using rsync. I've now switched to having a virtual machine host the external backups with proper incrementals - via attic, which beats my previous "only one copy" setup.
- Virtual Machine Backups
On a whim a few years ago I registered rsync.io which I use to maintain backups of my personal virtual machines. That still works, though I'll probably drop the domain and use backup.steve.org.uk or similar in the future.
FWIW the external backups are hosted on BigV, which gives me a 2Tb "archive" disk for a £40 a month. Perfect.
Tags: debian-administration, misc