X-Git-Url: http://cgit.sxemacs.org/?p=gnus;a=blobdiff_plain;f=lisp%2Fgnus-draft.el;h=aebf11830515cc4acd6f866fd483806b77d57c4e;hp=e9783a8929240c0d0e00046299e9082a186ff172;hb=60545a557b301dbd2dd5b06e2b97773da212179d;hpb=c358f44b1670d12d5eff5fe5a447a19afd34a252 diff --git a/lisp/gnus-draft.el b/lisp/gnus-draft.el index e9783a892..aebf11830 100644 --- a/lisp/gnus-draft.el +++ b/lisp/gnus-draft.el @@ -1,27 +1,24 @@ ;;; gnus-draft.el --- draft message support for Gnus -;; Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, -;; 2005, 2006, 2007, 2008 Free Software Foundation, Inc. +;; Copyright (C) 1997-2015 Free Software Foundation, Inc. ;; Author: Lars Magne Ingebrigtsen ;; Keywords: news ;; This file is part of GNU Emacs. -;; GNU Emacs is free software; you can redistribute it and/or modify +;; GNU Emacs 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, or (at your option) -;; any later version. +;; the Free Software Foundation, either version 3 of the License, or +;; (at your option) any later version. ;; GNU Emacs 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 +;; 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 GNU Emacs; see the file COPYING. If not, write to the -;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, -;; Boston, MA 02110-1301, USA. +;; along with GNU Emacs. If not, see . ;;; Commentary: @@ -34,23 +31,21 @@ (require 'nndraft) (require 'gnus-agent) (eval-when-compile (require 'cl)) +(eval-when-compile + (when (featurep 'xemacs) + (require 'easy-mmode))) ; for `define-minor-mode' ;;; Draft minor mode -(defvar gnus-draft-mode nil - "Minor mode for providing a draft summary buffers.") - -(defvar gnus-draft-mode-map nil) - -(unless gnus-draft-mode-map - (setq gnus-draft-mode-map (make-sparse-keymap)) - - (gnus-define-keys gnus-draft-mode-map - "Dt" gnus-draft-toggle-sending - "e" gnus-draft-edit-message ;; Use `B w' for `gnus-summary-edit-article' - "De" gnus-draft-edit-message - "Ds" gnus-draft-send-message - "DS" gnus-draft-send-all-messages)) +(defvar gnus-draft-mode-map + (let ((map (make-sparse-keymap))) + (gnus-define-keys map + "Dt" gnus-draft-toggle-sending + "e" gnus-draft-edit-message ;; Use `B w' for `gnus-summary-edit-article' + "De" gnus-draft-edit-message + "Ds" gnus-draft-send-message + "DS" gnus-draft-send-all-messages) + map)) (defun gnus-draft-make-menu-bar () (unless (boundp 'gnus-draft-menu) @@ -63,20 +58,18 @@ ["Send all messages" gnus-draft-send-all-messages t] ["Delete draft" gnus-summary-delete-article t])))) -(defun gnus-draft-mode (&optional arg) +(define-minor-mode gnus-draft-mode "Minor mode for providing a draft summary buffers. \\{gnus-draft-mode-map}" - (interactive "P") - (when (eq major-mode 'gnus-summary-mode) - (when (set (make-local-variable 'gnus-draft-mode) - (if (null arg) (not gnus-draft-mode) - (> (prefix-numeric-value arg) 0))) - ;; Set up the menu. - (when (gnus-visual-p 'draft-menu 'menu) - (gnus-draft-make-menu-bar)) - (add-minor-mode 'gnus-draft-mode " Draft" gnus-draft-mode-map) - (gnus-run-hooks 'gnus-draft-mode-hook)))) + :lighter " Draft" :keymap gnus-draft-mode-map + (cond + ((not (derived-mode-p 'gnus-summary-mode)) (setq gnus-draft-mode nil)) + (gnus-draft-mode + ;; Set up the menu. + (when (gnus-visual-p 'draft-menu 'menu) + (gnus-draft-make-menu-bar)) + (add-hook 'gnus-summary-prepare-exit-hook 'gnus-draft-clear-marks t t)))) ;;; Commands @@ -148,13 +141,15 @@ Obeys the standard process/prefix convention." message-send-hook)) (message-setup-hook (and (not is-queue) message-setup-hook)) + (gnus-message-setup-hook (and (not is-queue) + gnus-message-setup-hook)) (message-signature (and (not is-queue) message-signature)) (gnus-agent-queue-mail (and (not is-queue) gnus-agent-queue-mail)) (rfc2047-encode-encoded-words nil) type method move-to) - (gnus-draft-setup article (or group "nndraft:queue")) + (gnus-draft-setup article (or group "nndraft:queue") nil 'dont-pop) ;; We read the meta-information that says how and where ;; this message is to be sent. (save-restriction @@ -218,6 +213,7 @@ Obeys the standard process/prefix convention." (gnus-info-marks (gnus-get-info "nndraft:queue")))))) (gnus-posting-styles nil) + message-send-mail-partially-limit (total (length articles)) article) (while (setq article (pop articles)) @@ -225,7 +221,8 @@ Obeys the standard process/prefix convention." (let ((message-sending-message (format "Sending message %d of %d..." (- total (length articles)) total))) - (gnus-draft-send article)))))))) + (gnus-draft-send article)))))) + (gnus-group-refresh-group "nndraft:queue"))) ;;;###autoload (defun gnus-draft-reminder () @@ -244,58 +241,56 @@ Obeys the standard process/prefix convention." (defcustom gnus-draft-setup-hook nil "Hook run after setting up a draft buffer." :group 'gnus-message - :version "23.0" ;; No Gnus + :version "23.1" ;; No Gnus :type 'hook) -;;; Utility functions - -;;;!!!If this is byte-compiled, it fails miserably. -;;;!!!This is because `gnus-setup-message' uses uninterned symbols. -;;;!!!This has been fixed in recent versions of Emacs and XEmacs, -;;;!!!but for the time being, we'll just run this tiny function uncompiled. -(progn - (defun gnus-draft-setup (narticle group &optional restore) - (let (ga) - (gnus-setup-message 'forward - (let ((article narticle)) - (message-mail) - (erase-buffer) - (if (not (gnus-request-restore-buffer article group)) - (error "Couldn't restore the article") - (when (and restore - (equal group "nndraft:queue")) - (mime-to-mml)) - ;; Insert the separator. - (goto-char (point-min)) - (search-forward "\n\n") - (forward-char -1) - (save-restriction - (narrow-to-region (point-min) (point)) - (setq ga - (message-fetch-field gnus-draft-meta-information-header))) - (insert mail-header-separator) - (forward-line 1) - (message-set-auto-save-file-name)))) - (gnus-backlog-remove-article group narticle) - (when (and ga - (ignore-errors (setq ga (car (read-from-string ga))))) - (setq gnus-newsgroup-name - (if (equal (car ga) "") nil (car ga))) - (gnus-configure-posting-styles) - (setq gnus-message-group-art (cons gnus-newsgroup-name (cadr ga))) - (setq message-post-method - `(lambda (arg) - (gnus-post-method arg ,(car ga)))) - (unless (equal (cadr ga) "") - (dolist (article (cdr ga)) - (message-add-action - `(progn - (gnus-add-mark ,(car ga) 'replied ,article) - (gnus-request-set-mark ,(car ga) (list (list (list ,article) - 'add '(reply))))) - 'send)))) - (run-hooks 'gnus-draft-setup-hook)))) +(defun gnus-draft-setup (narticle group &optional restore dont-pop) + "Setup a mail draft buffer. +If DONT-POP is nil, display the buffer after setting it up." + (let (ga) + (gnus-setup-message 'forward + (let ((article narticle)) + (message-mail nil nil nil nil + (if dont-pop + (lambda (buf) (set-buffer (get-buffer-create buf))))) + (let ((inhibit-read-only t)) + (erase-buffer)) + (if (not (gnus-request-restore-buffer article group)) + (error "Couldn't restore the article") + (when (and restore + (equal group "nndraft:queue")) + (mime-to-mml)) + ;; Insert the separator. + (goto-char (point-min)) + (search-forward "\n\n") + (forward-char -1) + (save-restriction + (narrow-to-region (point-min) (point)) + (setq ga + (message-fetch-field gnus-draft-meta-information-header))) + (insert mail-header-separator) + (forward-line 1) + (message-set-auto-save-file-name)))) + (gnus-backlog-remove-article group narticle) + (when (and ga + (ignore-errors (setq ga (car (read-from-string ga))))) + (setq gnus-newsgroup-name + (if (equal (car ga) "") nil (car ga))) + (gnus-configure-posting-styles) + (setq gnus-message-group-art (cons gnus-newsgroup-name (cadr ga))) + (setq message-post-method + `(lambda (arg) + (gnus-post-method arg ,(car ga)))) + (unless (equal (cadr ga) "") + (dolist (article (cdr ga)) + (message-add-action + `(progn + (gnus-add-mark ,(car ga) 'replied ,article) + (gnus-request-set-mark ,(car ga) (list (list (list ,article) + 'add '(reply))))) + 'send)))) + (run-hooks 'gnus-draft-setup-hook))) (defun gnus-draft-article-sendable-p (article) "Say whether ARTICLE is sendable." @@ -314,6 +309,8 @@ Obeys the standard process/prefix convention." (while buffs (set-buffer (setq buff (pop buffs))) (if (and buffer-file-name + (equal (file-remote-p file) + (file-remote-p buffer-file-name)) (string-equal (file-truename buffer-file-name) (file-truename file)) (buffer-modified-p)) @@ -327,7 +324,11 @@ Obeys the standard process/prefix convention." (pop-to-buffer buff t))) (error "The draft %s is under edit" file))))) +(defun gnus-draft-clear-marks () + (setq gnus-newsgroup-reads nil + gnus-newsgroup-marked nil + gnus-newsgroup-unreads (nndraft-articles))) + (provide 'gnus-draft) -;;; arch-tag: 3d92af58-8c97-4a5c-9db4-a98e85198022 ;;; gnus-draft.el ends here