]> git.eshelyaron.com Git - emacs.git/commitdiff
Merge from gnus--devo--0
authorMiles Bader <miles@gnu.org>
Mon, 10 Mar 2008 00:50:22 +0000 (00:50 +0000)
committerMiles Bader <miles@gnu.org>
Mon, 10 Mar 2008 00:50:22 +0000 (00:50 +0000)
Revision: emacs@sv.gnu.org/emacs--devo--0--patch-1097

16 files changed:
doc/misc/ChangeLog
doc/misc/gnus-coding.texi
lisp/gnus/ChangeLog
lisp/gnus/auth-source.el [new file with mode: 0644]
lisp/gnus/gnus-art.el
lisp/gnus/gnus-bookmark.el
lisp/gnus/gnus-group.el
lisp/gnus/gnus-registry.el
lisp/gnus/gnus-sum.el
lisp/gnus/message.el
lisp/gnus/mm-decode.el
lisp/gnus/mm-view.el
lisp/gnus/mml.el
lisp/gnus/mml2015.el
lisp/net/imap.el
lisp/net/netrc.el

index e89a7e31ec00b9b83d62cd6f150f01a638a446ad..65f8a57c4fd8fb7c494b1eff4469c06a571ccb59 100644 (file)
@@ -1,3 +1,8 @@
+2008-03-10  Reiner Steib  <Reiner.Steib@gmx.de>
+
+       * gnus-coding.texi (Gnus Maintainance Guide): Update conventions for
+       custom versions.
+
 2008-03-07  Alan Mackenzie  <acm@muc.de>
 
        * cc-mode.texi (Limitations and Known Bugs): State that the number of
index b6dc3148da234d4dad241ade8e8b016e2f588780..3b0df9fb322f2c9e0084e4d6fc0be09d9da26b49 100644 (file)
@@ -256,7 +256,7 @@ changes.  Only after a new major release, e.g. 5.10.1, there's usually a
 feature period of several months.  After the release of Gnus 5.10.6 the
 development of new features started again on the trunk while the 5.10
 series is continued on the stable branch (v5-10) from which more stable
-releases will be done when needed (5.10.7, @dots{}).
+releases will be done when needed (5.10.8, @dots{}).
 @ref{Gnus Development, ,Gnus Development, gnus, The Gnus Newsreader}
 
 Stable releases of Gnus finally become part of Emacs.  E.g. Gnus 5.8
@@ -366,7 +366,7 @@ v5-10 branch) use @code{:version "22.1" ;; Oort Gnus} (including the
 comment) or e.g. @code{:version "22.2" ;; Gnus 5.10.10} if the feature
 was added for Emacs 22.2 and Gnus 5.10.10.
 @c
-If the variable is new in No Gnus use @code{:version "23.0" ;; No Gnus}.
+If the variable is new in No Gnus use @code{:version "23.1" ;; No Gnus}.
 
 The same applies for customizable variables when its default value was
 changed.
index 7cc373e435b20693bdc2056cab9115de044e49a4..e86ac06e974330c0a31e1e3b3bc2d65aa4672fd7 100644 (file)
@@ -1,13 +1,40 @@
+2008-03-07  Katsumi Yamaoka  <yamaoka@jpl.org>
+
+       * gnus-art.el (gnus-narrow-to-page): Position point properly.
+       (gnus-article-goto-prev-page): Work for articles having ^L's.
+
+       * gnus-sum.el (gnus-summary-end-of-article): Remove needless narrowing.
+
+       * mm-view.el (mm-w3m-standalone-supports-m17n-p): Fix typo.
+
 2008-03-07  Karl Fogel  <kfogel@red-bean.com>
 
        * gnus-bookmark.el: Adjust for renames in bookmark.el.
        (gnus-bookmark-make-record): Was `gnus-bookmark-make-cell'.
        (gnus-bookmark-jump): Adjust some variable names.
 
-2008-03-05  Reiner Steib  <Reiner.Steib@gmx.de>
+2008-03-06  Teodor Zlatanov  <tzz@lifelogs.com>
 
-       * gnus-sum.el (gnus-print-buffer): Honor ps-print-color-p.
-       Suggested by <chris.anderton@zetnet.co.uk>.
+       * auth-source.el: New package.
+       (auth-source-choices): Add customization entry point variable.
+
+       * gnus-registry.el (gnus-registry-user-format-function-M): Fix concat
+       bug.
+
+2008-03-05  Teodor Zlatanov  <tzz@lifelogs.com>
+
+       * gnus-registry.el (gnus-registry-install): Allow 'ask as an option.
+       (gnus-registry-initialize, gnus-registry-install-p): Use it.
+       (gnus-registry-install-shortcuts): Renamed from
+       gnus-registry-install-shortcuts-and-menus.  Installs the shortcuts in
+       the `gnus-registry-mark-map' keymap dynamically from
+       `gnus-registry-marks'.  The generated functions update the summary line
+       when a registry mark is added or deleted, and will call
+       `gnus-registry-install-p' (see the comments in the code).
+       (gnus-registry-user-format-function-M): Use concat intelligently.
+
+       * gnus-sum.el (gnus-summary-make-menu-bar): Add menu entries for all
+       the registry mark functions.
 
 2008-03-05  Glenn Morris  <rgm@gnu.org>
 
        gnus-art.
        (top-level): No need to load own source when compiling.
 
