feat(mu4e): use file icons in part/attachment pick

Along with some other improvements and refactoring to the part picker
for a generally nicer experience, improved readability, and more
flexibility.
This commit is contained in:
TEC 2021-09-11 23:08:59 +08:00
parent ea53ab9ef1
commit b05d8e8082
No known key found for this signature in database
GPG key ID: 779591AFDB81F06C

View file

@ -192,7 +192,12 @@ Acts like a singular `mu4e-view-save-attachments', without the saving."
(dolist (part parts) (dolist (part parts)
(let ((fname (cdr (assoc 'filename (assoc "attachment" (cdr part)))))) (let ((fname (cdr (assoc 'filename (assoc "attachment" (cdr part))))))
(when fname (when fname
(push (cons fname part) files)))) (push (cons (if (featurep 'all-the-icons)
(concat (all-the-icons-icon-for-file fname)
" " fname)
fname)
part)
files))))
(if files (if files
(cdr (assoc (completing-read "Select attachment: " (mapcar #'car files)) (cdr (assoc (completing-read "Select attachment: " (mapcar #'car files))
files)) files))
@ -205,13 +210,28 @@ Acts like a singular `mu4e-view-save-attachments', without the saving."
(mu4e~view-mime-part-to-temp-file (cdr (+mu4e-view-select-attachment))))) (mu4e~view-mime-part-to-temp-file (cdr (+mu4e-view-select-attachment)))))
(defun +mu4e-view-select-part () (defun +mu4e-view-select-part ()
(let ((parts (mu4e~view-gather-mime-parts)) labeledparts) (let ((parts (mu4e~view-gather-mime-parts)) partinfo labeledparts maxfnamelen fnamefmt)
(dolist (part parts) (dolist (part parts)
(push (cons (concat (propertize (format "%-2s " (car part)) 'face '(bold font-lock-type-face)) (push (list :index (car part)
(or (cdr (assoc 'filename (assoc "attachment" (cdr part)))) :mimetype (if (string= "text/plain" (caaddr part))
(propertize "unnamed" 'face '(italic font-lock-doc-face))) (format "%s (%s)"
(propertize (format " [%s]" (caaddr part)) 'face 'font-lock-constant-face)) (caaddr part)
part) (alist-get 'charset (cdaddr part)))
(caaddr part))
:type (car (nth 5 part))
:filename (cdr (assoc 'filename (assoc "attachment" (cdr part))))
:part part)
partinfo))
(setq maxfnamelen (apply #'max 7 (mapcar (lambda (i) (length (plist-get i :filename))) partinfo))
fnamefmt (format " %%-%ds " maxfnamelen))
(dolist (pinfo partinfo)
(push (cons (concat (propertize (format "%-2s " (plist-get pinfo :index)) 'face '(bold font-lock-type-face))
(when (featurep 'all-the-icons)
(all-the-icons-icon-for-file (or (plist-get pinfo :filename) "")))
(format fnamefmt (or (plist-get pinfo :filename)
(propertize (plist-get pinfo :type) 'face '(italic font-lock-doc-face))))
(propertize (plist-get pinfo :mimetype) 'face 'font-lock-constant-face))
(plist-get pinfo :part))
labeledparts)) labeledparts))
(cdr (assoc (completing-read "Select part: " (mapcar #'car labeledparts)) (cdr (assoc (completing-read "Select part: " (mapcar #'car labeledparts))
labeledparts)))) labeledparts))))