X-Git-Url: https://git.notmuchmail.org/git?p=notmuch;a=blobdiff_plain;f=emacs%2Fnotmuch-hello.el;h=1a76c30abed9d79eafe1da8c30acc9ad5bf93561;hp=8dbb89824397835c4cf5c6e61a6a8d26c3d44a47;hb=e972d752c038b015b0af92de4ce1e00aa2557b71;hpb=c506e1034b5adb54b3e4f8d3e59086756f2bb126 diff --git a/emacs/notmuch-hello.el b/emacs/notmuch-hello.el index 8dbb8982..1a76c30a 100644 --- a/emacs/notmuch-hello.el +++ b/emacs/notmuch-hello.el @@ -55,6 +55,26 @@ :type 'boolean :group 'notmuch) +(defcustom notmuch-hello-tag-list-make-query nil + "Function or string to generate queries for the all tags list. + +This variable controls which query results are shown for each tag +in the \"all tags\" list. If nil, it will use all messages with +that tag. If this is set to a string, it is used as a filter for +messages having that tag (equivalent to \"tag:TAG and (THIS-VARIABLE)\"). +Finally this can be a function that will be called for each tag and +should return a filter for that tag, or nil to hide the tag." + :type '(choice (const :tag "All messages" nil) + (const :tag "Unread messages" "tag:unread") + (const :tag "Custom filter" string) + (const :tag "Custom filter function" function)) + :group 'notmuch) + +(defcustom notmuch-hello-hide-tags nil + "List of tags to be hidden in the \"all tags\"-section." + :type '(repeat string) + :group 'notmuch) + (defface notmuch-hello-logo-background '((((class color) (background dark)) @@ -115,6 +135,7 @@ Typically \",\" in the US and UK and \".\" in Europe." (while (> n 0) (push (% n 1000) result) (setq n (/ n 1000))) + (setq result (or result '(0))) (apply #'concat (number-to-string (car result)) (mapcar (lambda (elem) @@ -293,11 +314,11 @@ should be. Returns a cons cell `(tags-per-line width)'." (define-key map "v" '(lambda () "Display the notmuch version" (interactive) (message "notmuch version %s" (notmuch-version)))) (define-key map "?" 'notmuch-help) - (define-key map "q" 'kill-this-buffer) + (define-key map "q" 'notmuch-kill-this-buffer) (define-key map "=" 'notmuch-hello-update) (define-key map "G" 'notmuch-hello-poll-and-update) (define-key map (kbd "") 'widget-backward) - (define-key map "m" 'notmuch-mua-mail) + (define-key map "m" 'notmuch-mua-new-mail) (define-key map "s" 'notmuch-hello-goto-search) map) "Keymap for \"notmuch hello\" buffers.") @@ -317,7 +338,28 @@ Complete list of currently available key bindings: ;;(setq buffer-read-only t) ) +(defun notmuch-hello-generate-tag-alist () + "Return an alist from tags to queries to display in the all-tags section." + (notmuch-remove-if-not + #'cdr + (mapcar (lambda (tag) + (cons tag + (cond + ((functionp notmuch-hello-tag-list-make-query) + (concat "tag:" tag " and (" + (funcall notmuch-hello-tag-list-make-query tag) ")")) + ((stringp notmuch-hello-tag-list-make-query) + (concat "tag:" tag " and (" + notmuch-hello-tag-list-make-query ")")) + (t (concat "tag:" tag))))) + (notmuch-remove-if-not + (lambda (tag) + (not (member tag notmuch-hello-hide-tags))) + (process-lines notmuch-command "search-tags"))))) + +;;;###autoload (defun notmuch-hello (&optional no-display) + "Run notmuch and display saved searches, known tags, etc." (interactive) ; Jump through a hoop to get this value from the deprecated variable @@ -386,16 +428,14 @@ Complete list of currently available key bindings: (let ((found-target-pos nil) (final-target-pos nil)) (let* ((saved-alist - ;; Filter out empty saved seaches if required. + ;; Filter out empty saved searches if required. (if notmuch-show-empty-saved-searches notmuch-saved-searches (loop for elem in notmuch-saved-searches if (> (string-to-number (notmuch-saved-search-count (cdr elem))) 0) collect elem))) (saved-widest (notmuch-hello-longest-label saved-alist)) - (alltags-alist (if notmuch-show-all-tags-list - (mapcar '(lambda (tag) (cons tag (concat "tag:" tag))) - (process-lines notmuch-command "search-tags")))) + (alltags-alist (if notmuch-show-all-tags-list (notmuch-hello-generate-tag-alist))) (alltags-widest (notmuch-hello-longest-label alltags-alist)) (widest (max saved-widest alltags-widest))) @@ -422,6 +462,10 @@ Complete list of currently available key bindings: (length "Search: "))) :action (lambda (widget &rest ignore) (notmuch-hello-search (widget-value widget)))) + ;; add an invisible space to make `widget-end-of-line' ignore + ;; trailine spaces in the search widget field + (widget-insert " ") + (put-text-property (1- (point)) (point) 'invisible t) (widget-insert "\n") (when notmuch-hello-recent-searches @@ -513,7 +557,6 @@ Complete list of currently available key bindings: (unless (widget-at) (notmuch-hello-goto-search))))) -;;;###autoload (defun notmuch-folder () "Deprecated function for invoking notmuch---calling `notmuch' is preferred now." (interactive)