+2008-03-04  Reiner Steib  <Reiner.Steib@gmx.de>
+
+       * gnus-sum.el (gnus-print-buffer): Honor ps-print-color-p.
+       Suggested by <chris.anderton@zetnet.co.uk>.
+
 2008-03-04  Glenn Morris  <rgm@gnu.org>
 
        * gnus-sum.el (top-level): No need to require gnus when compiling,
        since unconditionally required near start of file.
        (gnus-summary-display-while-building): Move definition before use.
 
+2008-03-04  Teodor Zlatanov  <tzz@lifelogs.com>
+
+       * gnus-registry.el (gnus-registry-user-format-function-M): Add
+       formatting function.
+
+2008-03-03  Teodor Zlatanov  <tzz@lifelogs.com>
+
+       * gnus-registry.el (gnus-registry-marks): Changed format to be nicer
+       with plists.
+       (gnus-registry-do-marks, gnus-registry-install-shortcuts-and-menus):
+       Use new format.
+
+2008-03-03  Katsumi Yamaoka  <yamaoka@jpl.org>
+
+       * gnus-art.el (gnus-article-describe-bindings): Work for the version of
+       `where-is-internal' that returns a range of key sequences.
+
 2008-03-03  Stefan Monnier  <monnier@iro.umontreal.ca>
 
        * mm-bodies.el (mm-decode-content-transfer-encoding): Simplify.
        * gnus-group.el (gnus-update-group-mark-positions):
        Use mm-string-to-multibyte.
 
+2008-03-02  Reiner Steib  <Reiner.Steib@gmx.de>
+
+       * mml2015.el (mml2015-extract-cleartext-signature): Explain that it
+       doesn't handle NotDashEscaped.
+
+       * mml.el (mml-menu): Improve help entries.  Move Sign/Encrypt Part.
+       (mml-dnd-attach-options): Fix typo in custom choice.
+
+       * gnus-group.el (gnus-group-read-ephemeral-gmane-group): Change
+       nndoc-article-type to mbox.
+       (gnus-group-read-ephemeral-gmane-group-url): Support permalink.
+
+       * mm-decode.el (mm-text-html-renderer): Prefer w3m over w3.  Fall back
+       to nil, instead of html2text.
+
+       * imap.el (imap-debug): Add `imap-ping-server'.
+
+       * gnus-bookmark.el: Add FIXMEs.
+
+       * message.el (message-form-letter-separator)
+       (message-send-form-letter-delay): New variables.
+       (message-send-form-letter): Use them.  New command to send form
+       letters.  Requested by Uwe Siart.
+       (message-send-mail-function): Doc fix.  Add "Other" custom option.
+
 2008-02-29  Andreas Seltenreich  <andreas@gate450.dyndns.org>
 
        * nnweb.el (nnweb-google-parse-1): Fix date parsing on articles with
