* Printing mail
@ 2010-11-09 14:51 Keith Packard
2010-11-09 16:16 ` Sebastian Spaeth
0 siblings, 1 reply; 18+ messages in thread
From: Keith Packard @ 2010-11-09 14:51 UTC (permalink / raw)
To: notmuch
[-- Attachment #1: Type: text/plain, Size: 355 bytes --]
Print is dead. Or so they say
Here's a script I'm using with '|' to get mail printed. As you can see,
it previews the mail on-screen with 'evince', from which you use the
regular 'print' dialog.
#!/bin/sh
tmp=`mktemp`
muttprint -p "TO_FILE:$tmp"
evince $tmp
rm $tmp
Making this more secure would be nice.
--
keith.packard@intel.com
[-- Attachment #2: Type: application/pgp-signature, Size: 189 bytes --]
^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: Printing mail
2010-11-09 14:51 Printing mail Keith Packard
@ 2010-11-09 16:16 ` Sebastian Spaeth
2010-11-09 18:00 ` Keith Packard
0 siblings, 1 reply; 18+ messages in thread
From: Sebastian Spaeth @ 2010-11-09 16:16 UTC (permalink / raw)
To: notmuch
[-- Attachment #1: Type: text/plain, Size: 633 bytes --]
On Tue, 09 Nov 2010 06:51:12 -0800, "Keith Packard" <keithp@keithp.com> wrote:
> Here's a script I'm using with '|' to get mail printed.
Cool script, thanks. Isn't invoking latex a bit heavy-handed to get a
simple mail printed? Given that we are running in almighty emacs anyway.
M-x ps-print buffer doesn't look too bad here and even copes with the
encoding better than the printout of your mail with muttprint had
looked.
Not sure if we should bind a key to ps-print-buffer in notmuch by
default?
The only nuissane is that the title bar simply says "*Printing mail*
(unsave)* here. Is there a way to customize that?
Sebastian
[-- Attachment #2: Type: application/pgp-signature, Size: 197 bytes --]
^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: Printing mail
2010-11-09 16:16 ` Sebastian Spaeth
@ 2010-11-09 18:00 ` Keith Packard
2010-11-10 7:32 ` Sebastian Spaeth
0 siblings, 1 reply; 18+ messages in thread
From: Keith Packard @ 2010-11-09 18:00 UTC (permalink / raw)
To: Sebastian Spaeth, notmuch
[-- Attachment #1: Type: text/plain, Size: 449 bytes --]
On Tue, 09 Nov 2010 17:16:48 +0100, Sebastian Spaeth <Sebastian@SSpaeth.de> wrote:
> M-x ps-print buffer doesn't look too bad here and even copes with the
> encoding better than the printout of your mail with muttprint had
> looked.
I like the header formatting. And, using evince provides a 'friendly'
print dialog. But, yeah, something that dealt with mail encodings and
attachments would be even nicer.
--
keith.packard@intel.com
[-- Attachment #2: Type: application/pgp-signature, Size: 189 bytes --]
^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: Printing mail
2010-11-09 18:00 ` Keith Packard
@ 2010-11-10 7:32 ` Sebastian Spaeth
2010-11-10 7:43 ` Keith Packard
0 siblings, 1 reply; 18+ messages in thread
From: Sebastian Spaeth @ 2010-11-10 7:32 UTC (permalink / raw)
To: Keith Packard, notmuch
[-- Attachment #1: Type: text/plain, Size: 812 bytes --]
On Tue, 09 Nov 2010 10:00:59 -0800, Keith Packard wrote:
> I like the header formatting. And, using evince provides a 'friendly'
> print dialog. But, yeah, something that dealt with mail encodings and
> attachments would be even nicer.
I have the printing package loaded
(require 'printing)
(pr-update-menus)
which gives me nice menu entries for previewing my printouts (defaults
to 'gv' but can easily be set to use 'evince') and which provides the
M-x pr-ps-buffer-preview command to invoke the print preview directly
(unfortunately it still asks about the n-up scaling of pages).
Better header formatting could be achieved by locally customizing the
"ps-print-header" thing when in notmuch mode. But I know too little
about elisp to actually do that myself. That would actually be pretty
nifty.
Sebastian
[-- Attachment #2: Type: application/pgp-signature, Size: 197 bytes --]
^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: Printing mail
2010-11-10 7:32 ` Sebastian Spaeth
@ 2010-11-10 7:43 ` Keith Packard
2010-11-11 12:57 ` David Edmondson
0 siblings, 1 reply; 18+ messages in thread
From: Keith Packard @ 2010-11-10 7:43 UTC (permalink / raw)
To: Sebastian Spaeth, notmuch
[-- Attachment #1: Type: text/plain, Size: 528 bytes --]
On Wed, 10 Nov 2010 08:32:01 +0100, Sebastian Spaeth <Sebastian@SSpaeth.de> wrote:
> which gives me nice menu entries for previewing my printouts (defaults
> to 'gv' but can easily be set to use 'evince') and which provides the
> M-x pr-ps-buffer-preview command to invoke the print preview directly
> (unfortunately it still asks about the n-up scaling of pages).
Oh, but that doesn't print a message, it prints a buffer which may contain
other stuff, and may have some elided lines.
--
keith.packard@intel.com
[-- Attachment #2: Type: application/pgp-signature, Size: 189 bytes --]
^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: Printing mail
2010-11-10 7:43 ` Keith Packard
@ 2010-11-11 12:57 ` David Edmondson
2010-11-11 14:12 ` Sebastian Spaeth
2010-11-12 12:53 ` [PATCH] emacs: Improved printing support David Edmondson
0 siblings, 2 replies; 18+ messages in thread
From: David Edmondson @ 2010-11-11 12:57 UTC (permalink / raw)
To: Keith Packard, Sebastian Spaeth, notmuch
[-- Attachment #1: Type: text/plain, Size: 811 bytes --]
On Tue, 09 Nov 2010 23:43:53 -0800, Keith Packard <keithp@keithp.com> wrote:
> On Wed, 10 Nov 2010 08:32:01 +0100, Sebastian Spaeth <Sebastian@SSpaeth.de> wrote:
>
> > which gives me nice menu entries for previewing my printouts (defaults
> > to 'gv' but can easily be set to use 'evince') and which provides the
> > M-x pr-ps-buffer-preview command to invoke the print preview directly
> > (unfortunately it still asks about the n-up scaling of pages).
>
> Oh, but that doesn't print a message, it prints a buffer which may contain
> other stuff, and may have some elided lines.
Which is swings and roundabouts, especially if the message in question
has multiple parts - muttprint produces mostly horrid output for
something with both text/plain and text/html parts.
How about something like the attached?
[-- Attachment #2: 0001-emacs-Improved-printing-support.patch --]
[-- Type: text/x-diff, Size: 5811 bytes --]
From 2fefbe83fd5d0abed4aa063f5d0d2a7b59873bd8 Mon Sep 17 00:00:00 2001
From: David Edmondson <dme@dme.org>
Date: Thu, 11 Nov 2010 12:33:19 +0000
Subject: [PATCH] emacs: Improved printing support.
---
emacs/Makefile.local | 3 +-
emacs/notmuch-print.el | 67 ++++++++++++++++++++++++++++++++++++++++++++++++
emacs/notmuch-show.el | 38 +++++++++++++++++++++++++++
3 files changed, 107 insertions(+), 1 deletions(-)
create mode 100644 emacs/notmuch-print.el
diff --git a/emacs/Makefile.local b/emacs/Makefile.local
index c5280f1..df87427 100644
--- a/emacs/Makefile.local
+++ b/emacs/Makefile.local
@@ -13,7 +13,8 @@ emacs_sources := \
$(dir)/notmuch-maildir-fcc.el \
$(dir)/notmuch-message.el \
$(dir)/coolj.el \
- $(dir)/notmuch-lkml.el
+ $(dir)/notmuch-lkml.el \
+ $(dir)/notmuch-print.el
emacs_images := \
$(dir)/notmuch-logo.png
diff --git a/emacs/notmuch-print.el b/emacs/notmuch-print.el
new file mode 100644
index 0000000..2ad4b45
--- /dev/null
+++ b/emacs/notmuch-print.el
@@ -0,0 +1,67 @@
+;; 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 'lpr
+ "How should printing be done?"
+ :group 'notmuch
+ :type '(choice
+ (const :tag "Use lpr" lpr)
+ (const :tag "Use ps-print" ps-print)
+ (const :tag "Use muttprint" muttprint)
+ (function :tag "Using a custom function")))
+
+(defvar notmuch-print-mechanism-map
+ '((lpr . notmuch-print-lpr)
+ (ps-print . notmuch-print-ps-print)
+ (muttprint . notmuch-print-muttprint)))
+
+(defmacro notmuch-print-with-file (filename &rest body)
+ `(with-temp-buffer
+ (insert-file-contents ,filename)
+ (setq buffer-modified-p nil)
+ ,@body))
+
+(defun notmuch-print-lpr (filename)
+ (notmuch-print-with-file filename
+ (lpr-buffer)))
+
+(defun notmuch-print-ps-print (filename)
+ (notmuch-print-with-file filename
+ (ps-print-buffer)))
+
+(defun notmuch-print-muttprint (filename)
+ (shell-command
+ (concat "cat " (shell-quote-argument filename) " | muttprint")))
+
+(defun notmuch-print-message (filename)
+ (let ((fn
+ (cond
+ ((functionp 'notmuch-print-mechanism)
+ 'notmuch-print-mechanism)
+ ((assoc notmuch-print-mechanism notmuch-print-mechanism-map)
+ (cdr (assoc notmuch-print-mechanism notmuch-print-mechanism-map)))
+ (t
+ (error "No printing mechanism found")))))
+ (funcall fn filename)))
+
+;;
+
+(provide 'notmuch-print)
diff --git a/emacs/notmuch-show.el b/emacs/notmuch-show.el
index 5efdf84..3680faf 100644
--- a/emacs/notmuch-show.el
+++ b/emacs/notmuch-show.el
@@ -32,6 +32,7 @@
(require 'notmuch-query)
(require 'notmuch-wash)
(require 'notmuch-mua)
+(require 'notmuch-print)
(declare-function notmuch-call-notmuch-process "notmuch" (&rest args))
(declare-function notmuch-fontify-headers "notmuch" nil)
@@ -174,6 +175,38 @@ Set `notmuch-show-address-simplication' to:
mm-handle (> (notmuch-count-attachments mm-handle) 1))))
(message "Done"))
+(defun notmuch-show-with-message-as-text (fn)
+ "Apply function `fn' to a text representation of the current
+message."
+ (let* ((from (notmuch-show-clean-address
+ (mail-header-parse-address (notmuch-show-get-from))))
+ (subject (notmuch-show-get-subject))
+ (date (notmuch-show-get-date))
+ (header (concat
+ "Tags: " (mapconcat '(lambda (tag) tag)
+ (notmuch-show-get-tags) ", ")
+ "\n"
+ "From: " from "\n"
+ "Date: " date "\n"))
+ (body (save-excursion
+ (goto-char (notmuch-show-message-top))
+ (forward-line)
+ (buffer-substring (point) (notmuch-show-message-bottom))))
+ (depth (notmuch-show-get-depth))
+ (file (make-temp-file "notmuch")))
+ (with-temp-file file
+ (insert body)
+ (indent-rigidly (point-min) (point-max) (- depth))
+ (goto-char (point-min))
+ (insert header))
+ (funcall fn file)
+ (delete-file file)))
+
+(defun notmuch-show-print-message ()
+ "Print the current message."
+ (interactive)
+ (notmuch-show-with-message-as-text 'notmuch-print-message))
+
(defun notmuch-show-fontify-header ()
(let ((face (cond
((looking-at "[Tt]o:")
@@ -520,6 +553,8 @@ current buffer, if possible."
(plist-put msg :message-invis-spec 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
;; entire message (augmented it with other stuff), which seems
;; like overkill. We might save a reduced subset (for example, not
@@ -821,6 +856,9 @@ All currently available key bindings:
(defun notmuch-show-get-to ()
(notmuch-show-get-header :To))
+(defun notmuch-show-get-depth ()
+ (notmuch-show-get-prop :depth))
+
(defun notmuch-show-set-tags (tags)
"Set the tags of the current message."
(notmuch-show-set-prop :tags tags)
--
1.7.2.3
[-- Attachment #3: Type: text/plain, Size: 42 bytes --]
dme.
--
David Edmondson, http://dme.org
^ permalink raw reply related [flat|nested] 18+ messages in thread
* Re: Printing mail
2010-11-11 12:57 ` David Edmondson
@ 2010-11-11 14:12 ` Sebastian Spaeth
2010-11-12 12:53 ` [PATCH] emacs: Improved printing support David Edmondson
1 sibling, 0 replies; 18+ messages in thread
From: Sebastian Spaeth @ 2010-11-11 14:12 UTC (permalink / raw)
To: notmuch
[-- Attachment #1: Type: text/plain, Size: 173 bytes --]
On Thu, 11 Nov 2010 12:57:05 +0000, David Edmondson <dme@dme.org> wrote:
> How about something like the attached?
Still untested, but hurray, yes please! :) \o/
Sebastian
[-- Attachment #2: Type: application/pgp-signature, Size: 197 bytes --]
^ permalink raw reply [flat|nested] 18+ messages in thread
* [PATCH] emacs: Improved printing support.
2010-11-11 12:57 ` David Edmondson
2010-11-11 14:12 ` Sebastian Spaeth
@ 2010-11-12 12:53 ` David Edmondson
1 sibling, 0 replies; 18+ messages in thread
From: David Edmondson @ 2010-11-12 12:53 UTC (permalink / raw)
To: notmuch
---
More usable (I'm trying 'muttprint then evince').
emacs/Makefile.local | 3 +-
emacs/notmuch-print.el | 75 ++++++++++++++++++++++++++++++++++++++++++++++++
emacs/notmuch-show.el | 51 ++++++++++++++++++++++++++++++++
3 files changed, 128 insertions(+), 1 deletions(-)
create mode 100644 emacs/notmuch-print.el
diff --git a/emacs/Makefile.local b/emacs/Makefile.local
index c5280f1..df87427 100644
--- a/emacs/Makefile.local
+++ b/emacs/Makefile.local
@@ -13,7 +13,8 @@ emacs_sources := \
$(dir)/notmuch-maildir-fcc.el \
$(dir)/notmuch-message.el \
$(dir)/coolj.el \
- $(dir)/notmuch-lkml.el
+ $(dir)/notmuch-lkml.el \
+ $(dir)/notmuch-print.el
emacs_images := \
$(dir)/notmuch-logo.png
diff --git a/emacs/notmuch-print.el b/emacs/notmuch-print.el
new file mode 100644
index 0000000..62e380c
--- /dev/null
+++ b/emacs/notmuch-print.el
@@ -0,0 +1,75 @@
+;; 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")))
+
+(defmacro notmuch-print-with-file (filename &rest body)
+ `(with-temp-buffer
+ (insert-file-contents ,filename)
+ (setq buffer-modified-p nil)
+ ,@body))
+
+(defun notmuch-print-lpr (filename)
+ (notmuch-print-with-file filename
+ (lpr-buffer)))
+
+(defun notmuch-print-ps-print (filename)
+ (notmuch-print-with-file filename
+ (ps-print-buffer)))
+
+(defun notmuch-print-ps-print/evince (filename)
+ (let ((ps-file (make-temp-file "notmuch")))
+ (notmuch-print-with-file filename
+ (ps-print-buffer ps-file)
+ (async-shell-command (concat "evince " ps-file)))))
+
+(defun notmuch-print-muttprint (filename)
+ (shell-command
+ (concat "muttprint "
+ "--file " (shell-quote-argument filename) " "
+ ;; Show the tags.
+ "--printed-headers Date_To_From_CC_Newsgroups_*Subject*_/Tags/ ")))
+
+(defun notmuch-print-muttprint/evince (filename)
+ (let ((ps-file (make-temp-file "notmuch")))
+ (call-process-shell-command
+ (concat "muttprint "
+ "--file " (shell-quote-argument filename) " "
+ ;; Show the tags.
+ "--printed-headers Date_To_From_CC_Newsgroups_*Subject*_/Tags/ "
+ "--printer \"TO_FILE:" (shell-quote-argument ps-file) "\""))
+ (async-shell-command (concat "evince " ps-file))))
+
+(defun notmuch-print-message (filename)
+ (funcall notmuch-print-mechanism filename))
+
+;;
+
+(provide 'notmuch-print)
diff --git a/emacs/notmuch-show.el b/emacs/notmuch-show.el
index aa89cfd..002c2fd 100644
--- a/emacs/notmuch-show.el
+++ b/emacs/notmuch-show.el
@@ -32,6 +32,7 @@
(require 'notmuch-query)
(require 'notmuch-wash)
(require 'notmuch-mua)
+(require 'notmuch-print)
(declare-function notmuch-call-notmuch-process "notmuch" (&rest args))
(declare-function notmuch-fontify-headers "notmuch" nil)
@@ -174,6 +175,51 @@ Set `notmuch-show-address-simplication' to:
mm-handle (> (notmuch-count-attachments mm-handle) 1))))
(message "Done"))
+(defun notmuch-show-with-message-as-text (fn)
+ "Apply function `fn' to a text representation of the current
+message."
+
+ ;; 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 '(lambda (tag) tag) tags ", ") "\n")
+ "")))
+ (all (buffer-substring (notmuch-show-message-top)
+ (notmuch-show-message-bottom)))
+
+ (file (make-temp-file "notmuch")))
+ (with-temp-file file
+ (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 file)
+ (delete-file file)))
+
+(defun notmuch-show-print-message ()
+ "Print the current message."
+ (interactive)
+ (notmuch-show-with-message-as-text 'notmuch-print-message))
+
(defun notmuch-show-fontify-header ()
(let ((face (cond
((looking-at "[Tt]o:")
@@ -530,6 +576,8 @@ current buffer, if possible."
(plist-put msg :message-invis-spec 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
;; entire message (augmented it with other stuff), which seems
;; like overkill. We might save a reduced subset (for example, not
@@ -831,6 +879,9 @@ All currently available key bindings:
(defun notmuch-show-get-to ()
(notmuch-show-get-header :To))
+(defun notmuch-show-get-depth ()
+ (notmuch-show-get-prop :depth))
+
(defun notmuch-show-set-tags (tags)
"Set the tags of the current message."
(notmuch-show-set-prop :tags tags)
--
1.7.2.3
^ permalink raw reply related [flat|nested] 18+ messages in thread
* [PATCH] emacs: Improved printing support.
@ 2011-12-30 10:28 David Edmondson
2011-12-31 19:15 ` David Bremner
2012-01-03 14:12 ` David Edmondson
0 siblings, 2 replies; 18+ messages in thread
From: David Edmondson @ 2011-12-30 10:28 UTC (permalink / raw)
To: notmuch
Add various functions to print notmuch messages and tie them together
with a simple frontend. No keybinding is currently made to encourage
paper saving.
---
Resurrecting an old patch.
emacs/Makefile.local | 3 +-
emacs/notmuch-print.el | 75 ++++++++++++++++++++++++++++++++++++++++++++++++
emacs/notmuch-show.el | 51 ++++++++++++++++++++++++++++++++
3 files changed, 128 insertions(+), 1 deletions(-)
create mode 100644 emacs/notmuch-print.el
diff --git a/emacs/Makefile.local b/emacs/Makefile.local
index 0c58b82..4fee0e8 100644
--- a/emacs/Makefile.local
+++ b/emacs/Makefile.local
@@ -13,7 +13,8 @@ emacs_sources := \
$(dir)/notmuch-maildir-fcc.el \
$(dir)/notmuch-message.el \
$(dir)/notmuch-crypto.el \
- $(dir)/coolj.el
+ $(dir)/coolj.el \
+ $(dir)/notmuch-print.el
emacs_images := \
$(srcdir)/$(dir)/notmuch-logo.png
diff --git a/emacs/notmuch-print.el b/emacs/notmuch-print.el
new file mode 100644
index 0000000..70fb041
--- /dev/null
+++ b/emacs/notmuch-print.el
@@ -0,0 +1,75 @@
+;; 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")))
+
+(defmacro notmuch-print-with-file (filename &rest body)
+ `(with-temp-buffer
+ (insert-file-contents ,filename)
+ (set-buffer-modified-p nil)
+ ,@body))
+
+(defun notmuch-print-lpr (filename)
+ (notmuch-print-with-file filename
+ (lpr-buffer)))
+
+(defun notmuch-print-ps-print (filename)
+ (notmuch-print-with-file filename
+ (ps-print-buffer)))
+
+(defun notmuch-print-ps-print/evince (filename)
+ (let ((ps-file (make-temp-file "notmuch")))
+ (notmuch-print-with-file filename
+ (ps-print-buffer ps-file)
+ (async-shell-command (concat "evince " ps-file)))))
+
+(defun notmuch-print-muttprint (filename)
+ (shell-command
+ (concat "muttprint "
+ "--file " (shell-quote-argument filename) " "
+ ;; Show the tags.
+ "--printed-headers Date_To_From_CC_Newsgroups_*Subject*_/Tags/ ")))
+
+(defun notmuch-print-muttprint/evince (filename)
+ (let ((ps-file (make-temp-file "notmuch")))
+ (call-process-shell-command
+ (concat "muttprint "
+ "--file " (shell-quote-argument filename) " "
+ ;; Show the tags.
+ "--printed-headers Date_To_From_CC_Newsgroups_*Subject*_/Tags/ "
+ "--printer \"TO_FILE:" (shell-quote-argument ps-file) "\""))
+ (async-shell-command (concat "evince " ps-file))))
+
+(defun notmuch-print-message (filename)
+ (funcall notmuch-print-mechanism filename))
+
+;;
+
+(provide 'notmuch-print)
diff --git a/emacs/notmuch-show.el b/emacs/notmuch-show.el
index 5502efd..5beadbc 100644
--- a/emacs/notmuch-show.el
+++ b/emacs/notmuch-show.el
@@ -34,6 +34,7 @@
(require 'notmuch-wash)
(require 'notmuch-mua)
(require 'notmuch-crypto)
+(require 'notmuch-print)
(declare-function notmuch-call-notmuch-process "notmuch" (&rest args))
(declare-function notmuch-fontify-headers "notmuch" nil)
@@ -186,6 +187,51 @@ indentation."
mm-handle (> (notmuch-count-attachments mm-handle) 1))))
(message "Done"))
+(defun notmuch-show-with-message-as-text (fn)
+ "Apply function `fn' to a text representation of the current
+message."
+
+ ;; 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 '(lambda (tag) tag) tags ", ") "\n")
+ "")))
+ (all (buffer-substring (notmuch-show-message-top)
+ (notmuch-show-message-bottom)))
+
+ (file (make-temp-file "notmuch")))
+ (with-temp-file file
+ (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 file)
+ (delete-file file)))
+
+(defun notmuch-show-print-message ()
+ "Print the current message."
+ (interactive)
+ (notmuch-show-with-message-as-text 'notmuch-print-message))
+
(defun notmuch-show-fontify-header ()
(let ((face (cond
((looking-at "[Tt]o:")
@@ -760,6 +806,8 @@ current buffer, if possible."
(overlay-put headers-overlay 'priority 10))
(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
;; entire message (augmented it with other stuff), which seems
;; like overkill. We might save a reduced subset (for example, not
@@ -1111,6 +1159,9 @@ Some useful entries are:
(defun notmuch-show-get-to ()
(notmuch-show-get-header :To))
+(defun notmuch-show-get-depth ()
+ (notmuch-show-get-prop :depth))
+
(defun notmuch-show-set-tags (tags)
"Set the tags of the current message."
(notmuch-show-set-prop :tags tags)
--
1.7.7.3
^ permalink raw reply related [flat|nested] 18+ messages in thread
* Re: [PATCH] emacs: Improved printing support.
2011-12-30 10:28 David Edmondson
@ 2011-12-31 19:15 ` David Bremner
2012-01-03 11:37 ` David Edmondson
2012-01-03 14:12 ` David Edmondson
1 sibling, 1 reply; 18+ messages in thread
From: David Bremner @ 2011-12-31 19:15 UTC (permalink / raw)
To: David Edmondson, notmuch
On Fri, 30 Dec 2011 10:28:17 +0000, David Edmondson <dme@dme.org> wrote:
> Add various functions to print notmuch messages and tie them together
> with a simple frontend. No keybinding is currently made to encourage
> paper saving.
Hi David.
I started playing with this a bit.
print using muttprint doesn't seem to work for me, I get a message:
"zsh:1: no matches found: Date_To_From_CC_Newsgroups_*Subject*_/Tags/"
Too lazy to track that down so far.
I wonder if the header line for ps-print could be easily improved (say
by giving the buffer a suggestive name).
d
^ permalink raw reply [flat|nested] 18+ messages in thread
* [PATCH] emacs: Improved printing support.
2011-12-30 10:28 David Edmondson
2011-12-31 19:15 ` David Bremner
@ 2012-01-03 14:12 ` David Edmondson
2012-01-16 11:30 ` David Edmondson
2012-01-16 21:27 ` Aaron Ecay
1 sibling, 2 replies; 18+ messages in thread
From: David Edmondson @ 2012-01-03 14:12 UTC (permalink / raw)
To: notmuch
Add various functions to print notmuch messages and tie them together
with a simple frontend. No keybinding is currently made to encourage
paper saving.
---
Fix the lack of shell quoting for muttprint. Rename the ps-print
buffers to have a relevant name.
emacs/Makefile.local | 3 +-
emacs/notmuch-print.el | 79 ++++++++++++++++++++++++++++++++++++++++++++++++
emacs/notmuch-show.el | 51 +++++++++++++++++++++++++++++++
3 files changed, 132 insertions(+), 1 deletions(-)
create mode 100644 emacs/notmuch-print.el
diff --git a/emacs/Makefile.local b/emacs/Makefile.local
index 0c58b82..4fee0e8 100644
--- a/emacs/Makefile.local
+++ b/emacs/Makefile.local
@@ -13,7 +13,8 @@ emacs_sources := \
$(dir)/notmuch-maildir-fcc.el \
$(dir)/notmuch-message.el \
$(dir)/notmuch-crypto.el \
- $(dir)/coolj.el
+ $(dir)/coolj.el \
+ $(dir)/notmuch-print.el
emacs_images := \
$(srcdir)/$(dir)/notmuch-logo.png
diff --git a/emacs/notmuch-print.el b/emacs/notmuch-print.el
new file mode 100644
index 0000000..d4b7ed4
--- /dev/null
+++ b/emacs/notmuch-print.el
@@ -0,0 +1,79 @@
+;; 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")))
+
+(defmacro notmuch-print-with-file (filename &rest body)
+ `(with-temp-buffer
+ (insert-file-contents ,filename)
+ (set-buffer-modified-p nil)
+ ,@body))
+
+(defun notmuch-print-lpr (filename msg)
+ (notmuch-print-with-file filename
+ (lpr-buffer)))
+
+(defun notmuch-print-ps-print (filename msg)
+ (let ((subject (plist-get (notmuch-show-get-prop :headers msg) :Subject)))
+ (notmuch-print-with-file filename
+ (rename-buffer subject t)
+ (ps-print-buffer))))
+
+(defun notmuch-print-ps-print/evince (filename msg)
+ (let ((ps-file (make-temp-file "notmuch"))
+ (subject (plist-get (notmuch-show-get-prop :headers msg) :Subject)))
+ (notmuch-print-with-file filename
+ (rename-buffer subject t)
+ (ps-print-buffer ps-file)
+ (async-shell-command (concat "evince " ps-file)))))
+
+(defun notmuch-print-muttprint (filename msg)
+ (shell-command
+ (concat "muttprint "
+ "--file " (shell-quote-argument filename) " "
+ ;; Show the tags.
+ "--printed-headers 'Date_To_From_CC_Newsgroups_*Subject*_/Tags/'")))
+
+(defun notmuch-print-muttprint/evince (filename msg)
+ (let ((ps-file (make-temp-file "notmuch")))
+ (call-process-shell-command
+ (concat "muttprint "
+ "--file " (shell-quote-argument filename) " "
+ ;; Show the tags.
+ "--printed-headers 'Date_To_From_CC_Newsgroups_*Subject*_/Tags/' "
+ "--printer 'TO_FILE:" (shell-quote-argument ps-file) "'"))
+ (async-shell-command (concat "evince " ps-file))))
+
+(defun notmuch-print-message (filename msg)
+ (funcall notmuch-print-mechanism filename msg))
+
+;;
+
+(provide 'notmuch-print)
diff --git a/emacs/notmuch-show.el b/emacs/notmuch-show.el
index 5502efd..55ccfc5 100644
--- a/emacs/notmuch-show.el
+++ b/emacs/notmuch-show.el
@@ -34,6 +34,7 @@
(require 'notmuch-wash)
(require 'notmuch-mua)
(require 'notmuch-crypto)
+(require 'notmuch-print)
(declare-function notmuch-call-notmuch-process "notmuch" (&rest args))
(declare-function notmuch-fontify-headers "notmuch" nil)
@@ -186,6 +187,51 @@ indentation."
mm-handle (> (notmuch-count-attachments mm-handle) 1))))
(message "Done"))
+(defun notmuch-show-with-message-as-text (fn)
+ "Apply function `fn' to a text representation of the current
+message."
+
+ ;; 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 '(lambda (tag) tag) tags ", ") "\n")
+ "")))
+ (all (buffer-substring (notmuch-show-message-top)
+ (notmuch-show-message-bottom)))
+
+ (file (make-temp-file "notmuch")))
+ (with-temp-file file
+ (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 file (notmuch-show-get-message-properties))
+ (delete-file file)))
+
+(defun notmuch-show-print-message ()
+ "Print the current message."
+ (interactive)
+ (notmuch-show-with-message-as-text 'notmuch-print-message))
+
(defun notmuch-show-fontify-header ()
(let ((face (cond
((looking-at "[Tt]o:")
@@ -760,6 +806,8 @@ current buffer, if possible."
(overlay-put headers-overlay 'priority 10))
(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
;; entire message (augmented it with other stuff), which seems
;; like overkill. We might save a reduced subset (for example, not
@@ -1111,6 +1159,9 @@ Some useful entries are:
(defun notmuch-show-get-to ()
(notmuch-show-get-header :To))
+(defun notmuch-show-get-depth ()
+ (notmuch-show-get-prop :depth))
+
(defun notmuch-show-set-tags (tags)
"Set the tags of the current message."
(notmuch-show-set-prop :tags tags)
--
1.7.7.3
^ permalink raw reply related [flat|nested] 18+ messages in thread
* Re: [PATCH] emacs: Improved printing support.
2012-01-03 14:12 ` David Edmondson
@ 2012-01-16 11:30 ` David Edmondson
2012-01-16 21:27 ` Aaron Ecay
1 sibling, 0 replies; 18+ messages in thread
From: David Edmondson @ 2012-01-16 11:30 UTC (permalink / raw)
To: notmuch
[-- Attachment #1: Type: text/plain, Size: 426 bytes --]
On Tue, 3 Jan 2012 14:12:26 +0000, David Edmondson <dme@dme.org> wrote:
> Add various functions to print notmuch messages and tie them together
> with a simple frontend. No keybinding is currently made to encourage
> paper saving.
Could someone review my lisp please?
bremner suggested that a default keybinding to print messages would be
appropriate. I'd like to propose '#' (for which I'll send another patch
if agreed).
[-- Attachment #2: Type: application/pgp-signature, Size: 197 bytes --]
^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: [PATCH] emacs: Improved printing support.
2012-01-03 14:12 ` David Edmondson
2012-01-16 11:30 ` David Edmondson
@ 2012-01-16 21:27 ` Aaron Ecay
2012-01-17 9:14 ` David Edmondson
2012-01-18 8:00 ` David Edmondson
1 sibling, 2 replies; 18+ messages in thread
From: Aaron Ecay @ 2012-01-16 21:27 UTC (permalink / raw)
To: David Edmondson, notmuch
I don’t have (easy access to) a printer, so I haven’t actually exercised
the printing functionality of this patch.
In general, the patch LGTM. Specific comments below.
On Tue, 3 Jan 2012 14:12:26 +0000, David Edmondson <dme@dme.org> wrote:
> Add various functions to print notmuch messages and tie them together
> with a simple frontend. No keybinding is currently made to encourage
> paper saving.
> ---
>
> Fix the lack of shell quoting for muttprint. Rename the ps-print
> buffers to have a relevant name.
>
> emacs/Makefile.local | 3 +-
> emacs/notmuch-print.el | 79 ++++++++++++++++++++++++++++++++++++++++++++++++
> emacs/notmuch-show.el | 51 +++++++++++++++++++++++++++++++
> 3 files changed, 132 insertions(+), 1 deletions(-)
> create mode 100644 emacs/notmuch-print.el
>
> diff --git a/emacs/Makefile.local b/emacs/Makefile.local
[...]
> --- /dev/null
> +++ b/emacs/notmuch-print.el
> @@ -0,0 +1,79 @@
> +;; 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")))
> +
> +(defmacro notmuch-print-with-file (filename &rest body)
> + `(with-temp-buffer
> + (insert-file-contents ,filename)
> + (set-buffer-modified-p nil)
> + ,@body))
> +
> +(defun notmuch-print-lpr (filename msg)
> + (notmuch-print-with-file filename
> + (lpr-buffer)))
> +
> +(defun notmuch-print-ps-print (filename msg)
> + (let ((subject (plist-get (notmuch-show-get-prop :headers msg) :Subject)))
> + (notmuch-print-with-file filename
> + (rename-buffer subject t)
> + (ps-print-buffer))))
> +
> +(defun notmuch-print-ps-print/evince (filename msg)
> + (let ((ps-file (make-temp-file "notmuch"))
> + (subject (plist-get (notmuch-show-get-prop :headers msg) :Subject)))
> + (notmuch-print-with-file filename
> + (rename-buffer subject t)
> + (ps-print-buffer ps-file)
> + (async-shell-command (concat "evince " ps-file)))))
> +
> +(defun notmuch-print-muttprint (filename msg)
> + (shell-command
> + (concat "muttprint "
> + "--file " (shell-quote-argument filename) " "
> + ;; Show the tags.
> + "--printed-headers 'Date_To_From_CC_Newsgroups_*Subject*_/Tags/'")))
> +
> +(defun notmuch-print-muttprint/evince (filename msg)
> + (let ((ps-file (make-temp-file "notmuch")))
> + (call-process-shell-command
> + (concat "muttprint "
> + "--file " (shell-quote-argument filename) " "
> + ;; Show the tags.
> + "--printed-headers 'Date_To_From_CC_Newsgroups_*Subject*_/Tags/' "
> + "--printer 'TO_FILE:" (shell-quote-argument ps-file) "'"))
> + (async-shell-command (concat "evince " ps-file))))
> +
> +(defun notmuch-print-message (filename msg)
> + (funcall notmuch-print-mechanism filename msg))
> +
> +;;
The above is just a stray comment line, right?
> +
> +(provide 'notmuch-print)
> diff --git a/emacs/notmuch-show.el b/emacs/notmuch-show.el
> index 5502efd..55ccfc5 100644
> --- a/emacs/notmuch-show.el
> +++ b/emacs/notmuch-show.el
> @@ -34,6 +34,7 @@
> (require 'notmuch-wash)
> (require 'notmuch-mua)
> (require 'notmuch-crypto)
> +(require 'notmuch-print)
>
> (declare-function notmuch-call-notmuch-process "notmuch" (&rest args))
> (declare-function notmuch-fontify-headers "notmuch" nil)
> @@ -186,6 +187,51 @@ indentation."
> mm-handle (> (notmuch-count-attachments mm-handle) 1))))
> (message "Done"))
>
> +(defun notmuch-show-with-message-as-text (fn)
> + "Apply function `fn' to a text representation of the current
> +message."
I think the docstring should say what agrs get passed to ‘fn’. Also,
function arguments should be referred to with capital letters, and the
first line should be a complete sentence. I’d recommend “Apply FN to
(...the rest unchanged)” for brevity in the first line.
(For anyone who is curious, these and other conventions are documented
in section D.6 of the Elisp manual.)
> +
> + ;; 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 '(lambda (tag) tag) tags ", ") "\n")
#'identity instead of the lambda
> + "")))
> + (all (buffer-substring (notmuch-show-message-top)
> + (notmuch-show-message-bottom)))
> +
> + (file (make-temp-file "notmuch")))
> + (with-temp-file file
> + (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 file (notmuch-show-get-message-properties))
> + (delete-file file)))
Why does this function write to a file? It seems that, of the print
methods, two (ps-print and lpr) don’t use the file at all. One
(ps-print/evince) creates yet another file, without depending on the
first. The other muttprint functions do use the file. So:
- This function would be more general if it didn’t handle file-writing
itself, but rather let each consumer of text-ified messages handle
that if needed.
- It would be cleaner if print backends that don’t crucially depend on
the existence of a file didn’t create one at all. If muttprint can
accept a message on stdin (it looks from the source like it can; it
gives me some error message about Iconv Perl modules when I try to run
it, so I can’t be sure), maybe writing to a file isn’t necessary at
all.
> +
> +(defun notmuch-show-print-message ()
> + "Print the current message."
> + (interactive)
> + (notmuch-show-with-message-as-text 'notmuch-print-message))
> +
> (defun notmuch-show-fontify-header ()
> (let ((face (cond
> ((looking-at "[Tt]o:")
> @@ -760,6 +806,8 @@ current buffer, if possible."
> (overlay-put headers-overlay 'priority 10))
> (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
> ;; entire message (augmented it with other stuff), which seems
> ;; like overkill. We might save a reduced subset (for example, not
> @@ -1111,6 +1159,9 @@ Some useful entries are:
> (defun notmuch-show-get-to ()
> (notmuch-show-get-header :To))
>
> +(defun notmuch-show-get-depth ()
> + (notmuch-show-get-prop :depth))
> +
> (defun notmuch-show-set-tags (tags)
> "Set the tags of the current message."
> (notmuch-show-set-prop :tags tags)
> --
> 1.7.7.3
>
> _______________________________________________
> notmuch mailing list
> notmuch@notmuchmail.org
> http://notmuchmail.org/mailman/listinfo/notmuch
--
Aaron Ecay
^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: [PATCH] emacs: Improved printing support.
2012-01-16 21:27 ` Aaron Ecay
@ 2012-01-17 9:14 ` David Edmondson
2012-01-18 8:00 ` David Edmondson
1 sibling, 0 replies; 18+ messages in thread
From: David Edmondson @ 2012-01-17 9:14 UTC (permalink / raw)
To: Aaron Ecay; +Cc: notmuch
[-- Attachment #1: Type: text/plain, Size: 2377 bytes --]
On Mon, 16 Jan 2012 16:27:06 -0500, Aaron Ecay <aaronecay@gmail.com> wrote:
> > +;;
>
> The above is just a stray comment line, right?
I tend to use them as spacers, but, sure.
> > +(defun notmuch-show-with-message-as-text (fn)
> > + "Apply function `fn' to a text representation of the current
> > +message."
>
> I think the docstring should say what agrs get passed to ‘fn’. Also,
> function arguments should be referred to with capital letters, and the
> first line should be a complete sentence. I’d recommend “Apply FN to
> (...the rest unchanged)” for brevity in the first line.
>
> (For anyone who is curious, these and other conventions are documented
> in section D.6 of the Elisp manual.)
Will fix.
> > + (concat "Tags: "
> > + (mapconcat '(lambda (tag) tag) tags ", ") "\n")
>
> #'identity instead of the lambda
/me slaps head. What was I thinking?
> > + (all (buffer-substring (notmuch-show-message-top)
> > + (notmuch-show-message-bottom)))
> > +
> > + (file (make-temp-file "notmuch")))
> > + (with-temp-file file
> > + (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 file (notmuch-show-get-message-properties))
> > + (delete-file file)))
>
> Why does this function write to a file? It seems that, of the print
> methods, two (ps-print and lpr) don’t use the file at all. One
> (ps-print/evince) creates yet another file, without depending on the
> first. The other muttprint functions do use the file. So:
> - This function would be more general if it didn’t handle file-writing
> itself, but rather let each consumer of text-ified messages handle
> that if needed.
> - It would be cleaner if print backends that don’t crucially depend on
> the existence of a file didn’t create one at all. If muttprint can
> accept a message on stdin (it looks from the source like it can; it
> gives me some error message about Iconv Perl modules when I try to run
> it, so I can’t be sure), maybe writing to a file isn’t necessary at
> all.
I'll rework it, thanks for the review!
[-- Attachment #2: Type: application/pgp-signature, Size: 197 bytes --]
^ permalink raw reply [flat|nested] 18+ messages in thread
* [PATCH] emacs: Improved printing support.
2012-01-16 21:27 ` Aaron Ecay
2012-01-17 9:14 ` David Edmondson
@ 2012-01-18 8:00 ` David Edmondson
2012-01-18 8:49 ` Aaron Ecay
2012-01-21 13:14 ` David Bremner
1 sibling, 2 replies; 18+ messages in thread
From: David Edmondson @ 2012-01-18 8:00 UTC (permalink / raw)
To: notmuch
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.
---
Updates based on Aaron's review - the comments were very useful in
improving things - thanks!
Add a keybinding to `notmuch-show-mode'.
emacs/Makefile.local | 3 +-
emacs/notmuch-print.el | 85 ++++++++++++++++++++++++++++++++++++++++++++++++
emacs/notmuch-show.el | 53 ++++++++++++++++++++++++++++++
3 files changed, 140 insertions(+), 1 deletions(-)
create mode 100644 emacs/notmuch-print.el
diff --git a/emacs/Makefile.local b/emacs/Makefile.local
index 0c58b82..4fee0e8 100644
--- a/emacs/Makefile.local
+++ b/emacs/Makefile.local
@@ -13,7 +13,8 @@ emacs_sources := \
$(dir)/notmuch-maildir-fcc.el \
$(dir)/notmuch-message.el \
$(dir)/notmuch-crypto.el \
- $(dir)/coolj.el
+ $(dir)/coolj.el \
+ $(dir)/notmuch-print.el
emacs_images := \
$(srcdir)/$(dir)/notmuch-logo.png
diff --git a/emacs/notmuch-print.el b/emacs/notmuch-print.el
new file mode 100644
index 0000000..77f10bb
--- /dev/null
+++ b/emacs/notmuch-print.el
@@ -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)
diff --git a/emacs/notmuch-show.el b/emacs/notmuch-show.el
index 797f94b..db25565 100644
--- a/emacs/notmuch-show.el
+++ b/emacs/notmuch-show.el
@@ -34,6 +34,7 @@
(require 'notmuch-wash)
(require 'notmuch-mua)
(require 'notmuch-crypto)
+(require 'notmuch-print)
(declare-function notmuch-call-notmuch-process "notmuch" (&rest args))
(declare-function notmuch-fontify-headers "notmuch" nil)
@@ -186,6 +187,52 @@ indentation."
mm-handle (> (notmuch-count-attachments mm-handle) 1))))
(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 ()
(let ((face (cond
((looking-at "[Tt]o:")
@@ -757,6 +804,8 @@ current buffer, if possible."
(overlay-put headers-overlay 'priority 10))
(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
;; entire message (augmented it with other stuff), which seems
;; like overkill. We might save a reduced subset (for example, not
@@ -947,6 +996,7 @@ thread id. If a prefix is given, crypto processing is toggled."
(define-key map " " 'notmuch-show-advance-and-archive)
(define-key map (kbd "M-RET") 'notmuch-show-open-or-close-all)
(define-key map (kbd "RET") 'notmuch-show-toggle-message)
+ (define-key map "#" 'notmuch-show-print-message)
map)
"Keymap for \"notmuch show\" buffers.")
(fset 'notmuch-show-mode-map notmuch-show-mode-map)
@@ -1107,6 +1157,9 @@ Some useful entries are:
(defun notmuch-show-get-to ()
(notmuch-show-get-header :To))
+(defun notmuch-show-get-depth ()
+ (notmuch-show-get-prop :depth))
+
(defun notmuch-show-set-tags (tags)
"Set the tags of the current message."
(notmuch-show-set-prop :tags tags)
--
1.7.7.3
^ permalink raw reply related [flat|nested] 18+ messages in thread
* Re: [PATCH] emacs: Improved printing support.
2012-01-18 8:00 ` David Edmondson
@ 2012-01-18 8:49 ` Aaron Ecay
2012-01-21 13:14 ` David Bremner
1 sibling, 0 replies; 18+ messages in thread
From: Aaron Ecay @ 2012-01-18 8:49 UTC (permalink / raw)
To: David Edmondson, notmuch
On Wed, 18 Jan 2012 08:00:21 +0000, David Edmondson <dme@dme.org> wrote:
> 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.
> ---
>
> Updates based on Aaron's review - the comments were very useful in
> improving things - thanks!
You’re welcome! The patch LGTM.
--
Aaron Ecay
^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: [PATCH] emacs: Improved printing support.
2012-01-18 8:00 ` David Edmondson
2012-01-18 8:49 ` Aaron Ecay
@ 2012-01-21 13:14 ` David Bremner
1 sibling, 0 replies; 18+ messages in thread
From: David Bremner @ 2012-01-21 13:14 UTC (permalink / raw)
To: David Edmondson, notmuch
On Wed, 18 Jan 2012 08:00:21 +0000, David Edmondson <dme@dme.org> wrote:
> Add various functions to print notmuch messages and tie them together
> with a simple frontend.
pushed, with one whitespace correction,
d
^ permalink raw reply [flat|nested] 18+ messages in thread
end of thread, other threads:[~2012-01-21 13:14 UTC | newest]
Thread overview: 18+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2010-11-09 14:51 Printing mail Keith Packard
2010-11-09 16:16 ` Sebastian Spaeth
2010-11-09 18:00 ` Keith Packard
2010-11-10 7:32 ` Sebastian Spaeth
2010-11-10 7:43 ` Keith Packard
2010-11-11 12:57 ` David Edmondson
2010-11-11 14:12 ` Sebastian Spaeth
2010-11-12 12:53 ` [PATCH] emacs: Improved printing support David Edmondson
-- strict thread matches above, loose matches on Subject: below --
2011-12-30 10:28 David Edmondson
2011-12-31 19:15 ` David Bremner
2012-01-03 11:37 ` David Edmondson
2012-01-03 14:12 ` David Edmondson
2012-01-16 11:30 ` David Edmondson
2012-01-16 21:27 ` Aaron Ecay
2012-01-17 9:14 ` David Edmondson
2012-01-18 8:00 ` David Edmondson
2012-01-18 8:49 ` Aaron Ecay
2012-01-21 13:14 ` David Bremner
Code repositories for project(s) associated with this public inbox
https://yhetil.org/notmuch.git/
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).