commit e55dc251b9e8001fe16873fadac565563e606d69 Author: David Edmondson <dme@dme.org> Date: Mon Apr 12 11:12:23 2010 +0100 emacs: Add notmuch-hello.el, a friendly frontend to notmuch New emacs/notmuch-hello.el diff --git a/emacs/notmuch-hello.el b/emacs/notmuch-hello.el new file mode 100644 index 0000000..279c424 --- /dev/null +++ b/emacs/notmuch-hello.el @@ -0,0 +1,122 @@ +;; notmuch-hello.el --- welcome to notmuch, a frontend +;; +;; Copyright © David Edmondson +;; +;; This file is part of Notmuch. +;; +;; Notmuch is free software: you can redistribute it and/or modify it +;; under the terms of the GNU General Public License as published by +;; the Free Software Foundation, either version 3 of the License, or +;; (at your option) any later version. +;; +;; Notmuch is distributed in the hope that it will be useful, but +;; WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +;; General Public License for more details. +;; +;; You should have received a copy of the GNU General Public License +;; along with Notmuch. If not, see <http://www.gnu.org/licenses/>. +;; +;; Authors: David Edmondson <dme@dme.org> + +(require 'widget) + +(require 'notmuch-lib) + +(defvar notmuch-hello-searches-to-save 10) +(defvar notmuch-hello-search-width 60) + +(defvar notmuch-hello-recent-searches nil) + +(defun notmuch-hello-save-search (search) + (if (not (memq search notmuch-hello-recent-searches)) + (push search notmuch-hello-recent-searches)) + (if (> (length notmuch-hello-recent-searches) + notmuch-hello-searches-to-save) + (setq notmuch-hello-recent-searches (butlast notmuch-hello-recent-searches)))) + +(defun notmuch-hello-trim (search) + "Trim whitespace." + (if (string-match "^[[:space:]]*\\(.*[^[:space:]]\\)[[:space:]]*$" search) + (match-string 1 search) + search)) + +(defun notmuch-hello-search (search) + (let ((search (notmuch-hello-trim search))) + (notmuch-hello-save-search search) + (notmuch-search search))) + +(defun notmuch-hello () + (interactive) + + (switch-to-buffer "*notmuch-hello*") + (kill-all-local-variables) + (let ((inhibit-read-only t)) + (erase-buffer)) + + (let ((all (overlay-lists))) + ;; Delete all the overlays. + (mapcar 'delete-overlay (car all)) + (mapcar 'delete-overlay (cdr all))) + + (widget-insert "\nWelcome to notmuch.\n\n") + (let ((start (point))) + (widget-insert "Search: ") + (widget-create 'editable-field + :size notmuch-hello-search-width + :action (lambda (widget &rest ignore) + (let ((search (widget-value widget))) + (notmuch-hello-search search)))) + (widget-insert "\n") + (indent-rigidly start (point) 4)) + + (when notmuch-hello-recent-searches + (widget-insert "\nRecent searches:\n\n") + (let ((start (point))) + (mapcar '(lambda (search) + (widget-create 'editable-field + :size notmuch-hello-search-width + :action (lambda (widget &rest ignore) + (let ((search (widget-value widget))) + (notmuch-hello-search search))) + search) + (widget-insert "\n")) + notmuch-hello-recent-searches) + (indent-rigidly start (point) 4))) + + (widget-insert "\nFolders:\n\n") + (let ((start (point))) + (mapcar '(lambda (folder) + (let ((w (widget-create 'push-button + :notify (lambda (widget &rest ignore) + (notmuch-search (widget-get widget :notmuch-search-terms))) + "open"))) + (widget-put w :notmuch-search-terms (cdr folder))) + (widget-insert (format " %6s %s\n" (notmuch-folder-count (cdr folder)) (car folder)))) + notmuch-folders) + (indent-rigidly start (point) 4)) + + (widget-insert "\nAll tags:\n\n") + (let ((start (point))) + (mapcar '(lambda (tag) + (let ((w (widget-create 'push-button + :notify (lambda (widget &rest ignore) + (notmuch-search (widget-get widget :notmuch-search-terms))) + "open"))) + (widget-put w :notmuch-search-terms (concat "tag:" tag))) + (widget-insert (format " %6s %s\n" (notmuch-folder-count + (concat "tag:" tag)) + tag))) + (process-lines notmuch-command "search-tags")) + (indent-rigidly start (point) 4)) + + (use-local-map widget-keymap) + (local-set-key "=" 'notmuch-hello) + (local-set-key "q" '(lambda () (interactive) (kill-buffer (current-buffer)))) + + (widget-setup) + + ;; Always put point inside the `search' widget, which we know is + ;; first. + (goto-char (point-min)) + (widget-forward 1)) dme. -- David Edmondson, http://dme.org