From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from localhost (localhost [127.0.0.1]) by olra.theworths.org (Postfix) with ESMTP id E76D6431FAF for ; Sun, 1 Sep 2013 11:00:01 -0700 (PDT) X-Virus-Scanned: Debian amavisd-new at olra.theworths.org X-Spam-Flag: NO X-Spam-Score: -0.7 X-Spam-Level: X-Spam-Status: No, score=-0.7 tagged_above=-999 required=5 tests=[RCVD_IN_DNSWL_LOW=-0.7] autolearn=disabled Received: from olra.theworths.org ([127.0.0.1]) by localhost (olra.theworths.org [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id EapaY46Xdo85 for ; Sun, 1 Sep 2013 10:59:57 -0700 (PDT) Received: from mail-ea0-f182.google.com (mail-ea0-f182.google.com [209.85.215.182]) (using TLSv1 with cipher RC4-SHA (128/128 bits)) (No client certificate requested) by olra.theworths.org (Postfix) with ESMTPS id 23A89431FBC for ; Sun, 1 Sep 2013 10:59:57 -0700 (PDT) Received: by mail-ea0-f182.google.com with SMTP id o10so1934168eaj.27 for ; Sun, 01 Sep 2013 10:59:54 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:cc:subject:date:message-id; bh=o3fPpm1c7gau26V4Wr49v2TqVCsHa+VZ/nxXfHVatr0=; b=EaFm1VlSmonEQtvFtWCevkzIqVj3YYsc8Clom5cQGceE76f5WOn8+m1+bnt3yYSnjd TQHbZ8az9TSohT1W69W+53CKvCz9fSz3ewUfdCMarjEkvGdG1eJ3ogQOyzSW6DTEl4Nn 0diQ77VL7F2GnafvtS8QelEg+Sk7DdhAoIoUVYNJfF6NlkOHlJ9c3kLj32zUbxdHZgsk fru1tXdEfUW8cS7gp2ftK1tYVmiVzaNlWyhc61P1Z3IbphWED49GVZumgZQm/aCcM4XE f9yWfFMQJ9U620UDBGA1wbKpjmWgH7XeRuJzncLL5bzjs+4xVZmrMioAUKBgDXh9ZlEC QDRA== X-Gm-Message-State: ALoCoQmpX7IvdefTdvoxFlbDri014gQdLJ4DL9/KSc3pGxAnLU8fYqmI5OISNyw0XEr68FqKDdK4 X-Received: by 10.15.73.134 with SMTP id h6mr381537eey.76.1378058393274; Sun, 01 Sep 2013 10:59:53 -0700 (PDT) Received: from localhost (dsl-hkibrasgw2-58c36f-91.dhcp.inet.fi. [88.195.111.91]) by mx.google.com with ESMTPSA id h52sm15164776eez.3.1969.12.31.16.00.00 (version=TLSv1.2 cipher=RC4-SHA bits=128/128); Sun, 01 Sep 2013 10:59:52 -0700 (PDT) From: Jani Nikula To: notmuch@notmuchmail.org Subject: [PATCH] emacs: insert quotable parts in reply as they are displayed in show view Date: Sun, 1 Sep 2013 20:59:53 +0300 Message-Id: <1378058393-29590-1-git-send-email-jani@nikula.org> X-Mailer: git-send-email 1.8.4.rc3 X-BeenThere: notmuch@notmuchmail.org X-Mailman-Version: 2.1.13 Precedence: list List-Id: "Use and development of the notmuch mail system." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sun, 01 Sep 2013 18:00:02 -0000 In reply, insert quotable parts using notmuch-show-insert-bodypart instead of calling notmuch-mm-display-part-inline directly to render the quoted parts as they are rendered in show view. We use a temp buffer to not leak text properties from the show renderer into the reply. This way we also don't need to worry about narrowing or point placement. Credits to Mark Walters and Austin Clements for getting this part straight. The notable change is that replies to text/calendar parts quote the pretty printed output of icalendar-import-buffer rather than the ugly raw vcalendar. --- v2: use (narrow-to-region (point-min) (point)) in notmuch-mua-insert-quotable-part instead of adding the ugly recenter in notmuch-mua-reply. Thanks to Austin and Mark for figuring this out. v3: Incorporate id:87eh98twws.fsf@qmul.ac.uk from Mark --- emacs/notmuch-mua.el | 17 +++++++++++------ emacs/notmuch-show.el | 18 +++++++++++++----- 2 files changed, 24 insertions(+), 11 deletions(-) diff --git a/emacs/notmuch-mua.el b/emacs/notmuch-mua.el index 2baae5f..ff8149b 100644 --- a/emacs/notmuch-mua.el +++ b/emacs/notmuch-mua.el @@ -28,6 +28,8 @@ (eval-when-compile (require 'cl)) +(declare-function notmuch-show-insert-bodypart "notmuch-show" (msg part depth &optional hide)) + ;; (defcustom notmuch-mua-send-hook '(notmuch-mua-message-send-hook) @@ -128,12 +130,15 @@ list." collect part)) (defun notmuch-mua-insert-quotable-part (message part) - (save-restriction - (narrow-to-region (point) (point)) - (notmuch-mm-display-part-inline message part (plist-get part :id) - (plist-get part :content-type) - notmuch-show-process-crypto) - (goto-char (point-max)))) + ;; We don't want text properties leaking from the show renderer into + ;; the reply so we use a temp buffer. Also we don't want hooks, such + ;; as notmuch-wash-*, to be run on the quotable part so we set + ;; notmuch-show-insert-text/plain-hook to nil. + (insert (with-temp-buffer + (let ((notmuch-show-insert-text/plain-hook nil)) + ;; Show the part but do not add buttons. + (notmuch-show-insert-bodypart message part 0 'no-buttons)) + (buffer-substring-no-properties (point-min) (point-max))))) ;; There is a bug in emacs 23's message.el that results in a newline ;; not being inserted after the References header, so the next header diff --git a/emacs/notmuch-show.el b/emacs/notmuch-show.el index 2896aae..904b98e 100644 --- a/emacs/notmuch-show.el +++ b/emacs/notmuch-show.el @@ -844,7 +844,11 @@ message at DEPTH in the current thread." (defun notmuch-show-insert-bodypart (msg part depth &optional hide) "Insert the body part PART at depth DEPTH in the current thread. -If HIDE is non-nil then initially hide this part." +HIDE determines whether to show or hide the part and the button +as follows: If HIDE is nil, show the part and the button. If HIDE +is t, hide the part initially and show the button. If HIDE is +'no-buttons, show the part but do not add any buttons (this is +useful for quoting in replies)." (let* ((content-type (downcase (plist-get part :content-type))) (mime-type (or (and (string= content-type "application/octet-stream") @@ -854,15 +858,19 @@ If HIDE is non-nil then initially hide this part." content-type)) (nth (plist-get part :id)) (beg (point)) - ;; We omit the part button for the first (or only) part if this is text/plain. - (button (unless (and (string= mime-type "text/plain") (<= nth 1)) + ;; Hide the part initially if HIDE is t. + (show-part (not (equal hide t))) + ;; We omit the part button for the first (or only) part if + ;; this is text/plain, or HIDE is 'no-buttons. + (button (unless (or (equal hide 'no-buttons) + (and (string= mime-type "text/plain") (<= nth 1))) (notmuch-show-insert-part-header nth mime-type content-type (plist-get part :filename)))) (content-beg (point))) ;; Store the computed mime-type for later use (e.g. by attachment handlers). (plist-put part :computed-type mime-type) - (if (not hide) + (if show-part (notmuch-show-insert-bodypart-internal msg part mime-type nth depth button) (button-put button :notmuch-lazy-part (list msg part mime-type nth depth button))) @@ -875,7 +883,7 @@ If HIDE is non-nil then initially hide this part." (insert "\n")) ;; We do not create the overlay for hidden (lazy) parts until ;; they are inserted. - (if (not hide) + (if show-part (notmuch-show-create-part-overlays button content-beg (point)) (save-excursion (notmuch-show-toggle-part-invisibility button))) -- 1.8.4.rc3