This function allows for restricting the date range of a search, back from the current time. The look-back time range is given at a second prompt. An example time range is '4d' to indicate four days or '12y' to indicate twelve years. On slow machines this can speed up the search considerably. I believe this handles the most common usage where one wishes to perform a search for a message that is known to have been received recently. One might imagine extending this function to be able to handle date ranges, such as "11/2004-2/2005", or it becoming obsolete if more flexible date specs are folded into notmuch search directly. --- emacs/notmuch.el | 62 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 62 insertions(+), 0 deletions(-) diff --git a/emacs/notmuch.el b/emacs/notmuch.el index 3d82f0d..763d517 100644 --- a/emacs/notmuch.el +++ b/emacs/notmuch.el @@ -948,6 +948,68 @@ current search results AND that are tagged with the given tag." (list (notmuch-select-tag-with-completion "Filter by tag: "))) (notmuch-search (concat notmuch-search-query-string " and tag:" tag) notmuch-search-oldest-first)) +(defun notmuch-search-convert-time-spec (spec) + "Internal function to convert an abbreviated time spec into seconds." + (if (string= spec "") + 0 + (let ((factor (replace-regexp-in-string "[Mhdwmy]$" "" spec)) + (unit (replace-regexp-in-string "^[0123456789]*" "" spec)) + seconds) + (if (string= factor "") + (setq factor 1) + (setq factor (string-to-number factor))) + (if (string= unit "") + (setq seconds 1) + (cond ((string= unit "M") + (setq seconds 60)) + ((string= unit "h") + (setq seconds 3600)) + ((string= unit "d") + (setq seconds 86400)) + ((string= unit "w") + (setq seconds 604800)) + ((string= unit "m") + (setq seconds 2678400)) + ((string= unit "y") + (setq seconds 31536000)) + (t + (setq seconds nil)))) + (if (null seconds) + nil + (* factor seconds))))) + +(defun notmuch-search-date-restrict (query time-spec) + "Run \"notmuch search\" but with a look-back time restriction. + +This first argument is the query string. +The second argument is a look-back time spec of the form 'XY', +where X is an integer and Y is one of: + 'M' minute + 'h' hour + 'd' day + 'w' week + 'm' month + 'y' year +For instance, a time spec of '3w' would return only search +results from within the last three weeks. +A time spec of nil returns the full search results. + +For more information see the \"notmuch-search\"." + (interactive "sNotmuch search: \nslook back?: ") + (let ((look-back (notmuch-search-convert-time-spec time-spec))) + (cond ((null look-back) + (message "unknown time spec")) + ((= look-back 0) + (notmuch-search query)) + (t + (let* ((now (current-time)) + (start (time-subtract now (seconds-to-time look-back)))) + (notmuch-search (concat + query " " + (format-time-string "%s" start) + ".." + (format-time-string "%s" now)))))))) + ;;;###autoload (defun notmuch () "Run notmuch and display saved searches, known tags, etc." -- 1.7.2.3