diff --git a/lisp/gnus/auth-source.el b/lisp/gnus/auth-source.el
new file mode 100644 (file)
index 0000000..116d8b4
--- /dev/null
@@ -0,0 +1,86 @@
+;;; auth-source.el --- authentication sources for Gnus and Emacs
+
+;; Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
+;;   2005, 2006, 2007, 2008 Free Software Foundation, Inc.
+
+;; Author: Ted Zlatanov <tzz@lifelogs.com>
+;; Keywords: news
+
+;; This file is part of GNU Emacs.
+
+;; 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.
+
+;; 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
+;; 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.
+
+;;; Commentary:
+
+;; This is the auth-source.el package.  It lets users tell Gnus how to
+;; authenticate in a single place.  Simplicity is the goal.  Instead
+;; of providing 5000 options, we'll stick to simple, easy to
+;; understand options.
+;;; Code:
+
+(eval-when-compile (require 'cl))
+
+(defgroup auth-source nil
+  "Authentication sources."
+  :version "22.1"
+  :group 'gnus)
+
+(defcustom auth-source-choices nil
+  "List of authentication sources.
+
+Each entry is the authentication type with optional properties."
+  :group 'auth-source
+  :type '(repeat :tag "Authentication Sources"
+                (cons :tag "Source definition"
+                      (group :tag "Select a source" :inline t
+                             (const :format "" :value :source)
+                             (choice :tag "Authentication information"
+                                     (const :tag "None" nil)
+                                     (file :tag "File")))
+                      (checklist :tag "Options" :greedy t
+                                 (group :inline t
+                                        (choice :tag "Choose the hosts"
+                                         (group :tag "Select host by name" :inline t
+                                                (const :format "" :value :host)
+                                                (string :tag "Host name"))
+                                         (group :tag "Select host by regular expression" :inline t
+                                                (const :format "" :value :host-regex)
+                                                (regexp :tag "Host regular expression"))
+                                         (group :tag "Use any host" :inline t
+                                                (const :format "" :value :host-any)
+                                                (const :tag "Any" t))
+                                         (group :tag "Use if no other host matches" :inline t
+                                                (const :tag "Fallback" nil))))
+                                 (group :tag "Choose the protocol" :inline t
+                                        (const :format "" :value :protocol)
+                                        (choice :tag "Protocol"
+                                                (const :tag "Any" t)
+                                                (const :tag "Fallback (used if no others match)" nil)
+                                                (const :tag "IMAP" imap)
+                                                (const :tag "POP3" pop3)
+                                                (const :tag "SSH"  ssh)
+                                                (const :tag "SFTP" sftp)
+                                                (const :tag "SMTP" smtp)))))))
+
+;; temp for debugging
+;; (customize-variable 'auth-source-choices)
+;; (setq auth-source-choices nil)
+;; (format "%S" auth-source-choices)
+
+(provide 'auth-source)
+
+;; arch-tag: ff1afe78-06e9-42c2-b693-e9f922cbe4ab
+;;; auth-source.el ends here
index 0b3293f4bb97cbd1202d407d34216035e46014e1..9033ef1ff353b7ed344f0da499f609548645ff31 100644 (file)
@@ -5988,39 +5988,51 @@ If given a numerical ARG, move forward ARG pages."
   (interactive "P")
   (setq arg (if arg (prefix-numeric-value arg) 0))
   (with-current-buffer gnus-article-buffer
-    (goto-char (point-min))
     (widen)
     ;; Remove any old next/prev buttons.
     (when (gnus-visual-p 'page-marker)
       (let ((inhibit-read-only t))
        (gnus-remove-text-with-property 'gnus-prev)
        (gnus-remove-text-with-property 'gnus-next)))
-    (if
-       (cond ((< arg 0)
-              (re-search-backward page-delimiter nil 'move (1+ (abs arg))))
-             ((> arg 0)
-              (re-search-forward page-delimiter nil 'move arg)))
-       (goto-char (match-end 0))
-      (save-excursion
-       (goto-char (point-min))
-       (setq gnus-page-broken
-             (and (re-search-forward page-delimiter nil t) t))))
-    (when gnus-page-broken
-      (narrow-to-region
-       (point)
-       (if (re-search-forward page-delimiter nil 'move)
-          (match-beginning 0)
-        (point)))
-      (when (and (gnus-visual-p 'page-marker)
-                (> (point-min) (save-restriction (widen) (point-min))))
-       (save-excursion
-         (goto-char (point-min))
-         (gnus-insert-prev-page-button)))
-      (when (and (gnus-visual-p 'page-marker)
-                (< (point-max) (save-restriction (widen) (point-max))))
-       (save-excursion
-         (goto-char (point-max))
-         (gnus-insert-next-page-button))))))
+    (let (st nd pt)
+      (when (save-excursion
+             (cond ((< arg 0)
+                    (if (re-search-backward page-delimiter nil 'move (abs arg))
+                        (prog1
+                            (setq nd (match-beginning 0)
+                                  pt nd)
+                          (when (re-search-backward page-delimiter nil t)
+                            (setq st (match-end 0))))
+                      (when (re-search-forward page-delimiter nil t)
+                        (setq nd (match-beginning 0)
+                              pt (point-min)))))
+                   ((> arg 0)
+                    (if (re-search-forward page-delimiter nil 'move arg)
+                        (prog1
+                            (setq st (match-end 0)
+                                  pt st)
+                          (when (re-search-forward page-delimiter nil t)
+                            (setq nd (match-beginning 0))))
+                      (when (re-search-backward page-delimiter nil t)
+                        (setq st (match-end 0)
+                              pt (point-max)))))
+                   (t
+                    (when (re-search-backward page-delimiter nil t)
+                      (goto-char (setq st (match-end 0))))
+                    (when (re-search-forward page-delimiter nil t)
+                      (setq nd (match-beginning 0)))
+                    (or st nd))))
+       (setq gnus-page-broken t)
+       (when pt (goto-char pt))
+       (narrow-to-region (or st (point-min)) (or nd (point-max)))
+       (when (gnus-visual-p 'page-marker)
+         (save-excursion
+           (when nd
+             (goto-char nd)
+             (gnus-insert-next-page-button))
+           (when st
+             (goto-char st)
+             (gnus-insert-prev-page-button))))))))
 
 ;; Article mode commands
 
@@ -6035,7 +6047,7 @@ If given a numerical ARG, move forward ARG pages."
 (defun gnus-article-goto-prev-page ()
   "Show the previous page of the article."
   (interactive)
-  (if (bobp)
+  (if (save-restriction (widen) (bobp)) ;; Real beginning-of-buffer?
       (gnus-article-read-summary-keys nil (gnus-character-to-event ?p))
     (gnus-article-prev-page nil)))
 
@@ -6395,10 +6407,21 @@ then we display only bindings that start with that prefix."
     (define-key map [t] nil)
     (with-current-buffer gnus-article-current-summary
       (set-keymap-parent map (key-binding "S"))
-      (let (def gnus-pick-mode)
-       (dolist (key sumkeys)
-         (when (setq def (key-binding key))
-           (define-key keymap key def))))
+      (let (key def gnus-pick-mode)
+       (while sumkeys
+         (setq key (pop sumkeys))
+         (cond ((and (vectorp key) (= (length key) 1)
+                     (consp (setq def (aref key 0)))
+                     (numberp (car def)) (numberp (cdr def)))
+                (when (< (max (car def) (cdr def)) 128)
+                  (setq sumkeys
+                        (append (mapcar
+                                 #'vector
+                                 (nreverse (gnus-uncompress-range def)))
+                                sumkeys))))
+               ((setq def (key-binding key))
+                (unless (eq def 'undefined)
+                  (define-key keymap key def))))))
       (when (boundp 'gnus-agent-summary-mode)
        (setq agent gnus-agent-summary-mode))
       (when (boundp 'gnus-draft-mode)
index 41b124e697aeef628b0451ecd76862eba5bc6e06..076ac52406dcc3abb4fb51a3574d4fe85dbb7402 100644 (file)
 ;; (define-key global-map "\C-crj" 'gnus-bookmark-jump)
 ;; (define-key global-map "\C-crl" 'gnus-bookmark-bmenu-list)
 
+;; FIXME: Add keybindings, see
+;; http://thread.gmane.org/gmane.emacs.gnus.general/63101/focus=63379
+;; http://thread.gmane.org/v9fxx9fkm4.fsf@marauder.physik.uni-ulm.de
+
+;; FIXME: Check if `gnus-bookmark.el' should use
+;; `bookmark-make-cell-function'.
+;; Cf. http://article.gmane.org/gmane.emacs.gnus.general/66076
+
 (defgroup gnus-bookmark nil
   "Setting, annotation and jumping to Gnus bookmarks."
   :group 'gnus)
index 466a846c675f2357f813bd0070ce46dfd7460d7b..8e2f82b540270469f2d36b548fd1e6c0136fb07c 100644 (file)
@@ -2363,7 +2363,7 @@ specified by `gnus-group-gmane-group-download-format'."
       (gnus-group-read-ephemeral-group
        (format "%s.start-%s.range-%s" group start range)
        `(nndoc ,tmpfile
-              (nndoc-article-type guess))))
+              (nndoc-article-type mbox))))
     (delete-file tmpfile)))
 
 (defun gnus-group-read-ephemeral-gmane-group-url (url)
@@ -2397,7 +2397,7 @@ Valid input formats include:
      ;; URLs providing `group' and `start':
      ((or (string-match
           ;; http://article.gmane.org/gmane.comp.gnu.make.bugs/3584
-          "^http://\\(?:thread\\|article\\)\.gmane\.org/\\([^/]+\\)/\\([0-9]+\\)"
+          "^http://\\(?:thread\\|article\\|permalink\\)\.gmane\.org/\\([^/]+\\)/\\([0-9]+\\)"
           url)
          (string-match
           ;; Don't advertize these in the doc string yet:
index 2803cd9db6d4d00365d32836e72a2d1a1817bbc8..5141a5e2d326ecdb78a943dee5781739d0f1df8b 100644 (file)
 
 (defcustom gnus-registry-marks
   '((Important
-     (char . ?i)
-     (image . "summary_important"))
+     :char ?i
+     :image "summary_important")
     (Work
-     (char . ?w)
-     (image . "summary_work"))
+     :char ?w
+     :image "summary_work")
     (Personal
-     (char . ?p)
-     (image . "summary_personal"))
+     :char ?p
+     :image "summary_personal")
     (To-Do
-     (char . ?t)
-     (image . "summary_todo"))
+     :char ?t
+     :image "summary_todo")
     (Later
-     (char . ?l)
-     (image . "summary_later")))
+     :char ?l
+     :image "summary_later"))
 
   "List of registry marks and their options.
 
@@ -106,14 +106,16 @@ line display and for keyboard shortcuts.
 Each entry must have an image string to be useful for visual
 display."
   :group 'gnus-registry
-  :type '(alist :key-type symbol
-               :value-type (set :tag "Mark details"
-                                 (cons :tag "Shortcut" 
-                                       (const :tag "Character code" char)
-                                       character)
-                                 (cons :tag "Visual" 
-                                       (const :tag "Image" image) 
-                                       string))))
+  :type '(repeat :tag "Registry Marks"
+                (cons :tag "Mark"
+                      (symbol :tag "Name")
+                      (checklist :tag "Options" :greedy t
+                                 (group :inline t
+                                        (const :format "" :value :char)
+                                        (character :tag "Character code"))
+                                 (group :inline t
+                                        (const :format "" :value :image)
+                                        (string :tag "Image"))))))
 
 (defcustom gnus-registry-default-mark 'To-Do
   "The default mark.  Should be a valid key for `gnus-registry-marks'."
@@ -130,10 +132,12 @@ references.'"
   :group 'gnus-registry
   :type '(repeat regexp))
 
-(defcustom gnus-registry-install nil
+(defcustom gnus-registry-install 'ask
   "Whether the registry should be installed."
   :group 'gnus-registry
-  :type 'boolean)
+  :type '(choice (const :tag "Never Install" nil)
+                (const :tag "Always Install" t)
+                (const :tag "Ask Me" ask)))
 
 (defcustom gnus-registry-clean-empty t
   "Whether the empty registry entries should be deleted.
@@ -700,24 +704,22 @@ Consults `gnus-registry-unfollowed-groups' and
 
 FUNCTION should take two parameters, a mark symbol and the cell value."
   (dolist (mark-info gnus-registry-marks)
-    (let ((mark (car-safe mark-info))
-         (data (cdr-safe mark-info)))
-      (dolist (cell data)
-       (let ((cell-type (car-safe cell))
-             (cell-data (cdr-safe cell)))
-         (when (equal type cell-type)
-           (funcall function mark cell-data)))))))
+    (let* ((mark (car-safe mark-info))
+          (data (cdr-safe mark-info))
+          (cell-data (plist-get data type)))
+      (when cell-data
+       (funcall function mark cell-data)))))
 
 ;;; this is ugly code, but I don't know how to do it better
-;;; TODO: clear the gnus-registry-mark-map before running
-(defun gnus-registry-install-shortcuts-and-menus ()
+(defun gnus-registry-install-shortcuts ()
   "Install the keyboard shortcuts and menus for the registry.
 Uses `gnus-registry-marks' to find what shortcuts to install."
-  (gnus-registry-do-marks 
-   'char
-   (lambda (mark data)
-     (let ((function-format
-           (format "gnus-registry-%%s-article-%s-mark" mark)))
+  (let (keys-plist)
+    (gnus-registry-do-marks 
+     :char
+     (lambda (mark data)
+       (let ((function-format
+             (format "gnus-registry-%%s-article-%s-mark" mark)))
 
 ;;; The following generates these functions:
 ;;; (defun gnus-registry-set-article-Important-mark (&rest articles)
@@ -729,44 +731,69 @@ Uses `gnus-registry-marks' to find what shortcuts to install."
 ;;;   (interactive (gnus-summary-work-articles current-prefix-arg))
 ;;;   (gnus-registry-set-article-mark-internal 'Important articles t t))
 
-       (dolist (remove '(t nil))
-        (let* ((variant-name (if remove "remove" "set"))
-               (function-name (format function-format variant-name))
-               (shortcut (format "%c" data))
-               (shortcut (if remove (upcase shortcut) shortcut)))
-          (unintern function-name)
-          (eval
-           `(defun 
-              ;; function name
-              ,(intern function-name) 
-              ;; parameter definition
-              (&rest articles)
-              ;; documentation
-              ,(format 
-                "%s the %s mark over process-marked ARTICLES."
-                (upcase-initials variant-name)
-                mark)
-              ;; interactive definition
-              (interactive 
-               (gnus-summary-work-articles current-prefix-arg))
-              ;; actual code
-              (gnus-registry-set-article-mark-internal 
-               ;; all this just to get the mark, I must be doing it wrong
-               (intern ,(symbol-name mark))
-               articles ,remove t))))))))
-  ;; I don't know how to do this inside the loop above, because
-  ;; gnus-define-keys is a macro
-  (gnus-define-keys (gnus-registry-mark-map "M" gnus-summary-mark-map)
-    "i" gnus-registry-set-article-Important-mark
-    "I" gnus-registry-remove-article-Important-mark
-    "w" gnus-registry-set-article-Work-mark
-    "W" gnus-registry-remove-article-Work-mark
-    "l" gnus-registry-set-article-Later-mark
-    "L" gnus-registry-remove-article-Later-mark
-    "p" gnus-registry-set-article-Personal-mark
-    "P" gnus-registry-remove-article-Personal-mark
-    "t" gnus-registry-set-article-To-Do-mark
-    "T" gnus-registry-remove-article-To-Do-mark))
+        (dolist (remove '(t nil))
+          (let* ((variant-name (if remove "remove" "set"))
+                 (function-name (format function-format variant-name))
+                 (shortcut (format "%c" data))
+                 (shortcut (if remove (upcase shortcut) shortcut)))
+            (unintern function-name)
+            (eval
+             `(defun 
+                ;; function name
+                ,(intern function-name) 
+                ;; parameter definition
+                (&rest articles)
+                ;; documentation
+                ,(format 
+                  "%s the %s mark over process-marked ARTICLES."
+                  (upcase-initials variant-name)
+                  mark)
+                ;; interactive definition
+                (interactive 
+                 (gnus-summary-work-articles current-prefix-arg))
+                ;; actual code
+
+                ;; if this is called and the user doesn't want the
+                ;; registry enabled, we'll ask anyhow
+                (when (eq gnus-registry-install nil)
+                  (setq gnus-registry-install 'ask))
+
+                ;; now the user is asked if gnus-registry-install is 'ask
+                (when (gnus-registry-install-p)
+                  (gnus-registry-set-article-mark-internal 
+                   ;; all this just to get the mark, I must be doing it wrong
+                   (intern ,(symbol-name mark))
+                   articles ,remove t)
+                  (dolist (article articles)
+                    (gnus-summary-update-article 
+                     article 
+                     (assoc article (gnus-data-list nil)))))))
+            (push (intern function-name) keys-plist)
+            (push shortcut keys-plist)
+            (gnus-message 
+             9 
+             "Defined mark handling function %s" 
+             function-name))))))
+    (gnus-define-keys-1
+     '(gnus-registry-mark-map "M" gnus-summary-mark-map) 
+     keys-plist)))
+
+;;; use like this:
+;;; (defalias 'gnus-user-format-function-M 
+;;;           'gnus-registry-user-format-function-M)
+(defun gnus-registry-user-format-function-M (headers)
+  (let* ((id (mail-header-message-id headers))
+        (marks (when id (gnus-registry-fetch-extra-marks id))))
+    (apply 'concat (mapcar (lambda(mark)
+                            (let ((c 
+                                   (plist-get
+                                    (cdr-safe 
+                                     (assoc mark gnus-registry-marks))
+                                    :char)))
+                              (if c
+                                  (list c)
+                                nil)))
+                          marks))))
 
 (defun gnus-registry-read-mark ()
   "Read a mark name from the user with completion."
@@ -1033,10 +1060,12 @@ Returns the first place where the trail finds a group name."
 
 ;;;###autoload
 (defun gnus-registry-initialize ()
+"Initialize the Gnus registry."
   (interactive)
-  (setq gnus-registry-install t)
+  (gnus-message 5 "Initializing the registry")
+  (setq gnus-registry-install t)       ; in case it was 'ask or nil
   (gnus-registry-install-hooks)
-  (gnus-registry-install-shortcuts-and-menus)
+  (gnus-registry-install-shortcuts)
   (gnus-registry-read))
 
 ;;;###autoload
@@ -1068,11 +1097,24 @@ Returns the first place where the trail finds a group name."
 
 (add-hook 'gnus-registry-unload-hook 'gnus-registry-unload-hook)
 
-(when gnus-registry-install
-  (gnus-registry-install-hooks)
-  (gnus-registry-read))
-
-;; TODO: a lot of things
+(defun gnus-registry-install-p ()
+  (interactive)
+  (when (eq gnus-registry-install 'ask)
+    (setq gnus-registry-install
+         (gnus-y-or-n-p
+          (concat "Enable the Gnus registry?  "
+                  "See the variable `gnus-registry-install' "
+                  "to get rid of this query permanently. ")))
+    (when gnus-registry-install
+      ;; we just set gnus-registry-install to t, so initialize the registry!
+      (gnus-registry-initialize)))
+;;; we could call it here: (customize-variable 'gnus-registry-install)
+  gnus-registry-install)
+
+(when (gnus-registry-install-p)
+  (gnus-registry-initialize))
+
+;; TODO: a few things
 
 (provide 'gnus-registry)
 
index 48232ae53f7133d396f51d289743fa1004417974..d6abbd6c13122bf33ccd3cc15ade5414fcafdc6e 100644 (file)
@@ -2582,6 +2582,17 @@ gnus-summary-show-article-from-menu-as-charset-%s" cs))))
         ["Set expirable mark" gnus-summary-mark-as-expirable t]
         ["Set bookmark" gnus-summary-set-bookmark t]
         ["Remove bookmark" gnus-summary-remove-bookmark t])
+       ("Registry Mark"
+        ["Important"     gnus-registry-set-article-Important-mark    t]
+        ["Not Important" gnus-registry-remove-article-Important-mark t]
+        ["Work"          gnus-registry-set-article-Work-mark         t]
+        ["Not Work"      gnus-registry-remove-article-Work-mark      t]
+        ["Later"         gnus-registry-set-article-Later-mark        t]
+        ["Not Later"     gnus-registry-remove-article-Later-mark     t]
+        ["Personal"      gnus-registry-set-article-Personal-mark     t]
+        ["Not Personal"  gnus-registry-remove-article-Personal-mark  t]
+        ["To Do"         gnus-registry-set-article-To-Do-mark        t]
+        ["Not To Do"     gnus-registry-remove-article-To-Do-mark     t])
        ("Limit to"
         ["Marks..." gnus-summary-limit-to-marks t]
         ["Subject..." gnus-summary-limit-to-subject t]
@@ -9210,8 +9221,6 @@ article.  If BACKWARD (the prefix) is non-nil, search backward instead."
     (goto-char (point-max))
     (recenter -3)
     (when gnus-break-pages
-      (when (re-search-backward page-delimiter nil t)
-       (narrow-to-region (match-end 0) (point-max)))
       (gnus-narrow-to-page))))
 
 (defun gnus-summary-print-truncate-and-quote (string &optional len)
index 32f191d918b8932c8e8c614869ecfa6a05bc4796..44c282bbd361c9b13ab127563162d888cf04d35f 100644 (file)
@@ -652,7 +652,8 @@ Valid values include `message-send-mail-with-sendmail'
 `message-send-mail-with-mh', `message-send-mail-with-qmail',
 `message-smtpmail-send-it', `smtpmail-send-it',
 `feedmail-send-it' and `message-send-mail-with-mailclient'.  The
-default is system dependent.
+default is system dependent and determined by the function
+`message-send-mail-function'.
 
 See also `send-mail-function'."
   :type '(radio (function-item message-send-mail-with-sendmail)
@@ -661,7 +662,6 @@ See also `send-mail-function'."
                (function-item message-smtpmail-send-it)
                (function-item smtpmail-send-it)
                (function-item feedmail-send-it)
-               (function :tag "Other")
                (function-item message-send-mail-with-mailclient
                               :tag "Use Mailclient package")
                (function :tag "Other"))
@@ -7807,6 +7807,98 @@ From headers in the original article."
        (delete-region start end)
        (insert match)))))
 
+;; To send pre-formatted letters like the example below, you can use
+;; `message-send-form-letter':
+;; --8<---------------cut here---------------start------------->8---
+;; To: alice@invalid.invalid
+;; Subject: Verification of your contact information
+;; From: Contact verification <admin@foo.invalid>
+;; --text follows this line--
+;; Hi Alice,
+;; please verify that your contact information is still valid:
+;; Alice A, A avenue 11, 1111 A town, Austria
+;; ----------next form letter message follows this line----------
+;; To: bob@invalid.invalid
+;; Subject: Verification of your contact information
+;; From: Contact verification <admin@foo.invalid>
+;; --text follows this line--
+;; Hi Bob,
+;; please verify that your contact information is still valid:
+;; Bob, B street 22, 22222 Be town, Belgium
+;; ----------next form letter message follows this line----------
+;; To: charlie@invalid.invalid
+;; Subject: Verification of your contact information
+;; From: Contact verification <admin@foo.invalid>
+;; --text follows this line--
+;; Hi Charlie,
+;; please verify that your contact information is still valid:
+;; Charlie Chaplin, C plaza 33, 33333 C town, Chile
+;; --8<---------------cut here---------------end--------------->8---
+
+;; FIXME: What is the most common term (circular letter, form letter, serial
+;; letter, standard letter) for such kind of letter?  See also
+;; <http://en.wikipedia.org/wiki/Form_letter>
+
+;; FIXME: Maybe extent message-mode's font-lock support to recognize
+;; `message-form-letter-separator', i.e. highlight each message like a single
+;; message.
+
+(defcustom message-form-letter-separator
+  "\n----------next form letter message follows this line----------\n"
+  "Separator for `message-send-form-letter'."
+  ;; :group 'message-form-letter
+  :group 'message-various
+  :version "23.1" ;; No Gnus
+  :type 'string)
+
+(defcustom message-send-form-letter-delay 1
+  "Delay in seconds when sending a message with `message-send-form-letter'.
+Only used when `message-send-form-letter' is called with non-nil
+argument `force'."
+  ;; :group 'message-form-letter
+  :group 'message-various
+  :version "23.1" ;; No Gnus
+  :type 'integer)
+
+(defun message-send-form-letter (&optional force)
+  "Sent all form letter messages from current buffer.
+Unless FORCE, prompt before sending.
+
+The messages are separated by `message-form-letter-separator'.
+Header and body are separated by `mail-header-separator'."
+  (interactive "P")
+  (let ((sent 0) (skipped 0)
+       start end text
+       buff
+       to done)
+    (goto-char (point-min))
+    (while (not done)
+      (setq start (point)
+           end (if (search-forward message-form-letter-separator nil t)
+                   (- (point) (length message-form-letter-separator) -1)
+                 (setq done t)
+                 (point-max)))
+      (setq text
+           (buffer-substring-no-properties start end))
+      (setq buff (generate-new-buffer "*mail - form letter*"))
+      (with-current-buffer buff
+       (insert text)
+       (message-mode)
+       (setq to (message-fetch-field "To"))
+       (switch-to-buffer buff)
+       (when force
+         (sit-for message-send-form-letter-delay))
+       (if (or force
+                 (y-or-n-p (format "Send message to `%s'? " to)))
+           (progn
+             (setq sent (1+ sent))
+             (message-send-and-exit))
+         (message (format "Message to `%s' skipped." to))
+         (setq skipped (1+ skipped)))
+       (when (buffer-live-p buff)
+         (kill-buffer buff))))
+    (message "%s message(s) sent, %s skipped." sent skipped)))
+
 (when (featurep 'xemacs)
   (require 'messagexmas)
   (message-xmas-redefine))
index 98d444665b2e1f47e8c2394098697e52c6a63d51..46bf4b8d8fecaeb45783abfc002a4dc6b5dcf73a 100644 (file)
         ,disposition ,description ,cache ,id))
 
 (defcustom mm-text-html-renderer
-  (cond ((locate-library "w3") 'w3)
-       ((executable-find "w3m") (if (locate-library "w3m")
-                                    'w3m
-                                  'w3m-standalone))
+  (cond ((executable-find "w3m")
+        (if (locate-library "w3m")
+            'w3m
+          'w3m-standalone))
        ((executable-find "links") 'links)
        ((executable-find "lynx") 'lynx)
-       (t 'html2text))
+       ((locate-library "w3") 'w3)
+       ((locate-library "html2text") 'html2text)
+       (t nil))
   "Render of HTML contents.
 It is one of defined renderer types, or a rendering function.
 The defined renderer types are:
-`w3'   : use Emacs/W3;
 `w3m'  : use emacs-w3m;
 `w3m-standalone': use w3m;
 `links': use links;
 `lynx' : use lynx;
+`w3'   : use Emacs/W3;
 `html2text' : use html2text;
-nil    : use external viewer."
-  :version "22.1"
+nil    : use external viewer (default web browser)."
+  :version "23.0" ;; No Gnus
   :type '(choice (const w3)
-                (const w3m)
-                (const w3m-standalone)
+                (const w3m :tag "emacs-w3m")
+                (const w3m-standalone :tag "standalone w3m" )
                 (const links)
                 (const lynx)
                 (const html2text)
-                (const nil)
+                (const nil :tag "External viewer")
                 (function))
   :group 'mime-display)
 
index 5abeea16812a8eb38cba83fce358f55e7015a594..9e9414f8fe223ce2a96b3a7d6804ff9ccb9b54b0 100644 (file)
             (let ((coding-system-for-write 'iso-2022-jp)
                   (coding-system-for-read 'iso-2022-jp)
                   (str (mm-decode-coding-string "\
-\e$B#D#o#e#s!!#w#3#m!!#s#u#p#p#o#r#t#s!!#m#1#7#n!)\e(B" 'iso-2022-jp)))
+\e$B#D#o#e#s!!#w#3#m!!#s#u#p#p#o#r#t!!#m#1#7#n!)\e(B" 'iso-2022-jp)))
               (mm-with-multibyte-buffer
                 (insert str)
                 (call-process-region
index c703e1365f668d8c15575c0be77d3709d93e3207..0a7aac29ed9c19f80961c52af0b93fa5665d7e5f 100644 (file)
@@ -1017,6 +1017,14 @@ If HANDLES is non-nil, use it instead reparsing the buffer."
     (define-key main "\C-c\C-m" map)
     main))
 
+;; (defun mml-toggle-gcc-externalize-attachments ()
+;;   (interactive)
+;;   (prog1
+;;       (setq gnus-gcc-externalize-attachments
+;;         (not gnus-gcc-externalize-attachments))
+;;     (message "gnus-gcc-externalize-attachments is `%s'."
+;;          gnus-gcc-externalize-attachments)))
+
 (easy-menu-define
   mml-menu mml-mode-map ""
   `("Attachments"
@@ -1025,10 +1033,18 @@ If HANDLES is non-nil, use it instead reparsing the buffer."
         '(:help "Attach a file at point"))]
     ["Attach Buffer..." mml-attach-buffer
      ,@(if (featurep 'xemacs) '(t)
-        '(:help "Attach a buffer to the outgoing MIME message"))]
+        '(:help "Attach a buffer to the outgoing message"))]
     ["Attach External..." mml-attach-external
      ,@(if (featurep 'xemacs) '(t)
-        '(:help "Attach reference to file"))]
+        '(:help "Attach reference to an external file"))]
+    ;; ["Externalize Attachments"
+    ;;  (lambda () (interactive) (mml-toggle-gcc-externalize-attachments))
+    ;; ,@(if (featurep 'xemacs) nil
+    ;;         '(:help "Save attachments as external parts in Gcc copies"))
+    ;; :visible (booleanp gnus-gcc-externalize-attachments)
+    ;; :style radio
+    ;; :selected (equal gnus-gcc-externalize-attachments t) ]
+    "----"
     ;;
     ("Change Security Method"
      ["PGP/MIME"
@@ -1056,6 +1072,10 @@ If HANDLES is non-nil, use it instead reparsing the buffer."
     ["Encrypt/Sign off" mml-unsecure-message
      ,@(if (featurep 'xemacs) '(t)
         '(:help "Don't Encrypt/Sign Message"))]
+    ;; Do we have separate encrypt and encrypt/sign commands for parts?
+    ["Sign Part" mml-secure-sign t]
+    ["Encrypt Part" mml-secure-encrypt t]
+    "----"
     ;; Maybe we could remove these, because people who write MML most probably
     ;; don't use the menu:
     ["Insert Part..." mml-insert-part
@@ -1063,9 +1083,6 @@ If HANDLES is non-nil, use it instead reparsing the buffer."
     ["Insert Multipart..." mml-insert-multipart
      :active (message-in-body-p)]
     ;;
-    ;; Do we have separate encrypt and encrypt/sign commands for parts?
-    ["Sign Part" mml-secure-sign t]
-    ["Encrypt Part" mml-secure-encrypt t]
     ;;["Narrow" mml-narrow-to-part t]
     ["Quote MML in region" mml-quote-region
      :active (message-mark-active-p)
@@ -1222,7 +1239,7 @@ If it is a list, valid members are `type', `description' and
 don't ask for options.  If it is t, ask the user whether or not
 to specify options."
   :type '(choice
-         (const :tag "Non" nil)
+         (const :tag "None" nil)
          (const :tag "Query" t)
          (list :value (type description disposition)
           (set :inline t
index b4d301190d0d90d16322536e9d91965716ec81a1..8add5e5215f27170c17c8bd5256b762825464732 100644 (file)
@@ -153,6 +153,17 @@ Whether the passphrase is cached at all is controlled by
 ;; should be done by GnuPG rather than Elisp, but older PGP backends
 ;; (such as Mailcrypt, PGG, and gpg.el) discard the output from GnuPG.
 (defun mml2015-extract-cleartext-signature ()
+  ;; Daiki Ueno in
+  ;; <54a15d860801080142l70b95d7dkac4bf51a86196011@mail.gmail.com>: ``I still
+  ;; believe that the right way is to use the plaintext output from GnuPG as
+  ;; it is, and mml2015-extract-cleartext-signature is just a kludge for
+  ;; misdesigned libraries like PGG, which have no ability to do that.  So, I
+  ;; think it should not have descriptive documentation.''
+  ;;
+  ;; This function doesn't handle NotDashEscaped correctly.  EasyPG handles it
+  ;; correctly.
+  ;; http://thread.gmane.org/gmane.emacs.gnus.general/66062/focus=66082
+  ;; http://thread.gmane.org/gmane.emacs.gnus.general/65087/focus=65109
   (goto-char (point-min))
   (forward-line)
   ;; We need to be careful not to strip beyond the armor headers.
index 2ec29252d473cb27b579345ba3c2ccf0afd5639d..399d5ec823792f16e2a544e2976cc13794dee4b2 100644 (file)
@@ -2923,6 +2923,7 @@ Return nil if no complete line has arrived."
          imap-open-1
          imap-open
          imap-opened
+         imap-ping-server
          imap-authenticate
          imap-close
          imap-capability
index 8c588a11451ae996f9724f367bc6a2c11cbf8f5d..de82ae7473ddf147b23bd34e9fc4bbb6f4cbf5ae 100644 (file)
@@ -61,7 +61,7 @@
 
 (defun netrc-parse (file)
   (interactive "fFile to Parse: ")
-  "Parse FILE and return an list of all entries in the file."
+  "Parse FILE and return a list of all entries in the file."
   (when (file-exists-p file)
     (with-temp-buffer
       (let ((tokens '("machine" "default" "login"