I was looking for a function which would find a buffer based on one of my saved searches, and perform the search if it didn't exist. I've gotten it a bit closer, if I perform the search that matches a saved search, then this routine will find it because of the magic in notmuch-search-buffer-title, but perhaps someone else feels up to searching through the saved searches directly? (defun notmuch-goto-or-search (&optional query) "Find a notmuch-search buffer with the given query, or run \"notmuch search\" with the given `query' and display results. If `query' is nil, it is read interactively from the minibuffer." (interactive) (if (null query) (setq query (notmuch-read-query "Notmuch goto-or-search: "))) (let ((buffer-name (notmuch-search-buffer-title query))) (setq buf (get-buffer buffer-name))) (if (not buf) (notmuch-search query) (switch-to-buffer buf) ))) I then use it something like this: (global-set-key [C-f1] (lambda () (interactive) (notmuch-goto-or-search "tag:inbox and tag:unread and not tag:deleted"))) (global-set-key [C-f2] (lambda () (interactive) (notmuch-goto-or-search "tag:inbox and not tag:deleted"))) (global-set-key [C-f3] 'notmuch) (global-set-key [C-f6] (lambda () (interactive) (notmuch-goto-or-search "tag:todo and not tag:deleted"))) It would be better if I could use my Inbox, INBOX and todo names for the saved searches, but how to do that without breaking generality of searching the body of the email? Do I have to define my own ss: (saved search) prefix or something, as I believe some others have? This is what I'm willing to do today, and it works for me, I could patch notmuch.el, but I wondered about answering the other questions. Also, some elisp master could hint about how to make the binding not so ugly. ;) Another appreciated elisp hint would be how to get the buf variable to go inside the let, I keep getting complaints about buffer-name not being defined, thus the "ugly" setq, which works. Enjoy, -Mark