Planner is a PersonalInformationManager (PIM) by JohnWiegley. You can use it to manage your tasks, schedule, notes, and anything else you want to store in a free-text richly-hyperlinked personal information manager integrated into Emacs. Because it’s in Emacs, it can easily be tweaked to support your particular way of planning, and it can draw upon the data and functions you already have in Emacs.

It puts all of the Emacs PIM pieces together: BbdbMode (addresses), EmacsMuse (linking of notes and publishing), etc. This allows you to easily write notes, link to other notes, link to dates, link to addresses, link to – everything.

If you’re new to Planner, here’s a good way to get started:

There is a good intro on how to use the PlannerMode in the planner.el file.

Getting Planner

The current version is at

You can get the latest development snapshot at

See the PlannerModeQuickStart page for more specific directions on getting Planner.

The Planner manual is available on-line in several forms at

Older version is at

If you’re new to PlannerMode (or you don’t mind relearning some keybindings), you can add (planner-install-extra-task-keybindings) to your .emacs to take advantage of the new task keybindings. Warning to old users of planner.el: C-c C-t becomes a prefix key; use C-c C-t C-t to create tasks.

Planner features

Take a look at PlannerModeQuickStart for a number of features and how to use them.

PlannerMode is a way to manage notes and tasks. It leverages on EmacsMuse to create a hyperlinked planning and note-taking environment. Two types of pages are usually created “Daily Pages” and “Project Pages.” Daily pages keep track of the day-to-day; Project pages let you organize your notes into projects. In the typical set up, tasks and notes can be put into both pages simultaneously, giving you the ability to look over your notes chronologically or by project.

Here are some features of planner. Some require customization, so read the docs.

Migrating to Org-Mode

A small Perl program to convert Planner files into something suitable for OrgMode was once available.

People who use planner.el

Bug in Planner 3.42 Registry Handling

There is a bug in planner-registry.el in the latest version of planner mode. I’m surprised that no one has found it in the last 4 years as it makes the registry unusable. I have emailed the author, but for the time being a temporary fix is to put:

(defun planner-registry-update-registry (from-file new-entries)
  "Update the registry FROM-FILE with NEW-ENTRIES."
    (find-file planner-registry-file)
    (goto-char (point-min))
    (while (re-search-forward
	    (concat "^(\"" from-file) nil t)
      (delete-region (planner-line-beginning-position)
    (goto-char (point-min))
    (re-search-forward "^'(\n" nil t)
    (dolist (elem new-entries)
      (insert (with-output-to-string (prin1 elem)) "\n"))
    (kill-buffer (current-buffer)))
  (message (format "Planner registry updated for URLs in %s"

in your .emacs (or other init file) after:

(require 'planner-registry)

but before:


Using Planner with NotMuch

The following code will allow you to type “c k” while point is in an email in a NotMuch show buffer and then a link to the email message, that can be understood by planner, will then be stored in the kill ring. The link displays the subject of the message, suitably edited so as not to contain characters that would break the link code. The text of the Date: and From: field are also copied to the kill ring as the user will probably want these too.

;; Code for using notmuch with planner
(defun notmuch-show-get-planner-link ()
  "Get a planner-formatted link to a notmuch-show email message.
The format of the link is:

   [[<subject>]], <date>, <from>.

The subject field is suitably edited to remove any characters
that would break the coding of the link. The text of the Date:
and From: fields are also also copied to the kill ring as the
user will most probably need them.
  ;; Make sure planner understands lisp coded links
  (require 'planner-lisp)
  (let ((id (concat "id:" (notmuch-show-get-message-id t)))
	(subject (notmuch-show-get-subject))
	(date (notmuch-show-get-date))
	(from (notmuch-show-get-from))
	title link-code link)
    ;; Replace awkward characters in subject
    (setq title (replace-regexp-in-string "\"" "'" subject))
    (setq title (replace-regexp-in-string "\\[" "{" subject))
    (setq title (replace-regexp-in-string "\\]" "}" subject))
    ;; Construct the title of the show buffer
    (setq title (concat "*"
			(truncate-string-to-width subject 30 nil nil t)
    ;; Construct link code
    (setq link-code
	  (format "lisp:/(notmuch-show \"%s\" (current-buffer) nil \"%s\")"
    ;; Construct link
    (setq link
	  (format "[[%s][%s]], %s, %s." link-code subject date from))))

(defun notmuch-show-stash-planner-link ()
  "Planner-formatted link to notmuch-show email message to kill ring."
  (notmuch-common-do-stash (notmuch-show-get-planner-link)))

(define-key notmuch-show-stash-map "k" 'notmuch-show-stash-planner-link)

I, Bernard Hurley, would be interested if there is a less messy way to replace unwanted characters in the Subject: field (I have used Common Lisp and Scheme for years but am relatively new to Elisp.) I think I have covered all the characters that could cause problems but if you find more please post them here.

CategoryModes CategoryPersonalInformationManager CategoryCalendar CategoryTodo