2013年03月17日
editing with root-privileges -- once more
We've already discussed editing root-owned files here a few times; it's one
of those tasks where in a reflex I still open a terminal and use vi to do
the job… the only way to overcome that seems to be to make it really
easy to do the same from within my running emacs:
(defun djcb-find-file-as-root () "Like `ido-find-file, but automatically edit the file with root-privileges (using tramp/sudo), if the file is not writable by user." (interactive) (let ((file (ido-read-file-name "Edit as root: "))) (unless (file-writable-p file) (setq file (concat "/sudo:root@localhost:" file))) (find-file file))) ;; or some other keybinding... (global-set-key (kbd "C-x F") 'djcb-find-file-as-root)
We could take it one step further still – overload the normal
(ido-)find-file with a version that checks the permissions first, and if
needed, use the above function to open it. But maybe that is too easy; we
should be careful with root-owned files after all.
2012年10月15日
mu4e v0.9.9 is out!
I few months ago, I introduced mu4e, a modest little emacs mail client that
I wrote. It seems many people picked it up, great!
what's new?
I have just released mu/mu4e version 0.9.9. There are quite a few changes, both user-visible and 'under-the-hood'. I've also spent some time on improving the manual (pdf), and I'm quite happy about it.
Some of the more visible new things in mu4e are:
- Support for crypto (decrypting messages, signing them)
- Support for refiling (like
mutt, Wanderlust) - Dynamic folders (instead of hard-coding the sent/draft/trash/refile folder, they can be functions that return different folders based on the message we're dealing with, see the example below)
- Same for the folder to save attachments
- A lot of smaller and bigger UI improvements
Also, the core mu program has seen a lot of improvements (many of which
directly improve mu4e as well)
- Better support for non-ascii locales / character sets, such as
ISO-2022-JP - Improved on-line help ('
mu help ...') - Performance improvements for threaded display (~ 25% for 23K messages)
For a more complete list, see NEWS.
dynamic folders
As mentioned, mu4e now supports dynamic folders. Before, you'd set your
trash folder to some static string:
(setq mu4e-trash-folder "/trash")
In some cases, you may want to have a bit more flexibility – for example, have a separate trash-folder (or sent-folder, drafts-folder, refile-folder) for private mail and work mail. You can now do something like:
(setq mu4e-trash-folder (lambda (msg) (if (and msg ;; msg may be nil (mu4e-message-contact-field-matches msg :to "me@work.com")) "/trash-work" "/trash")))
refiling
After I have dealt with some e-mail, I either delete it or move it to some
archive folder – refiling. For this, there is now the r keybinding, and
mu4e-refile-folder; and a place where dynamic folders really shine:
(setq mu4e-refile-folder (lambda (msg) (cond ;; messages to the mu mailing list go to the /mu folder ((mu4e-message-contact-field-matches msg :to "mu-discuss@googlegroups.com") "/mu") ;; messages sent directly to me go to /archive ;; also `mu4e-user-mail-address-regexp' can be used ((mu4e-message-contact-field-matches msg :to "me@example.com") "/private") ;; messages with football or soccer in the subject go to /football ((string-match "football\\|soccer" (or (mu4e-message-field msg :subject) "")) "/football") ;; everything else goes to /archive ;; important to have a catch-all at the end! (t "/archive"))))
How cool is that? After reading my inbox folder, I select all messages (C-x h), press r, and they're all moved to the right refiling folder.
crypto support
mu4e already supported signing/encrypting messages, but now it supports
decryption and verifying signatures as well. This was one of the most
requested new features. I think it is still a bit rough, but it has been
working very well for me.
so…
I think version 0.9.9 is a great new step for mu4e. It already goes far
beyond I ever planned to do. I received a lot of suggestions for new
features, which is great! I'm not planning to implement all of those, but I
will try to make mu4e even more programmable – it should be easy to augment
mu4e with your own little elisp-snippets – the Barbapapa principle of
software, already so clearly present in emacs itself.
2012年08月20日
introducing mu4e, an e-mail client for emacs
background
I've haven't written too much here lately. This is because I have spent most
of my emacs hacking time on mu4e, an emacs e-mail client. It's only
slightly over six months old since its first release, but it has progressed
rather quickly! So, I think it is time to give it an introduction to a wider
audience. In future posts, I'll go into more detail.
E-mail is a very important means of communication for me; and for purposes of
integration, it prefer to do my e-mail with emacs. For a long time, I used
mutt with emacs as the editor; a few years back I switched to Wanderlust,
and wrote a few articles about it.
There's a lot to like about Wanderlust: it's very featureful, and allows for a lot of customization. Still, there were a few things I was not fully happy with; the most important one was the speed of some operations; another annoyance was the fact that I got rather frequent cache-corruptions when using newer emacs versions.
So, what was I to do? Well, a few years back, I had written an e-mail
indexer/searcher, called mu. It takes the messages in a maildir-folder, and
allows you to query them. I wondered if I could use mu as the backend for
an emacs-based e-mail client. So, I fired up emacs, started writing some code
and some later I had a first version of… mu4e.
how does it work?
mu4e is an emacs front-end for mu; when you start it, mu4e connects to a
mu server process (started on-demand). It accepts simple commands, and
responds with emacs s-expressions, in asynchronous fashion. In practice, all
the heavy work is done in this server process, and emacs shows the results
when it is ready (usually almost instantly). Emacs does not need to wait for
the backend, and things stay snappy, even with tens of thousands (or more)
e-mail messages. The only operation that may still require some waiting is
sending mail, since that uses the emacs built-in smtpmail, which blocks
during its operation.
mu expects your e-mail messages to be stored in a maildir (a
one-file-per-message system); you can get these mails there through tools
like offlineimap or fetchmail. mu periodically indexes the messages, and
stores the results in a Xapian database. A lot of what mu4e does is
querying this database – so for example, what you see as 'my inbox folder'
in the mu4e-frontend, is in fact just the result of a query of all
message that happen to live in that folder. You can query for many things –
message sender, subject, date, words in the body and more.
mu4e does not just query messages; it can also move messages between
folders, delete them, modify their flags and so on (and afterwards update the
database). All 'state' is in the file system, and the database is just a quick
way to get to it; if you delete the database and then re-index, nothing is
lost, and changes made with other tools (e.g. mutt) are picked up by mu as
well.
trying mu4e
Some Linux distributions ship mu4e, but not necessarily a very recent
version; and because mu4e is developing quickly, you may want to use the
latest official release, or (if you are more adventurous) check out the git repository. You'll need GNU/Emacs 23 or 24, GLib, GMime >= 2.4 and Xapian.
After installing mu4e, you can check the mu4e manual, which should be
fairly complete. In fact, one of the goals of mu4e is to make it easy to
set up; for that reason, the documentation includes complete examples of how
to set things up. The Getting started chapter should get you up to speed
quickly.
So, give it a try if you're interested; the mu=/=mu4e project is very open
to suggestions (and even bugs reports!), so feel free to put them here or
subscribe to the mu mailing list.
a small tour
I'll end this with a number of screenshots, to give you a rough idea of how things look.
The main screen
The headers / view split-screen
The results of your queries are shown as a list of headers; if you click one
of the headers, mu4e splits the screen horizontally (optionally, you can
split the screen vertically, or only show the message view). You can
customize the headers shown, re-order them and so on.
The message view supports html message, inline images, and has a mechanism to associate user-functions with messages and attachments (such as 'view in browser' or 'pipe through command'); see the manual for some examples.
The message composition view
Obviously, you can reply to messages, forward them, or compose a new
message. For writing and sending messages, mu4e reuses emacs' built-in
message-mode. There's support for auto-completing addresses (based on the
e-mails you've sent/received before).
There's even (experimental) support for writing you're messages using
org-mode, and then sending them as rich-text (html) messages.
parting thoughts
So, this was a short introduction to mu4e, barely scratching the surface,
but hopefully conveying the main ideas. The manual discusses things in much
more detail, and I'll write more about it in the future.
mu4e is still a young project, but, for what's it worth, I've been using it
full-time for over six months, and a growing number of people are doing the
same. So, if you're interested, give it try and let us know you think!
Have fun!
2012年08月10日
file management with sunrise-commander
I tend to do a lot of file management from the shell (zsh, in my case); this
is very flexible / powerful and so on. But, for some things a bit more
graphical approach is nicer.
There are fully graphical file-managers like Nautilus or Thunar, but for a bit more keyboard-friendly file-management, there are so-called orthodox file managers - the archetypical Norton Commander and its descendants, like midnight-commander (mc) and gnome commander.
Not surprisingly, emacs has its own incarnation - it is called the sunrise commander and happily it's obtainable through ELPA. It's become an important of my workflow. When you're used to Midnight Commander, you'll feel right at home.
If you want to use emacs for yet another of your computer-based
activities, give it a try.
2012年07月09日
replace-regexp and numbering lines
I saw the Got Emacs? posting showing off the new emacs-24
rectangle-number-lines command, to number a bunch of lines in buffer,
i.e..:
foo bar cuux
becomes:
1 foo 2 bar 3 cuux
Very cool! An alternative is to use cua-mode, mark the column for the
numbers with cua-set-rectangle-mark (C-RET), and then use M-x cua-sequence-rectangle (which takes you throught the steps, and has a lot of
flexibility.
But let's look at yet another way: using replace-regexp. If we select (mark)
the list once more, we can do M-x replace-regexp RET ^ RET \#. RET Note that
the # is a special meta-character that represents the number of replacements already made. This has the somewhat clumsy side-effect that your
list be numbered, starting at 0 rather than 1, so you should add a
dummy-element at the beginning. Clearly, replace-regexp is inferior for
simply adding some line numbers – however, it has the flexibility to do some
smarter things.
Smarter things? Yes! replace-regexp allows you to use arbitrary
Lisp-expressions in the replace strings. So, let's suppose that we want to use
letters instead of numbers for our lines. Easy – again, select (mark) your
lines, M-x replace-regexp RET ^ RET ,円(format "%c. " (+ ?a \#)) RET and we get:
a. foo b. bar c. cuux
Admittedly, not the most world-shattering thing, but it does show the powers
hidden in something as common as replace-regexp.
2012年06月20日
who holds this value?
Something from the category of useful things hiding in emacs… Suppose you are looking for the variable that holds a certain value. How to find it?
Easy: M-x apropos-value
So, for example, finding all variables that hold your e-mail address:
M-x apropos-value RET me@example.com RET
and you'll get all the matches in the *Apropos*-buffer. HT: Stephen
Eglen.
Also check the various other M-x apropos-... commands, they all help you
find useful information if you can remember a word. Except for… M-x apropos-zippy… eh?
2012年06月06日
euro 2012 games in your org-mode agenda
Things have been rather quiet at emacs-fu - reason for this is that most of my emacs hacking time has been spent on mu4e, the emacs e-mail client I wrote. It's been shaping up pretty nicely, I should probably write some emacs-fu posts about it :)
Another interesting pastime (esp. in Europe) is football/soccer, in particular the Euro2012 games; long-time readers will remember the schedule for world cup games; I made a new one for Euro2012: https://github.com/djcb/org-euro2012.
In order to have the games show up in your agenda, make sure the file is in
your org-agenda-files. If needed, you could add it with something like this in
your org-mode settings (change the directory path to wherever you have put
euro2012.org):
(add-to-list 'org-agenda-files "~/org/euro2012.org")
One small issue with the schedule is that it uses the central-european summer time (UTC+2), and there is no automatic way to adjust times for the local time zone. As a work-around, Juan Pechiar provided the following function which makes it easy to update all org-timestamps in a file:
(defun update-org-hours (n) "Change all org-mode timestamps in the current buffer by N hours." (interactive "nAdd hours: ") (save-excursion (goto-char (point-min)) (while (re-search-forward "[[<]" nil t) (when (org-at-timestamp-p t) (org-timestamp-change n 'hour)))))
Evaluate this function. After that, you can go to the file with the schedule, and give an M-x update-org-hours, provide the offset for your timezone, compared to UTC+2.
Let the games begin!