Extending project.el with to-do functionality

When I work on a personal project which has the potential to grow beyond a few tasks, I like to maintain the project's to-do list within a TODO.org file (or whatever the extension may be) usually located at the tippity-top of the project, or in more technical terms, the project root.

It's sort of annoying having to manually find-file anytime I'd like to make a change to my to-do list. As a result of this frustration, I wrote this tiny function which automatically opens the to-do file from anywhere inside (or outside if not within) the target project.

(defun +project-todo ()
    "Edit the to-do file at the root of the current project."
    (interactive)
    (let* ((project (project-root (project-current t)))
       (todo (car (directory-files project t "^TODO\\(\\..*\\)?$"))))
      (cond ((and todo (file-exists-p todo)) (find-file todo))
        (t (message "Project does not contain a TODO file.")))))

To further extend project.el, we should perhaps register this command in the list of options that appear when we switch to a project with C-x p p. The project-switch-commands variable is what we're after, we should append a list of the form (COMMAND LABEL &optional KEY) if we'd like to see its shortcut listed.

(add-to-list 'project-switch-commands '(project-todo "Todo" "t"))

Additionally, map the function to something memorable.

(global-set-key (kbd "C-x p t") 'project-todo)

And that's it, we're all set.