mirror of
https://git.notmuchmail.org/git/notmuch
synced 2024-11-25 12:28:09 +01:00
emacs: Improved printing support.
Add various functions to print notmuch messages and tie them together with a simple frontend. Add a binding ('#') in `notmuch-show-mode' to print the current message. one trailing space removed by db.
This commit is contained in:
parent
8ae753f30f
commit
05f4904616
3 changed files with 140 additions and 1 deletions
|
@ -13,7 +13,8 @@ emacs_sources := \
|
||||||
$(dir)/notmuch-maildir-fcc.el \
|
$(dir)/notmuch-maildir-fcc.el \
|
||||||
$(dir)/notmuch-message.el \
|
$(dir)/notmuch-message.el \
|
||||||
$(dir)/notmuch-crypto.el \
|
$(dir)/notmuch-crypto.el \
|
||||||
$(dir)/coolj.el
|
$(dir)/coolj.el \
|
||||||
|
$(dir)/notmuch-print.el
|
||||||
|
|
||||||
emacs_images := \
|
emacs_images := \
|
||||||
$(srcdir)/$(dir)/notmuch-logo.png
|
$(srcdir)/$(dir)/notmuch-logo.png
|
||||||
|
|
85
emacs/notmuch-print.el
Normal file
85
emacs/notmuch-print.el
Normal file
|
@ -0,0 +1,85 @@
|
||||||
|
;; notmuch-print.el --- printing messages from notmuch.
|
||||||
|
;;
|
||||||
|
;; Copyright © David Edmondson
|
||||||
|
;;
|
||||||
|
;; This file is part of Notmuch.
|
||||||
|
;;
|
||||||
|
;; Notmuch is free software: you can redistribute it and/or modify it
|
||||||
|
;; under the terms of the GNU General Public License as published by
|
||||||
|
;; the Free Software Foundation, either version 3 of the License, or
|
||||||
|
;; (at your option) any later version.
|
||||||
|
;;
|
||||||
|
;; Notmuch is distributed in the hope that it will be useful, but
|
||||||
|
;; WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
;; General Public License for more details.
|
||||||
|
;;
|
||||||
|
;; You should have received a copy of the GNU General Public License
|
||||||
|
;; along with Notmuch. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
;;
|
||||||
|
;; Authors: David Edmondson <dme@dme.org>
|
||||||
|
|
||||||
|
(defcustom notmuch-print-mechanism 'notmuch-print-lpr
|
||||||
|
"How should printing be done?"
|
||||||
|
:group 'notmuch
|
||||||
|
:type '(choice
|
||||||
|
(function :tag "Use lpr" notmuch-print-lpr)
|
||||||
|
(function :tag "Use ps-print" notmuch-print-ps-print)
|
||||||
|
(function :tag "Use ps-print then evince" notmuch-print-ps-print/evince)
|
||||||
|
(function :tag "Use muttprint" notmuch-print-muttprint)
|
||||||
|
(function :tag "Use muttprint then evince" notmuch-print-muttprint/evince)
|
||||||
|
(function :tag "Using a custom function")))
|
||||||
|
|
||||||
|
;; Utility functions:
|
||||||
|
|
||||||
|
(defun notmuch-print-run-evince (file)
|
||||||
|
"View FILE using 'evince'."
|
||||||
|
(start-process "evince" nil "evince" file))
|
||||||
|
|
||||||
|
(defun notmuch-print-run-muttprint (&optional output)
|
||||||
|
"Pass the contents of the current buffer to 'muttprint'.
|
||||||
|
|
||||||
|
Optional OUTPUT allows passing a list of flags to muttprint."
|
||||||
|
(apply #'call-process-region (point-min) (point-max)
|
||||||
|
;; Reads from stdin.
|
||||||
|
"muttprint"
|
||||||
|
nil nil nil
|
||||||
|
;; Show the tags.
|
||||||
|
"--printed-headers" "Date_To_From_CC_Newsgroups_*Subject*_/Tags/"
|
||||||
|
output))
|
||||||
|
|
||||||
|
;; User-visible functions:
|
||||||
|
|
||||||
|
(defun notmuch-print-lpr (msg)
|
||||||
|
"Print a message buffer using lpr."
|
||||||
|
(lpr-buffer))
|
||||||
|
|
||||||
|
(defun notmuch-print-ps-print (msg)
|
||||||
|
"Print a message buffer using the ps-print package."
|
||||||
|
(let ((subject (plist-get (notmuch-show-get-prop :headers msg) :Subject)))
|
||||||
|
(rename-buffer subject t)
|
||||||
|
(ps-print-buffer)))
|
||||||
|
|
||||||
|
(defun notmuch-print-ps-print/evince (msg)
|
||||||
|
"Preview a message buffer using ps-print and evince."
|
||||||
|
(let ((ps-file (make-temp-file "notmuch"))
|
||||||
|
(subject (plist-get (notmuch-show-get-prop :headers msg) :Subject)))
|
||||||
|
(rename-buffer subject t)
|
||||||
|
(ps-print-buffer ps-file)
|
||||||
|
(notmuch-print-run-evince ps-file)))
|
||||||
|
|
||||||
|
(defun notmuch-print-muttprint (msg)
|
||||||
|
"Print a message using muttprint."
|
||||||
|
(notmuch-print-run-muttprint))
|
||||||
|
|
||||||
|
(defun notmuch-print-muttprint/evince (msg)
|
||||||
|
"Preview a message buffer using muttprint and evince."
|
||||||
|
(let ((ps-file (make-temp-file "notmuch")))
|
||||||
|
(notmuch-print-run-muttprint (list "--printer" (concat "TO_FILE:" ps-file)))
|
||||||
|
(notmuch-print-run-evince ps-file)))
|
||||||
|
|
||||||
|
(defun notmuch-print-message (msg)
|
||||||
|
"Print a message using the user-selected mechanism."
|
||||||
|
(funcall notmuch-print-mechanism msg))
|
||||||
|
|
||||||
|
(provide 'notmuch-print)
|
|
@ -34,6 +34,7 @@
|
||||||
(require 'notmuch-wash)
|
(require 'notmuch-wash)
|
||||||
(require 'notmuch-mua)
|
(require 'notmuch-mua)
|
||||||
(require 'notmuch-crypto)
|
(require 'notmuch-crypto)
|
||||||
|
(require 'notmuch-print)
|
||||||
|
|
||||||
(declare-function notmuch-call-notmuch-process "notmuch" (&rest args))
|
(declare-function notmuch-call-notmuch-process "notmuch" (&rest args))
|
||||||
(declare-function notmuch-fontify-headers "notmuch" nil)
|
(declare-function notmuch-fontify-headers "notmuch" nil)
|
||||||
|
@ -188,6 +189,52 @@ indentation."
|
||||||
mm-handle (> (notmuch-count-attachments mm-handle) 1))))
|
mm-handle (> (notmuch-count-attachments mm-handle) 1))))
|
||||||
(message "Done"))
|
(message "Done"))
|
||||||
|
|
||||||
|
(defun notmuch-show-with-message-as-text (fn)
|
||||||
|
"Apply FN to a text representation of the current message.
|
||||||
|
|
||||||
|
FN is called with one argument, the message properties. It should
|
||||||
|
operation on the contents of the current buffer."
|
||||||
|
|
||||||
|
;; Remake the header to ensure that all information is available.
|
||||||
|
(let* ((to (notmuch-show-get-to))
|
||||||
|
(cc (notmuch-show-get-cc))
|
||||||
|
(from (notmuch-show-get-from))
|
||||||
|
(subject (notmuch-show-get-subject))
|
||||||
|
(date (notmuch-show-get-date))
|
||||||
|
(tags (notmuch-show-get-tags))
|
||||||
|
(depth (notmuch-show-get-depth))
|
||||||
|
|
||||||
|
(header (concat
|
||||||
|
"Subject: " subject "\n"
|
||||||
|
"To: " to "\n"
|
||||||
|
(if (not (string= cc ""))
|
||||||
|
(concat "Cc: " cc "\n")
|
||||||
|
"")
|
||||||
|
"From: " from "\n"
|
||||||
|
"Date: " date "\n"
|
||||||
|
(if tags
|
||||||
|
(concat "Tags: "
|
||||||
|
(mapconcat #'identity tags ", ") "\n")
|
||||||
|
"")))
|
||||||
|
(all (buffer-substring (notmuch-show-message-top)
|
||||||
|
(notmuch-show-message-bottom)))
|
||||||
|
|
||||||
|
(props (notmuch-show-get-message-properties)))
|
||||||
|
(with-temp-buffer
|
||||||
|
(insert all)
|
||||||
|
(indent-rigidly (point-min) (point-max) (- depth))
|
||||||
|
;; Remove the original header.
|
||||||
|
(goto-char (point-min))
|
||||||
|
(re-search-forward "^$" (point-max) nil)
|
||||||
|
(delete-region (point-min) (point))
|
||||||
|
(insert header)
|
||||||
|
(funcall fn props))))
|
||||||
|
|
||||||
|
(defun notmuch-show-print-message ()
|
||||||
|
"Print the current message."
|
||||||
|
(interactive)
|
||||||
|
(notmuch-show-with-message-as-text 'notmuch-print-message))
|
||||||
|
|
||||||
(defun notmuch-show-fontify-header ()
|
(defun notmuch-show-fontify-header ()
|
||||||
(let ((face (cond
|
(let ((face (cond
|
||||||
((looking-at "[Tt]o:")
|
((looking-at "[Tt]o:")
|
||||||
|
@ -763,6 +810,8 @@ current buffer, if possible."
|
||||||
(overlay-put headers-overlay 'priority 10))
|
(overlay-put headers-overlay 'priority 10))
|
||||||
(overlay-put (make-overlay body-start body-end) 'invisible message-invis-spec)
|
(overlay-put (make-overlay body-start body-end) 'invisible message-invis-spec)
|
||||||
|
|
||||||
|
(plist-put msg :depth depth)
|
||||||
|
|
||||||
;; Save the properties for this message. Currently this saves the
|
;; Save the properties for this message. Currently this saves the
|
||||||
;; entire message (augmented it with other stuff), which seems
|
;; entire message (augmented it with other stuff), which seems
|
||||||
;; like overkill. We might save a reduced subset (for example, not
|
;; like overkill. We might save a reduced subset (for example, not
|
||||||
|
@ -953,6 +1002,7 @@ thread id. If a prefix is given, crypto processing is toggled."
|
||||||
(define-key map " " 'notmuch-show-advance-and-archive)
|
(define-key map " " 'notmuch-show-advance-and-archive)
|
||||||
(define-key map (kbd "M-RET") 'notmuch-show-open-or-close-all)
|
(define-key map (kbd "M-RET") 'notmuch-show-open-or-close-all)
|
||||||
(define-key map (kbd "RET") 'notmuch-show-toggle-message)
|
(define-key map (kbd "RET") 'notmuch-show-toggle-message)
|
||||||
|
(define-key map "#" 'notmuch-show-print-message)
|
||||||
map)
|
map)
|
||||||
"Keymap for \"notmuch show\" buffers.")
|
"Keymap for \"notmuch show\" buffers.")
|
||||||
(fset 'notmuch-show-mode-map notmuch-show-mode-map)
|
(fset 'notmuch-show-mode-map notmuch-show-mode-map)
|
||||||
|
@ -1113,6 +1163,9 @@ Some useful entries are:
|
||||||
(defun notmuch-show-get-to ()
|
(defun notmuch-show-get-to ()
|
||||||
(notmuch-show-get-header :To))
|
(notmuch-show-get-header :To))
|
||||||
|
|
||||||
|
(defun notmuch-show-get-depth ()
|
||||||
|
(notmuch-show-get-prop :depth))
|
||||||
|
|
||||||
(defun notmuch-show-set-tags (tags)
|
(defun notmuch-show-set-tags (tags)
|
||||||
"Set the tags of the current message."
|
"Set the tags of the current message."
|
||||||
(notmuch-show-set-prop :tags tags)
|
(notmuch-show-set-prop :tags tags)
|
||||||
|
|
Loading…
Reference in a new issue