]> git.notmuchmail.org Git - notmuch/blobdiff - emacs/notmuch-hello.el
emacs: Fix the autoload comments
[notmuch] / emacs / notmuch-hello.el
index 5072669b3d0f0f6b6bfc5670fd3489c0723cff6a..c384313f69fc1c052de87ad29c272251c351c89a 100644 (file)
@@ -19,9 +19,9 @@
 ;;
 ;; Authors: David Edmondson <dme@dme.org>
 
+(eval-when-compile (require 'cl))
 (require 'widget)
 (require 'wid-edit) ; For `widget-forward'.
-(require 'cl)
 
 (require 'notmuch-lib)
 (require 'notmuch-mua)
@@ -91,6 +91,13 @@ So:
          (integer :tag "Number of characters")
          (float :tag "Fraction of window")))
 
+(defcustom notmuch-decimal-separator ","
+  "The string used as a decimal separator.
+
+Typically \",\" in the US and UK and \".\" in Europe."
+  :group 'notmuch
+  :type 'string)
+
 (defvar notmuch-hello-url "http://notmuchmail.org"
   "The `notmuch' web site.")
 
@@ -103,6 +110,17 @@ So:
         notmuch-recent-searches-max)
       (setq notmuch-hello-recent-searches (butlast notmuch-hello-recent-searches))))
 
+(defun notmuch-hello-nice-number (n)
+  (let (result)
+    (while (> n 0)
+      (push (% n 1000) result)
+      (setq n (/ n 1000)))
+    (apply #'concat
+     (number-to-string (car result))
+     (mapcar (lambda (elem)
+             (format "%s%03d" notmuch-decimal-separator elem))
+            (cdr result)))))
+
 (defun notmuch-hello-trim (search)
   "Trim whitespace."
   (if (string-match "^[[:space:]]*\\(.*[^[:space:]]\\)[[:space:]]*$" search)
@@ -175,9 +193,9 @@ should be. Returns a cons cell `(tags-per-line width)'."
          ((integerp notmuch-column-control)
           (max 1
                (/ (- (window-width) notmuch-hello-indent)
-                  ;; Count is 7 wide (6 digits plus space), 1 for the space
+                  ;; Count is 9 wide (8 digits plus space), 1 for the space
                   ;; after the name.
-                  (+ 7 1 (max notmuch-column-control widest)))))
+                  (+ 9 1 (max notmuch-column-control widest)))))
 
          ((floatp notmuch-column-control)
           (let* ((available-width (- (window-width) notmuch-hello-indent))
@@ -187,12 +205,16 @@ should be. Returns a cons cell `(tags-per-line width)'."
          (t
           (max 1
                (/ (- (window-width) notmuch-hello-indent)
-                  ;; Count is 7 wide (6 digits plus space), 1 for the space
+                  ;; Count is 9 wide (8 digits plus space), 1 for the space
                   ;; after the name.
-                  (+ 7 1 widest)))))))
-
-    (cons tags-per-line (/ (- (window-width) notmuch-hello-indent
-                             (* tags-per-line (+ 7 1)))
+                  (+ 9 1 widest)))))))
+
+    (cons tags-per-line (/ (max 1
+                               (- (window-width) notmuch-hello-indent
+                                  ;; Count is 9 wide (8 digits plus
+                                  ;; space), 1 for the space after the
+                                  ;; name.
+                                  (* tags-per-line (+ 9 1))))
                           tags-per-line))))
 
 (defun notmuch-hello-insert-tags (tag-alist widest target)
@@ -213,7 +235,9 @@ should be. Returns a cons cell `(tags-per-line width)'."
              (let* ((name (car elem))
                     (query (cdr elem))
                     (formatted-name (format "%s " name)))
-               (widget-insert (format "%6s " (notmuch-saved-search-count query)))
+               (widget-insert (format "%8s "
+                                      (notmuch-hello-nice-number
+                                       (string-to-number (notmuch-saved-search-count query)))))
                (if (string= formatted-name target)
                    (setq found-target-pos (point-marker)))
                (widget-create 'push-button
@@ -226,7 +250,9 @@ should be. Returns a cons cell `(tags-per-line width)'."
                ;; can just insert `(- widest (length name))' spaces -
                ;; the column separator is included in the button if
                ;; `(equal widest (length name)'.
-               (widget-insert (make-string (- widest (length name)) ? ))))
+               (widget-insert (make-string (max 1
+                                                (- widest (length name)))
+                                           ? ))))
            (setq count (1+ count))
            (if (eq (% count tags-per-line) 0)
                (widget-insert "\n")))
