Marcin Norkowski has a fun example of some smart lisp coding to emulate the famous opening crawl of the Star Wars films. Here it is in action:
Marcin Norkowski has a fun example of some smart lisp coding to emulate the famous opening crawl of the Star Wars films. Here it is in action:
In the following I will put forward my philosophy on handling emails and then show how this is realised in emacs using mu4e and org-mode.
I couple of years ago I read an article by the economist Tim Harford which hugely influenced the way I handle my emails. The ideas in the article are not unique but they really struck a chord with me. My email philosophy can be distilled down to one key concept:
your inbox is not a todo list
Like many people I used to keep emails in my inbox as a way of reminding me of something I needed to do, but the fact is that an inbox is a rubbish todo list.
I also had folders for putting emails in and I would occasionally have a painful cleanout of my towering inbox, agonising over which folder to put an email in, or whether I should create a new folder for it. No more! As long as your email programme has a good search, then it is quicker to search than to use a filing system.
Now when I check my emails, I do one of the following
To use this system effectively, all you really need is: (i) an email client with a good search function so you can archive all mail in the same folder and not worry about filing it neatly, and (ii) a good system for adding tasks from your emails to a todo list.
The mu4e email client in emacs, combined with org-mode for todo organisation is the perfect way to do both of these things. There is very good documentation on how to set up mu4e on the project web page, including configuring it to work well with gmail, so I won’t go over that here. What I will say is that mu4e is built on mu, a powerful email indexer so it has all of your search needs covered.
Apart from searching, mu4e integrates very well with org-mode to make it seamless to generate todo items from emails. To set this up, add the following to your emacs config file
;;store org-mode links to messages (require 'org-mu4e) ;;store link to message if in header view, not to header query (setq org-mu4e-link-query-in-headers-mode nil)
Now update your org-mode capture template to something like this
(setq org-capture-templates '(("t" "todo" entry (file+headline "~/todo.org" "Tasks") "* TODO [#A] %?\nSCHEDULED: %(org-insert-time-stamp (org-read-date nil t \"+0d\"))\n%a\n")))
This looks like the version we had before, but the extra %a
adds a link to the file you are visiting when you invoke the capture template.
The beauty of this is that hitting C-c c t
now generates a todo item that contains a link to the email you are currently viewing. So you have zero friction in creating a todo item to e.g. reply to an email by a certain deadline, and you can happily archive that email knowing that clicking the link in the todo item will take you directly back to it.
I moved from thunderbird to mu4e a couple of months ago and really haven’t looked back. The things I missed at first were some of the extensions I was using to: create email templates; remind me about attachments; and add a delay to outgoing email so that I could have an “undo send” functionality. Happily I’ve found solutions to all of these in mu4e and I’ll be covering them in future posts.
Use dired-jump
, which is bound to C-x C-j
by default to show the current file in a dired buffer. The command is part of dired-x
which is built in to emacs, but you may need to add the following to your emacs config file to activate it.
(require 'dired-x)
In this post we’ll build on the simple todo list that we put together previously and add schedules and deadlines to our tasks to build a powerful agenda.
When adding a task (with C-c c t
) you can add a scheduled date to it with C-c C-s
or a deadline date with C-c C-d
, or both. These will pop up a calendar which you can navigate using shift and the arrow keys.
I prefer to schedule all new tasks to today’s date as a default, so I update the org-capture-templates
variable to
(setq org-capture-templates '(("t" "todo" entry (file+headline "~/todo.org" "Tasks") "* TODO [#A] %?\nSCHEDULED: %(org-insert-time-stamp (org-read-date nil t \"+0d\"))\n")))
Now when you add a task, you will see a scheduled field like this
** TODO [#A] SCHEDULED: <2015-12-08 Tue>
You can edit the date by putting the cursor in it and using shift + arrow keys.
Now instead of using C-c a t
to view your list of tasks, we will use C-c a n
to display a list of your scheduled tasks and then any unscheduled tasks below it.
I have several configuration options that I recommend. Add the following to your emacs config file if you like the look of them:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; org-mode agenda options ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;open agenda in current window (setq org-agenda-window-setup (quote current-window)) ;;warn me of any deadlines in next 7 days (setq org-deadline-warning-days 7) ;;show me tasks scheduled or due in next fortnight (setq org-agenda-span (quote fortnight)) ;;don't show tasks as scheduled if they are already shown as a deadline (setq org-agenda-skip-scheduled-if-deadline-is-shown t) ;;don't give awarning colour to tasks with impending deadlines ;;if they are scheduled to be done (setq org-agenda-skip-deadline-prewarning-if-scheduled (quote pre-scheduled)) ;;don't show tasks that are scheduled or have deadlines in the ;;normal todo list (setq org-agenda-todo-ignore-deadlines (quote all)) (setq org-agenda-todo-ignore-scheduled (quote all)) ;;sort tasks in order of when they are due and then by priority (setq org-agenda-sorting-strategy (quote ((agenda deadline-up priority-down) (todo priority-down category-keep) (tags priority-down category-keep) (search category-keep))))
With these options we get a really useful view of our tasks when using C-c a n
. For example, here is a todo.org
file with a mixture of tasks with and without schedules and deadlines
* Tasks ** TODO [#A] do this today SCHEDULED: <2015-12-08 Tue> ** TODO [#A] do this tomorrow SCHEDULED: <2015-12-09 Wed> ** TODO [#A] this task is not scheduled ** TODO [#B] scheduled for today, priority B SCHEDULED: <2015-12-08 Tue> ** TODO [#A] scheduled today and deadline in 2 days DEADLINE: <2015-12-10 Thu> SCHEDULED: <2015-12-08 Tue> ** TODO [#A] deadline in 2 days and not scheduled DEADLINE: <2015-12-10 Thu> ** TODO [#A] scheduled for monday SCHEDULED: <2015-12-14 Mon> ** TODO [#C] do this today if I get time SCHEDULED: <2015-12-08 Tue> ** TODO [#B] neither is this one ** TODO [#C] or this one ** TODO [#A] deadline in 10 days and not scheduled DEADLINE: <2015-12-18 Fri>
When I view the agenda associated with this file I see this
Any time you find yourself doing a repetitive task in emacs, you should stop and think about whether you could be using a macro to automate it. To use a macro you start a recording and do whatever edits or other commands you need for your task, then stop the macro and execute it to repeat the task as many times as you like. There is a great introduction and overview of macros at emacs-fu.
I wanted to pick out from that article a useful feature of macros that I have neglected until recently. Normally a macro is saved until you record a new one, in which case it is overwritten. However it is possible to give your macro and name and then save it for future use.
At the moment I am rewriting some LaTeX notes into org mode to use in lecture slides. This involves several repetitive tasks, like converting a section heading like this
\subsection{Object on vertical spring}
into this
** Object on vertical spring
The trick to making a good macro is to make it as general as possible, like searching to move to a character instead of just moving the cursor. In this case I did the following:
C-x C-(
to start the macro recordingC-a
to go to the start of the lineC-SPC
to set the markC-s {
to search forward to the “{” characterRET
to exit the searchC-d
to delete the regionC-e
to move to the end of the lineBACKSPACE
to get rid of the last “}”C-x )
to end the recording Now I can replay my macro with C-x e
but I know I’ll need this again many times in the future so I use M-x name-last-kbd-macro
and enter a name for the macro (e.g. bjm/sec-to-star
). Now I go to my emacs config file and add the following
;;macro to convert latex sections to org-mode subheadings ;;use M-x insert-kbd-macro to add the following line (fset 'bjm/sec-to-star [?\C-a ?\C- ?\C-s ?\{ return ?\C-d ?* ?* ? ?\C-e backspace ?\C-x]) ;;bind this to a key (global-set-key (kbd "C-c b *") 'bjm/sec-to-star)
Where the fset
line was added by using M-x insert-kbd-macro
and then selecting the macro name I just used to save the macro. Finally I bind this to a key for ease of use in the future.
You can use M-x edit-named-kbd-macro
to see a nicer view of your macro and tweak it if needed.
Finally, note that macros are not limited to simple editing commands. You can e.g. create, edit and save new files or do other more complex procedures within a macro.