Inbox Zero - Time Management?

Inbox Zero

In the IT world, I suspect all professionals read about the Inbox-Zero from Merlin Mann principle. And handling an email from your mailbox only once is the best way to process your inbox in the most efficient way.

Emails, for my part, remain a tool for communication and sometime for information archiving, a bit like a huge database of knowledge accumulated over time.

That is also one of the reasons, Notmuch indexing engine has been one of my favorite tools in the last years. With a couple of keywords, it is easy to simply narrow down the search result and retrace the context with the thread the email is associated to.

The 4 D’s actions

The 4 D actions suggested by Inbox-Zero process on how to address each email are: Delete, Delegate, Defer and Do.

  • Delete:
    Deleting an email is the simplest thing one can do. To me this happens only for spam if is not an already filtered or irrelevant information, otherwise the email will be archived rather than deleted.

  • Delegate:
    The action is to be performed by somebody else. I would simply reply(-all)/forward with other teammates who might be concerned by the matter. When I am also involved and like to follow the progress of an activity, I like to be kept in CC to continue receiving the exchanges until the activity is concluded. When this moment arrives the all thread is archived.

  • Defer:
    Sometimes providing feedback on an email requests more time. This can be because an analysis needs to be performed or because an answer from a linked activity is still pending to arrive or a ticket to be closed.

    In that case, I personally register the task within my related org-mode project or to-do list and flag the email for a later follow-up. It will stay in my inbox as read in any case.

    Through the years, I realized that spending time to move emails around and “break” threads is really inconvenient. So I keep all in the inbox folder and rely on the powerful Notmuch search index database.

  • Do:
    If the task or the answer/response can be performed right away, I will simply do it, so there is no need to return on the subject.

    Some kind of Do and Forget about it.\ Still, the answer will remained in my mailbox, as an archived status, so if the time comes this information is needed I would be able to retrieve it easily.

My personal process

It is a challenge to address all requests, to Get all Things Done (GTD) and manage and optimize the time for different activities. I personally see the method as a guideline rather than something to be strictly applied.

My main Notmuch view only report Unread and Flagged emails.

  • The Unread emails:
    which I read first and process with the 4 D’s actions.

  • The Flagged emails:
    I come back to them mostly at the beginning of the day to follow-up when a feedback is missing and creates a pending action.

My main view is defined in my saved searches:

(setq notmuch-saved-searches
      '((:name "Inbox"
               :query "((tag:inbox and tag:unread) or tag:flagged) and not tag:trash"
               :key "u")
         ;; ...
               ))
%%{ init: {"flowchart": {"curve": "linear"}} }%% flowchart TB start(Start) --> unread(Unread
Message) unread --- dummy(( )) delete(Delete
Archive) delegate(Delegage) defer(Add task
in Org-Mode) do(Respond /
Take action) dummy --> delete & delegate & defer & do --- dummy2(( )) dummy2 --> next(Next
Unread) next --- question{ ? } question -- yes --> repeat(Move next) question -- no --> flagged(Process
Flagged)

Parsing the Flagged email, I would simply perform a follow-up if necessary.

Custom bindings

Thanks to the tips from Notmuch, I have a couple of custom bindings to quickly add/remove the flags and perform quick key actions.

(use-package notmuch
  :if (executable-find "notmuch")
  :commands notmuch
  :bind
  (:map notmuch-search-mode-map
   ("f" . #'notmuch-flag)
   ("d" . #'notmuch-delete)
   ("u" . #'notmuch-mark-read)
   ("g" . #'notmuch-refresh-this-buffer)
   :map notmuch-show-mode-map
   ("d" . #'notmuch-delete)
   ("f" . #'notmuch-flag)
   :map notmuch-tree-mode-map
   ("d" . #'notmuch-delete)
   ("f" . #'notmuch-flag)
   )

  :config
  (setq notmuch-show-logo nil)
  (setq notmuch-saved-searches
        '((:name "Inbox"
                 :query "((tag:inbox and tag:unread) or tag:flagged) and not tag:trash"
                 :key "u")
           %% ... 
          ))

  (setq notmuch-multipart/alternative-discouraged '("text/plain"))
  (setq notmuch-hello-auto-refresh t)
  (setq notmuch-hello-recent-searches-max 20)
  (setq notmuch-hello-thousands-separator "")
  (setq notmuch-crypto-process-mime t)

  (setq notmuch-archive-tags '("-unread" "+archive"))

  (defun notmuch-toggle-tag (tags advance)
    (let* ((cur-tags
            (cl-case major-mode
              (notmuch-search-mode
               (notmuch-search-get-tags))

              (notmuch-tree-mode
               (notmuch-tree-get-tags))
              
              (notmuch-show-mode
               (notmuch-show-get-tags))))
           (action (if (cl-intersection cur-tags tags :test 'string=) "-" "+"))
	   (arg (mapcar (lambda (x) (concat action x)) tags)))

      (cl-case major-mode
        (notmuch-search-mode
         (notmuch-search-tag arg)
         (when advance (notmuch-search-next-thread)))
        (notmuch-tree-mode
         (notmuch-tree-tag arg))
        (notmuch-show-mode
         (notmuch-show-tag arg)
         (when advance (notmuch-show-next-matching-message))))))

  (defun notmuch-flag ()
    "tag email for Flagged"
    (interactive)
    (notmuch-toggle-tag '("flagged") t))

  (defun notmuch-delete ()
    "tag email as deleted and unread"
    (interactive)
    (cl-case major-mode
      (notmuch-search-mode
       (notmuch-search-tag (list "+deleted" "-unread" "-inbox"))
       (notmuch-search-next-thread))
      (notmuch-show-mode
       (notmuch-show-tag (list "+deleted" "-inbox"))
       (notmuch-show-next-matching-message))
      (notmuch-tree-mode
       (notmuch-tree-tag (list "+deleted" "-inbox"))
       (notmuch-tree-next-matching-message))))
  
  (defun notmuch-mark-read ()
    "Tag email as unread"
    (interactive)
    (notmuch-toggle-tag '("unread") t))

  )

External references

  1. https://notmuchmail.org/
  2. Wikipedia - Merlin Mann
  3. https://www.gnu.org/software/emacs/