@@ -249,6 +275,7 @@ should be. Returns a cons cell `(tags-per-line width)'."
   (notmuch-hello-update t))
 
 (defun notmuch-hello-update (&optional no-display)
+  "Update the current notmuch view."
   ;; Lazy - rebuild everything.
   (interactive)
   (notmuch-hello no-display))
@@ -259,7 +286,40 @@ should be. Returns a cons cell `(tags-per-line width)'."
   (notmuch-poll)
   (notmuch-hello-update))
 
+
+(defvar notmuch-hello-mode-map
+  (let ((map (make-sparse-keymap)))
+    (set-keymap-parent map widget-keymap)
+    (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 "=" '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 "s" 'notmuch-hello-goto-search)
+    map)
+  "Keymap for \"notmuch hello\" buffers.")
+(fset 'notmuch-hello-mode-map notmuch-hello-mode-map)
+
+(defun notmuch-hello-mode ()
+ "Major mode for convenient notmuch navigation. This is your entry portal into notmuch.
+
+Complete list of currently available key bindings:
+
+\\{notmuch-hello-mode-map}"
+ (interactive)
+ (kill-all-local-variables)
+ (use-local-map notmuch-hello-mode-map)
+ (setq major-mode 'notmuch-hello-mode
+       mode-name "notmuch-hello")
+ ;;(setq buffer-read-only t)
+)
+
+;;;###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
@@ -283,6 +343,9 @@ should be. Returns a cons cell `(tags-per-line width)'."
     (let ((inhibit-read-only t))
       (erase-buffer))
 
+    (unless (eq major-mode 'notmuch-hello-mode)
+      (notmuch-hello-mode))
+
     (let ((all (overlay-lists)))
       ;; Delete all the overlays.
       (mapc 'delete-overlay (car all))
@@ -318,8 +381,9 @@ should be. Returns a cons cell `(tags-per-line width)'."
                     :notify (lambda (&rest ignore)
                               (notmuch-hello-update))
                     :help-echo "Refresh"
-                    (car (process-lines notmuch-command "count")))
-      (widget-insert " messages (that's not much mail).\n"))
+                    (notmuch-hello-nice-number
+                     (string-to-number (car (process-lines notmuch-command "count")))))
+      (widget-insert " messages.\n"))
 
     (let ((found-target-pos nil)
          (final-target-pos nil))
@@ -441,16 +505,6 @@ should be. Returns a cons cell `(tags-per-line width)'."
        (let ((fill-column (- (window-width) notmuch-hello-indent)))
          (center-region start (point))))
 
-      (use-local-map widget-keymap)
-      (local-set-key "=" 'notmuch-hello-update)
-      (local-set-key (kbd "<C-tab>") 'widget-backward)
-      (local-set-key "G" 'notmuch-hello-poll-and-update)
-      (local-set-key "m" 'notmuch-mua-mail)
-      (local-set-key "q" '(lambda () (interactive) (kill-buffer (current-buffer))))
-      (local-set-key "s" 'notmuch-hello-goto-search)
-      (local-set-key "v" '(lambda () (interactive)
-                           (message "notmuch version %s" (notmuch-version))))
-
       (widget-setup)
 
       (when final-target-pos
@@ -461,7 +515,6 @@ should be. Returns a cons cell `(tags-per-line width)'."
       (unless (widget-at)
        (notmuch-hello-goto-search)))))
 
-;;;###autoload
 (defun notmuch-folder ()
   "Deprecated function for invoking notmuch---calling `notmuch' is preferred now."
   (interactive)