;;
;; 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)
(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.")
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)))
+ (setq result (or result '(0)))
+ (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)
maximize (length (car elem)))
0))
-(defun notmuch-hello-roundup (dividend divisor)
- "Return the rounded up value of dividing `dividend' by `divisor'."
- (+ (/ dividend divisor)
- (if (> (% dividend divisor) 0) 1 0)))
-
(defun notmuch-hello-reflect-generate-row (ncols nrows row list)
(let ((len (length list)))
(loop for col from 0 to (- ncols 1)
"Reflect a `ncols' wide matrix represented by `list' along the
diagonal."
;; Not very lispy...
- (let ((nrows (notmuch-hello-roundup (length list) ncols)))
+ (let ((nrows (ceiling (length list) ncols)))
(loop for row from 0 to (- nrows 1)
append (notmuch-hello-reflect-generate-row ncols nrows row list))))
((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))
(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)
(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
;; 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")))
(notmuch-hello-update t))
(defun notmuch-hello-update (&optional no-display)
+ "Update the current notmuch view."
;; Lazy - rebuild everything.
(interactive)
(notmuch-hello no-display))
(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" '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-new-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
(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))
: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))
(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 "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
(unless (widget-at)
(notmuch-hello-goto-search)))))
-;;;###autoload
(defun notmuch-folder ()
"Deprecated function for invoking notmuch---calling `notmuch' is preferred now."
(interactive)