* mu4e: experimental support for fancy (non-ascii) characters for flags and

thread prefixes. Based on idea by Niv Sardi (xaiki)
This commit is contained in:
djcb 2012-08-27 18:04:58 +03:00
parent 354f77e41d
commit 9c493a017a
1 changed files with 75 additions and 21 deletions

View File

@ -71,13 +71,41 @@ and the mode-line."
:type 'integer :type 'integer
:group 'mu4e-headers) :group 'mu4e-headers)
(defcustom mu4e-headers-visible-columns 30 (defcustom mu4e-headers-visible-columns 30
"Number of columns to display for the header view when using the "Number of columns to display for the header view when using the
vertical split-view." vertical split-view."
:type 'integer :type 'integer
:group 'mu4e-headers) :group 'mu4e-headers)
(defcustom mu4e-headers-use-fancy-chars nil
"Whether to use fancy (non-ascii) characters to show message
flags and thread prefixes."
:type 'booleanp
:group 'mu4e-headers)
;; marks for headers of the form; each is a cons-cell (basic . fancy)
;; each of which is basic ascii char and something fancy, respectively
(defvar mu4e-headers-draft-mark '("D" . "") "Mark for draft messages.")
(defvar mu4e-headers-flagged-mark '("F" . "") "Mark for flagged messages.")
(defvar mu4e-headers-new-mark '("N" . "") "Mark for new messages.")
(defvar mu4e-headers-passed-mark '("P" . "") "Mark for passed (fwd) messages.")
(defvar mu4e-headers-replied-mark '("R" . "") "Mark for replied messages.")
(defvar mu4e-headers-seen-mark '("S" . "") "Mark for seen messages.")
(defvar mu4e-headers-trashed-mark '("T" . "") "Mark for trashed messages.")
(defvar mu4e-headers-attach-mark '("a" . "a") "Mark for messages w/ attachments.")
(defvar mu4e-headers-encrypted-mark '("x" . "x") "Mark for encrypted messages.")
(defvar mu4e-headers-signed-mark '("s" . "s") "Mark for signed messages.")
(defvar mu4e-headers-unread-mark '("u" . "u") "Mark for unread messages.")
;; thread prefix marks
(defvar mu4e-headers-has-child-prefix '("+" . "+") "Prefix for thread with child(ren).")
(defvar mu4e-headers-empty-parent-prefix '("-" . "") "Prefix for thread without parent.")
(defvar mu4e-headers-first-child-prefix '("\\" . "┗➔") "Prefix for the first child.")
(defvar mu4e-headers-duplicate-prefix '("=" . "") "Prefix for a duplicate message.")
(defvar mu4e-headers-default-prefix '("|" . "") "Default prefix.")
(defvar mu4e-headers-actions (defvar mu4e-headers-actions
'( ("capture message" . mu4e-action-capture-message)) '( ("capture message" . mu4e-action-capture-message))
"List of actions to perform on messages in the headers list. The actions "List of actions to perform on messages in the headers list. The actions
@ -234,22 +262,50 @@ into a string."
(let ((name (car ct)) (email (cdr ct))) (let ((name (car ct)) (email (cdr ct)))
(or name email "?"))) contacts ", ")) (or name email "?"))) contacts ", "))
(defun mu4e~headers-thread-prefix (thread) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defsubst mu4e~headers-thread-prefix (thread)
"Calculate the thread prefix based on thread info THREAD." "Calculate the thread prefix based on thread info THREAD."
(if thread (when thread
(let ( (level (plist-get thread :level)) (let ((get-prefix
(first-child (plist-get thread :first-child)) (lambda (cell) (if mu4e-headers-use-fancy-chars (cdr cell) (car cell)))))
(has-child (plist-get thread :has-child))
(duplicate (plist-get thread :duplicate))
(empty-parent (plist-get thread :empty-parent)))
(concat (concat
(make-string (* (if empty-parent 0 2) level) ?\s) (make-string (* (if (plist-get thread :empty-parent) 0 2)
(plist-get thread :level)) ?\s)
(cond (cond
(has-child "+ ") ((plist-get thread :has-child) (funcall get-prefix mu4e-headers-has-child-prefix))
(empty-parent "- ") ((plist-get thread :empty-parent) (funcall get-prefix mu4e-headers-empty-parent-prefix))
(first-child "\\ ") ((plist-get thread :first-child) (funcall get-prefix mu4e-headers-first-child-prefix))
(duplicate "= ") ((plist-get thread :duplicate) (funcall get-prefix mu4e-headers-duplicate-prefix))
(t "| ")))))) (t (funcall get-prefix mu4e-headers-default-prefix)))
" "))))
(defsubst mu4e~headers-flags-str (flags)
"Get a display string for the flags; note, there is
`mu4e-flags-to-string' but that is for internal use; this function
is for display. (This difference is significant, since internally,
the Maildir spec determines what the flags look like, while our
display may be different)."
(let ((str)
(get-prefix
(lambda (cell) (if mu4e-headers-use-fancy-chars (cdr cell) (car cell)))))
(dolist (flag flags)
(setq str
(concat str
(case flag
('draft (funcall get-prefix mu4e-headers-draft-mark))
('flagged (funcall get-prefix mu4e-headers-flagged-mark))
('new (funcall get-prefix mu4e-headers-new-mark))
('passed (funcall get-prefix mu4e-headers-passed-mark))
('replied (funcall get-prefix mu4e-headers-replied-mark))
('seen (funcall get-prefix mu4e-headers-seen-mark))
('trashed (funcall get-prefix mu4e-headers-trashed-mark))
('attach (funcall get-prefix mu4e-headers-attach-mark))
('encrypted (funcall get-prefix mu4e-headers-encrypted-mark))
('signed (funcall get-prefix mu4e-headers-signed-mark))
('unread (funcall get-prefix mu4e-headers-unread-mark))))))
str))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defconst mu4e-headers-from-or-to-prefix '("" . "To ") (defconst mu4e-headers-from-or-to-prefix '("" . "To ")
"Prefix for the :from-or-to field when it is showing, "Prefix for the :from-or-to field when it is showing,
@ -290,7 +346,7 @@ if provided, or at the end of the buffer otherwise."
mu4e-headers-from-or-to-prefix)) mu4e-headers-from-or-to-prefix))
(mu4e~headers-contact-str from-lst))))) (mu4e~headers-contact-str from-lst)))))
(:date (format-time-string mu4e-headers-date-format val)) (:date (format-time-string mu4e-headers-date-format val))
(:flags (propertize (mu4e-flags-to-string val) (:flags (propertize (mu4e~headers-flags-str val)
'help-echo (format "%S" val))) 'help-echo (format "%S" val)))
(:size (mu4e-display-size val)) (:size (mu4e-display-size val))
(t (mu4e-error "Unsupported header field (%S)" field))))) (t (mu4e-error "Unsupported header field (%S)" field)))))
@ -520,7 +576,6 @@ after the end of the search results."
table)) table))
"The `glyphless-char-display' table in mu4e heders buffers.") "The `glyphless-char-display' table in mu4e heders buffers.")
(defun mu4e~header-line-format () (defun mu4e~header-line-format ()
"Get the format for the header line." "Get the format for the header line."
(cons (cons
@ -623,15 +678,14 @@ adding a lot of new headers looks really choppy."
;;;; is used for quickly finding a certain header, the latter for retrieving the ;;;; is used for quickly finding a certain header, the latter for retrieving the
;;;; docid at point without string matching etc. ;;;; docid at point without string matching etc.
(defun mu4e~headers-docid-cookie (docid) (defsubst mu4e~headers-docid-cookie (docid)
"Create an invisible string containing DOCID; this is to be used "Create an invisible string containing DOCID; this is to be used
at the beginning of lines to identify headers." at the beginning of lines to identify headers."
(propertize (format "%s%d%s" (propertize (format "%s%d%s"
mu4e~headers-docid-pre docid mu4e~headers-docid-post) mu4e~headers-docid-pre docid mu4e~headers-docid-post)
'docid docid 'invisible t)) 'docid docid 'invisible t))
(defsubst mu4e~headers-docid-at-point (&optional point)
(defun mu4e~headers-docid-at-point (&optional point)
"Get the docid for the header at POINT, or at current (point) if "Get the docid for the header at POINT, or at current (point) if
nil. Returns the docid, or nil if there is none." nil. Returns the docid, or nil if there is none."
(save-excursion (save-excursion
@ -656,7 +710,7 @@ of the beginning of the line."
(setq newpoint (point))))) (setq newpoint (point)))))
newpoint)) ;; return the point, or nil if not found newpoint)) ;; return the point, or nil if not found
(defun mu4e~headers-docid-pos (docid) (defsubst mu4e~headers-docid-pos (docid)
"Return the pos of the beginning of the line with the header with "Return the pos of the beginning of the line with the header with
docid DOCID, or nil if it cannot be found." docid DOCID, or nil if it cannot be found."
(let ((pos)) (let ((pos))
@ -664,7 +718,7 @@ docid DOCID, or nil if it cannot be found."
(setq pos (mu4e~headers-goto-docid docid))) (setq pos (mu4e~headers-goto-docid docid)))
pos)) pos))
(defun mu4e~headers-field-for-docid (docid field) (defsubst mu4e~headers-field-for-docid (docid field)
"Get FIELD (a symbol, see `mu4e-headers-names') for the message "Get FIELD (a symbol, see `mu4e-headers-names') for the message
with DOCID which must be present in the headers buffer." with DOCID which must be present in the headers buffer."
(save-excursion (save-excursion