]> git.notmuchmail.org Git - notmuch/blobdiff - emacs/notmuch-hello.el
emacs: add invisible space after the search widget field in notmuch-hello
[notmuch] / emacs / notmuch-hello.el
index 8dbb89824397835c4cf5c6e61a6a8d26c3d44a47..1a76c30abed9d79eafe1da8c30acc9ad5bf93561 100644 (file)
   :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 "<C-tab>") '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)