diff options
Diffstat (limited to 'lisp/gnus')
47 files changed, 2085 insertions, 811 deletions
diff --git a/lisp/gnus/ChangeLog b/lisp/gnus/ChangeLog index 59a935ee829..251e5b1f381 100644 --- a/lisp/gnus/ChangeLog +++ b/lisp/gnus/ChangeLog @@ -1,6 +1,167 @@ -2013-03-11 Glenn Morris <rgm@gnu.org> +2013-04-25 Andrew Cohen <cohen@bu.edu> - * Version 24.3 released. + * gnus-msg.el (gnus-inews-insert-gcc): Re-order conditional to work for + string values of 'gcc-self. Thanks to Saroj Thirumalai. + +2013-04-24 Andrew Cohen <cohen@bu.edu> + + * nnir.el (nnir-close-group): Make sure we are in the right group. + + * gnus-sum.el (gnus-summary-insert-articles): Force updates to the + dependency table from all newly retrieved headers. + +2013-04-16 David Edmondson <dme@dme.org> + + Support <img src="data:...">. + + * shr.el (shr-image-from-data): New function. + (shr-tag-img): Use it. + +2013-04-14 Andrew Cohen <cohen@bu.edu> + + * nnir.el (nnir-request-set-mark): Make sure we are in the right + group. + +2013-04-12 Katsumi Yamaoka <yamaoka@jpl.org> + + * gnus-msg.el (gnus-msg-mail): Make it avoid using posting styles + corresponding to any existing group (Bug#14166). + +2013-04-10 Andrew Cohen <cohen@bu.edu> + + * nnir.el (number-sequence): No longer used. + (nnir-request-set-mark): New function. + (nnir-request-update-info): Improve marks updating. + (nnir-request-scan): Don't duplicate marks updating. + (gnus-group-make-nnir-group, nnir-run-imap, nnir-request-create-group): + Use 'assq rather than 'assoc. Quote anonymous function. + (nnir-request-group, nnir-close-group, gnus-summary-create-nnir-group): + Use 'gnus-group-prefixed-p. + (gnus-summary-create-nnir-group): Make sure server for method is open. + +2013-04-04 Andrew Cohen <cohen@bu.edu> + + * nnir.el (gnus-nnir-group-p): New function. + (nnir-possibly-change-group): Use it. + + * gnus-msg.el (gnus-setup-message): Use it. + +2013-04-04 Katsumi Yamaoka <yamaoka@jpl.org> + + * mml.el (mml-minibuffer-read-description): Use `default' insted of + `initial-input' for the argument name. + Suggested by Stefan Monnier <monnier@iro.umontreal.ca>. + +2013-04-03 Kevin Layer <layer@known.net> (tiny change) + + * mml.el (mml-minibuffer-read-description): Allow passing in a prefix + (used by MH-E). + +2013-04-01 Andrew Cohen <cohen@bu.edu> + + * nnir.el (nnir-request-update-mark): Improve mark updating in original + group. + + * gnus-msg.el (nnir-article-number, nnir-article-group): Autoload to + fix compilation. + +2013-03-31 Andrew Cohen <cohen@bu.edu> + + * nnir.el (nnir-method-default-engines): And another typo. + +2013-03-30 Andrew Cohen <cohen@bu.edu> + + * nnir.el (nnir-method-default-engines): Fix typo. + +2013-03-29 Andrew Cohen <cohen@bu.edu> + + * nnir.el: Define 'number-sequence for xemacs. + (gnus-summary-create-nnir-group): New function to create an nnir group + from an nnir summary buffer based on the current query. + (nnir-request-create-group): Update to allow nnir group creation based + on the current query. + +2013-03-28 Katsumi Yamaoka <yamaoka@jpl.org> + + * nndraft.el (nndraft-request-expire-articles): + Make expiry target always `delete'. + +2013-03-27 Andrew Cohen <cohen@bu.edu> + + * gnus-msg.el (gnus-setup-message): When replying from an nnir summary + buffer use the posting-style and gcc of the original article group. + (gnus-inews-insert-gcc): Don't set gcc-self for virtual groups. + + * nnir.el: Fix byte-compile warning. nnoo-define-skeleton should come + after other deffoos. + +2013-03-26 Andrew Cohen <cohen@bu.edu> + + * nnir.el: Major rewrite. Cleaner separation between searches and group + management. Marks are now shown in nnir summary buffers. Rudimentary + support for real (i.e. not ephemeral) nnir groups. + (gnus-summary-make-nnir-group): New function for initiating searches + from a summary buffer. + +2013-03-18 Sam Steingold <sds@gnu.org> + + * message.el (message-bury): Minor cleanup. + +2013-03-06 Katsumi Yamaoka <yamaoka@jpl.org> + + * nndir.el (nndir-request-list): Remove 2nd argument passed to + nnml-request-list. (Bug#13873) + (nndir-request-newsgroups): Remove, unused. + + * nndraft.el (nndraft-request-newsgroups): Remove, unused. + +2013-03-03 Ted Phelps <phelps@gnusto.com> + + * shr.el: Make all the overlays set the `evaporate' property so that + they're removed properly. + +2013-02-25 Adam Sjøgren <asjo@koldfront.dk> + + * mml2015-el (mml2015-epg-key-image): Wrap epg-gpg-program in + shell-quote-argument. + +2013-02-22 David Engster <deng@randomsample.de> + + * gnus-registry.el (gnus-registry-save): Provide class name when + calling `eieio-persistent-read' to avoid "unsafe call" warning. Use + `condition-case' to stay compatible with older EIEIO versions which + only accept one argument. + +2013-02-17 Daiki Ueno <ueno@gnu.org> + + * mml2015.el (epg-key-user-id-list, epg-user-id-string) + (epg-user-id-validity): Autoload. + (mml2015-epg-check-user-id): New function. + (mml2015-epg-check-sub-key): New function split from + mml2015-epg-find-usable-key. + (mml2015-epg-find-usable-key): Accept context, name, usage, and + optional name-is-key-id, to handle the case when user-id is unusable. + Reported by Łukasz Stelmach <stlman@poczta.fm>. + +2013-02-17 Glenn Morris <rgm@gnu.org> + + * shr.el (shr-put-image): Use image-multi-frame-p if available. + +2013-02-16 Glenn Morris <rgm@gnu.org> + + * shr.el (shr-put-image): Only animate images that specify a delay. + This is consistent with the old image-animated-p behavior. + +2013-02-14 Katsumi Yamaoka <yamaoka@jpl.org> + + * gnus-util.el (gnus-define-keys): Convert [?\S-\ ] to [(shift space)] + for XEmacs. + +2013-02-13 Juri Linkov <juri@jurta.org> + + * gnus-art.el (gnus-article-mode-map): + * gnus-sum.el (gnus-summary-mode-map, gnus-summary-article-map): + Make S-SPC scroll in the opposite sense to SPC. (Bug#2145) 2013-02-10 Katsumi Yamaoka <yamaoka@jpl.org> @@ -12,6 +173,111 @@ * auth-source.el (auth-source-format-prompt): Don't get confused by any "\" in replacement text. (Bug#13637) +2013-01-30 Christopher Schmidt <christopher@ch.ristopher.com> + + * gnus-int.el (gnus-backend-trace-elapsed): New variable. + (gnus-backend-trace): Honor gnus-backend-trace. + + * mml.el (mml-insert-part): Insert closing tag. + + * mm-decode.el (mm-save-part): Handle invalid read-file-name results. + +2013-01-21 Lars Magne Ingebrigtsen <larsi@gnus.org> + + * gnus-sum.el (gnus-summary-read-group-1): Protect against not being + able to find the article, which can happen in debbugs groups, + apparently. + +2013-01-16 Glenn Morris <rgm@gnu.org> + + * smiley.el (smiley-style): Make the file loadable in batch mode. + +2013-01-15 Stefan Monnier <monnier@iro.umontreal.ca> + + * nnimap.el (nnimap-keepalive): Don't throw an error if there's no more + imap process running. + +2013-01-14 Julien Danjou <julien@danjou.info> + + * gnus-sum.el (gnus-summary-from-or-to-or-newsgroups): + Compare addresses against addresses, not against the full From field. + +2013-01-13 Richard Stallman <rms@gnu.org> + + * message.el (message-forward-make-body-mime): New args BEG, END + specify what part of FORWARD-BUFFER to use. Do the work directly + instead of calling `mml-insert-buffer'. + +2013-01-11 Aaron S. Hawley <Aaron.Hawley@vtinfo.com> + + * gnus-start.el (gnus-check-new-newsgroups): Fix ambiguous doc string + cross-reference(s). + + * gnus-sum.el (gnus-summary-newsgroup-prefix): Fix ambiguous doc string + cross-reference(s). + +2013-01-11 Dmitry Antipov <dmantipov@yandex.ru> + + * gnus-art.el (gnus-mime-display-security): Use point-min-marker + and point-max-marker. + * gnus-async.el (gnus-async-article-callback): Use point-max-marker. + +2013-01-10 Uwe Brauer <oub@mat.ucm.es> (tiny change) + + * mml-smime.el (mml-smime-encrypt-to-self): New user option analogous + to mml2015-encrypt-to-self. + (mml-smime-epg-encrypt): Respect mml-smime-encrypt-to-self. + +2013-01-09 Daiki Ueno <ueno@gnu.org> + + * mml-smime.el (epg-sub-key-fingerprint): Autoload for + mml-smime-epg-find-usable-secret-key. + +2013-01-08 Glenn Morris <rgm@gnu.org> + + * mml-smime.el (mml-smime-sign-with-sender): Add :version. + +2013-01-07 Daiki Ueno <ueno@gnu.org> + + * mml-smime.el: Support signing by sender. + Requested by Uwe Brauer. + (mml-smime-sign-with-sender): New user option analogous + to mml2015-sign-with-sender. + (mml-smime-epg-sign): Respect mml-smime-sign-with-sender. + (mml-smime-epg-find-usable-secret-key): New helper function copied from + mml2015.el. + +2012-12-31 Lars Magne Ingebrigtsen <larsi@gnus.org> + + * gnus-msg.el (gnus-inews-insert-gcc): Don't insert Gcc headers if Gnus + isn't running, because Gnus will probably not know how to handle the + Gcc header (bug#11941). + + * nnimap.el (nnimap-update-info): Treat \Deleted articles as \Read + articles. + +2012-12-29 Lars Magne Ingebrigtsen <larsi@gnus.org> + + * nnfolder.el (nnfolder-recursive-directory-files): New function. + (nnfolder-generate-active-file): Make this function work with recursive + folder names. + +2012-12-27 Lars Ingebrigtsen <larsi@gnus.org> + + * nntp.el (nntp-open-connection): Use HELP as the capability command + instead of CAPABILITY because Typhoon v2.2.2.503 chokes completely on + unknown commands. And CAPABILITY is an unknown command (bug#12763). + +2012-12-27 Wolfgang Jenkner <wjenkner@inode.at> + + * gnus-spec.el (gnus-face-face-function): Don't use nil as no-op face + place holder since this gives `Invalid face reference: nil' messages. + Use the `default' face instead. It has the same effect here, even + though it is not no-op. + + * gnus-util.el + (gnus-put-text-property-excluding-characters-with-faces): Similarly. + 2012-12-27 Lars Ingebrigtsen <larsi@gnus.org> * gnus-msg.el (gnus-summary-resend-message): Don't bug out on @@ -20,18 +286,243 @@ 2012-12-27 Glenn Morris <rgm@gnu.org> * plstore.el (plstore-passphrase-callback-function): - Fix file/buffer typo. (Bug#13264) + Use plstore-get-file. + +2012-12-27 Andreas Schwab <schwab@linux-m68k.org> -2012-12-24 Andreas Schwab <schwab@linux-m68k.org> + * mml2015.el (mml2015-epg-key-image): Separate attribute stream from + stderr. * nnimap.el (nnimap-find-article-by-message-id): Don't error out if group is nil. -2012-12-23 Andreas Schwab <schwab@linux-m68k.org> - * shr.el (shr-tag-em): Render as italic, not bold. -2012-12-02 Andreas Schwab <schwab@linux-m68k.org> +2012-12-26 Katsumi Yamaoka <yamaoka@jpl.org> + + * mml2015.el (mml2015-epg-key-image): Use mm-set-buffer-multibyte. + +2012-12-25 Adam Sjøgren <asjo@koldfront.dk> + + * mml2015.el (mml2015-epg-key-image): use --attribute-fd rather than + temporary file to get PGP key image. Pass no-show-photos when extracting + image to avoid having it pop up twice. + +2012-12-26 Lars Ingebrigtsen <larsi@gnus.org> + + * gnus-art.el (gnus-article-treat-types): Include text/html as parts + eligible for treatment. + + * gnus-util.el (gnus-goto-colon): Move to the beginning of the visual + lines. This makes summary commands with hidden threads work more + reliably. + + * gnus-cite.el (gnus-article-hide-citation-maybe): Leave an expansion + button to mark the hidden citations (bug#9395). + +2012-12-26 Daiki Ueno <ueno@gnu.org> + + * mml2015.el (mml2015-epg-signature-to-string): New function. + (mml2015-epg-verify-result-to-string): New function. + (mml2015-epg-decrypt, mml2015-epg-clear-decrypt, mml2015-epg-verify) + (mml2015-epg-clear-verify): Use mml2015-epg-verify-result-to-string + instead of epg-verify-result-to-string. + (epg-signature-key-id, epg-signature-to-string): Autoload. + (epg-verify-result-to-string): Remove autoload. + +2012-12-25 Adam Sjøgren <asjo@koldfront.dk> + + * mml2015.el (mml2015-epg-key-image): New function, to retrieve photo + ID image from GPG public key. + (mml2015-epg-key-image-to-string): New function. + +2012-12-25 Leo Liu <sdl.web@gmail.com> + + * plstore.el (plstore-passphrase-callback-function): Fix error when + error when plstore-cache-passphrase-for-symmetric-encryption is set + (bug#13264). + +2012-12-25 Lars Ingebrigtsen <larsi@gnus.org> + + * gnus-sum.el (gnus-set-global-variables): Don't copy over the summary + buffer to the article buffer here, because that clobbers multiple + article buffers. + + * gnus-art.el (gnus-article-setup-buffer): Make sure that the article + buffer always points to the right summary buffer. + +2012-12-25 John Wiegley <jwiegley@gmail.com> + + * auth-source.el (auth-source-netrc-parse): Allow using "password" as + the password (bug#12097). + +2012-12-25 Lars Ingebrigtsen <larsi@gnus.org> + + * shr.el (shr-tag-a): Don't tagify <A> elements that don't have HREFs + (bug#13263). + + * gnus-salt.el (gnus-highlight-selected-tree): Check whether the Tree + buffer exists before using it (bug#12475). + + * gnus-agent.el (gnus-agent-fetch-articles): Don't fetch articles from + offline groups (bug#11937). + + * message.el (message-yank-original): When using customize to set the + value of `message-cite-style', the variable it set to a symbol that's + the name of the variable, which must then be dereferenced (bug#12616). + +2012-12-25 Wolfgang Jenkner <wjenkner@inode.at> + + * lisp/gnus-spec.el (gnus-face-face-function): Initialize the value of + the `face' property with a list whose car is the face specified in the + format string and whose cdr is (nil). + * lisp/gnus-util.el + (gnus-put-text-property-excluding-characters-with-faces): + Change accordingly. + (gnus-get-text-property-excluding-characters-with-faces): New function. + * lisp/gnus-sum.el (gnus-summary-highlight-line): + * lisp/gnus-salt.el (gnus-tree-highlight-node): + * lisp/gnus-group.el (gnus-group-highlight-line): Use it. + +2012-12-25 Lars Ingebrigtsen <larsi@gnus.org> + + * nnimap.el (nnimap-authenticator): Expand to allow specifying the + login methods. + (nnimap-login): Respect the `nnimap-authenticator' variable. + + * gnus-sum.el (gnus-summary-push-marks-to-backend): Push the complete + mark state when moving articles. Otherwise unticked articles will get + their ticks back after moving. + +2012-12-24 Lars Ingebrigtsen <larsi@gnus.org> + + * gnus-srvr.el (gnus-browse-delete-group): Fix syntax error. + + * message.el (message-ignored-news-headers): Always remove + X-Message-SMTP-Method to avoid information leakage if the user + mistakenly inserts the header into news messages. + + * gnus-srvr.el (gnus-browse-delete-group): New command and keystroke. + + * gnus-sum.el (gnus-summary-hide-thread): If point were further to the + right than four characters, this command would move point to + `point-max'. Don't do that. + + * gnus-group.el (gnus-group-read-ephemeral-group): Set the active data + to nil to allow re-selecting groups that gain articles. + (gnus-bug-group-download-format-alist): Update the URL. + +2012-12-23 Andreas Schwab <schwab@suse.de> + + * shr.el (shr-tag-em): Render em as italic, not bold. + +2012-12-23 Lars Ingebrigtsen <larsi@gnus.org> + + * gnus-int.el (gnus-backend-trace): Factor out into its own function + for reuse. + (gnus-open-server): Use it to add more tracing. + (gnus-finish-retrieve-group-infos): Add backend tracing. + (gnus-backend-trace): Also note the elapsed seconds. + +2012-12-22 Philipp Haselwarter <philipp@haselwarter.org> + + * gnus-sync.el (gnus-sync-file-encrypt-to, gnus-sync-save): + Set epa-file-encrypt-to from variable to avoid querying. + +2012-12-14 Akinori MUSHA <knu@iDaemons.org> (tiny change) + + * sieve-mode.el (sieve-font-lock-keywords): + Keywords should be word delimited. (Bug#13173) + +2012-12-12 Katsumi Yamaoka <yamaoka@jpl.org> + + * gnus-art.el (gnus-article-browse-html-parts): Use <div align="left"> + instead of <pre> to align message header. + +2012-12-12 Sam Steingold <sds@gnu.org> + + * gnus.el (gnus-other-frame-resume-function): Add user option. + (gnus-other-frame): Call `gnus-other-frame-resume-function' on resume. + +2012-12-06 Sam Steingold <sds@gnu.org> + + * gnus-start.el (gnus-before-resume-hook): Add. + (gnus-1): Run it when Gnus is alive. + +2012-12-06 Katsumi Yamaoka <yamaoka@jpl.org> + + * gmm-utils.el (gmm-called-interactively-p): Restore as a macro. + * gnus-art.el (article-unsplit-urls) + * gnus-bookmark.el (gnus-bookmark-bmenu-list) + * gnus-registry.el (gnus-registry-get-article-marks) + * message.el (message-goto-body): Use it. + (message-called-interactively-p): Remove. + + * spam-stat.el (spam-stat-called-interactively-p): New macro. + (spam-stat-score-buffer): Use it. + + * spam.el: Silence the warnings against BBDB functions when compiling. + + * gnus-score.el (gnus-score-decode-text-parts): + Use append+mapcar instead of the cl function mapcan. + + * gmm-utils.el (gmm-flet): Remove. + + * gnus-sync.el (gnus-sync-lesync-call): + Avoid overriding json-alist-p. + + * message.el (message-read-from-minibuffer): + Avoid overriding mail-abbrev-in-expansion-header-p. + +2012-12-05 Sam Steingold <sds@gnu.org> + + * gnus.el (gnus-delete-gnus-frame): Extract from `gnus-other-frame'. + (gnus-other-frame): Add `gnus-delete-gnus-frame' to + `gnus-suspend-gnus-hook' in addition to `gnus-exit-gnus-hook'. + +2012-12-05 Katsumi Yamaoka <yamaoka@jpl.org> + + * gmm-utils.el (gmm-called-interactively-p): Revert. + This seems to cause Emacs to get stuck! + * gnus-art.el (article-unsplit-urls) + * gnus-bookmark.el (gnus-bookmark-bmenu-list) + * gnus-registry.el (gnus-registry-get-article-marks) + * message.el (message-goto-body) + (message-called-interactively-p): Revert. + + * gmm-utils.el (gmm-called-interactively-p): New function. + * gnus-art.el (article-unsplit-urls) + * gnus-bookmark.el (gnus-bookmark-bmenu-list) + * gnus-registry.el (gnus-registry-get-article-marks) + * message.el (message-goto-body): Use it. + (message-called-interactively-p): Remove. + + * gmm-utils.el (gmm-flet): Restore it using cl-letf. + * gnus-sync.el (gnus-sync-lesync-call) + * message.el (message-read-from-minibuffer): Use it. + +2012-12-05 Katsumi Yamaoka <yamaoka@jpl.org> + + * gmm-utils.el (gmm-flet): Remove. + * gnus-sync.el (gnus-sync-lesync-call) + * message.el (message-read-from-minibuffer): Don't use it. + +2012-12-04 Katsumi Yamaoka <yamaoka@jpl.org> + + * gmm-utils.el (gmm-labels): Use cl-labels if available. + +2012-12-04 Katsumi Yamaoka <yamaoka@jpl.org> + + * gmm-utils.el (gmm-flet, gmm-labels): New macros. + + * gnus-sync.el (gnus-sync-lesync-call) + * message.el (message-read-from-minibuffer): Use gmm-flet. + + * gnus-score.el (gnus-score-decode-text-parts): Use gmm-labels. + + * gnus-util.el (gnus-macroexpand-all): Remove. + +2012-12-03 Andreas Schwab <schwab@linux-m68k.org> * gnus-sum.el (gnus-summary-mode-map): Bind gnus-summary-widget-forward to TAB, not [tab]. @@ -40,13 +531,18 @@ * gnus-sync.el (gnus-sync-newsrc-offsets): Restore definition. (gnus-sync-save): Use correct format for gnus-sync-newsrc-loader. +2012-11-19 Katsumi Yamaoka <yamaoka@jpl.org> + + * message.el (message-get-reply-headers): + Make sure the reply goes to the author if it is a wide reply. + 2012-11-16 Jan Tatarik <jan.tatarik@gmail.com> * gnus-score.el (gnus-score-body): * gnus-logic.el (gnus-advanced-body): Don't score by headers when scoring by body. -2012-11-13 Glenn Morris <rgm@gnu.org> +2012-11-16 Glenn Morris <rgm@gnu.org> * gnus-diary.el (nndiary-request-create-group-functions) (nndiary-request-update-info-functions) @@ -54,6 +550,36 @@ (nndiary-request-accept-article-functions): Use new names for hooks rather than obsolete aliases. +2012-11-08 Katsumi Yamaoka <yamaoka@jpl.org> + + * gnus-art.el (gnus-article-browse-html-parts): Always replace charset + in meta tag with the one the part specifies in its header. + +2012-11-02 Stephen Eglen <S.J.Eglen@damtp.cam.ac.uk> + + * gnus-dired.el (gnus-dired-attach): Attach to last used message buffer + by default. + +2012-11-02 Katsumi Yamaoka <yamaoka@jpl.org> + + New UIDL implementation. + + * mail-source.el (mail-sources, mail-source-keyword-map): + Add :leave as a pop3 keyword. + (mail-source-fetch-pop): Bind pop3-leave-mail-on-server. + + * pop3.el (pop3-leave-mail-on-server): Allow number. + (pop3-uidl-file, pop3-uidl-file-backup): New user options. + (pop3-movemail): Add UIDL support. + (pop3-send-streaming-command): Take a list of mail numbers instead of + the number of mails. + (pop3-write-to-file): Add X-UIDL header. + (pop3-uidl-stat, pop3-uidl-dele, pop3-uidl-load, pop3-uidl-save) + (pop3-uidl-add-xheader): New functions. + + * message.el (message-ignored-resent-headers): + Add X-Content-Length and X-UIDL headers. + 2012-10-23 Stefan Monnier <monnier@iro.umontreal.ca> * nndiary.el (nndiary-request-create-group-functions) diff --git a/lisp/gnus/ChangeLog.1 b/lisp/gnus/ChangeLog.1 index 34533f31bff..9043a23361e 100644 --- a/lisp/gnus/ChangeLog.1 +++ b/lisp/gnus/ChangeLog.1 @@ -452,7 +452,7 @@ * gnus-sum.el (gnus-remove-thread): Didn't work with sparse threads. -1998-08-14 Franois Pinard <pinard@iro.umontreal.ca> +1998-08-14 François Pinard <pinard@iro.umontreal.ca> * nndoc.el (nndoc-generate-mime-parts-head): Use original Subject, Message-ID, and References in fully blown articles. @@ -619,7 +619,7 @@ * gnus.el: Gnus v5.6.31 is released. -1998-08-09 Franois Pinard <pinard@iro.umontreal.ca> +1998-08-09 François Pinard <pinard@iro.umontreal.ca> * nndoc.el: Split MIME multipart messages, maybe recursively. (nndoc-mime-parts-type-p, nndoc-transform-mime-parts, @@ -760,7 +760,7 @@ * gnus-group.el (gnus-group-read-ephemeral-group): Make the server unique. -1998-07-28 Franois Pinard <pinard@iro.umontreal.ca> +1998-07-28 François Pinard <pinard@iro.umontreal.ca> * gnus-uu.el (gnus-uu-reginize-string): Consider the number of parts as part of the fixed subject, instead of a wild quantity. @@ -943,7 +943,7 @@ * nntp.el (nntp-server-opened-hook): Doc change. -1998-07-10 Franois Pinard <pinard@iro.umontreal.ca> +1998-07-10 François Pinard <pinard@iro.umontreal.ca> * gnus-sum.el (gnus-summary-respool-trace): New command and keystroke. @@ -1003,7 +1003,7 @@ * nntp.el (nntp-record-command): Give more precise time info. (nntp-next-result-arrived-p): Look for the end of error lines. -1998-07-01 Franois Pinard <pinard@iro.umontreal.ca> +1998-07-01 François Pinard <pinard@iro.umontreal.ca> * gnus-util.el (gnus-delete-if): Would do the opposite. @@ -2016,7 +2016,7 @@ * gnus-picon.el (gnus-picons-display-x-face): `buf' -- unbound var. -1998-02-28 Franois Pinard <pinard@iro.umontreal.ca> +1998-02-28 François Pinard <pinard@iro.umontreal.ca> * gnus: configure'd. @@ -2370,7 +2370,7 @@ * gnus-sum.el (gnus-summary-exit): Call purging function. -1998-02-13 Franois Pinard <pinard@iro.umontreal.ca> +1998-02-13 François Pinard <pinard@iro.umontreal.ca> * nnmail.el (nnmail-get-new-mail): Don't clear split-history. (nnmail-purge-split-history): New function. @@ -3724,3 +3724,7 @@ You should have received a copy of the GNU General Public License along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. + +;; Local Variables: +;; coding: utf-8 +;; End: diff --git a/lisp/gnus/ChangeLog.2 b/lisp/gnus/ChangeLog.2 index ab590a68654..4ddd622ce9a 100644 --- a/lisp/gnus/ChangeLog.2 +++ b/lisp/gnus/ChangeLog.2 @@ -72,7 +72,7 @@ * gnus-dired.el (gnus-dired-mode-map): Change keymaps. -2004-01-02 Arne J,Ax(Brgensen <arne@arnested.dk> +2004-01-02 Arne Jørgensen <arne@arnested.dk> * smime.el (smime-crl-check): Doc fix. @@ -143,7 +143,7 @@ (gnus-summary-goto-article): Allow `%40'. (gnus-summary-refer-article): Convert `%40' to `@'. -2003-12-30 Arne J,Ax(Brgensen <arne@arnested.dk> +2003-12-30 Arne Jørgensen <arne@arnested.dk> * smime.el (smime-crl-check): New. (smime-verify-region): Use it. @@ -152,7 +152,7 @@ (gnus-score-find-trace): Use gnus-score-edit-file-at-point. Added `f' and `t' commands, added quick help. With some suggestions - from Karl Pfl,Ad(Bsterer <sigurd@12move.de>. + from Karl Pflästerer <sigurd@12move.de>. * gnus-util.el (gnus-emacs-version): Added doc-string. @@ -160,7 +160,7 @@ (mml-attach-file): Use it. (mml-preview): Added MIME preview to gnus-buffers. -2003-12-30 Karl Pfl,Ad(Bsterer <sigurd@12move.de> +2003-12-30 Karl Pflästerer <sigurd@12move.de> * gnus-score.el (gnus-score-edit-file-at-point): Consider the whole match element. @@ -243,7 +243,7 @@ * gnus-score.el (gnus-summary-lower-score) (gnus-summary-increase-score): Mention symbolic prefix in the - doc-string. Suggested by Karl Pfl,Ad(Bsterer <sigurd@12move.de>. + doc-string. Suggested by Karl Pflästerer <sigurd@12move.de>. 2003-12-21 Jesper Harder <harder@ifa.au.dk> @@ -383,7 +383,7 @@ * message.el (message-get-reply-headers): Narrow to headers. -2003-12-10 L,Bu(Brentey K,Ba(Broly <lorentey@elte.hu> +2003-12-10 Lőrentey Károly <lorentey@elte.hu> * spam.el (spam-disable-spam-split-during-ham-respool): New variable. @@ -406,7 +406,7 @@ input. (pgg-decode-armor-region): Don't parse packet if decoding fail. -2003-12-09 L,Bu(Brentey K,Ba(Broly <lorentey@elte.hu> +2003-12-09 Lőrentey Károly <lorentey@elte.hu> * spam.el (spam-check-bogofilter): Run in the correct buffer. @@ -444,7 +444,7 @@ 2003-12-08 Simon Josefsson <jas@extundo.com> * mml-smime.el (mml-smime-sign): Replace CRLF with LF in OpenSSL - output. Reported by Arne J,Ax(Brgensen <arne@arnested.dk>. + output. Reported by Arne Jørgensen <arne@arnested.dk>. 2003-12-07 Lloyd Zusman <ljz@asfast.com> (tiny change) @@ -1018,7 +1018,7 @@ (gnus-header-button-alist): Likewise. (gnus-url-mailto): Handle ?to parameters. Replace \r\n with \n. Reverse parameter list to use same order as in the URL. Reported - by f95-msv@f.kth.se (M,Ae(Brten Svantesson). + by f95-msv@f.kth.se (Mårten Svantesson). 2003-10-25 Teodor Zlatanov <tzz@lifelogs.com> @@ -1215,7 +1215,7 @@ (gnus-article-prepare): Don't set to t. (gnus-narrow-to-page): Set to t if we break. -2003-06-11 Daniel N,Ai(Bri <dne@mayonnaise.net> +2003-06-11 Daniel Néri <dne@mayonnaise.net> * message.el (message-resend): Generate Resent-Message-ID header. @@ -1558,7 +1558,7 @@ 2003-08-29 Simon Josefsson <jas@extundo.com> * gnus-group.el (gnus-group-delete-group): Doc fix. Suggested by - Jochen K,A|(Bpper <jochen@jochen-kuepper.de>. + Jochen Küpper <jochen@jochen-kuepper.de>. 2003-08-29 Katsumi Yamaoka <yamaoka@jpl.org> @@ -1588,7 +1588,7 @@ * gnus-art.el (gnus-treat-display-face): Fix typo. (gnus-treat-display-xface): Rename to gnus-treat-display-x-face - (reported by Jochen K,A|(Bpper <jochen@jochen-kuepper.de>) + (reported by Jochen Küpper <jochen@jochen-kuepper.de>) 2003-08-24 Jesper Harder <harder@ifa.au.dk> @@ -1804,7 +1804,7 @@ * mml-sec.el (mml-signencrypt-style-alist): Use "combined" by default. Improve docstring. -2003-07-10 Kai Gro,A_(Bjohann <kai.grossjohann@gmx.net> +2003-07-10 Kai Großjohann <kai.grossjohann@gmx.net> * imap.el (imap-arrival-filter): Fix test for missing process buffer. @@ -2097,10 +2097,10 @@ * gnus-sum.el (gnus-summary-make-menu-bar): Removed ["Add buttons" gnus-summary-display-buttonized t]. -2003-06-07 Kai Gro,A_(Bjohann <kai.grossjohann@gmx.net> +2003-06-07 Kai Großjohann <kai.grossjohann@gmx.net> * nnmail.el (nnmail-split-fancy-match-partial-words): Doc string - fix. Reported by Johan Bockg,Ae(Brd <bojohan+news@dd.chalmers.se>. + fix. Reported by Johan Bockgård <bojohan+news@dd.chalmers.se>. 2003-06-07 Jesper Harder <harder@ifa.au.dk> @@ -2157,7 +2157,7 @@ compiling. (gnus-find-method-for-group, nnvirtual-find-group-art): Autoload. -2003-06-03 Kai Gro,A_(Bjohann <kai.grossjohann@gmx.net> +2003-06-03 Kai Großjohann <kai.grossjohann@gmx.net> * nnmail.el (nnmail-split-fancy-match-partial-words): New user option. @@ -2364,7 +2364,7 @@ (rfc2047-syntax-table): Fix building table to work in Emacs 22. (rfc2047-unfold-region): Delete unused var `leading'. -2003-05-12 Ville Skytt,Ad(B <scop@xemacs.org> (tiny change) +2003-05-12 Ville Skyttä <scop@xemacs.org> (tiny change) * pgg.el (pgg-temp-buffer-show-function): Reuse existing visible output window if one is available. @@ -2459,7 +2459,7 @@ * spam.el (spam-use-regex-headers): Docstring fix. -2003-05-08 Kai Gro,A_(Bjohann <kai.grossjohann@gmx.net> +2003-05-08 Kai Großjohann <kai.grossjohann@gmx.net> * gnus-sum.el (gnus-summary-next-page): Mention `gnus-article-skip-boring' in docstring. @@ -2749,7 +2749,7 @@ * gnus-int.el (gnus-open-server): Revert changes. -2003-04-30 Kai Gro,A_(Bjohann <kai.grossjohann@gmx.net> +2003-04-30 Kai Großjohann <kai.grossjohann@gmx.net> * gnus-int.el (gnus-open-server): Try to open unagentized servers even when unplugged. @@ -2788,7 +2788,7 @@ (gnus-register-action): Optimized logical flow. (gnus-summary-prepare-hook): Added gnus-registry-register-message-ids. -2003-04-30 Kai Gro,A_(Bjohann <kai.grossjohann@gmx.net> +2003-04-30 Kai Großjohann <kai.grossjohann@gmx.net> * gnus-delay.el (gnus-delay-article): Call `gnus-agent-queue-setup' to create the delay group. @@ -2837,7 +2837,7 @@ * spam-report.el (spam-report-gmane): gnus-summary-article-number is not necessary, just use the function parameter. -2003-04-29 Karl Pfl,Ad(Bsterer <sigurd@12move.de> +2003-04-29 Karl Pflästerer <sigurd@12move.de> * spam-stat.el (spam-stat-save): No longer font-locks the file when saving. @@ -4142,7 +4142,7 @@ (gnus-agent-article-alist, gnus-agent-article-alist) (gnus-agent-cat-defaccessor): Doc fixes. -2003-03-04 Kai Gro,A_(Bjohann <kai.grossjohann@uni-duisburg.de> +2003-03-04 Kai Großjohann <kai.grossjohann@uni-duisburg.de> * gnus-agent.el (gnus-function-implies-unread-1): Grok byte-compiled functions. @@ -4552,7 +4552,7 @@ (gnus-agent-regenerate-group): Now clears the message buffer when finished. -2003-02-23 Kai Gro,A_(Bjohann <kai.grossjohann@uni-duisburg.de> +2003-02-23 Kai Großjohann <kai.grossjohann@uni-duisburg.de> * gnus.el (gnus-agent-target-move-group-header): New variable. * gnus-draft.el (gnus-draft-send): If special header @@ -4578,7 +4578,7 @@ * gnus-util.el (gnus-fetch-original-field): New function. -2003-02-23 Kai Gro,A_(Bjohann <kai.grossjohann@uni-duisburg.de> +2003-02-23 Kai Großjohann <kai.grossjohann@uni-duisburg.de> * message.el (message-mode): \\(...\\) around additional paragraph-separate alternative. @@ -4629,12 +4629,12 @@ * message.el (message-mode): MML tags separate paragraphs. -2003-02-22 Kai Gro,A_(Bjohann <kai.grossjohann@uni-duisburg.de> +2003-02-22 Kai Großjohann <kai.grossjohann@uni-duisburg.de> * gnus-agent.el (gnus-agent-get-undownloaded-list): Sort `gnus-newsgroup-headers'. -2003-02-22 Karl Pfl,Ad(Bsterer <sigurd@12move.de> +2003-02-22 Karl Pflästerer <sigurd@12move.de> * gnus-art.el (gnus-article-refer-article): Grok more message id formats. @@ -4714,7 +4714,7 @@ illegible and invisible text. * gnus-util.el (gnus-multiple-choice): Separate choices with - ",,A (B". Suggested by Dan Jacobson <jidanni@dman.ddts.net>. + ", ". Suggested by Dan Jacobson <jidanni@dman.ddts.net>. 2003-02-18 Jesper Harder <harder@ifa.au.dk> @@ -4727,7 +4727,7 @@ gnus-summary-kill-process-mark and gnus-summary-yank-process-mark around process-mark manipulation on the group. -2003-02-17 Kai Gro,A_(Bjohann <kai.grossjohann@uni-duisburg.de> +2003-02-17 Kai Großjohann <kai.grossjohann@uni-duisburg.de> * gnus-sum.el (gnus-summary-make-menu-bar): Add MIME/Multipart submenu. @@ -4764,7 +4764,7 @@ * gnus-art.el (gnus-article-prepare): Don't set agent mark if online. -2003-02-14 Kai Gro,A_(Bjohann <kai.grossjohann@uni-duisburg.de> +2003-02-14 Kai Großjohann <kai.grossjohann@uni-duisburg.de> * gnus-agent.el (gnus-agent-group-make-menu-bar): Include all commands. @@ -5051,7 +5051,7 @@ * gnus.el (spam group parameters): Change 'other to 'const in the group parameter definitions to soothe XEmacs. -2003-02-04 Kai Gro,A_(Bjohann <kai.grossjohann@uni-duisburg.de> +2003-02-04 Kai Großjohann <kai.grossjohann@uni-duisburg.de> * gnus-delay.el (gnus-delay-article): Really create nndraft:delayed group if it doesn't exist. @@ -5222,7 +5222,7 @@ * nnheader.el (nnheader-directory-separator-character): New variable. -2003-01-24 Kai Gro,A_(Bjohann <kai.grossjohann@uni-duisburg.de> +2003-01-24 Kai Großjohann <kai.grossjohann@uni-duisburg.de> * gnus-agent.el (gnus-agent-max-fetch-size) (gnus-agent-article-alist, gnus-agent-get-undownloaded-list) @@ -5400,7 +5400,7 @@ calculation of net characters added for use in the gnus-data structure. -2003-01-18 Kai Gro,A_(Bjohann <kai.grossjohann@uni-duisburg.de> +2003-01-18 Kai Großjohann <kai.grossjohann@uni-duisburg.de> * nnmail.el (nnmail-process-unix-mail-format): Improve error message. Suggested by Jari Aalto. @@ -5652,7 +5652,7 @@ * gnus-msg.el (gnus-inews-add-send-actions): Get the right articles to be marked when not yanking. -2003-01-12 Fran,Ag(Bois-David Collin <Francois-David.Collin@curie.fr> +2003-01-12 François-David Collin <Francois-David.Collin@curie.fr> * mm-decode.el (mm-get-part): Use mm-with-unibyte-current-buffer. @@ -5666,10 +5666,10 @@ 2003-01-12 Simon Josefsson <jas@extundo.com> * sieve.el (sieve-upload-and-bury): New. Suggested by - kai.grossjohann@uni-duisburg.de (Kai Gro,A_(Bjohann). + kai.grossjohann@uni-duisburg.de (Kai Großjohann). * sieve-mode.el (sieve-mode-map): Bind s-u-a-b to C-c C-c. - Suggested by kai.grossjohann@uni-duisburg.de (Kai Gro,A_(Bjohann). + Suggested by kai.grossjohann@uni-duisburg.de (Kai Großjohann). 2003-01-12 Lars Magne Ingebrigtsen <larsi@gnus.org> @@ -5701,7 +5701,7 @@ * gnus-sum.el (gnus-summary-exit): Reverse change to make group exit work with two frames. -2003-01-11 Fran,Ag(Bois-David Collin <Francois-David.Collin@wanadoo.fr> +2003-01-11 François-David Collin <Francois-David.Collin@wanadoo.fr> * message.el (message-forward-make-body): Use mule4. @@ -6303,7 +6303,7 @@ * dig.el (query-dig): Doc fix. -2003-01-02 Kai Gro,A_(Bjohann <kai.grossjohann@uni-duisburg.de> +2003-01-02 Kai Großjohann <kai.grossjohann@uni-duisburg.de> * gnus-agent.el (gnus-agent-fetch-selected-article): Update whole summary buffer line, not just the download mark. @@ -6694,7 +6694,7 @@ * gnus-agent.el (gnus-close-agent): Don't blank out the list of covered methods. -2002-12-12 Kai Gro,A_(Bjohann <kai.grossjohann@uni-duisburg.de> +2002-12-12 Kai Großjohann <kai.grossjohann@uni-duisburg.de> * nntp.el (nntp-with-open-group-first-pass): Do not wrap in eval-when-compile. Suggested by Kevin Greiner. @@ -6825,12 +6825,12 @@ Because of an unknown bug, the group buffer is saved in .overview file. -2002-12-09 Kai Gro,A_(Bjohann <kai.grossjohann@uni-duisburg.de> +2002-12-09 Kai Großjohann <kai.grossjohann@uni-duisburg.de> * nntp.el (nntp-send-command): Braino in last commit. Replace `and' with `or'. -2002-12-08 Kai Gro,A_(Bjohann <kai.grossjohann@uni-duisburg.de> +2002-12-08 Kai Großjohann <kai.grossjohann@uni-duisburg.de> * nntp.el (nntp-send-command): Assume that echo does not happen when nntp-open-connection-function is nntp-open-network-stream. @@ -6854,12 +6854,12 @@ * rfc2047.el (rfc2047-decode-region): Remove newlines between decoded words. -2002-12-03 Kai Gro,A_(Bjohann <kai.grossjohann@uni-duisburg.de> +2002-12-03 Kai Großjohann <kai.grossjohann@uni-duisburg.de> * gnus.el (fboundp): After loading mm-util, make sure it was the right one. -2002-11-29 Kai Gro,A_(Bjohann <kai.grossjohann@uni-duisburg.de> +2002-11-29 Kai Großjohann <kai.grossjohann@uni-duisburg.de> * gnus-art.el (gnus-inhibit-mime-unbuttonizing): Moved here from gnus-sum. Made into a user option. @@ -6916,7 +6916,7 @@ * binhex.el (binhex-decode-region): Don't hardcode point-min == 1. -2002-11-29 Kai Gro,A_(Bjohann <kai.grossjohann@uni-duisburg.de> +2002-11-29 Kai Großjohann <kai.grossjohann@uni-duisburg.de> * gnus-sum.el (gnus-simplify-ignored-prefixes) (gnus-summary-mark-article-as-unread) @@ -6949,7 +6949,7 @@ * nnrss.el (nnrss-group-alist): Update the link of Jabber. -2002-11-26 Kai Gro,A_(Bjohann <kai.grossjohann@uni-duisburg.de> +2002-11-26 Kai Großjohann <kai.grossjohann@uni-duisburg.de> * gnus-sum.el (gnus-summary-insert-old-articles): Remove superfluous function call. @@ -6961,13 +6961,13 @@ * gnus-agent.el: Autoload number-at-point instead. (gnus-agent-check-overview-buffer): No warning for deactivate-mark. -2002-11-26 Kai Gro,A_(Bjohann <kai.grossjohann@uni-duisburg.de> +2002-11-26 Kai Großjohann <kai.grossjohann@uni-duisburg.de> * gnus-agent.el (gnus-agent-check-overview-buffer): Explicitly require thingatpt (for number-at-point) and protect against deactivate-mark being unbound (on XEmacs). -2002-11-25 Kai Gro,A_(Bjohann <kai.grossjohann@uni-duisburg.de> +2002-11-25 Kai Großjohann <kai.grossjohann@uni-duisburg.de> * gnus-agent.el (gnus-agent-check-overview-buffer): Make debugger print message on entry. @@ -6977,7 +6977,7 @@ * gnus-range.el (gnus-range-difference): New function. * gnus-sum.el (gnus-summary-insert-old-articles): Use it. -2002-11-24 Kai Gro,A_(Bjohann <kai.grossjohann@uni-duisburg.de> +2002-11-24 Kai Großjohann <kai.grossjohann@uni-duisburg.de> * gnus-sum.el (gnus-summary-insert-old-articles): Use gnus-remove-from-range instead of gnus-range-difference which @@ -7063,7 +7063,7 @@ of article numbers. The range is not expanded into a list until the optional ALL parameter has been applied. -2002-11-18 Kai Gro,A_(Bjohann <kai.grossjohann@uni-duisburg.de> +2002-11-18 Kai Großjohann <kai.grossjohann@uni-duisburg.de> * gnus-agent.el (gnus-category-mode): Typo in doc string. @@ -7124,7 +7124,7 @@ * mml.el (mml-preview): Bind message-this-is-mail if it is mail. -2002-11-13 Kai Gro,A_(Bjohann <kai.grossjohann@uni-duisburg.de> +2002-11-13 Kai Großjohann <kai.grossjohann@uni-duisburg.de> * gnus.el (gnus-summary-line-format): Document %C. @@ -7198,12 +7198,12 @@ (spam-stat-reduce-size): No longer remove words with values close to 0.5, because the default value is 0.2. -2002-10-31 Kai Gro,A_(Bjohann <kai.grossjohann@uni-duisburg.de> +2002-10-31 Kai Großjohann <kai.grossjohann@uni-duisburg.de> * gnus-util.el (gnus-user-date-format-alist): Clarify and correct documentation. -2002-10-28 Kai Gro,A_(Bjohann <kai.grossjohann@uni-duisburg.de> +2002-10-28 Kai Großjohann <kai.grossjohann@uni-duisburg.de> * gnus-agent.el (gnus-agent-fetched-headers) (gnus-agent-load-fetched-headers) @@ -7260,12 +7260,12 @@ type values ("url" size) regardless of the values of mm-url-use-external. -2002-10-26 Kai Gro,A_(Bjohann <kai.grossjohann@uni-duisburg.de> +2002-10-26 Kai Großjohann <kai.grossjohann@uni-duisburg.de> * nnimap.el (nnimap-request-article-part): Try harder to show group name in debugging message. -2002-10-25 Kai Gro,A_(Bjohann <kai.grossjohann@uni-duisburg.de> +2002-10-25 Kai Großjohann <kai.grossjohann@uni-duisburg.de> * gnus-agent.el (gnus-agent-save-fetched-headers): Create directory if it doesn't exist. @@ -7283,7 +7283,7 @@ * gnus-agent.el (gnus-agent-load-alist): Fix parenthesis. -2002-10-24 Kai Gro,A_(Bjohann <kai.grossjohann@uni-duisburg.de> +2002-10-24 Kai Großjohann <kai.grossjohann@uni-duisburg.de> * gnus-agent.el (gnus-agent-save-alist, gnus-agent-load-alist): Remove unused optional arg DIR and corresponding code. @@ -7295,7 +7295,7 @@ * gnus-agent.el (gnus-agent-fetch-headers): Add some comments. -2002-10-23 Kai Gro,A_(Bjohann <kai.grossjohann@uni-duisburg.de> +2002-10-23 Kai Großjohann <kai.grossjohann@uni-duisburg.de> * gnus-agent.el (gnus-agent-fetched-headers): New variable, contains range of headers that have been fetched by the agent @@ -7338,7 +7338,7 @@ * nnslashdot.el: Removed some test lines. More test. -2002-10-21 Kai Gro,A_(Bjohann <Kai.Grossjohann@CS.Uni-Dortmund.DE> +2002-10-21 Kai Großjohann <Kai.Grossjohann@CS.Uni-Dortmund.DE> * gnus-agent.el (gnus-agent-fetch-headers): Remove articles that are known to be downloaded already. @@ -7364,7 +7364,7 @@ * gnus-srvr.el (gnus-server-prepare): Removed superfluous cdr. -2002-10-20 Kai Gro,A_(Bjohann <Kai.Grossjohann@CS.Uni-Dortmund.DE> +2002-10-20 Kai Großjohann <Kai.Grossjohann@CS.Uni-Dortmund.DE> * gnus-agent.el (gnus-agent-fetch-group-1): After fetching headers from the group, update variable `articles' to contain @@ -7392,7 +7392,7 @@ * nnimap.el (nnimap-open-server): Check imap-state in IMAP server buffer. -2002-10-18 Kai Gro,A_(Bjohann <Kai.Grossjohann@CS.Uni-Dortmund.DE> +2002-10-18 Kai Großjohann <Kai.Grossjohann@CS.Uni-Dortmund.DE> * gnus-spec.el (gnus-make-format-preserve-properties) (gnus-xmas-format, gnus-parse-simple-format): Preserve text @@ -7475,9 +7475,9 @@ * spam-stat.el: Check for the existence of hash functions instead of the Emacs version to decide whether to load cl. Suggested by - Kai Gro,A_(Bjohann. + Kai Großjohann. -2002-10-15 Kai Gro,A_(Bjohann <Kai.Grossjohann@CS.Uni-Dortmund.DE> +2002-10-15 Kai Großjohann <Kai.Grossjohann@CS.Uni-Dortmund.DE> * gnus-agent.el (gnus-agent-fetch-selected-article): Open history if it isn't open yet. @@ -7603,7 +7603,7 @@ * pgg.el (pgg-insert-url-with-w3): Ignore errors. (pgg-fetch-key-function): Nil if w3 is not installed. -2002-10-08 Kai Gro,A_(Bjohann <Kai.Grossjohann@CS.Uni-Dortmund.DE> +2002-10-08 Kai Großjohann <Kai.Grossjohann@CS.Uni-Dortmund.DE> * gnus-agent.el (gnus-agent-fetch-selected-article): Bind gnus-agent-current-history. @@ -7612,7 +7612,7 @@ * imap.el (imap-parse-status): Don't use read to read token. -2002-10-05 Kai Gro,A_(Bjohann <Kai.Grossjohann@CS.Uni-Dortmund.DE> +2002-10-05 Kai Großjohann <Kai.Grossjohann@CS.Uni-Dortmund.DE> * gnus-agent.el (gnus-agent-fetch-selected-article): Do nothing for methods not covered by the agent, and when unplugged. @@ -7724,7 +7724,7 @@ * nnmaildir.el (nnmaildir--group-maxnum-art): Fix maximum article number when there are no articles. -2002-10-03 Kai Gro,A_(Bjohann <Kai.Grossjohann@CS.Uni-Dortmund.DE> +2002-10-03 Kai Großjohann <Kai.Grossjohann@CS.Uni-Dortmund.DE> * gnus-agent.el (gnus-agent-summary-fetch-group): Optional prefix arg ALL means to fetch all articles, not only downloadable ones. @@ -7738,7 +7738,7 @@ 2002-09-30 Teodor Zlatanov <tzz@lifelogs.com> - * spam.el: Merged changes from pinard@iro.umontreal.ca (Fran,Ag(Bois + * spam.el: Merged changes from pinard@iro.umontreal.ca (François Pinard). Major revamp of the code, documentation is in comments in the file for now. @@ -7849,7 +7849,7 @@ * message.el (message-forward-make-body): Revert an early change because 8-bit utf-8 emails. -2002-09-25 Bj,Av(Brn Torkelsson <torkel@acc.umu.se> +2002-09-25 Björn Torkelsson <torkel@acc.umu.se> * gnus-agent.el (gnus-category-line-format): Doc fixes (mostly added links to Info). @@ -7990,7 +7990,7 @@ given. 2002-09-23 Simon Josefsson <jas@extundo.com> - Trivial fix from beaker@iavmb.pl (Krzysztof J,Bj(Bdruczyk). + Trivial fix from beaker@iavmb.pl (Krzysztof Jędruczyk). * smime.el (smime-sign-buffer): Get key and extra certs. (smime-get-key-with-certs-by-email): Utility function. @@ -8151,7 +8151,7 @@ * gnus-art.el (gnus-article-treat-body-boundary): Don't quote a value for gnus-decoration property. -2002-09-06 Kai Gro,b_(Bjohann <Kai.Grossjohann@CS.Uni-Dortmund.DE> +2002-09-06 Kai Großjohann <Kai.Grossjohann@CS.Uni-Dortmund.DE> * nnmail.el (nnmail-cache-fetch-group): Don't return "" (empty string) as group name in case we have a CRLF in the file. @@ -8270,7 +8270,7 @@ * gnus-util.el (gnus-select-frame-set-input-focus): New function. -2002-08-20 $B>.4X(B $B5HB'(B (KOSEKI Yoshinori) <kose@meadowy.org> +2002-08-20 小関 吉則 (KOSEKI Yoshinori) <kose@meadowy.org> * message.el (message-set-auto-save-file-name): Add support for the Cygwin Emacs; the system-type is `cygwin'. @@ -8292,11 +8292,11 @@ * message.el (message-ignored-supersedes-headers): Add X-Hashcash. (message-ignored-resent-headers): Add envelope From. -2002-08-18 Kai Gro,b_(Bjohann <Kai.Grossjohann@CS.Uni-Dortmund.DE> +2002-08-18 Kai Großjohann <Kai.Grossjohann@CS.Uni-Dortmund.DE> * gnus.el (gnus-summary-line-format): Document %k specifier. -2002-08-17 Kai Gro,b_(Bjohann <Kai.Grossjohann@CS.Uni-Dortmund.DE> +2002-08-17 Kai Großjohann <Kai.Grossjohann@CS.Uni-Dortmund.DE> * gnus-sum.el (gnus-summary-line-message-size): New function. (gnus-summary-line-format-alist): Use it. @@ -8306,7 +8306,7 @@ * gnus-art.el (article-make-date-line): Refer to the value for `gnus-article-time-format' in the summary buffer. - * message.el (message-cite-prefix-regexp): Exclude ":" and ",A;(B". + * message.el (message-cite-prefix-regexp): Exclude ":" and "»". 2002-08-14 Simon Josefsson <jas@extundo.com> @@ -8521,7 +8521,7 @@ * gnus-art.el (article-unsplit-urls): Keep URL buttonized after unsplitting. -2002-07-01 Kai Gro,b_(Bjohann <Kai.Grossjohann@CS.Uni-Dortmund.DE> +2002-07-01 Kai Großjohann <Kai.Grossjohann@CS.Uni-Dortmund.DE> * gnus-msg.el (gnus-summary-resend-default-address): New user option. (gnus-summary-resend-message): Use it. @@ -8546,17 +8546,17 @@ * nntp.el (nntp-open-via-rlogin-and-telnet): Hide commandline args. -2002-06-26 Kai Gro,b_(Bjohann <Kai.Grossjohann@CS.Uni-Dortmund.DE> +2002-06-26 Kai Großjohann <Kai.Grossjohann@CS.Uni-Dortmund.DE> * message.el (message-font-lock-keywords): Revert 2002-06-22 change. -2002-06-24 Kai Gro,b_(Bjohann <Kai.Grossjohann@CS.Uni-Dortmund.DE> +2002-06-24 Kai Großjohann <Kai.Grossjohann@CS.Uni-Dortmund.DE> * message.el (message-font-lock-keywords): Put colon in header name match. -2002-06-22 Kai Gro,b_(Bjohann <Kai.Grossjohann@CS.Uni-Dortmund.DE> +2002-06-22 Kai Großjohann <Kai.Grossjohann@CS.Uni-Dortmund.DE> * message.el (message-font-lock-keywords): Don't use header faces in the body. Thanks to Stefan Monnier for the hint on the @@ -8578,7 +8578,7 @@ * nnmail.el (nnmail-cache-ignore-groups): New. * nnmail.el (nnmail-cache-insert): Obey nnmail-cache-ignore-groups. -2002-06-18 Kai Gro,b_(Bjohann <Kai.Grossjohann@CS.Uni-Dortmund.DE> +2002-06-18 Kai Großjohann <Kai.Grossjohann@CS.Uni-Dortmund.DE> * gnus-delay.el (gnus-delay-send-queue): Delete the delay header before sending. Suggested by Jan Rychter. @@ -8589,7 +8589,7 @@ sure to write byte-compiled versions of gnus-*-format-alist to .newsrc.eld. -2002-06-16 Bj,Ax(Brn Mork <bmork@dod.no> +2002-06-16 Bjørn Mork <bmork@dod.no> * gnus-agent.el (gnus-agent-read-servers) (gnus-agent-write-servers): Put server name (string like @@ -8657,12 +8657,12 @@ * message.el (message-send-mail-with-sendmail): Improve error message. -2002-06-06 Kai Gro,b_(Bjohann <Kai.Grossjohann@CS.Uni-Dortmund.DE> +2002-06-06 Kai Großjohann <Kai.Grossjohann@CS.Uni-Dortmund.DE> * message.el (message-interactive): Change default from nil to t. Better to be safe than to be fast. -2002-06-05 Kai Gro,b_(Bjohann <Kai.Grossjohann@CS.Uni-Dortmund.DE> +2002-06-05 Kai Großjohann <Kai.Grossjohann@CS.Uni-Dortmund.DE> * message.el (message-send-mail-with-sendmail): Check return value from call-process-region. @@ -8833,7 +8833,7 @@ frobbing the alist directly. * mml.el (mml-generate-mime-1): Use accessor function. -2002-05-08 Kai Gro,b_(Bjohann <Kai.Grossjohann@CS.Uni-Dortmund.DE> +2002-05-08 Kai Großjohann <Kai.Grossjohann@CS.Uni-Dortmund.DE> * gnus-art.el (gnus-article-mode-syntax-table): Specify matching parenthesis for "<" and ">". Suggested by Andreas Schwab @@ -8961,7 +8961,7 @@ 2002-04-27 ShengHuo ZHU <zsh@cs.rochester.edu> * gnus-msg.el (gnus-article-mail): Use gnus-msg-mail instead. - Trivial change from Karl Pfl,Ad(Bsterer <sigurd@12move.de>. + Trivial change from Karl Pflästerer <sigurd@12move.de>. 2002-04-27 Katsumi Yamaoka <yamaoka@jpl.org> @@ -9027,7 +9027,7 @@ * gnus-msg.el (gnus-summary-resend-message-edit): Remove message-ignored-resent-headers, too. -2002-04-22 Bj,Av(Brn Torkelsson <torkel@acc.umu.se> +2002-04-22 Björn Torkelsson <torkel@acc.umu.se> * gnus-srvr.el (gnus-server-browse-in-group-buffer): It is a boolean not a string @@ -9128,7 +9128,7 @@ <Nicolas.Kowalski@imag.fr>. * smime.el (smime-CA-directory): Fix doc. Thanks to Arne - J,Ax(Brgensen <arne+usenet@daimi.au.dk>. + Jørgensen <arne+usenet@daimi.au.dk>. (smime-sign-buffer): Work in XEmacs. Thanks to Nicolas Kowalski <Nicolas.Kowalski@imag.fr>. (smime-decrypt-buffer): Ditto. @@ -9224,9 +9224,9 @@ * gnus-sum.el (gnus-summary-dummy-line-format): * gnus.el (gnus-summary-line-format): Fixing links to Info. - Trivial change from Bj,Av(Brn Torkelsson <torkel@pdc.kth.se>. + Trivial change from Björn Torkelsson <torkel@pdc.kth.se>. -2002-03-29 Kai Gro,b_(Bjohann <Kai.Grossjohann@CS.Uni-Dortmund.DE> +2002-03-29 Kai Großjohann <Kai.Grossjohann@CS.Uni-Dortmund.DE> * gnus-sum.el (gnus-summary-move-article) (gnus-summary-copy-article): Mention `gnus-move-split-methods' in @@ -9260,7 +9260,7 @@ (nnmaildir--edit-prep): New function. (Local Variables): Use it. -2002-03-26 Pavel Jan,Am(Bk <Pavel@Janik.cz> +2002-03-26 Pavel Janík <Pavel@Janik.cz> * gnus-sum.el (gnus-summary-make-menu-bar): Fix typo. @@ -9307,7 +9307,7 @@ * message.el (message-font-lock-keywords): Support multi-line MML tags. -2002-03-21 L,Bu(Brentey K,Ba(Broly <lorentey@elte.hu> +2002-03-21 Lőrentey Károly <lorentey@elte.hu> * gnus-sum.el (gnus-print-buffer): Remove gnus-decoration. @@ -9325,7 +9325,7 @@ * gnus-group.el (gnus-group-process-prefix): Make sure there is a mark. -2002-03-19 Kai Gro,b_(Bjohann <Kai.Grossjohann@CS.Uni-Dortmund.DE> +2002-03-19 Kai Großjohann <Kai.Grossjohann@CS.Uni-Dortmund.DE> * gnus-sum.el (gnus-sum-thread-tree-root) (gnus-sum-thread-tree-single-indent) @@ -9338,7 +9338,7 @@ * gnus-util.el (gnus-extract-address-components): Don't break on names such as James "Kibo" Parry. -2002-03-13 Pavel Jan,Am(Bk <Pavel@Janik.cz> +2002-03-13 Pavel Janík <Pavel@Janik.cz> * pop3.el (pop3-open-server): Revert multibyte change. @@ -9915,7 +9915,7 @@ * nnagent.el (nnagent-request-expire-articles): Don't delete files. -2002-02-06 Stefan Reich,Av(Br <xsteve@riic.at> +2002-02-06 Stefan Reichör <xsteve@riic.at> * gnus-agent.el (gnus-agent-summary-make-menu-bar): Fix typo. @@ -9958,7 +9958,7 @@ (gnus-article-reply-with-original): Ditto. * binhex.el (binhex-decoder-switches): Fix doc. From - Pavel@Janik.cz (Pavel Jan,Am(Bk). + Pavel@Janik.cz (Pavel Janík). 2002-02-04 ShengHuo ZHU <zsh@cs.rochester.edu> @@ -10806,7 +10806,7 @@ * flow-fill.el (fill-flowed-display-column) (fill-flowed-encode-columnq): New variables. Suggested by - Kai.Grossjohann@CS.Uni-Dortmund.DE (Kai Gro,b_(Bjohann). + Kai.Grossjohann@CS.Uni-Dortmund.DE (Kai Großjohann). (fill-flowed-encode, fill-flowed): Use them. * message.el (message-send-news, message-send-mail): Use @@ -10976,7 +10976,7 @@ * gnus-group.el (gnus-group-read-ephemeral-group): Restore the old behavior of quit-config. -2002-01-08 Bj,Ax(Brn Mork <bmork@dod.no> (tiny change) +2002-01-08 Bjørn Mork <bmork@dod.no> (tiny change) * message.el (message-make-from): Don't quote fullname. @@ -11373,7 +11373,7 @@ (gnus-picon-transform-address): Insert spec backward, due to the incompatibility of gnus-xmas-put-image. -2002-01-02 Pavel Jan,Am(Bk <Pavel@Janik.cz> +2002-01-02 Pavel Janík <Pavel@Janik.cz> * gnus-fun.el (gnus-convert-pbm-to-x-face-command): Doc fix. @@ -11802,7 +11802,7 @@ * gnus-win.el (gnus-configure-windows-hook): New hook. -2001-12-29 Sascha L,A|(Bdecke <sascha@meta-x.de> +2001-12-29 Sascha Lüdecke <sascha@meta-x.de> * gnus-win.el (gnus-configure-windows): Minimize tree buffer. @@ -11901,7 +11901,7 @@ (nnmaildir-version): Indicate that nnmaildir is now a standard part of Gnus, not separately released. -2001-12-21 08:00:00 Pavel Jan,Am(Bk <Pavel@Janik.cz> +2001-12-21 08:00:00 Pavel Janík <Pavel@Janik.cz> * gnus-art.el, gnus-picon.el, gnus-sieve.el, gnus-sum.el: * gnus-xmas.el, imap.el, mailcap.el, mm-util.el, nnfolder.el: @@ -12008,7 +12008,7 @@ * mm-url.el (executable-find): Autoload. -2001-12-12 Pavel Jan,Am(Bk <Pavel@Janik.cz> +2001-12-12 Pavel Janík <Pavel@Janik.cz> * gnus-mlspl.el (gnus-group-split-fancy): Doc fix (add reference to variable, follow doc-string conventions). @@ -12210,7 +12210,7 @@ * message.el (message-tab-body-function): Set to nil. (message-tab): Use text-mode-map or global-map. - Suggested by Kai Gro,b_(Bjohann <Kai.Grossjohann@CS.Uni-Dortmund.DE>. + Suggested by Kai Großjohann <Kai.Grossjohann@CS.Uni-Dortmund.DE>. 2001-11-30 Simon Josefsson <jas@extundo.com> @@ -12224,7 +12224,7 @@ * gnus-agent.el (gnus-agent-write-active): Make sure sym is a cons of integers. -2001-11-29 Kai Gro,b_(Bjohann <Kai.Grossjohann@CS.Uni-Dortmund.DE> +2001-11-29 Kai Großjohann <Kai.Grossjohann@CS.Uni-Dortmund.DE> * message.el (message-newgroups-header-regexp) (message-completion-alist, message-tab-body-function): Use @@ -12307,7 +12307,7 @@ (gnus-summary-limit-to-extra): Ditto. (gnus-summary-find-matching): Support not-matching argument. -2001-11-25 Kai Gro,b_(Bjohann <Kai.Grossjohann@CS.Uni-Dortmund.DE> +2001-11-25 Kai Großjohann <Kai.Grossjohann@CS.Uni-Dortmund.DE> * message.el (message-wash-subject): Use `insert' rather than `insert-string', which is deprecated. @@ -12367,7 +12367,7 @@ * nnfolder.el (nnfolder-read-folder): Use group instead of nnfolder-current-group. - Suggested by K,Ba(Broly L,Bu(Brentey <lorentey@elte.hu>. + Suggested by Károly Lőrentey <lorentey@elte.hu>. 2001-11-17 Simon Josefsson <jas@extundo.com> @@ -12461,7 +12461,7 @@ * mml2015.el: Mention RFC 3156. -2001-11-12 Sascha L,A|(Bdecke <sascha@meta-x.de> +2001-11-12 Sascha Lüdecke <sascha@meta-x.de> * mml1991.el: New file. @@ -12480,11 +12480,11 @@ canlock, no need to require two different hash algs). Suggested by Ferenc Wagner <wferi@bolyai1.elte.hu>. -2001-11-09 Pavel Jan,Am(Bk <Pavel@Janik.cz> +2001-11-09 Pavel Janík <Pavel@Janik.cz> * gnus.el (gnus-local-domain): Fix doc. -2001-11-09 Kai Gro,b_(Bjohann <Kai.Grossjohann@CS.Uni-Dortmund.DE> +2001-11-09 Kai Großjohann <Kai.Grossjohann@CS.Uni-Dortmund.DE> * message.el (message-point-in-header-p): New function. (message-do-auto-fill): Use it. @@ -12823,7 +12823,7 @@ (nnweb-type-definition): Add google as alias of dejanews. (nnweb-google-parse-1): Forward 1 line. -2001-10-26 Kai Gro,b_(Bjohann <Kai.Grossjohann@CS.Uni-Dortmund.DE> +2001-10-26 Kai Großjohann <Kai.Grossjohann@CS.Uni-Dortmund.DE> * gnus-msg.el (gnus-summary-mail-forward): Doc fix: add pointer to variable `message-forward-ignored-headers'. @@ -12859,7 +12859,7 @@ * gnus-msg.el (gnus-extended-version): Include system-configuration. - Suggested by Kai.Grossjohann@CS.Uni-Dortmund.DE (Kai Gro,b_(Bjohann). + Suggested by Kai.Grossjohann@CS.Uni-Dortmund.DE (Kai Großjohann). 2001-10-22 Per Abrahamsen <abraham@dina.kvl.dk> @@ -12879,7 +12879,7 @@ (nnimap-split-inbox, nnimap-expunge-search-string) (nnimap-importantize-dormant): Remove "*" from doc. -2001-10-20 Kai Gro,b_(Bjohann <Kai.Grossjohann@CS.Uni-Dortmund.DE> +2001-10-20 Kai Großjohann <Kai.Grossjohann@CS.Uni-Dortmund.DE> * gnus-sum.el (gnus-summary-limit-to-score): Prompt for score if not supplied via prefix arg. From Lisp, make arg mandatory. @@ -12993,7 +12993,7 @@ (mml2015-gpg-decrypt-1): Decanonicalize decrypted MIME body. (Mailcrypt seem to do this, but gpg.el doesn't.) -2001-10-16 Kai Gro,b_(Bjohann <Kai.Grossjohann@CS.Uni-Dortmund.DE> +2001-10-16 Kai Großjohann <Kai.Grossjohann@CS.Uni-Dortmund.DE> Patch by Oliver Scholz <oscholz@my.gnus.org>. * gnus-draft.el (gnus-draft-edit-message): Add text property @@ -13048,7 +13048,7 @@ * message.el (message-do-auto-fill): Use gnus-point-at-bol. (autoload): Add some autoloads. -2001-10-12 Kai Gro,b_(Bjohann <Kai.Grossjohann@CS.Uni-Dortmund.DE> +2001-10-12 Kai Großjohann <Kai.Grossjohann@CS.Uni-Dortmund.DE> Suggested by Oliver Scholz <epameinondas@gmx.de>. * message.el (message-do-auto-fill): New function. Like @@ -13183,7 +13183,7 @@ * gnus-sum.el (gnus-summary-extract-address-component): New function. (gnus-summary-from-or-to-or-newsgroups): Optimize. -2001-09-29 Kai Gro,b_(Bjohann <Kai.Grossjohann@CS.Uni-Dortmund.DE> +2001-09-29 Kai Großjohann <Kai.Grossjohann@CS.Uni-Dortmund.DE> * message.el (message-mode-map): Keybinding for `gnus-delay-article'. (message-mode-menu): Menu item for same. @@ -13226,7 +13226,7 @@ (gnus-topic-catchup-articles): New function. Suggested by Robin S. Socha <robin-dated-1001857693.185e29@socha.net>. -2001-09-27 11:00:00 Gerd M,Av(Bllmann <gerd@gnu.org> +2001-09-27 11:00:00 Gerd Möllmann <gerd@gnu.org> * gnus-ems.el (gnus-article-display-xface): Insert xface after previous ones. @@ -13287,7 +13287,7 @@ * gnus-group.el (gnus-group-catchup): Update expire marks in backend. Also, if ALL also set expire marks on tick/dormant. -2001-09-20 Kai Gro,b_(Bjohann <Kai.Grossjohann@CS.Uni-Dortmund.DE> +2001-09-20 Kai Großjohann <Kai.Grossjohann@CS.Uni-Dortmund.DE> * message.el (message-tab-body-function): New variable. * message.el (message-tab): Use it. @@ -13318,7 +13318,7 @@ * gnus-srvr.el (gnus-server-insert-server-line): Don't let an error querying a backend abort the whole process. -2001-09-17 08:00:00 Gerd M,Av(Bllmann <gerd@gnu.org> +2001-09-17 08:00:00 Gerd Möllmann <gerd@gnu.org> * gnus-srvr.el (gnus-server-mode): Fix bogus fontification. @@ -13359,7 +13359,7 @@ * gnus-draft.el (gnus-draft-setup): Don't set mark when there isn't an article to set it on (e.g. when you `a' in a group). -2001-09-12 Pavel Jan,Am(Bk <Pavel@Janik.cz> +2001-09-12 Pavel Janík <Pavel@Janik.cz> * mm-util.el (mm-charset-synonym-alist): Add windows-1250 so we can read e-mails from Microsoft Outlook users not using ISO @@ -13478,7 +13478,7 @@ * gnus-sum.el (gnus-summary-insert-line): Fix. -2001-09-06 Bj,Av(Brn Torkelsson <torkel@acc.umu.se> +2001-09-06 Björn Torkelsson <torkel@acc.umu.se> * gnus-sum.el: Bind g-s-t-s to "W g". * gnus-sum.el (gnus-summary-make-menu-bar): Add g-s-t-s. @@ -13494,7 +13494,7 @@ * gnus-sum.el (gnus-summary-insert-line): Insert forwarded, recent and unseen marks. -2001-09-05 Kai Gro,b_(Bjohann <Kai.Grossjohann@CS.Uni-Dortmund.DE> +2001-09-05 Kai Großjohann <Kai.Grossjohann@CS.Uni-Dortmund.DE> * nnmail.el (nnmail-split-fancy): Document `junk'. @@ -13772,7 +13772,7 @@ * gnus-spec.el (gnus-correct-substring): Stopped one character before we wanted. -2001-08-19 Pavel Jan,Am(Bk <Pavel@Janik.cz> +2001-08-19 Pavel Janík <Pavel@Janik.cz> * earcon.el (earcon-auto-play): Remove unused option. @@ -13930,7 +13930,7 @@ * mml.el (mml-menu): Collapse Attach, Insert and Security submenu. -2001-08-17 Bj,Av(Brn Torkelsson <torkel@acc.kth.se> +2001-08-17 Björn Torkelsson <torkel@acc.kth.se> * message.el: Rename "Abort Message" to "Postpone Message". Remove "Attach file as MIME" from Message menu, it's already in @@ -13984,17 +13984,17 @@ * gnus-srvr.el (gnus-server-browse-in-group-buffer): Default to nil. -2001-08-15 Kai Gro,b_(Bjohann <Kai.Grossjohann@CS.Uni-Dortmund.DE> +2001-08-15 Kai Großjohann <Kai.Grossjohann@CS.Uni-Dortmund.DE> * gnus-delay.el (gnus-delay-article): Allow "01:23" time spec, which specifies a time today or tomorrow. -2001-08-15 Pavel Jan,Am(Bk <Pavel@Janik.cz> +2001-08-15 Pavel Janík <Pavel@Janik.cz> * gnus-agent.el (gnus-agent-make-mode-line-string) (gnus-agent-toggle-plugged): Use new API. -2001-08-14 Kai Gro,b_(Bjohann <Kai.Grossjohann@CS.Uni-Dortmund.DE> +2001-08-14 Kai Großjohann <Kai.Grossjohann@CS.Uni-Dortmund.DE> * gnus-delay.el (gnus-delay-send-drafts): Fix check whether deadline has expired. @@ -14054,7 +14054,7 @@ (nndoc-oe-dbx-dissection): New function. (nndoc-oe-dbx-generate-article): New function. -2001-08-11 Kai Gro,b_(Bjohann <Kai.Grossjohann@CS.Uni-Dortmund.DE> +2001-08-11 Kai Großjohann <Kai.Grossjohann@CS.Uni-Dortmund.DE> * gnus-delay.el (gnus-delay-send-drafts): Cleaner way to check whether deadline has been reached. Patch from Dan Nicolaescu @@ -14123,7 +14123,7 @@ * gnus-sum.el (gnus-summary-edit-article-done): Ditto. * gnus-sum.el (gnus-summary-reparent-thread): Ditto. -2001-08-07 16:00:00 Gerd M,Av(Bllmann <gerd@gnu.org> +2001-08-07 16:00:00 Gerd Möllmann <gerd@gnu.org> * mm-uu.el (mm-uu-dissect): Autoload. @@ -14195,7 +14195,7 @@ before remove. (gnus-mime-security-show-details): Ditto. -2001-08-04 Kai Gro,b_(Bjohann <Kai.Grossjohann@CS.Uni-Dortmund.DE> +2001-08-04 Kai Großjohann <Kai.Grossjohann@CS.Uni-Dortmund.DE> * nnmail.el (nnmail-split-fancy-with-parent): Correct `mapconcat' syntax. Protect string-match against nil string and regexp. @@ -14280,7 +14280,7 @@ * gnus-msg.el (gnus-post-method): Refer to `gnus-parameters'. 2001-07-31 17:00:00 ShengHuo ZHU <zsh@cs.rochester.edu> - Originally from Pavel Jan,Am(Bk <Pavel@Janik.cz> + Originally from Pavel Janík <Pavel@Janik.cz> * gnus-agent.el (gnus-agent-make-mode-line-string): New function. (gnus-agent-toggle-plugged): Use it. @@ -14292,7 +14292,7 @@ (gnus-read-newsrc-el-file, gnus-save-newsrc-file) (gnus-slave-save-newsrc): Use it. -2001-07-31 Kai Gro,b_(Bjohann <Kai.Grossjohann@CS.Uni-Dortmund.DE> +2001-07-31 Kai Großjohann <Kai.Grossjohann@CS.Uni-Dortmund.DE> * gnus-delay.el (gnus-delay-initialize): Use standard define-key syntax. @@ -14386,7 +14386,7 @@ calls widen. Thanks to Christoph Conrad <christoph.conrad@gmx.de>. -2001-07-29 Kai Gro,b_(Bjohann <Kai.Grossjohann@CS.Uni-Dortmund.DE> +2001-07-29 Kai Großjohann <Kai.Grossjohann@CS.Uni-Dortmund.DE> * gnus.el (gnus-summary-line-format): Mention `gnus-sum-thread-*' for %B spec. @@ -14477,7 +14477,7 @@ * nnheader.el (nnheader-translate-file-chars): cygwin32 is running in M$Windows too. -2001-07-26 Kai Gro,b_(Bjohann <Kai.Grossjohann@CS.Uni-Dortmund.DE> +2001-07-26 Kai Großjohann <Kai.Grossjohann@CS.Uni-Dortmund.DE> * gnus-delay.el (gnus-delay-send-drafts): Don't `error'. @@ -14555,7 +14555,7 @@ * mm-decode.el (mm-remove-part): Don't murder the current window (nil). (mm-display-external): Use display-term configure. -2001-07-24 Kai Gro,b_(Bjohann <Kai.Grossjohann@CS.Uni-Dortmund.DE> +2001-07-24 Kai Großjohann <Kai.Grossjohann@CS.Uni-Dortmund.DE> * gnus-delay.el (gnus-delay-default-hour): New variable. (gnus-delay-article): Allow specific date in YYYY-MM-DD format. @@ -14589,7 +14589,7 @@ `gnus-check-bogus-newsgroups' just after the native server is opened. -2001-07-23 Kai Gro,b_(Bjohann <Kai.Grossjohann@CS.Uni-Dortmund.DE> +2001-07-23 Kai Großjohann <Kai.Grossjohann@CS.Uni-Dortmund.DE> * nnmail.el (nnmail-do-request-post): Util function to be used by `nnchoke-request-post' for all nnmail-derived backends. @@ -14607,7 +14607,7 @@ * gnus-msg.el (gnus-setup-message): make-local-hook. -2001-07-22 Kai Gro,b_(Bjohann <Kai.Grossjohann@CS.Uni-Dortmund.DE> +2001-07-22 Kai Großjohann <Kai.Grossjohann@CS.Uni-Dortmund.DE> * gnus-delay.el (gnus-delay-article): Fix `read-string' for XEmacs. Allow more units. Submitted by Karl Kleinpaste @@ -14617,7 +14617,7 @@ whether the groups exist, check the right server based on `gnus-post-method'. -2001-07-21 Kai Gro,b_(Bjohann <Kai.Grossjohann@CS.Uni-Dortmund.DE> +2001-07-21 Kai Großjohann <Kai.Grossjohann@CS.Uni-Dortmund.DE> * gnus-delay.el: New file. @@ -14632,7 +14632,7 @@ (article-de-base64-unreadable, article-wash-html): (gnus-mime-inline-part, gnus-mime-view-part-as-charset): Ditto. -2001-07-21 Kai Gro,b_(Bjohann <Kai.Grossjohann@CS.Uni-Dortmund.DE> +2001-07-21 Kai Großjohann <Kai.Grossjohann@CS.Uni-Dortmund.DE> * nnml.el (nnml-request-post): New function. Can be used for annotations in nnml groups. @@ -14694,12 +14694,12 @@ * gnus-art.el (gnus-article-edit-mode): Use define-derived-mode. -2001-07-16 Kai Gro,b_(Bjohann <Kai.Grossjohann@CS.Uni-Dortmund.DE> +2001-07-16 Kai Großjohann <Kai.Grossjohann@CS.Uni-Dortmund.DE> * message.el (message-citation-line-function): Refer to gnus-cite-attribution-suffix. -2001-07-15 Pavel Jan,Am(Bk <Pavel@Janik.cz> +2001-07-15 Pavel Janík <Pavel@Janik.cz> * gnus-art.el, ...: Error convention changes. @@ -14712,7 +14712,7 @@ * nnrss.el (nnrss-read-group-data): Nuke emacs-lisp-mode-hook. (nnrss-read-server-data): Ditto. -2001-07-13 12:00:00 Pavel Jan,Am(Bk <Pavel@Janik.cz> +2001-07-13 12:00:00 Pavel Janík <Pavel@Janik.cz> * gnus-setup.el (gnus-use-installed-gnus): Typo. * Cleanup files. @@ -14757,7 +14757,7 @@ (mm-display-external): Use it. Use term to display when no window-system. -2001-07-12 Bj,Av(Brn Torkelsson <torkel@hpc2n.umu.se> +2001-07-12 Björn Torkelsson <torkel@hpc2n.umu.se> * gnus-srvr.el (gnus-browse-make-menu-bar): Changed one of the Browse->Next entries to Browse->Prev. @@ -14783,7 +14783,7 @@ * gnus-draft.el (gnus-draft-edit-message): Remove Date here. (gnus-draft-setup): Remove backlog. -2001-07-10 Pavel Jan,Am(Bk <Pavel@Janik.cz> +2001-07-10 Pavel Janík <Pavel@Janik.cz> * gnus-logic.el, gnus-srvr.el, gnus-vm.el, nnheaderxm.el, nnoo.el: Cleanup. @@ -15194,7 +15194,7 @@ * gnus-sum.el (gnus-summary-catchup): New argument. (gnus-summary-catchup-from-here): New function. -2001-05-30 Kai Gro,b_(Bjohann <Kai.Grossjohann@CS.Uni-Dortmund.DE> +2001-05-30 Kai Großjohann <Kai.Grossjohann@CS.Uni-Dortmund.DE> * mm-view.el (mm-inline-image-xemacs): Insert newline, then move back, then insert glyph. (Before, the glyph was inserted first, @@ -15398,7 +15398,7 @@ matching subjects. (gnus-offer-save-summaries): Clean up. -2001-04-13 Kai Gro,b_(Bjohann <Kai.Grossjohann@CS.Uni-Dortmund.DE> +2001-04-13 Kai Großjohann <Kai.Grossjohann@CS.Uni-Dortmund.DE> * nnmail.el (nnmail-split-fancy-with-parent): Add docstring. @@ -15606,7 +15606,7 @@ * mml2015.el (mml2015-gpg-extract-from): No error. -2001-03-18 23:00:00 Bj,Ax(Brn Mork <bmork@dod.no> +2001-03-18 23:00:00 Bjørn Mork <bmork@dod.no> * mml2015.el (mml2015-gpg-extract-from): New function. (mml2015-gpg-verify): Use it. @@ -15634,7 +15634,7 @@ `nnimap-use-nov-p' (it really tested the negative). (nnimap-retrieve-headers): Use it. -2001-03-11 Kai Gro,b_(Bjohann <Kai.Grossjohann@CS.Uni-Dortmund.DE> +2001-03-11 Kai Großjohann <Kai.Grossjohann@CS.Uni-Dortmund.DE> * message.el (message-generate-headers-first): Update doc. @@ -15852,7 +15852,7 @@ * gnus-draft.el (gnus-draft-reminder): "Confirm to exit?" -2001-02-19 Kai Gro,b_(Bjohann <Kai.Grossjohann@CS.Uni-Dortmund.DE> +2001-02-19 Kai Großjohann <Kai.Grossjohann@CS.Uni-Dortmund.DE> * gnus-sum.el (gnus-thread-sort-functions): Doc fix. Refer to gnus-article-sort-functions. @@ -15969,7 +15969,7 @@ (gnus-subscribe-hierarchically): Return gnus-subscribe-newsgroup's return . -2001-02-12 Kai Gro,b_(Bjohann <Kai.Grossjohann@CS.Uni-Dortmund.DE> +2001-02-12 Kai Großjohann <Kai.Grossjohann@CS.Uni-Dortmund.DE> * gnus-cus.el (gnus-score-customize): Doc fix. @@ -16042,7 +16042,7 @@ * gnus-uu.el (gnus-uu-grab-articles): Shoot down original article buffer. -2001-02-07 Kai Gro,b_(Bjohann <Kai.Grossjohann@CS.Uni-Dortmund.DE> +2001-02-07 Kai Großjohann <Kai.Grossjohann@CS.Uni-Dortmund.DE> * message.el (message-generate-headers-first): Doc fix. @@ -16557,7 +16557,7 @@ * nnfolder.el (nnfolder-existing-articles): Reversed, i.e. sorted. (nnfolder-request-expire-articles): Use gnus-sorted-intersection. (nnfolder-retrieve-headers): Use intersection. Suggested by Jonas - Kvarnstr,Av(Bm <jonkv@ida.liu.se>. + Kvarnström <jonkv@ida.liu.se>. 2000-12-30 00:17:38 Lars Magne Ingebrigtsen <larsi@gnus.org> @@ -16759,7 +16759,7 @@ * message.el (message-forward): Save-restriction. -2000-12-21 Kai Gro,b_(Bjohann <Kai.Grossjohann@CS.Uni-Dortmund.DE> +2000-12-21 Kai Großjohann <Kai.Grossjohann@CS.Uni-Dortmund.DE> * gnus-art.el (article-treat-dumbquotes): More doc, provided by Paul Stevenson <p.stevenson@surrey.ac.uk> @@ -17849,10 +17849,10 @@ * message.el (message-font-lock-keywords): Use message-cite-prefix-regexp. -2000-11-15 Kai Gro,b_(Bjohann <Kai.Grossjohann@CS.Uni-Dortmund.DE> +2000-11-15 Kai Großjohann <Kai.Grossjohann@CS.Uni-Dortmund.DE> * gnus-group.el (gnus-group-jump-to-group-prompt): New variable by - Stein Arild Str,Ax(Bmme. + Stein Arild Strømme. (gnus-group-jump-to-group): Use it. (gnus-group-jump-to-group-prompt): Customize. @@ -17984,7 +17984,7 @@ * gnus-art.el (gnus-mime-display-alternative): Show button if no preferred part. -2000-11-07 Kai Gro,b_(Bjohann <Kai.Grossjohann@CS.Uni-Dortmund.DE> +2000-11-07 Kai Großjohann <Kai.Grossjohann@CS.Uni-Dortmund.DE> * gnus-sum.el (gnus-move-split-methods): Say that `gnus-split-methods' uses file names, whereas this uses group @@ -18571,5 +18571,5 @@ See ChangeLog.1 for earlier changes. along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. ;; Local Variables: -;; coding: iso-2022-7bit +;; coding: utf-8 ;; End: diff --git a/lisp/gnus/auth-source.el b/lisp/gnus/auth-source.el index ffc6a4b78af..e94904bf175 100644 --- a/lisp/gnus/auth-source.el +++ b/lisp/gnus/auth-source.el @@ -1008,7 +1008,7 @@ Note that the MAX parameter is used so we can exit the parse early." (while (and (zerop (forward-line 1)) (looking-at "$"))) (narrow-to-region (point) (point))) - ((member elem tokens) + ((and (member elem tokens) (null pair)) ;; Tokens that don't have a following value are ignored, ;; except "default". (when (and pair (or (cdr pair) diff --git a/lisp/gnus/deuglify.el b/lisp/gnus/deuglify.el index 8ef89a9e56d..36e91980ba2 100644 --- a/lisp/gnus/deuglify.el +++ b/lisp/gnus/deuglify.el @@ -270,7 +270,7 @@ :group 'gnus-outlook-deuglify) (defcustom gnus-outlook-deuglify-attrib-verb-regexp - "wrote\\|writes\\|says\\|schrieb\\|schreibt\\|meinte\\|skrev\\|a crit\\|schreef\\|escribi" + "wrote\\|writes\\|says\\|schrieb\\|schreibt\\|meinte\\|skrev\\|a écrit\\|schreef\\|escribió" "Regular expression matching the verb used in an attribution line." :version "22.1" :type 'string @@ -472,7 +472,7 @@ NODISPLAY is non-nil, don't redisplay the article buffer." (provide 'deuglify) ;; Local Variables: -;; coding: iso-8859-1 +;; coding: utf-8 ;; End: ;;; deuglify.el ends here diff --git a/lisp/gnus/gmm-utils.el b/lisp/gnus/gmm-utils.el index c009ac762c5..8bafb7d0f6b 100644 --- a/lisp/gnus/gmm-utils.el +++ b/lisp/gnus/gmm-utils.el @@ -417,6 +417,31 @@ coding-system." (write-region start end filename append visit lockname)) (write-region start end filename append visit lockname mustbenew))) +;; `interactive-p' is obsolete since Emacs 23.2. +(defmacro gmm-called-interactively-p (kind) + (condition-case nil + (progn + (eval '(called-interactively-p 'any)) + ;; Emacs >=23.2 + `(called-interactively-p ,kind)) + ;; Emacs <23.2 + (wrong-number-of-arguments '(called-interactively-p)) + ;; XEmacs + (void-function '(interactive-p)))) + +;; `labels' is obsolete since Emacs 24.3. +(defmacro gmm-labels (bindings &rest body) + "Make temporary function bindings. +The bindings can be recursive and the scoping is lexical, but capturing +them in closures will only work if `lexical-binding' is in use. But in +Emacs 24.2 and older, the lexical scoping is handled via `lexical-let' +rather than relying on `lexical-binding'. + +\(fn ((FUNC ARGLIST BODY...) ...) FORM...)" + `(,(progn (require 'cl) (if (fboundp 'cl-labels) 'cl-labels 'labels)) + ,bindings ,@body)) +(put 'gmm-labels 'lisp-indent-function 1) + (provide 'gmm-utils) ;;; gmm-utils.el ends here diff --git a/lisp/gnus/gnus-agent.el b/lisp/gnus/gnus-agent.el index 681ae6c0a09..1d0f346e10f 100644 --- a/lisp/gnus/gnus-agent.el +++ b/lisp/gnus/gnus-agent.el @@ -1489,7 +1489,8 @@ downloaded into the agent." (defun gnus-agent-fetch-articles (group articles) "Fetch ARTICLES from GROUP and put them into the Agent." - (when articles + (when (and articles + (gnus-online (gnus-group-method group))) (gnus-agent-load-alist group) (let* ((alist gnus-agent-article-alist) (headers (if (< (length articles) 2) nil gnus-newsgroup-headers)) diff --git a/lisp/gnus/gnus-art.el b/lisp/gnus/gnus-art.el index 74733356283..13d9b4e5c28 100644 --- a/lisp/gnus/gnus-art.el +++ b/lisp/gnus/gnus-art.el @@ -1121,8 +1121,8 @@ parts. When nil, redisplay article." (const :tag "Header" head))) (defvar gnus-article-treat-types '("text/plain" "text/x-verbatim" - "text/x-patch") - "Parts to treat.") + "text/x-patch" "text/html") + "Part types eligible for treatment.") (defvar gnus-inhibit-treatment nil "Whether to inhibit treatment.") @@ -2718,7 +2718,7 @@ If READ-CHARSET, ask for a coding system." (while (re-search-forward "\\(\\(https?\\|ftp\\)://\\S-+\\) *\n\\(\\S-+\\)" nil t) (replace-match "\\1\\3" t))) - (when (interactive-p) + (when (gmm-called-interactively-p 'any) (gnus-treat-article nil)))) (defun article-wash-html () @@ -2877,21 +2877,23 @@ message header will be added to the bodies of the \"text/html\" parts." ;; Add a meta html tag to specify charset and a header. (cond (header - (let (title eheader body hcharset coding force-charset) + (let (title eheader body hcharset coding) (with-temp-buffer (mm-enable-multibyte) (setq case-fold-search t) (insert header "\n") (setq title (message-fetch-field "subject")) (goto-char (point-min)) - (while (re-search-forward "\\(<\\)\\|\\(>\\)\\|&" nil t) + (while (re-search-forward "\\(<\\)\\|\\(>\\)\\|\\(&\\)\\|\n" + nil t) (replace-match (cond ((match-beginning 1) "<") ((match-beginning 2) ">") - (t "&")))) + ((match-beginning 3) "&") + (t "<br>\n")))) (goto-char (point-min)) - (insert "<pre>\n") + (insert "<div align=\"left\">\n") (goto-char (point-max)) - (insert "</pre>\n<hr>\n") + (insert "</div>\n<hr>\n") ;; We have to examine charset one by one since ;; charset specified in parts might be different. (if (eq charset 'gnus-decoded) @@ -2900,8 +2902,7 @@ message header will be added to the bodies of the \"text/html\" parts." charset) title (when title (mm-encode-coding-string title charset)) - body (mm-encode-coding-string content charset) - force-charset t) + body (mm-encode-coding-string content charset)) (setq hcharset (mm-find-mime-charset-region (point-min) (point-max))) (cond ((= (length hcharset) 1) @@ -2932,8 +2933,7 @@ message header will be added to the bodies of the \"text/html\" parts." body (mm-encode-coding-string (mm-decode-coding-string content body) - charset) - force-charset t))) + charset)))) (setq charset hcharset eheader (mm-encode-coding-string (buffer-string) coding) @@ -2947,7 +2947,7 @@ message header will be added to the bodies of the \"text/html\" parts." (mm-disable-multibyte) (insert body) (when charset - (mm-add-meta-html-tag handle charset force-charset)) + (mm-add-meta-html-tag handle charset t)) (when title (goto-char (point-min)) (unless (search-forward "<title>" nil t) @@ -4361,6 +4361,7 @@ If variable `gnus-use-long-file-name' is non-nil, it is (gnus-define-keys gnus-article-mode-map " " gnus-article-goto-next-page + [?\S-\ ] gnus-article-goto-prev-page "\177" gnus-article-goto-prev-page [delete] gnus-article-goto-prev-page [backspace] gnus-article-goto-prev-page @@ -4539,18 +4540,17 @@ commands: (gnus-article-mode)) (setq truncate-lines gnus-article-truncate-lines) (current-buffer)) - (with-current-buffer (gnus-get-buffer-create name) - (gnus-article-mode) - (setq truncate-lines gnus-article-truncate-lines) - (make-local-variable 'gnus-summary-buffer) - (setq gnus-summary-buffer - (gnus-summary-buffer-name gnus-newsgroup-name)) - (gnus-summary-set-local-parameters gnus-newsgroup-name) - (when article-lapsed-timer - (gnus-stop-date-timer)) - (when gnus-article-update-date-headers - (gnus-start-date-timer gnus-article-update-date-headers)) - (current-buffer))))) + (let ((summary gnus-summary-buffer)) + (with-current-buffer (gnus-get-buffer-create name) + (gnus-article-mode) + (setq truncate-lines gnus-article-truncate-lines) + (set (make-local-variable 'gnus-summary-buffer) summary) + (gnus-summary-set-local-parameters gnus-newsgroup-name) + (when article-lapsed-timer + (gnus-stop-date-timer)) + (when gnus-article-update-date-headers + (gnus-start-date-timer gnus-article-update-date-headers)) + (current-buffer)))))) (defun gnus-article-stop-animations () (dolist (timer (and (boundp 'timer-list) @@ -8689,9 +8689,7 @@ For example: gnus-mime-security-button-end-line-format)) (gnus-insert-mime-security-button handle))) (mm-set-handle-multipart-parameter - handle 'gnus-region - (cons (set-marker (make-marker) (point-min)) - (set-marker (make-marker) (point-max)))) + handle 'gnus-region (cons (point-min-marker) (point-max-marker))) (goto-char (point-max)))) (defun gnus-mime-security-run-function (function) diff --git a/lisp/gnus/gnus-async.el b/lisp/gnus/gnus-async.el index 41b0cc25006..c5d64332547 100644 --- a/lisp/gnus/gnus-async.el +++ b/lisp/gnus/gnus-async.el @@ -254,7 +254,7 @@ that was fetched." gnus-async-article-alist (cons (list (intern (format "%s-%d" group article) gnus-async-hashtb) - mark (set-marker (make-marker) (point-max)) + mark (point-max-marker) group article) gnus-async-article-alist)))) (if (not (gnus-buffer-live-p summary)) diff --git a/lisp/gnus/gnus-bookmark.el b/lisp/gnus/gnus-bookmark.el index 5afdb064fa9..7a3d273622a 100644 --- a/lisp/gnus/gnus-bookmark.el +++ b/lisp/gnus/gnus-bookmark.el @@ -367,7 +367,7 @@ The leftmost column displays a D if the bookmark is flagged for deletion, or > if it is flagged for displaying." (interactive) (gnus-bookmark-maybe-load-default-file) - (if (interactive-p) + (if (gmm-called-interactively-p 'any) (switch-to-buffer (get-buffer-create "*Gnus Bookmark List*")) (set-buffer (get-buffer-create "*Gnus Bookmark List*"))) (let ((inhibit-read-only t) diff --git a/lisp/gnus/gnus-cite.el b/lisp/gnus/gnus-cite.el index 708b60442da..22e97cd8f4f 100644 --- a/lisp/gnus/gnus-cite.el +++ b/lisp/gnus/gnus-cite.el @@ -745,28 +745,14 @@ See also the documentation for `gnus-article-highlight-citation'." (gnus-article-search-signature) (setq total (count-lines start (point))) (while atts - (setq hidden (+ hidden (length (cdr (assoc (cdar atts) - gnus-cite-prefix-alist)))) + (setq hidden (+ hidden (length + (cdr (assoc (cdar atts) + gnus-cite-prefix-alist)))) atts (cdr atts))) (when (or force (and (> (* 100 hidden) (* gnus-cite-hide-percentage total)) (> hidden gnus-cite-hide-absolute))) - (gnus-add-wash-type 'cite) - (setq atts gnus-cite-attribution-alist) - (while atts - (setq total (cdr (assoc (cdar atts) gnus-cite-prefix-alist)) - atts (cdr atts)) - (while total - (setq hidden (car total) - total (cdr total)) - (goto-char (point-min)) - (forward-line (1- hidden)) - (unless (assq hidden gnus-cite-attribution-alist) - (gnus-add-text-properties - (point) (progn (forward-line 1) (point)) - (nconc (list 'article-type 'cite) - gnus-hidden-properties))))))))) - (gnus-set-mode-line 'article))) + (gnus-article-hide-citation))))))) (defun gnus-article-hide-citation-in-followups () "Hide cited text in non-root articles." @@ -1264,7 +1250,7 @@ When enabled, it automatically turns on `font-lock-mode'." (provide 'gnus-cite) ;; Local Variables: -;; coding: iso-8859-1 +;; coding: utf-8 ;; End: ;;; gnus-cite.el ends here diff --git a/lisp/gnus/gnus-delay.el b/lisp/gnus/gnus-delay.el index 5c14ffcfbdf..921d24109c2 100644 --- a/lisp/gnus/gnus-delay.el +++ b/lisp/gnus/gnus-delay.el @@ -2,7 +2,7 @@ ;; Copyright (C) 2001-2013 Free Software Foundation, Inc. -;; Author: Kai Grojohann <Kai.Grossjohann@CS.Uni-Dortmund.DE> +;; Author: Kai Großjohann <Kai.Grossjohann@CS.Uni-Dortmund.DE> ;; Keywords: mail, news, extensions ;; This file is part of GNU Emacs. @@ -186,7 +186,7 @@ Checking delayed messages is skipped if optional arg NO-CHECK is non-nil." (provide 'gnus-delay) ;; Local Variables: -;; coding: iso-8859-1 +;; coding: utf-8 ;; End: ;;; gnus-delay.el ends here diff --git a/lisp/gnus/gnus-dired.el b/lisp/gnus/gnus-dired.el index e5ebb39f6d2..1592d73684c 100644 --- a/lisp/gnus/gnus-dired.el +++ b/lisp/gnus/gnus-dired.el @@ -155,8 +155,8 @@ filenames." (setq destination (if (= (length bufs) 1) (get-buffer (car bufs)) - (gnus-completing-read "Attach to which mail composition buffer" - bufs t))) + (gnus-completing-read "Attach to buffer" + bufs t nil nil (car bufs)))) ;; setup a new mail composition buffer (let ((mail-user-agent gnus-dired-mail-mode) ;; A workaround to prevent Gnus from displaying the Gnus diff --git a/lisp/gnus/gnus-group.el b/lisp/gnus/gnus-group.el index 76977b7690a..2c45d3c24a1 100644 --- a/lisp/gnus/gnus-group.el +++ b/lisp/gnus/gnus-group.el @@ -1667,7 +1667,7 @@ and ends at END." (let ((face (cdar (gnus-group-update-eval-form group gnus-group-highlight)))) - (unless (eq face (get-text-property beg 'face)) + (unless (eq face (gnus-get-text-property-excluding-characters-with-faces beg 'face)) (let ((inhibit-read-only t)) (gnus-put-text-property-excluding-characters-with-faces beg end 'face @@ -2310,6 +2310,7 @@ Return the name of the group if selection was successful." (let ((group (if (gnus-group-foreign-p group) group (gnus-group-prefixed-name (gnus-group-real-name group) method)))) + (gnus-set-active group nil) (gnus-sethash group `(-1 nil (,group @@ -2441,7 +2442,7 @@ Valid input formats include: (gnus-read-ephemeral-gmane-group group start range))) (defcustom gnus-bug-group-download-format-alist - '((emacs . "http://debbugs.gnu.org/%s;mboxmaint=yes;mboxstat=yes") + '((emacs . "http://debbugs.gnu.org/cgi/bugreport.cgi?bug=%s;mboxmaint=yes;mboxstat=yes") (debian . "http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=%s&mbox=yes;mboxmaint=yes")) "Alist of symbols for bug trackers and the corresponding URL format string. diff --git a/lisp/gnus/gnus-int.el b/lisp/gnus/gnus-int.el index 0a02138ee58..2378b598eeb 100644 --- a/lisp/gnus/gnus-int.el +++ b/lisp/gnus/gnus-int.el @@ -248,17 +248,26 @@ If it is down, start it up (again)." 'denied)) (defvar gnus-backend-trace nil) +(defvar gnus-backend-trace-elapsed nil) -(defun gnus-open-server (gnus-command-method) - "Open a connection to GNUS-COMMAND-METHOD." - (when (stringp gnus-command-method) - (setq gnus-command-method (gnus-server-to-method gnus-command-method))) +(defun gnus-backend-trace (type form) (when gnus-backend-trace (with-current-buffer (get-buffer-create "*gnus trace*") (buffer-disable-undo) (goto-char (point-max)) (insert (format-time-string "%H:%M:%S") - (format " %S\n" gnus-command-method)))) + (format " %.2fs %s %S\n" + (if (numberp gnus-backend-trace-elapsed) + (- (float-time) gnus-backend-trace-elapsed) + 0) + type form)) + (setq gnus-backend-trace-elapsed (float-time))))) + +(defun gnus-open-server (gnus-command-method) + "Open a connection to GNUS-COMMAND-METHOD." + (when (stringp gnus-command-method) + (setq gnus-command-method (gnus-server-to-method gnus-command-method))) + (gnus-backend-trace :opening gnus-command-method) (let ((elem (assoc gnus-command-method gnus-opened-servers)) (server (gnus-method-to-server-name gnus-command-method))) ;; If this method was previously denied, we just return nil. @@ -333,6 +342,7 @@ If it is down, start it up (again)." (save-excursion (gnus-agent-possibly-synchronize-flags-server gnus-command-method))) + (gnus-backend-trace :opened gnus-command-method) result))))) (defun gnus-close-server (gnus-command-method) @@ -353,9 +363,13 @@ If it is down, start it up (again)." "Read and update infos from GNUS-COMMAND-METHOD." (when (stringp gnus-command-method) (setq gnus-command-method (gnus-server-to-method gnus-command-method))) - (funcall (gnus-get-function gnus-command-method 'finish-retrieve-group-infos) - (nth 1 gnus-command-method) - infos data)) + (gnus-backend-trace :finishing gnus-command-method) + (prog1 + (funcall (gnus-get-function gnus-command-method + 'finish-retrieve-group-infos) + (nth 1 gnus-command-method) + infos data) + (gnus-backend-trace :finished gnus-command-method))) (defun gnus-retrieve-group-data-early (gnus-command-method infos) "Start early async retrieval of data from GNUS-COMMAND-METHOD." diff --git a/lisp/gnus/gnus-msg.el b/lisp/gnus/gnus-msg.el index c7509e858f7..fce9a3633c2 100644 --- a/lisp/gnus/gnus-msg.el +++ b/lisp/gnus/gnus-msg.el @@ -415,6 +415,11 @@ Thank you for your help in stamping out bugs. (gnus-inews-make-draft-meta-information ,(gnus-group-decoded-name gnus-newsgroup-name) ',articles))) +(autoload 'nnir-article-number "nnir" nil nil 'macro) +(autoload 'nnir-article-group "nnir" nil nil 'macro) +(autoload 'gnus-nnir-group-p "nnir") + + (defvar gnus-article-reply nil) (defmacro gnus-setup-message (config &rest forms) (let ((winconf (make-symbol "gnus-setup-message-winconf")) @@ -426,15 +431,22 @@ Thank you for your help in stamping out bugs. `(let ((,winconf (current-window-configuration)) (,winconf-name gnus-current-window-configuration) (,buffer (buffer-name (current-buffer))) - (,article gnus-article-reply) + (,article (if (and (gnus-nnir-group-p gnus-newsgroup-name) + gnus-article-reply) + (nnir-article-number gnus-article-reply) + gnus-article-reply)) (,yanked gnus-article-yanked-articles) - (,group gnus-newsgroup-name) + (,group (if (and (gnus-nnir-group-p gnus-newsgroup-name) + gnus-article-reply) + (nnir-article-group gnus-article-reply) + gnus-newsgroup-name)) (message-header-setup-hook (copy-sequence message-header-setup-hook)) (mbl mml-buffer-list) (message-mode-hook (copy-sequence message-mode-hook))) (setq mml-buffer-list nil) - (add-hook 'message-header-setup-hook 'gnus-inews-insert-gcc) + (add-hook 'message-header-setup-hook (lambda () + (gnus-inews-insert-gcc ,group))) ;; message-newsreader and message-mailer were formerly set in ;; gnus-inews-add-send-actions, but this is too late when ;; message-generate-headers-first is used. --ansel @@ -526,7 +538,8 @@ instead." (message-mail to subject other-headers continue nil yank-action send-actions return-action)) (let ((buf (current-buffer)) - (gnus-newsgroup-name (or gnus-newsgroup-name "")) + ;; Don't use posting styles corresponding to any existing group. + (gnus-newsgroup-name "") mail-buf) (gnus-setup-message 'message (message-mail to subject other-headers continue @@ -1706,7 +1719,8 @@ this is a reply." (group (when group (gnus-group-decoded-name group))) (var (or gnus-outgoing-message-group gnus-message-archive-group)) (gcc-self-val - (and group (gnus-group-find-parameter group 'gcc-self))) + (and group (not (gnus-virtual-group-p group)) + (gnus-group-find-parameter group 'gcc-self))) result (groups (cond @@ -1745,7 +1759,8 @@ this is a reply." (setq var (cdr var))) result))) name) - (when (or groups gcc-self-val) + (when (and (or groups gcc-self-val) + (gnus-alive-p)) (when (stringp groups) (setq groups (list groups))) (save-excursion diff --git a/lisp/gnus/gnus-registry.el b/lisp/gnus/gnus-registry.el index a0013c0ee2c..5a7dfd82d28 100644 --- a/lisp/gnus/gnus-registry.el +++ b/lisp/gnus/gnus-registry.el @@ -87,6 +87,12 @@ (require 'easymenu) (require 'registry) +;; Silence XEmacs byte compiler, which will otherwise complain about +;; call to `eieio-persistent-read'. +(when (featurep 'xemacs) + (byte-compiler-options + (warnings (- callargs)))) + (defvar gnus-adaptive-word-syntax-table) (defvar gnus-registry-dirty t @@ -296,8 +302,14 @@ This is not required after changing `gnus-registry-cache-file'." (condition-case nil (progn (gnus-message 5 "Reading Gnus registry from %s..." file) - (setq gnus-registry-db (gnus-registry-fixup-registry - (eieio-persistent-read file))) + (setq gnus-registry-db + (gnus-registry-fixup-registry + (condition-case nil + (with-no-warnings + (eieio-persistent-read file 'registry-db)) + ;; Older EIEIO versions do not check the class name. + ('wrong-number-of-arguments + (eieio-persistent-read file))))) (gnus-message 5 "Reading Gnus registry from %s...done" file)) (error (gnus-message @@ -982,7 +994,7 @@ only the last one's marks are returned." (let* ((article (last articles)) (id (gnus-registry-fetch-message-id-fast article)) (marks (when id (gnus-registry-get-id-key id 'mark)))) - (when (interactive-p) + (when (gmm-called-interactively-p 'any) (gnus-message 1 "Marks are %S" marks)) marks)) diff --git a/lisp/gnus/gnus-salt.el b/lisp/gnus/gnus-salt.el index 2126d56bb00..48b51d2c95d 100644 --- a/lisp/gnus/gnus-salt.el +++ b/lisp/gnus/gnus-salt.el @@ -659,7 +659,7 @@ Two predefined functions are available: (while (and list (not (eval (caar list)))) (setq list (cdr list))))) - (unless (eq (setq face (cdar list)) (get-text-property beg 'face)) + (unless (eq (setq face (cdar list)) (gnus-get-text-property-excluding-characters-with-faces beg 'face)) (gnus-put-text-property-excluding-characters-with-faces beg end 'face (if (boundp face) (symbol-value face) face))))) @@ -828,31 +828,33 @@ Two predefined functions are available: (defun gnus-highlight-selected-tree (article) "Highlight the selected article in the tree." - (let ((buf (current-buffer)) - region) - (set-buffer gnus-tree-buffer) - (when (setq region (gnus-tree-article-region article)) - (when (or (not gnus-selected-tree-overlay) - (gnus-extent-detached-p gnus-selected-tree-overlay)) - ;; Create a new overlay. - (gnus-overlay-put - (setq gnus-selected-tree-overlay - (gnus-make-overlay (point-min) (1+ (point-min)))) - 'face gnus-selected-tree-face)) - ;; Move the overlay to the article. - (gnus-move-overlay - gnus-selected-tree-overlay (goto-char (car region)) (cdr region)) - (gnus-tree-minimize) - (gnus-tree-recenter) - (let ((selected (selected-window))) - (when (gnus-get-buffer-window (set-buffer gnus-tree-buffer) t) - (select-window (gnus-get-buffer-window (set-buffer gnus-tree-buffer) t)) - (gnus-horizontal-recenter) - (select-window selected)))) -;; If we remove this save-excursion, it updates the wrong mode lines?!? - (with-current-buffer gnus-tree-buffer - (gnus-set-mode-line 'tree)) - (set-buffer buf))) + (when (buffer-live-p gnus-tree-buffer) + (let ((buf (current-buffer)) + region) + (set-buffer gnus-tree-buffer) + (when (setq region (gnus-tree-article-region article)) + (when (or (not gnus-selected-tree-overlay) + (gnus-extent-detached-p gnus-selected-tree-overlay)) + ;; Create a new overlay. + (gnus-overlay-put + (setq gnus-selected-tree-overlay + (gnus-make-overlay (point-min) (1+ (point-min)))) + 'face gnus-selected-tree-face)) + ;; Move the overlay to the article. + (gnus-move-overlay + gnus-selected-tree-overlay (goto-char (car region)) (cdr region)) + (gnus-tree-minimize) + (gnus-tree-recenter) + (let ((selected (selected-window))) + (when (gnus-get-buffer-window (set-buffer gnus-tree-buffer) t) + (select-window + (gnus-get-buffer-window (set-buffer gnus-tree-buffer) t)) + (gnus-horizontal-recenter) + (select-window selected)))) + ;; If we remove this save-excursion, it updates the wrong mode lines?!? + (with-current-buffer gnus-tree-buffer + (gnus-set-mode-line 'tree)) + (set-buffer buf)))) (defun gnus-tree-highlight-article (article face) (with-current-buffer (gnus-get-tree-buffer) diff --git a/lisp/gnus/gnus-score.el b/lisp/gnus/gnus-score.el index 625f2c989b2..da5c31325bd 100644 --- a/lisp/gnus/gnus-score.el +++ b/lisp/gnus/gnus-score.el @@ -33,6 +33,7 @@ (require 'gnus-win) (require 'message) (require 'score-mode) +(require 'gmm-utils) (defcustom gnus-global-score-files nil "List of global score files and directories. @@ -1718,33 +1719,37 @@ score in `gnus-newsgroup-scored' by SCORE." nil) (defun gnus-score-decode-text-parts () - (labels ((mm-text-parts (handle) - (cond ((stringp (car handle)) - (let ((parts (mapcan #'mm-text-parts (cdr handle)))) - (if (equal "multipart/alternative" (car handle)) - ;; pick the first supported alternative - (list (car parts)) - parts))) - - ((bufferp (car handle)) - (when (string-match "^text/" (mm-handle-media-type handle)) - (list handle))) - - (t (mapcan #'mm-text-parts handle)))) - (my-mm-display-part (handle) - (when handle - (save-restriction - (narrow-to-region (point) (point)) - (mm-display-inline handle) - (goto-char (point-max)))))) + (gmm-labels + ((mm-text-parts + (handle) + (cond ((stringp (car handle)) + (let ((parts (apply #'append + (mapcar #'mm-text-parts (cdr handle))))) + (if (equal "multipart/alternative" (car handle)) + ;; pick the first supported alternative + (list (car parts)) + parts))) + + ((bufferp (car handle)) + (when (string-match "^text/" (mm-handle-media-type handle)) + (list handle))) + + (t (apply #'append (mapcar #'mm-text-parts handle))))) + (my-mm-display-part + (handle) + (when handle + (save-restriction + (narrow-to-region (point) (point)) + (mm-display-inline handle) + (goto-char (point-max)))))) (let (;(mm-text-html-renderer 'w3m-standalone) - (handles (mm-dissect-buffer t))) + (handles (mm-dissect-buffer t))) (save-excursion - (article-goto-body) - (delete-region (point) (point-max)) - (mapc #'my-mm-display-part (mm-text-parts handles)) - handles)))) + (article-goto-body) + (delete-region (point) (point-max)) + (mapc #'my-mm-display-part (mm-text-parts handles)) + handles)))) (defun gnus-score-body (scores header now expire &optional trace) (if gnus-agent-fetching diff --git a/lisp/gnus/gnus-spec.el b/lisp/gnus/gnus-spec.el index c355b9a551f..2606b8860af 100644 --- a/lisp/gnus/gnus-spec.el +++ b/lisp/gnus/gnus-spec.el @@ -265,7 +265,14 @@ Return a list of updated types." (defun gnus-face-face-function (form type) `(gnus-add-text-properties (point) (progn ,@form (point)) - '(gnus-face t face ,(symbol-value (intern (format "gnus-face-%d" type)))))) + (cons 'face + (cons + ;; Delay consing the value of the `face' property until + ;; `gnus-add-text-properties' runs, since it will be modified + ;; by `gnus-put-text-property-excluding-characters-with-faces'. + (list ',(symbol-value (intern (format "gnus-face-%d" type))) 'default) + ;; Redundant now, but still convenient. + '(gnus-face t))))) (defun gnus-balloon-face-function (form type) `(gnus-put-text-property @@ -411,7 +418,7 @@ characters when given a pad value." ;; them will have the balloon-help text property. (let ((case-fold-search nil)) (if (string-match - "\\`\\(.*\\)%[0-9]?[{(]\\(.*\\)%[0-9]?[})]\\(.*\n?\\)\\'\\|%[-0-9]*=\\|%[-0-9]*\\*" + "\\`\\(.*\\)%[0-9]?[{(«]\\(.*\\)%[0-9]?[»})]\\(.*\n?\\)\\'\\|%[-0-9]*=\\|%[-0-9]*\\*" format) (gnus-parse-complex-format format spec-alist) ;; This is a simple format. @@ -428,13 +435,13 @@ characters when given a pad value." (goto-char (point-min)) (insert "(\"") ;; Convert all font specs into font spec lists. - (while (re-search-forward "%\\([0-9]+\\)?\\([{}()]\\)" nil t) + (while (re-search-forward "%\\([0-9]+\\)?\\([«»{}()]\\)" nil t) (let ((number (if (match-beginning 1) (match-string 1) "0")) (delim (aref (match-string 2) 0))) (if (or (= delim ?\() (= delim ?\{) - (= delim ?\)) + (= delim ?\«)) (replace-match (concat "\"(" (cond ((= delim ?\() "mouse") ((= delim ?\{) "face") @@ -726,7 +733,7 @@ If PROPS, insert the result." (provide 'gnus-spec) ;; Local Variables: -;; coding: iso-8859-1 +;; coding: utf-8 ;; End: ;;; gnus-spec.el ends here diff --git a/lisp/gnus/gnus-srvr.el b/lisp/gnus/gnus-srvr.el index 8493c8871a9..69774587d80 100644 --- a/lisp/gnus/gnus-srvr.el +++ b/lisp/gnus/gnus-srvr.el @@ -713,6 +713,7 @@ claim them." "q" gnus-browse-exit "Q" gnus-browse-exit "d" gnus-browse-describe-group + [delete] gnus-browse-delete-group "\C-c\C-c" gnus-browse-exit "?" gnus-browse-describe-briefly @@ -964,6 +965,16 @@ how new groups will be entered into the group buffer." (interactive (list (gnus-browse-group-name))) (gnus-group-describe-group nil group)) +(defun gnus-browse-delete-group (group force) + "Delete the current group. Only meaningful with editable groups. +If FORCE (the prefix) is non-nil, all the articles in the group will +be deleted. This is \"deleted\" as in \"removed forever from the face +of the Earth\". There is no undo. The user will be prompted before +doing the deletion." + (interactive (list (gnus-browse-group-name) + current-prefix-arg)) + (gnus-group-delete-group group force)) + (defun gnus-browse-unsubscribe-group () "Toggle subscription of the current group in the browse buffer." (let ((sub nil) diff --git a/lisp/gnus/gnus-start.el b/lisp/gnus/gnus-start.el index c9896bf2754..48bb99bfbce 100644 --- a/lisp/gnus/gnus-start.el +++ b/lisp/gnus/gnus-start.el @@ -110,7 +110,7 @@ ask the servers (primary, secondary, and archive servers) to list new groups since the last time it checked: 1. This variable is `ask-server'. 2. This variable is a list of select methods (see below). - 3. `gnus-read-active-file' is nil or `some'. + 3. Option `gnus-read-active-file' is nil or `some'. 4. A prefix argument is given to `gnus-find-new-newsgroups' interactively. Thus, if this variable is `ask-server' or a list of select methods or @@ -395,7 +395,16 @@ This hook is called after Gnus is connected to the NNTP server." (defcustom gnus-before-startup-hook nil "A hook called before startup. -This hook is called as the first thing when Gnus is started." +This hook is called as the first thing when Gnus is started. +See also `gnus-before-resume-hook'." + :group 'gnus-start + :type 'hook) + +(defcustom gnus-before-resume-hook nil + "A hook called before resuming Gnus after suspend. +This hook is called as the first thing when Gnus is resumed after a suspend. +See also `gnus-before-startup-hook'." + :version "24.4" :group 'gnus-start :type 'hook) @@ -749,6 +758,7 @@ prompt the user for the name of an NNTP server to use." (if (gnus-alive-p) (progn + (gnus-run-hooks 'gnus-before-resume-hook) (switch-to-buffer gnus-group-buffer) (gnus-group-get-new-news (and (numberp arg) diff --git a/lisp/gnus/gnus-sum.el b/lisp/gnus/gnus-sum.el index 32ef7029456..e6366e775df 100644 --- a/lisp/gnus/gnus-sum.el +++ b/lisp/gnus/gnus-sum.el @@ -451,7 +451,7 @@ current article is unread." :group 'gnus-summary-maneuvering :type 'boolean) -(defcustom gnus-auto-center-summary +(defcustom gnus-auto-center-summary (max (or (bound-and-true-p scroll-margin) 0) 2) "*If non-nil, always center the current summary buffer. In particular, if `vertical' do only vertical recentering. If non-nil @@ -1167,7 +1167,7 @@ using `gnus-ignored-from-addresses'." (defcustom gnus-summary-newsgroup-prefix "=> " "*String prefixed to the Newsgroup field in the summary -line when using `gnus-ignored-from-addresses'." +line when using the option `gnus-ignored-from-addresses'." :version "22.1" :group 'gnus-summary :type 'string) @@ -1819,6 +1819,7 @@ increase the score of each group you read." (gnus-define-keys gnus-summary-mode-map " " gnus-summary-next-page + [?\S-\ ] gnus-summary-prev-page "\177" gnus-summary-prev-page [delete] gnus-summary-prev-page [backspace] gnus-summary-prev-page @@ -2058,6 +2059,7 @@ increase the score of each group you read." (gnus-define-keys (gnus-summary-article-map "A" gnus-summary-mode-map) " " gnus-summary-next-page "n" gnus-summary-next-page + [?\S-\ ] gnus-summary-prev-page "\177" gnus-summary-prev-page [delete] gnus-summary-prev-page "p" gnus-summary-prev-page @@ -3493,8 +3495,8 @@ If the setup was successful, non-nil is returned." (set-buffer buffer) (setq gnus-summary-buffer (current-buffer)) (not gnus-newsgroup-prepared)) - ;; Fix by Sudish Joseph <joseph@cis.ohio-state.edu> - (setq gnus-summary-buffer (set-buffer (gnus-get-buffer-create buffer))) + (set-buffer (gnus-get-buffer-create buffer)) + (setq gnus-summary-buffer (current-buffer)) (gnus-summary-mode group) (when (gnus-group-quit-config group) (set (make-local-variable 'gnus-single-article-buffer) nil)) @@ -3552,11 +3554,7 @@ buffer that was in action when the last article was fetched." (if (consp (car locals)) (set (caar locals) (pop vlist)) (set (car locals) (pop vlist))) - (setq locals (cdr locals)))) - ;; The article buffer also has local variables. - (when (gnus-buffer-live-p gnus-article-buffer) - (set-buffer gnus-article-buffer) - (setq gnus-summary-buffer summary)))))) + (setq locals (cdr locals)))))))) (defun gnus-summary-article-unread-p (article) "Say whether ARTICLE is unread or not." @@ -3655,17 +3653,18 @@ buffer that was in action when the last article was fetched." (or (car (funcall gnus-extract-address-components from)) from)) -(defun gnus-summary-from-or-to-or-newsgroups (header gnus-tmp-from) +(defun gnus-summary-from-or-to-or-newsgroups (header from) (let ((mail-parse-charset gnus-newsgroup-charset) - (ignored-from-addresses (gnus-ignored-from-addresses)) - ; Is it really necessary to do this next part for each summary line? - ; Luckily, doesn't seem to slow things down much. - (mail-parse-ignored-charsets - (with-current-buffer gnus-summary-buffer - gnus-newsgroup-ignored-charsets))) + (ignored-from-addresses (gnus-ignored-from-addresses)) + ;; Is it really necessary to do this next part for each summary line? + ;; Luckily, doesn't seem to slow things down much. + (mail-parse-ignored-charsets + (with-current-buffer gnus-summary-buffer + gnus-newsgroup-ignored-charsets)) + (address (cadr (gnus-extract-address-components from)))) (or (and ignored-from-addresses - (string-match ignored-from-addresses gnus-tmp-from) + (string-match ignored-from-addresses address) (let ((extra-headers (mail-header-extra header)) to newsgroups) @@ -3684,9 +3683,7 @@ buffer that was in action when the last article was fetched." gnus-newsgroup-name)) 'nntp) (gnus-group-real-name gnus-newsgroup-name)))) (concat gnus-summary-newsgroup-prefix newsgroups))))) - (gnus-string-mark-left-to-right - (inline - (gnus-summary-extract-address-component gnus-tmp-from)))))) + (gnus-string-mark-left-to-right (gnus-summary-extract-address-component from))))) (defun gnus-summary-insert-line (gnus-tmp-header gnus-tmp-level gnus-tmp-current @@ -4063,9 +4060,10 @@ If SELECT-ARTICLES, only select those articles from GROUP." gnus-auto-select-first) (progn (let ((art (gnus-summary-article-number))) - (unless (and (not gnus-plugged) - (or (memq art gnus-newsgroup-undownloaded) - (memq art gnus-newsgroup-downloadable))) + (when (and art + gnus-plugged + (not (memq art gnus-newsgroup-undownloaded)) + (not (memq art gnus-newsgroup-downloadable))) (gnus-summary-goto-article art)))) ;; Don't select any articles. (gnus-summary-position-point) @@ -7874,7 +7872,6 @@ If STOP is non-nil, just stop when reaching the end of the message. Also see the variable `gnus-article-skip-boring'." (interactive "P") - (setq gnus-summary-buffer (current-buffer)) (gnus-set-global-variables) (let ((article (gnus-summary-article-number)) (article-window (get-buffer-window gnus-article-buffer t)) @@ -9791,7 +9788,7 @@ installed for this command to work." (when (message-goto-body) (gnus-narrow-to-body)) (goto-char (point-min)) - (while (search-forward "" (point-max) t) + (while (search-forward "·" (point-max) t) (replace-match ".")) (unmorse-region (point-min) (point-max)) (widen) @@ -10127,17 +10124,20 @@ ACTION can be either `move' (the default), `crosspost' or `copy'." (defun gnus-summary-push-marks-to-backend (article) (let ((set nil) + (del nil) (marks gnus-article-mark-lists)) (unless (memq article gnus-newsgroup-unreads) (push 'read set)) (while marks - (when (and (eq (gnus-article-mark-to-type (cdar marks)) 'list) - (memq article (symbol-value - (intern (format "gnus-newsgroup-%s" - (caar marks)))))) - (push (cdar marks) set)) + (if (and (eq (gnus-article-mark-to-type (cdar marks)) 'list) + (memq article (symbol-value + (intern (format "gnus-newsgroup-%s" + (caar marks)))))) + (push (cdar marks) set) + (push (cdar marks) del)) (pop marks)) - (gnus-request-set-mark gnus-newsgroup-name `(((,article) set ,set))))) + (gnus-request-set-mark gnus-newsgroup-name `(((,article) set ,set) + ((,article) del ,del))))) (defun gnus-summary-copy-article (&optional n to-newsgroup select-method) "Copy the current article to some other group. @@ -11647,10 +11647,10 @@ If PREDICATE is supplied, threads that satisfy this predicate will not be hidden. Returns nil if no threads were there to be hidden." (interactive) + (beginning-of-line) (let ((start (point)) (starteol (line-end-position)) (article (gnus-summary-article-number))) - (goto-char start) ;; Go forward until either the buffer ends or the subthread ends. (when (and (not (eobp)) (or (zerop (gnus-summary-next-thread 1 t)) @@ -12521,7 +12521,7 @@ If REVERSE, save parts that do not match TYPE." (memq article gnus-newsgroup-undownloaded) (not (memq article gnus-newsgroup-cached))))) (let ((face (funcall (gnus-summary-highlight-line-0)))) - (unless (eq face (get-text-property beg 'face)) + (unless (eq face (gnus-get-text-property-excluding-characters-with-faces beg 'face)) (gnus-put-text-property-excluding-characters-with-faces beg (point-at-eol) 'face (setq face (if (boundp face) (symbol-value face) face))) @@ -12775,7 +12775,7 @@ returned." (setq gnus-newsgroup-headers (gnus-merge 'list gnus-newsgroup-headers - (gnus-fetch-headers articles) + (gnus-fetch-headers articles nil t) 'gnus-article-sort-by-number)) (setq gnus-newsgroup-articles (gnus-sorted-nunion gnus-newsgroup-articles articles)) @@ -12978,7 +12978,7 @@ BOOKMARK is a bookmark name or a bookmark record." (run-hooks 'gnus-sum-load-hook) ;; Local Variables: -;; coding: iso-8859-1 +;; coding: utf-8 ;; End: ;;; gnus-sum.el ends here diff --git a/lisp/gnus/gnus-sync.el b/lisp/gnus/gnus-sync.el index 3d20c238a5e..8cf92df5b91 100644 --- a/lisp/gnus/gnus-sync.el +++ b/lisp/gnus/gnus-sync.el @@ -112,8 +112,9 @@ this setting is harmless until the user chooses a sync backend." (defcustom gnus-sync-newsrc-offsets '(2 3) "List of per-group data to be synchronized." :group 'gnus-sync + :version "24.4" :type '(set (const :tag "Read ranges" 2) - (const :tag "Marks" 3))) + (const :tag "Marks" 3))) (defcustom gnus-sync-global-vars nil "List of global variables to be synchronized. @@ -137,6 +138,11 @@ and `gnus-topic-alist'. Also see `gnus-variable-list'." (defvar gnus-sync-newsrc-loader nil "Carrier for newsrc data") +(defcustom gnus-sync-file-encrypt-to nil + "If non-nil, `epa-file-encrypt-to' is set from this for encrypting the Sync + file." + :group 'gnus-sync) + (defcustom gnus-sync-lesync-name (system-name) "The LeSync name for this machine." :group 'gnus-sync @@ -175,16 +181,15 @@ and `gnus-topic-alist'. Also see `gnus-variable-list'." (defun gnus-sync-lesync-call (url method headers &optional kvdata) "Make an access request to URL using KVDATA and METHOD. KVDATA must be an alist." - (flet ((json-alist-p (list) (gnus-sync-json-alist-p list))) ; temp patch - (let ((url-request-method method) - (url-request-extra-headers headers) - (url-request-data (if kvdata (json-encode kvdata) nil))) - (with-current-buffer (url-retrieve-synchronously url) - (let ((data (gnus-sync-lesync-parse))) - (gnus-message 12 "gnus-sync-lesync-call: %s URL %s sent %S got %S" - method url `((headers . ,headers) (data ,kvdata)) data) - (kill-buffer (current-buffer)) - data))))) + (let ((url-request-method method) + (url-request-extra-headers headers) + (url-request-data (if kvdata (json-encode kvdata) nil))) + (with-current-buffer (url-retrieve-synchronously url) + (let ((data (gnus-sync-lesync-parse))) + (gnus-message 12 "gnus-sync-lesync-call: %s URL %s sent %S got %S" + method url `((headers . ,headers) (data ,kvdata)) data) + (kill-buffer (current-buffer)) + data)))) (defun gnus-sync-lesync-PUT (url headers &optional data) (gnus-sync-lesync-call url "PUT" headers data)) @@ -762,6 +767,9 @@ With a prefix, FORCE is set and all groups will be saved." (progn (let ((coding-system-for-write gnus-ding-file-coding-system) (standard-output (current-buffer))) + (when gnus-sync-file-encrypt-to + (set (make-local-variable 'epa-file-encrypt-to) + gnus-sync-file-encrypt-to)) (princ (format ";; -*- mode:emacs-lisp; coding: %s; -*-\n" gnus-ding-file-coding-system)) (princ ";; Gnus sync data v. 0.0.1\n") diff --git a/lisp/gnus/gnus-util.el b/lisp/gnus/gnus-util.el index 6f00eec786d..331f9556710 100644 --- a/lisp/gnus/gnus-util.el +++ b/lisp/gnus/gnus-util.el @@ -225,7 +225,7 @@ is slower." (defun gnus-goto-colon () - (beginning-of-line) + (move-beginning-of-line 1) (let ((eol (point-at-eol))) (goto-char (or (text-property-any (point) eol 'gnus-position t) (search-forward ":" eol t) @@ -333,6 +333,13 @@ TIME defaults to the current time." (defmacro gnus-define-keys (keymap &rest plist) "Define all keys in PLIST in KEYMAP." + ;; Convert the key [?\S-\ ] to [(shift space)] for XEmacs. + (when (featurep 'xemacs) + (let ((bindings plist)) + (while bindings + (when (equal (car bindings) [?\S-\ ]) + (setcar bindings [(shift space)])) + (setq bindings (cddr bindings))))) `(gnus-define-keys-1 (quote ,keymap) (quote ,plist))) (defmacro gnus-define-keys-safe (keymap &rest plist) @@ -866,18 +873,29 @@ If there's no subdirectory, delete DIRECTORY as well." (setq beg (point))) (gnus-overlay-put (gnus-make-overlay beg (point)) prop val))))) -(defun gnus-put-text-property-excluding-characters-with-faces (beg end - prop val) - "The same as `put-text-property', but don't put props on characters with the `gnus-face' property." - (let ((b beg)) - (while (/= b end) - (when (get-text-property b 'gnus-face) - (setq b (next-single-property-change b 'gnus-face nil end))) - (when (/= b end) +(defun gnus-put-text-property-excluding-characters-with-faces (beg end prop val) + "The same as `put-text-property', except where `gnus-face' is set. +If so, and PROP is `face', set the second element of its value to VAL. +Otherwise, do nothing." + (while (< beg end) + ;; Property values are compared with `eq'. + (let ((stop (next-single-property-change beg 'face nil end))) + (if (get-text-property beg 'gnus-face) + (when (eq prop 'face) + (setcar (cdr (get-text-property beg 'face)) (or val 'default))) (inline - (gnus-put-text-property - b (setq b (next-single-property-change b 'gnus-face nil end)) - prop val)))))) + (gnus-put-text-property beg stop prop val))) + (setq beg stop)))) + +(defun gnus-get-text-property-excluding-characters-with-faces (pos prop) + "The same as `get-text-property', except where `gnus-face' is set. +If so, and PROP is `face', return the second element of its value. +Otherwise, return the value." + (let ((val (get-text-property pos prop))) + (if (and (get-text-property pos 'gnus-face) + (eq prop 'face)) + (cadr val) + (get-text-property pos prop)))) (defmacro gnus-faces-at (position) "Return a list of faces at POSITION." @@ -1938,27 +1956,6 @@ to case differences." (string-equal (downcase str1) (downcase prefix)) (string-equal str1 prefix)))))) -(eval-and-compile - (if (fboundp 'macroexpand-all) - (defalias 'gnus-macroexpand-all 'macroexpand-all) - (defun gnus-macroexpand-all (form &optional environment) - "Return result of expanding macros at all levels in FORM. -If no macros are expanded, FORM is returned unchanged. -The second optional arg ENVIRONMENT specifies an environment of macro -definitions to shadow the loaded ones for use in file byte-compilation." - (if (consp form) - (let ((idx 1) - (len (length (setq form (copy-sequence form)))) - expanded) - (while (< idx len) - (setcar (nthcdr idx form) (gnus-macroexpand-all (nth idx form) - environment)) - (setq idx (1+ idx))) - (if (eq (setq expanded (macroexpand form environment)) form) - form - (gnus-macroexpand-all expanded environment))) - form)))) - ;; Simple check: can be a macro but this way, although slow, it's really clear. ;; We don't use `bound-and-true-p' because it's not in XEmacs. (defun gnus-bound-and-true-p (sym) diff --git a/lisp/gnus/gnus.el b/lisp/gnus/gnus.el index d0e8d805206..ffb4694f4a8 100644 --- a/lisp/gnus/gnus.el +++ b/lisp/gnus/gnus.el @@ -2495,7 +2495,16 @@ Disabling the agent may result in noticeable loss of performance." :type 'boolean) (defcustom gnus-other-frame-function 'gnus - "Function called by the command `gnus-other-frame'." + "Function called by the command `gnus-other-frame' when starting Gnus." + :group 'gnus-start + :type '(choice (function-item gnus) + (function-item gnus-no-server) + (function-item gnus-slave) + (function-item gnus-slave-no-server))) + +(defcustom gnus-other-frame-resume-function 'gnus-group-get-new-news + "Function called by the command `gnus-other-frame' when resuming Gnus." + :version "24.4" :group 'gnus-start :type '(choice (function-item gnus) (function-item gnus-no-server) @@ -4348,13 +4357,22 @@ server." (interactive "P") (gnus arg nil 'slave)) +(defun gnus-delete-gnus-frame () + "Delete gnus frame unless it is the only one. +Used for `gnus-exit-gnus-hook' in `gnus-other-frame'." + (when (and (frame-live-p gnus-other-frame-object) + (cdr (frame-list))) + (delete-frame gnus-other-frame-object)) + (setq gnus-other-frame-object nil)) + ;;;###autoload (defun gnus-other-frame (&optional arg display) "Pop up a frame to read news. This will call one of the Gnus commands which is specified by the user option `gnus-other-frame-function' (default `gnus') with the argument -ARG if Gnus is not running, otherwise just pop up a Gnus frame. The -optional second argument DISPLAY should be a standard display string +ARG if Gnus is not running, otherwise pop up a Gnus frame and run the +command specified by `gnus-other-frame-resume-function'. +The optional second argument DISPLAY should be a standard display string such as \"unix:0\" to specify where to pop up a frame. If DISPLAY is omitted or the function `make-frame-on-display' is not available, the current display is used." @@ -4386,14 +4404,16 @@ current display is used." (make-frame-on-display display gnus-other-frame-parameters) (make-frame gnus-other-frame-parameters)))) (if alive - (switch-to-buffer gnus-group-buffer) + (progn (switch-to-buffer gnus-group-buffer) + (funcall gnus-other-frame-resume-function arg)) (funcall gnus-other-frame-function arg) - (add-hook 'gnus-exit-gnus-hook - (lambda nil - (when (and (frame-live-p gnus-other-frame-object) - (cdr (frame-list))) - (delete-frame gnus-other-frame-object)) - (setq gnus-other-frame-object nil))))))) + (add-hook 'gnus-exit-gnus-hook 'gnus-delete-gnus-frame) + ;; One might argue that `gnus-delete-gnus-frame' should not be called + ;; from `gnus-suspend-gnus-hook', but, on the other hand, one might + ;; argue that it should. No matter what you think, for the sake of + ;; those who want it to be called from it, please keep (defun + ;; gnus-delete-gnus-frame) even if you remove the next `add-hook'. + (add-hook 'gnus-suspend-gnus-hook 'gnus-delete-gnus-frame))))) ;;;###autoload (defun gnus (&optional arg dont-connect slave) diff --git a/lisp/gnus/html2text.el b/lisp/gnus/html2text.el index 4e05f1abb40..68e75196c87 100644 --- a/lisp/gnus/html2text.el +++ b/lisp/gnus/html2text.el @@ -1,4 +1,4 @@ -;;; html2text.el --- a simple html to plain text converter +;;; html2text.el --- a simple html to plain text converter -*- coding: utf-8 -*- ;; Copyright (C) 2002-2013 Free Software Foundation, Inc. @@ -65,14 +65,14 @@ ("–" . "-") ("‰" . "%%") ("±" . "+-") - ("£" . "") + ("£" . "£") (""" . "\"") ("»" . ">>") ("&rdquo" . "\"") ("®" . "(R)") ("›" . ")") ("’" . "'") - ("§" . "") + ("§" . "§") ("¹" . "^1") ("²" . "^2") ("³" . "^3") diff --git a/lisp/gnus/mail-source.el b/lisp/gnus/mail-source.el index c53968db352..9cc2e6ac09c 100644 --- a/lisp/gnus/mail-source.el +++ b/lisp/gnus/mail-source.el @@ -63,7 +63,7 @@ This variable is a list of mail source specifiers. See Info node `(gnus)Mail Source Specifiers'." :group 'mail-source - :version "23.1" ;; No Gnus + :version "24.4" :link '(custom-manual "(gnus)Mail Source Specifiers") :type `(choice (const :tag "None" nil) @@ -159,7 +159,18 @@ See Info node `(gnus)Mail Source Specifiers'." :value nil (const :tag "Clear" nil) (const starttls) - (const :tag "SSL/TLS" ssl))))) + (const :tag "SSL/TLS" ssl))) + (group :inline t + (const :format "" :value :leave) + (choice :format "\ +%{Leave mail on server%}:\n\t\t%[Value Menu%] %v" + :value nil + (const :tag "\ +Don't leave mails" nil) + (const :tag "\ +Leave all mails" t) + (number :tag "\ +Leave mails for this many days" :value 14))))) (cons :tag "Maildir (qmail, postfix...)" (const :format "" maildir) (checklist :tag "Options" :greedy t @@ -340,7 +351,8 @@ Common keywords should be listed here.") (:function) (:password) (:authentication password) - (:stream nil)) + (:stream nil) + (:leave)) (maildir (:path (or (getenv "MAILDIR") "~/Maildir/")) (:subdirs ("cur" "new")) @@ -825,7 +837,8 @@ Deleting old (> %s day(s)) incoming mail file `%s'." diff bfile) (pop3-port port) (pop3-authentication-scheme (if (eq authentication 'apop) 'apop 'pass)) - (pop3-stream-type stream)) + (pop3-stream-type stream) + (pop3-leave-mail-on-server leave)) (if (or debug-on-quit debug-on-error) (save-excursion (pop3-movemail mail-source-crash-box)) (condition-case err diff --git a/lisp/gnus/message.el b/lisp/gnus/message.el index 4e40b1afaa6..2b2a0a94413 100644 --- a/lisp/gnus/message.el +++ b/lisp/gnus/message.el @@ -264,7 +264,7 @@ This is a list of regexps and regexp matches." :type 'sexp) (defcustom message-ignored-news-headers - "^NNTP-Posting-Host:\\|^Xref:\\|^[BGF]cc:\\|^Resent-Fcc:\\|^X-Draft-From:\\|^X-Gnus-Agent-Meta-Information:" + "^NNTP-Posting-Host:\\|^Xref:\\|^[BGF]cc:\\|^Resent-Fcc:\\|^X-Draft-From:\\|^X-Gnus-Agent-Meta-Information:\\|^X-Message-SMTP-Method:" "*Regexp of headers to be removed unconditionally before posting." :group 'message-news :group 'message-headers @@ -592,8 +592,10 @@ Done before generating the new subject of a forward." ;; comes back to you (e.g. a mailing-list to which you subscribe, in which ;; case you may be removed from the list on the grounds that mail to you ;; bounced with a "mailing loop" error). - "^Return-receipt\\|^X-Gnus\\|^Gnus-Warning:\\|^>?From \\|^Delivered-To:" + "^Return-receipt\\|^X-Gnus\\|^Gnus-Warning:\\|^>?From \\|^Delivered-To:\ +\\|^X-Content-Length:\\|^X-UIDL:" "*All headers that match this regexp will be deleted when resending a message." + :version "24.4" :group 'message-interface :link '(custom-manual "(message)Resending") :type '(repeat :value-to-internal (lambda (widget value) @@ -1741,7 +1743,7 @@ no, only reply back to the author." (file-error)) (mm-coding-system-p 'utf-8) (executable-find idna-program) - (string= (idna-to-ascii "rksmrgs") + (string= (idna-to-ascii "räksmörgås") "xn--rksmrgs-5wao1o") t) "Whether to encode non-ASCII in domain names into ASCII according to IDNA. @@ -3135,22 +3137,10 @@ M-RET `message-newline-and-reformat' (break the line and reformat)." (push-mark) (message-position-on-field "Summary" "Subject")) -(eval-when-compile - (defmacro message-called-interactively-p (kind) - (condition-case nil - (progn - (eval '(called-interactively-p 'any)) - ;; Emacs >=23.2 - `(called-interactively-p ,kind)) - ;; Emacs <23.2 - (wrong-number-of-arguments '(called-interactively-p)) - ;; XEmacs - (void-function '(interactive-p))))) - (defun message-goto-body () "Move point to the beginning of the message body." (interactive) - (when (and (message-called-interactively-p 'any) + (when (and (gmm-called-interactively-p 'any) (looking-at "[ \t]*\n")) (expand-abbrev)) (push-mark) @@ -3824,7 +3814,9 @@ prefix, and don't delete any headers." (interactive "P") ;; eval the let forms contained in message-cite-style (eval - `(let ,message-cite-style + `(let ,(if (symbolp message-cite-style) + (symbol-value message-cite-style) + message-cite-style) (message--yank-original-internal ',arg)))) (defun message-yank-buffer (buffer) @@ -4105,11 +4097,9 @@ Instead, just auto-save the buffer and then bury it." (defun message-bury (buffer) "Bury this mail BUFFER." - (if message-return-action - (progn - (bury-buffer buffer) - (apply (car message-return-action) (cdr message-return-action))) - (with-current-buffer buffer (bury-buffer)))) + (bury-buffer buffer) + (when message-return-action + (apply (car message-return-action) (cdr message-return-action)))) (defun message-send (&optional arg) "Send the message in the current buffer. @@ -6728,11 +6718,16 @@ The function is called with one parameter, a cons cell ..." ", ")) mct (message-fetch-field "mail-copies-to") author (or (message-fetch-field "mail-reply-to") - (message-fetch-field "reply-to") - (message-fetch-field "from") - "") + (message-fetch-field "reply-to")) mft (and message-use-mail-followup-to - (message-fetch-field "mail-followup-to")))) + (message-fetch-field "mail-followup-to"))) + ;; Make sure this message goes to the author if this is a wide + ;; reply, since Reply-To address may be a list address a mailing + ;; list server added. + (when (and wide author) + (setq cc (concat author ", " cc))) + (when (or wide (not author)) + (setq author (or (message-fetch-field "from") "")))) ;; Handle special values of Mail-Copies-To. (when mct @@ -7379,12 +7374,13 @@ Optional DIGEST will use digest to forward." (dolist (elem ignored) (message-remove-header elem t)))))) -(defun message-forward-make-body-mime (forward-buffer) +(defun message-forward-make-body-mime (forward-buffer &optional beg end) (let ((b (point))) (insert "\n\n<#part type=message/rfc822 disposition=inline raw=t>\n") (save-restriction (narrow-to-region (point) (point)) - (mml-insert-buffer forward-buffer) + (insert-buffer-substring forward-buffer beg end) + (mml-quote-region (point-min) (point-max)) (goto-char (point-min)) (when (looking-at "From ") (replace-match "X-From-Line: ")) @@ -8134,8 +8130,7 @@ regexp VARSTR." (if (fboundp 'mail-abbrevs-setup) (let ((minibuffer-setup-hook 'mail-abbrevs-setup) (minibuffer-local-map message-minibuffer-local-map)) - (flet ((mail-abbrev-in-expansion-header-p nil t)) - (read-from-minibuffer prompt initial-contents))) + (read-from-minibuffer prompt initial-contents)) (let ((minibuffer-setup-hook 'mail-abbrev-minibuffer-setup-hook) (minibuffer-local-map message-minibuffer-local-map)) (read-string prompt initial-contents)))) @@ -8424,7 +8419,7 @@ Used in `message-simplify-recipients'." (run-hooks 'message-load-hook) ;; Local Variables: -;; coding: iso-8859-1 +;; coding: utf-8 ;; End: ;;; message.el ends here diff --git a/lisp/gnus/mm-decode.el b/lisp/gnus/mm-decode.el index b5e4d3e38e8..04f325633ba 100644 --- a/lisp/gnus/mm-decode.el +++ b/lisp/gnus/mm-decode.el @@ -1298,14 +1298,26 @@ PROMPT overrides the default one used to ask user for a file name." (when filename (setq filename (gnus-map-function mm-file-name-rewrite-functions (file-name-nondirectory filename)))) - (setq file - (read-file-name - (or prompt - (format "Save MIME part to (default %s): " - (or filename ""))) - (or mm-default-directory default-directory) - (expand-file-name (or filename "") - (or mm-default-directory default-directory)))) + (while + (progn + (setq file + (read-file-name + (or prompt + (format "Save MIME part to (default %s): " + (or filename ""))) + (or mm-default-directory default-directory) + (expand-file-name (or filename "") + (or mm-default-directory default-directory)))) + (cond ((or (not file) (equal file "")) + (message "Please enter a file name") + t) + ((and (file-directory-p file) + (not filename)) + (message "Please enter a non-directory file name") + t) + (t nil))) + (sit-for 2) + (discard-input)) (if (file-directory-p file) (setq file (expand-file-name filename file)) (setq file (expand-file-name @@ -1791,7 +1803,7 @@ If RECURSIVE, search recursively." (replace-match (char-to-string char)))) ;; Remove "soft hyphens". (goto-char (point-min)) - (while (search-forward "" nil t) + (while (search-forward "" nil t) (replace-match "" t t)) (libxml-parse-html-region (point-min) (point-max)))) (unless (bobp) @@ -1813,7 +1825,7 @@ If RECURSIVE, search recursively." (provide 'mm-decode) ;; Local Variables: -;; coding: iso-8859-1 +;; coding: utf-8 ;; End: ;;; mm-decode.el ends here diff --git a/lisp/gnus/mml-smime.el b/lisp/gnus/mml-smime.el index 3e769d396b0..6ea55377e02 100644 --- a/lisp/gnus/mml-smime.el +++ b/lisp/gnus/mml-smime.el @@ -74,6 +74,18 @@ Whether the passphrase is cached at all is controlled by :group 'mime-security :type '(repeat (string :tag "Key ID"))) +(defcustom mml-smime-sign-with-sender nil + "If t, use message sender so find a key to sign with." + :group 'mime-security + :version "24.4" + :type 'boolean) + +(defcustom mml-smime-encrypt-to-self nil + "If t, add your own key ID to recipient list when encryption." + :group 'mime-security + :version "24.4" + :type 'boolean) + (defun mml-smime-sign (cont) (let ((func (nth 1 (assq mml-smime-use mml-smime-function-alist)))) (if func @@ -323,6 +335,7 @@ Whether the passphrase is cached at all is controlled by (autoload 'epg-encrypt-string "epg") (autoload 'epg-passphrase-callback-function "epg") (autoload 'epg-context-set-passphrase-callback "epg") + (autoload 'epg-sub-key-fingerprint "epg") (autoload 'epg-configuration "epg-config") (autoload 'epg-expand-group "epg-config") (autoload 'epa-select-keys "epa")) @@ -366,6 +379,24 @@ Whether the passphrase is cached at all is controlled by (setq pointer (cdr pointer)))) (setq keys (cdr keys))))) +;; XXX: since gpg --list-secret-keys does not return validity of each +;; key, `mml-smime-epg-find-usable-key' defined above is not enough for +;; secret keys. The function `mml-smime-epg-find-usable-secret-key' +;; below looks at appropriate public keys to check usability. +(defun mml-smime-epg-find-usable-secret-key (context name usage) + (let ((secret-keys (epg-list-keys context name t)) + secret-key) + (while (and (not secret-key) secret-keys) + (if (mml-smime-epg-find-usable-key + (epg-list-keys context (epg-sub-key-fingerprint + (car (epg-key-sub-key-list + (car secret-keys))))) + usage) + (setq secret-key (car secret-keys) + secret-keys nil) + (setq secret-keys (cdr secret-keys)))) + secret-key)) + (autoload 'mml-compute-boundary "mml") ;; We require mm-decode, which requires mm-bodies, which autoloads @@ -376,29 +407,36 @@ Whether the passphrase is cached at all is controlled by (let* ((inhibit-redisplay t) (context (epg-make-context 'CMS)) (boundary (mml-compute-boundary cont)) + (sender (message-options-get 'message-sender)) + (signer-names (or mml-smime-signers + (if (and mml-smime-sign-with-sender sender) + (list (concat "<" sender ">"))))) signer-key (signers (or (message-options-get 'mml-smime-epg-signers) (message-options-set - 'mml-smime-epg-signers - (if (eq mm-sign-option 'guided) - (epa-select-keys context "\ + 'mml-smime-epg-signers + (if (eq mm-sign-option 'guided) + (epa-select-keys context "\ Select keys for signing. If no one is selected, default secret key is used. " - mml-smime-signers t) - (if mml-smime-signers - (mapcar - (lambda (signer) - (setq signer-key (mml-smime-epg-find-usable-key - (epg-list-keys context signer t) - 'sign)) - (unless (or signer-key - (y-or-n-p - (format "No secret key for %s; skip it? " + signer-names + t) + (if (or sender mml-smime-signers) + (delq nil + (mapcar + (lambda (signer) + (setq signer-key + (mml-smime-epg-find-usable-secret-key + context signer 'sign)) + (unless (or signer-key + (y-or-n-p + (format + "No secret key for %s; skip it? " signer))) - (error "No secret key for %s" signer)) - signer-key) - mml-smime-signers)))))) + (error "No secret key for %s" signer)) + signer-key) + signer-names))))))) signature micalg) (epg-context-set-signers context signers) (if mml-smime-cache-passphrase @@ -443,13 +481,17 @@ Content-Disposition: attachment; filename=smime.p7s (goto-char (point-max)))) (defun mml-smime-epg-encrypt (cont) - (let ((inhibit-redisplay t) - (context (epg-make-context 'CMS)) - (config (epg-configuration)) - (recipients (message-options-get 'mml-smime-epg-recipients)) - cipher signers - (boundary (mml-compute-boundary cont)) - recipient-key) + (let* ((inhibit-redisplay t) + (context (epg-make-context 'CMS)) + (config (epg-configuration)) + (recipients (message-options-get 'mml-smime-epg-recipients)) + cipher signers + (sender (message-options-get 'message-sender)) + (signer-names (or mml-smime-signers + (if (and mml-smime-sign-with-sender sender) + (list (concat "<" sender ">"))))) + (boundary (mml-compute-boundary cont)) + recipient-key) (unless recipients (setq recipients (apply #'nconc @@ -462,6 +504,10 @@ Content-Disposition: attachment; filename=smime.p7s (message-options-set 'message-recipients (read-string "Recipients: "))) "[ \f\t\n\r\v,]+")))) + (when mml-smime-encrypt-to-self + (unless signer-names + (error "Neither message sender nor mml-smime-signers are set")) + (setq recipients (nconc recipients signer-names))) (if (eq mm-encrypt-option 'guided) (setq recipients (epa-select-keys context "\ diff --git a/lisp/gnus/mml.el b/lisp/gnus/mml.el index 453086f4c20..91f0e325182 100644 --- a/lisp/gnus/mml.el +++ b/lisp/gnus/mml.el @@ -1212,8 +1212,8 @@ If not set, `default-directory' will be used." string default))) -(defun mml-minibuffer-read-description () - (let ((description (read-string "One line description: "))) +(defun mml-minibuffer-read-description (&optional default) + (let ((description (read-string "One line description: " default))) (when (string-match "\\`[ \t]*\\'" description) (setq description nil)) description)) @@ -1440,7 +1440,9 @@ TYPE is the MIME type to use." ;; when you send the message. (or (eq mail-user-agent 'message-user-agent) (setq mail-encode-mml t)) - (mml-insert-tag 'part 'type type 'disposition "inline")) + (mml-insert-tag 'part 'type type 'disposition "inline") + (save-excursion + (mml-insert-tag '/part))) (declare-function message-subscribed-p "message" ()) (declare-function message-make-mail-followup-to "message" diff --git a/lisp/gnus/mml1991.el b/lisp/gnus/mml1991.el index 88dee4ad883..5af7639019a 100644 --- a/lisp/gnus/mml1991.el +++ b/lisp/gnus/mml1991.el @@ -2,7 +2,7 @@ ;; Copyright (C) 1998-2013 Free Software Foundation, Inc. -;; Author: Sascha Ldecke <sascha@meta-x.de>, +;; Author: Sascha Lüdecke <sascha@meta-x.de>, ;; Simon Josefsson <simon@josefsson.org> (Mailcrypt interface, Gnus glue) ;; Keywords: PGP @@ -480,7 +480,7 @@ If no one is selected, default secret key is used. " (provide 'mml1991) ;; Local Variables: -;; coding: iso-8859-1 +;; coding: utf-8 ;; End: ;;; mml1991.el ends here diff --git a/lisp/gnus/mml2015.el b/lisp/gnus/mml2015.el index af65872b0cf..39bce23e76c 100644 --- a/lisp/gnus/mml2015.el +++ b/lisp/gnus/mml2015.el @@ -735,6 +735,7 @@ If set, it overrides the setting of `mml2015-sign-with-sender'." (defvar epg-user-id-alist) (defvar epg-digest-algorithm-alist) +(defvar epg-gpg-program) (defvar inhibit-redisplay) (autoload 'epg-make-context "epg") @@ -743,7 +744,6 @@ If set, it overrides the setting of `mml2015-sign-with-sender'." (autoload 'epg-context-set-signers "epg") (autoload 'epg-context-result-for "epg") (autoload 'epg-new-signature-digest-algorithm "epg") -(autoload 'epg-verify-result-to-string "epg") (autoload 'epg-list-keys "epg") (autoload 'epg-decrypt-string "epg") (autoload 'epg-verify-string "epg") @@ -755,6 +755,11 @@ If set, it overrides the setting of `mml2015-sign-with-sender'." (autoload 'epg-sub-key-capability "epg") (autoload 'epg-sub-key-validity "epg") (autoload 'epg-sub-key-fingerprint "epg") +(autoload 'epg-signature-key-id "epg") +(autoload 'epg-signature-to-string "epg") +(autoload 'epg-key-user-id-list "epg") +(autoload 'epg-user-id-string "epg") +(autoload 'epg-user-id-validity "epg") (autoload 'epg-configuration "epg-config") (autoload 'epg-expand-group "epg-config") (autoload 'epa-select-keys "epa") @@ -784,21 +789,53 @@ If set, it overrides the setting of `mml2015-sign-with-sender'." (cons password-cache-key-id mml2015-epg-secret-key-id-list)) (copy-sequence passphrase))))) -(defun mml2015-epg-find-usable-key (keys usage) - (catch 'found +(defun mml2015-epg-check-user-id (key recipient) + (let ((pointer (epg-key-user-id-list key)) + result) + (while pointer + (if (and (equal (car (mail-header-parse-address + (epg-user-id-string (car pointer)))) + (car (mail-header-parse-address + recipient))) + (not (memq (epg-user-id-validity (car pointer)) + '(revoked expired)))) + (setq result t + pointer nil) + (setq pointer (cdr pointer)))) + result)) + +(defun mml2015-epg-check-sub-key (key usage) + (let ((pointer (epg-key-sub-key-list key)) + result) + ;; The primary key will be marked as disabled, when the entire + ;; key is disabled (see 12 Field, Format of colon listings, in + ;; gnupg/doc/DETAILS) + (unless (memq 'disabled (epg-sub-key-capability (car pointer))) + (while pointer + (if (and (memq usage (epg-sub-key-capability (car pointer))) + (not (memq (epg-sub-key-validity (car pointer)) + '(revoked expired)))) + (setq result t + pointer nil) + (setq pointer (cdr pointer))))) + result)) + +(defun mml2015-epg-find-usable-key (context name usage + &optional name-is-key-id) + (let ((keys (epg-list-keys context name)) + key) (while keys - (let ((pointer (epg-key-sub-key-list (car keys)))) - ;; The primary key will be marked as disabled, when the entire - ;; key is disabled (see 12 Field, Format of colon listings, in - ;; gnupg/doc/DETAILS) - (unless (memq 'disabled (epg-sub-key-capability (car pointer))) - (while pointer - (if (and (memq usage (epg-sub-key-capability (car pointer))) - (not (memq (epg-sub-key-validity (car pointer)) - '(revoked expired)))) - (throw 'found (car keys))) - (setq pointer (cdr pointer))))) - (setq keys (cdr keys))))) + (if (and (or name-is-key-id + ;; Non email user-id can be supplied through + ;; mml2015-signers if mml2015-encrypt-to-self is set. + ;; Treat it as valid, as it is user's intention. + (not (string-match "\\`<" name)) + (mml2015-epg-check-user-id (car keys) name)) + (mml2015-epg-check-sub-key (car keys) usage)) + (setq key (car keys) + keys nil) + (setq keys (cdr keys)))) + key)) ;; XXX: since gpg --list-secret-keys does not return validity of each ;; key, `mml2015-epg-find-usable-key' defined above is not enough for @@ -809,15 +846,46 @@ If set, it overrides the setting of `mml2015-sign-with-sender'." secret-key) (while (and (not secret-key) secret-keys) (if (mml2015-epg-find-usable-key - (epg-list-keys context (epg-sub-key-fingerprint - (car (epg-key-sub-key-list - (car secret-keys))))) - usage) + context + (epg-sub-key-fingerprint + (car (epg-key-sub-key-list + (car secret-keys)))) + usage + t) (setq secret-key (car secret-keys) secret-keys nil) (setq secret-keys (cdr secret-keys)))) secret-key)) +(defun mml2015-epg-key-image (key-id) + "Return the image of a key, if any" + (with-temp-buffer + (mm-set-buffer-multibyte nil) + (let* ((coding-system-for-write 'binary) + (coding-system-for-read 'binary) + (data (shell-command-to-string + (format "%s --list-options no-show-photos --attribute-fd 3 --list-keys %s 3>&1 >/dev/null 2>&1" + (shell-quote-argument epg-gpg-program) key-id)))) + (when (> (length data) 0) + (insert (substring data 16)) + (create-image (buffer-string) nil t))))) + +(defun mml2015-epg-key-image-to-string (key-id) + "Return a string with the image of a key, if any" + (let* ((result "") + (key-image (mml2015-epg-key-image key-id))) + (when key-image + (setq result " ") + (put-text-property 1 2 'display key-image result)) + result)) + +(defun mml2015-epg-signature-to-string (signature) + (concat (epg-signature-to-string signature) + (mml2015-epg-key-image-to-string (epg-signature-key-id signature)))) + +(defun mml2015-epg-verify-result-to-string (verify-result) + (mapconcat #'mml2015-epg-signature-to-string verify-result "\n")) + (defun mml2015-epg-decrypt (handle ctl) (catch 'error (let ((inhibit-redisplay t) @@ -860,7 +928,7 @@ If set, it overrides the setting of `mml2015-sign-with-sender'." (mm-set-handle-multipart-parameter mm-security-handle 'gnus-info (concat "OK\n" - (epg-verify-result-to-string + (mml2015-epg-verify-result-to-string (epg-context-result-for context 'verify)))) (mm-set-handle-multipart-parameter mm-security-handle 'gnus-info "OK")) @@ -908,7 +976,7 @@ If set, it overrides the setting of `mml2015-sign-with-sender'." (if (epg-context-result-for context 'verify) (mm-set-handle-multipart-parameter mm-security-handle 'gnus-details - (epg-verify-result-to-string + (mml2015-epg-verify-result-to-string (epg-context-result-for context 'verify))))))) (defun mml2015-epg-verify (handle ctl) @@ -942,7 +1010,8 @@ If set, it overrides the setting of `mml2015-sign-with-sender'." (throw 'error handle))) (mm-set-handle-multipart-parameter mm-security-handle 'gnus-info - (epg-verify-result-to-string (epg-context-result-for context 'verify))) + (mml2015-epg-verify-result-to-string + (epg-context-result-for context 'verify))) handle))) (defun mml2015-epg-clear-verify () @@ -965,7 +1034,7 @@ If set, it overrides the setting of `mml2015-sign-with-sender'." (progn (mm-set-handle-multipart-parameter mm-security-handle 'gnus-info - (epg-verify-result-to-string + (mml2015-epg-verify-result-to-string (epg-context-result-for context 'verify))) (delete-region (point-min) (point-max)) (insert (mm-decode-coding-string plain coding-system-for-read))) @@ -1083,8 +1152,7 @@ If no one is selected, symmetric encryption will be performed. " (mapcar (lambda (recipient) (setq recipient-key (mml2015-epg-find-usable-key - (epg-list-keys context recipient) - 'encrypt)) + context recipient 'encrypt)) (unless (or recipient-key (y-or-n-p (format "No public key for %s; skip it? " diff --git a/lisp/gnus/nndir.el b/lisp/gnus/nndir.el index b99a0c37d2e..5e68779e977 100644 --- a/lisp/gnus/nndir.el +++ b/lisp/gnus/nndir.el @@ -90,8 +90,7 @@ (nnml-request-article 0 nndir-current-group 0 0) (nnmh-request-group nndir-current-group 0 0) (nnml-close-group nndir-current-group 0) - (nnml-request-list (nnoo-current-server 'nndir) nndir-directory) - (nnml-request-newsgroups (nnoo-current-server 'nndir) nndir-directory)) + (nnml-request-list (nnoo-current-server 'nndir))) (provide 'nndir) diff --git a/lisp/gnus/nndraft.el b/lisp/gnus/nndraft.el index ad8a8b164de..c9625f4c447 100644 --- a/lisp/gnus/nndraft.el +++ b/lisp/gnus/nndraft.el @@ -255,11 +255,16 @@ are generated if and only if they are also in `message-draft-headers'.") (deffoo nndraft-request-expire-articles (articles group &optional server force) (nndraft-possibly-change-group group) (let* ((nnmh-allow-delete-final t) - (nnmail-expiry-target - (or (gnus-group-find-parameter - (gnus-group-prefixed-name group (list 'nndraft server)) - 'expiry-target t) - nnmail-expiry-target)) + (nnmail-expiry-target 'delete) + ;; FIXME: If we want to move a draft message to an expiry group, + ;; there are things to have to improve: + ;; - Remove a header separator. + ;; - Encode it, including attachments, into a MIME message. + ;;(nnmail-expiry-target + ;; (or (gnus-group-find-parameter + ;; (gnus-group-prefixed-name group (list 'nndraft server)) + ;; 'expiry-target t) + ;; nnmail-expiry-target)) (res (nnoo-parent-function 'nndraft 'nnmh-request-expire-articles (list articles group server force))) @@ -346,8 +351,7 @@ are generated if and only if they are also in `message-draft-headers'.") nnmh-retrieve-headers nnmh-request-group nnmh-close-group - nnmh-request-list - nnmh-request-newsgroups)) + nnmh-request-list)) (provide 'nndraft) diff --git a/lisp/gnus/nnfolder.el b/lisp/gnus/nnfolder.el index 7dfdb9ebcfd..e189ab531f0 100644 --- a/lisp/gnus/nnfolder.el +++ b/lisp/gnus/nnfolder.el @@ -1004,6 +1004,28 @@ deleted. Point is left where the deleted region was." (nnfolder-save-nov)) (current-buffer)))))) +(defun nnfolder-recursive-directory-files (dir prefix) + (let ((files nil)) + (dolist (file (directory-files dir)) + (cond + ((or (file-symlink-p (expand-file-name file dir)) + (member file '("." ".."))) + ;; Ignore + ) + ((file-directory-p (expand-file-name file dir)) + (setq files (nconc (nnfolder-recursive-directory-files + (expand-file-name file dir) + (if prefix + (concat prefix "." (directory-file-name file)) + (file-name-nondirectory file))) + files))) + ((file-regular-p (expand-file-name file dir)) + (push (if prefix + (concat prefix "." file) + file) + files)))) + files)) + ;;;###autoload (defun nnfolder-generate-active-file () "Look for mbox folders in the nnfolder directory and make them into groups. @@ -1020,10 +1042,13 @@ This command does not work if you use short group names." (when (not (message-mail-file-mbox-p file)) (ignore-errors (delete-file file))))) - (dolist (file (directory-files nnfolder-directory)) + (dolist (file (if nnmail-use-long-file-names + (directory-files nnfolder-directory) + (nnfolder-recursive-directory-files + nnfolder-directory nil))) (when (and (not (backup-file-name-p file)) (message-mail-file-mbox-p - (nnheader-concat nnfolder-directory file))) + (nnfolder-group-pathname file))) (let ((oldgroup (assoc file nnfolder-group-alist))) (if oldgroup (nnheader-message 5 "Refreshing group %s..." file) diff --git a/lisp/gnus/nnimap.el b/lisp/gnus/nnimap.el index 307d8247912..9c18bc2cff0 100644 --- a/lisp/gnus/nnimap.el +++ b/lisp/gnus/nnimap.el @@ -99,7 +99,8 @@ Uses the same syntax as `nnmail-split-methods'.") (defvoo nnimap-authenticator nil "How nnimap authenticate itself to the server. -Possible choices are nil (use default methods) or `anonymous'.") +Possible choices are nil (use default methods), `anonymous', +`login', `plain' and `cram-md5'.") (defvoo nnimap-expunge t "If non-nil, expunge articles after deleting them. @@ -338,7 +339,8 @@ textual parts.") (nnimap-last-command-time nnimap-object))) ;; More than five minutes since the last command. (* 5 60))) - (nnimap-send-command "NOOP"))))))) + (ignore-errors ;E.g. "buffer foo has no process". + (nnimap-send-command "NOOP")))))))) (defun nnimap-open-connection (buffer) ;; Be backwards-compatible -- the earlier value of nnimap-stream was @@ -366,7 +368,7 @@ textual parts.") (defun nnimap-open-connection-1 (buffer) (unless nnimap-keepalive-timer (setq nnimap-keepalive-timer (run-at-time (* 60 15) (* 60 15) - 'nnimap-keepalive))) + #'nnimap-keepalive))) (with-current-buffer (nnimap-make-process-buffer buffer) (let* ((coding-system-for-read 'binary) (coding-system-for-write 'binary) @@ -487,9 +489,13 @@ textual parts.") ;; round trips than CRAM-MD5, and it's less likely to be buggy), ;; and we're using an encrypted connection. ((and (not (nnimap-capability "LOGINDISABLED")) - (eq (nnimap-stream-type nnimap-object) 'tls)) + (eq (nnimap-stream-type nnimap-object) 'tls) + (or (null nnimap-authenticator) + (eq nnimap-authenticator 'login))) (nnimap-command "LOGIN %S %S" user password)) - ((nnimap-capability "AUTH=CRAM-MD5") + ((and (nnimap-capability "AUTH=CRAM-MD5") + (or (null nnimap-authenticator) + (eq nnimap-authenticator 'cram-md5))) (erase-buffer) (let ((sequence (nnimap-send-command "AUTHENTICATE CRAM-MD5")) (challenge (nnimap-wait-for-line "^\\+\\(.*\\)\n"))) @@ -502,9 +508,13 @@ textual parts.") (base64-decode-string challenge)))) "\r\n")) (nnimap-wait-for-response sequence))) - ((not (nnimap-capability "LOGINDISABLED")) + ((and (not (nnimap-capability "LOGINDISABLED")) + (or (null nnimap-authenticator) + (eq nnimap-authenticator 'login))) (nnimap-command "LOGIN %S %S" user password)) - ((nnimap-capability "AUTH=PLAIN") + ((and (nnimap-capability "AUTH=PLAIN") + (or (null nnimap-authenticator) + (eq nnimap-authenticator 'plain))) (nnimap-command "AUTHENTICATE PLAIN %s" (base64-encode-string @@ -1411,7 +1421,9 @@ textual parts.") (gnus-set-difference (gnus-set-difference existing - (cdr (assoc '%Seen flags))) + (gnus-sorted-union + (cdr (assoc '%Seen flags)) + (cdr (assoc '%Deleted flags)))) (cdr (assoc '%Flagged flags))))) (read (gnus-range-difference (cons start-article high) unread))) diff --git a/lisp/gnus/nnir.el b/lisp/gnus/nnir.el index 0e2e76f25be..21f81dc664c 100644 --- a/lisp/gnus/nnir.el +++ b/lisp/gnus/nnir.el @@ -1,8 +1,8 @@ -;;; nnir.el --- search mail with various search engines -*- coding: iso-8859-1 -*- +;;; nnir.el --- search mail with various search engines -*- coding: utf-8 -*- ;; Copyright (C) 1998-2013 Free Software Foundation, Inc. -;; Author: Kai Grojohann <grossjohann@ls6.cs.uni-dortmund.de> +;; Author: Kai Großjohann <grossjohann@ls6.cs.uni-dortmund.de> ;; Swish-e and Swish++ backends by: ;; Christoph Conrad <christoph.conrad@gmx.de>. ;; IMAP backend by: Simon Josefsson <jas@pdc.kth.se>. @@ -29,10 +29,6 @@ ;;; Commentary: -;; TODO: Documentation in the Gnus manual - -;; Where in the existing gnus manual would this fit best? - ;; What does it do? Well, it allows you to search your mail using ;; some search engine (imap, namazu, swish-e, gmane and others -- see ;; later) by typing `G G' in the Group buffer. You will then get a @@ -136,17 +132,26 @@ ;; other backend. ;; The interface between the two layers consists of the single -;; function `nnir-run-query', which just selects the appropriate -;; function for the search engine one is using. The input to -;; `nnir-run-query' is a string, representing the query as input by -;; the user. The output of `nnir-run-query' is supposed to be a -;; vector, each element of which should in turn be a three-element -;; vector. The first element should be full group name of the article, -;; the second element should be the article number, and the third -;; element should be the Retrieval Status Value (RSV) as returned from -;; the search engine. An RSV is the score assigned to the document by -;; the search engine. For Boolean search engines, the -;; RSV is always 1000 (or 1 or 100, or whatever you like). +;; function `nnir-run-query', which dispatches the search to the +;; proper search function. The argument of `nnir-run-query' is an +;; alist with two keys: 'nnir-query-spec and 'nnir-group-spec. The +;; value for 'nnir-query-spec is an alist. The only required key/value +;; pair is (query . "query") specifying the search string to pass to +;; the query engine. Individual engines may have other elements. The +;; value of 'nnir-group-spec is a list with the specification of the +;; groups/servers to search. The format of the 'nnir-group-spec is +;; (("server1" ("group11" "group12")) ("server2" ("group21" +;; "group22"))). If any of the group lists is absent then all groups +;; on that server are searched. + +;; The output of `nnir-run-query' is supposed to be a vector, each +;; element of which should in turn be a three-element vector. The +;; first element should be full group name of the article, the second +;; element should be the article number, and the third element should +;; be the Retrieval Status Value (RSV) as returned from the search +;; engine. An RSV is the score assigned to the document by the search +;; engine. For Boolean search engines, the RSV is always 1000 (or 1 +;; or 100, or whatever you like). ;; The sorting order of the articles in the summary buffer created by ;; nnir is based on the order of the articles in the above mentioned @@ -179,26 +184,21 @@ ;;; Internal Variables: -(defvar nnir-current-query nil - "Internal: stores current query (= group name).") - -(defvar nnir-current-server nil - "Internal: stores current server (does it ever change?).") +(defvar nnir-memo-query nil + "Internal: stores current query.") -(defvar nnir-current-group-marked nil - "Internal: stores current list of process-marked groups.") +(defvar nnir-memo-server nil + "Internal: stores current server.") (defvar nnir-artlist nil "Internal: stores search result.") -(defvar nnir-tmp-buffer " *nnir*" - "Internal: temporary buffer.") - (defvar nnir-search-history () "Internal: the history for querying search options in nnir") -(defvar nnir-extra-parms nil - "Internal: stores request for extra search parms") +(defconst nnir-tmp-buffer " *nnir*" + "Internal: temporary buffer.") + ;; Imap variables @@ -290,14 +290,14 @@ is `(valuefunc member)'." (autoload 'nnimap-command "nnimap") (autoload 'nnimap-possibly-change-group "nnimap") (autoload 'nnimap-make-thread-query "nnimap") - (autoload 'gnus-registry-action "gnus-registry")) + (autoload 'gnus-registry-action "gnus-registry") + (autoload 'gnus-registry-get-id-key "gnus-registry") + (autoload 'gnus-group-topic-name "gnus-topic")) + (nnoo-declare nnir) (nnoo-define-basics nnir) -(defvoo nnir-address nil - "The address of the nnir server.") - (gnus-declare-backend "nnir" 'mail 'virtual) @@ -344,7 +344,7 @@ result, `gnus-retrieve-headers' will be called instead." (defcustom nnir-imap-default-search-key "whole message" "*The default IMAP search key for an nnir search. Must be one of the keys in `nnir-imap-search-arguments'. To use raw imap queries - by default set this to \"Imap\"." + by default set this to \"imap\"." :version "24.1" :type `(choice ,@(mapcar (lambda (elem) (list 'const (car elem))) nnir-imap-search-arguments)) @@ -546,17 +546,17 @@ that it is for notmuch, not Namazu." ,nnir-imap-default-search-key ; default ))) (gmane nnir-run-gmane - ((author . "Gmane Author: "))) + ((gmane-author . "Gmane Author: "))) (swish++ nnir-run-swish++ - ((group . "Swish++ Group spec: "))) + ((swish++-group . "Swish++ Group spec: "))) (swish-e nnir-run-swish-e - ((group . "Swish-e Group spec: "))) + ((swish-e-group . "Swish-e Group spec: "))) (namazu nnir-run-namazu ()) (notmuch nnir-run-notmuch ()) (hyrex nnir-run-hyrex - ((group . "Hyrex Group spec: "))) + ((hyrex-group . "Hyrex Group spec: "))) (find-grep nnir-run-find-grep ((grep-options . "Grep options: ")))) "Alist of supported search engines. @@ -576,69 +576,111 @@ needs the variables `nnir-namazu-program', Add an entry here when adding a new search engine.") -(defcustom nnir-method-default-engines - '((nnimap . imap) - (nntp . gmane)) +(defcustom nnir-method-default-engines '((nnimap . imap) (nntp . gmane)) "*Alist of default search engines keyed by server method." :version "24.1" - :type `(repeat (cons (choice (const nnimap) (const nttp) (const nnspool) + :group 'nnir + :type `(repeat (cons (choice (const nnimap) (const nntp) (const nnspool) (const nneething) (const nndir) (const nnmbox) (const nnml) (const nnmh) (const nndraft) (const nnfolder) (const nnmaildir)) (choice ,@(mapcar (lambda (elem) (list 'const (car elem))) - nnir-engines)))) - :group 'nnir) + nnir-engines))))) ;; Gnus glue. -(defun gnus-group-make-nnir-group (nnir-extra-parms &optional parms) - "Create an nnir group. Asks for query." +(defun gnus-group-make-nnir-group (nnir-extra-parms &optional specs) + "Create an nnir group. Prompt for a search query and determine +the groups to search as follows: if called from the *Server* +buffer search all groups belonging to the server on the current +line; if called from the *Group* buffer search any marked groups, +or the group on the current line, or all the groups under the +current topic. Calling with a prefix-arg prompts for additional +search-engine specific constraints. A non-nil `specs' arg must be +an alist with `nnir-query-spec' and `nnir-group-spec' keys, and +skips all prompting." (interactive "P") - (setq nnir-current-query nil - nnir-current-server nil - nnir-current-group-marked nil - nnir-artlist nil) - (let* ((query (unless parms (read-string "Query: " nil 'nnir-search-history))) - (parms (or parms (list (cons 'query query)))) - (srv (or (cdr (assq 'server parms)) (gnus-server-server-name) "nnir"))) - (add-to-list 'parms (cons 'unique-id (message-unique-id)) t) + (let* ((group-spec + (or (cdr (assq 'nnir-group-spec specs)) + (if (gnus-server-server-name) + (list (list (gnus-server-server-name))) + (nnir-categorize + (or gnus-group-marked + (if (gnus-group-group-name) + (list (gnus-group-group-name)) + (cdr (assoc (gnus-group-topic-name) gnus-topic-alist)))) + gnus-group-server)))) + (query-spec + (or (cdr (assq 'nnir-query-spec specs)) + (apply + 'append + (list (cons 'query + (read-string "Query: " nil 'nnir-search-history))) + (when nnir-extra-parms + (mapcar + (lambda (x) + (nnir-read-parms (nnir-server-to-search-engine (car x)))) + group-spec)))))) (gnus-group-read-ephemeral-group - (concat "nnir:" (prin1-to-string parms)) (list 'nnir srv) t - (cons (current-buffer) gnus-current-window-configuration) - nil))) + (concat "nnir-" (message-unique-id)) + (list 'nnir "nnir") + nil +; (cons (current-buffer) gnus-current-window-configuration) + nil + nil nil + (list + (cons 'nnir-specs (list (cons 'nnir-query-spec query-spec) + (cons 'nnir-group-spec group-spec))) + (cons 'nnir-artlist nil))))) + +(defun gnus-summary-make-nnir-group (nnir-extra-parms) + "Search a group from the summary buffer." + (interactive "P") + (gnus-warp-to-article) + (let ((spec + (list + (cons 'nnir-group-spec + (list (list + (gnus-group-server gnus-newsgroup-name) + (list gnus-newsgroup-name))))))) + (gnus-group-make-nnir-group nnir-extra-parms spec))) ;; Gnus backend interface functions. (deffoo nnir-open-server (server &optional definitions) ;; Just set the server variables appropriately. - (add-hook 'gnus-summary-mode-hook 'nnir-mode) - (nnoo-change-server 'nnir server definitions)) - -(deffoo nnir-request-group (group &optional server fast info) - "GROUP is the query string." - (nnir-possibly-change-server server) - ;; Check for cache and return that if appropriate. - (if (and (equal group nnir-current-query) - (equal gnus-group-marked nnir-current-group-marked) - (or (null server) - (equal server nnir-current-server))) - nnir-artlist - ;; Cache miss. - (setq nnir-artlist (nnir-run-query group))) - (with-current-buffer nntp-server-buffer - (setq nnir-current-query group) - (when server (setq nnir-current-server server)) - (setq nnir-current-group-marked gnus-group-marked) - (if (zerop (length nnir-artlist)) - (nnheader-report 'nnir "Search produced empty results.") - ;; Remember data for cache. - (nnheader-insert "211 %d %d %d %s\n" - (nnir-artlist-length nnir-artlist) ; total # - 1 ; first # - (nnir-artlist-length nnir-artlist) ; last # - group)))) ; group name + (let ((backend (car (gnus-server-to-method server)))) + (if backend + (nnoo-change-server backend server definitions) + (add-hook 'gnus-summary-mode-hook 'nnir-mode) + (nnoo-change-server 'nnir server definitions)))) + +(deffoo nnir-request-group (group &optional server dont-check info) + (nnir-possibly-change-group group server) + (let ((pgroup (gnus-group-guess-full-name-from-command-method group)) + length) + ;; Check for cached search result or run the query and cache the + ;; result. + (unless (and nnir-artlist dont-check) + (gnus-group-set-parameter + pgroup 'nnir-artlist + (setq nnir-artlist + (nnir-run-query + (gnus-group-get-parameter pgroup 'nnir-specs t)))) + (nnir-request-update-info pgroup (gnus-get-info pgroup))) + (with-current-buffer nntp-server-buffer + (if (zerop (setq length (nnir-artlist-length nnir-artlist))) + (progn + (nnir-close-group group) + (nnheader-report 'nnir "Search produced empty results.")) + (nnheader-insert "211 %d %d %d %s\n" + length ; total # + 1 ; first # + length ; last # + group)))) ; group name + nnir-artlist) (deffoo nnir-retrieve-headers (articles &optional group server fetch-old) (with-current-buffer nntp-server-buffer @@ -654,13 +696,7 @@ Add an entry here when adding a new search engine.") (server (gnus-group-server artgroup)) (gnus-override-method (gnus-server-to-method server)) parsefunc) - ;; (or (numberp art) - ;; (nnheader-report - ;; 'nnir - ;; "nnir-retrieve-headers doesn't grok message ids: %s" - ;; art)) - (nnir-possibly-change-server server) - ;; is this needed? + ;; (nnir-possibly-change-group nil server) (erase-buffer) (case (setq gnus-headers-retrieved-by (or @@ -694,6 +730,7 @@ Add an entry here when adding a new search engine.") 'nov))) (deffoo nnir-request-article (article &optional group server to-buffer) + (nnir-possibly-change-group group server) (if (and (stringp article) (not (eq 'nnimap (car (gnus-server-to-method server))))) (nnheader-report @@ -702,35 +739,35 @@ Add an entry here when adding a new search engine.") server) (save-excursion (let ((article article) - query) - (when (stringp article) - (setq gnus-override-method (gnus-server-to-method server)) - (setq query - (list - (cons 'query (format "HEADER Message-ID %s" article)) - (cons 'unique-id article) - (cons 'criteria "") - (cons 'shortcut t))) - (unless (and (equal query nnir-current-query) - (equal server nnir-current-server)) - (setq nnir-artlist (nnir-run-imap query server)) - (setq nnir-current-query query) - (setq nnir-current-server server)) - (setq article 1)) - (unless (zerop (length nnir-artlist)) - (let ((artfullgroup (nnir-article-group article)) - (artno (nnir-article-number article))) - (message "Requesting article %d from group %s" - artno artfullgroup) - (if to-buffer - (with-current-buffer to-buffer - (let ((gnus-article-decode-hook nil)) - (gnus-request-article-this-buffer artno artfullgroup))) - (gnus-request-article artno artfullgroup)) - (cons artfullgroup artno))))))) + query) + (when (stringp article) + (setq gnus-override-method (gnus-server-to-method server)) + (setq query + (list + (cons 'query (format "HEADER Message-ID %s" article)) + (cons 'criteria "") + (cons 'shortcut t))) + (unless (and nnir-artlist (equal query nnir-memo-query) + (equal server nnir-memo-server)) + (setq nnir-artlist (nnir-run-imap query server) + nnir-memo-query query + nnir-memo-server server)) + (setq article 1)) + (unless (zerop (nnir-artlist-length nnir-artlist)) + (let ((artfullgroup (nnir-article-group article)) + (artno (nnir-article-number article))) + (message "Requesting article %d from group %s" + artno artfullgroup) + (if to-buffer + (with-current-buffer to-buffer + (let ((gnus-article-decode-hook nil)) + (gnus-request-article-this-buffer artno artfullgroup))) + (gnus-request-article artno artfullgroup)) + (cons artfullgroup artno))))))) (deffoo nnir-request-move-article (article group server accept-form &optional last internal-move-group) + (nnir-possibly-change-group group server) (let* ((artfullgroup (nnir-article-group article)) (artno (nnir-article-number article)) (to-newsgroup (nth 1 accept-form)) @@ -751,6 +788,7 @@ Add an entry here when adding a new search engine.") (gnus-group-real-name to-newsgroup))))) (deffoo nnir-request-expire-articles (articles group &optional server force) + (nnir-possibly-change-group group server) (if force (let ((articles-by-group (nnir-categorize articles nnir-article-group nnir-article-ids)) @@ -772,22 +810,103 @@ Add an entry here when adding a new search engine.") articles)) (deffoo nnir-warp-to-article () + (nnir-possibly-change-group gnus-newsgroup-name) (let* ((cur (if (> (gnus-summary-article-number) 0) (gnus-summary-article-number) - (error "This is not a real article"))) + (error "Can't warp to a pseudo-article"))) (backend-article-group (nnir-article-group cur)) (backend-article-number (nnir-article-number cur)) (quit-config (gnus-ephemeral-group-p gnus-newsgroup-name))) - ;; first exit from the nnir summary buffer. - (gnus-summary-exit) + + ;; what should we do here? we could leave all the buffers around + ;; and assume that we have to exit from them one by one. or we can + ;; try to clean up directly + + ;;first exit from the nnir summary buffer. +; (gnus-summary-exit) ;; and if the nnir summary buffer in turn came from another ;; summary buffer we have to clean that summary up too. - (when (eq (cdr quit-config) 'summary) - (gnus-summary-exit)) + ; (when (not (eq (cdr quit-config) 'group)) +; (gnus-summary-exit)) (gnus-summary-read-group-1 backend-article-group t t nil - nil (list backend-article-number)))) + nil (list backend-article-number)))) + +(deffoo nnir-request-update-mark (group article mark) + (let ((artgroup (nnir-article-group article)) + (artnumber (nnir-article-number article))) + (gnus-request-update-mark artgroup artnumber mark))) + +(deffoo nnir-request-set-mark (group actions &optional server) + (nnir-possibly-change-group group server) + (let (mlist) + (dolist (action actions) + (destructuring-bind (range action marks) action + (let ((articles-by-group (nnir-categorize + (gnus-uncompress-range range) + nnir-article-group nnir-article-number))) + (dolist (artgroup articles-by-group) + (push (list + (car artgroup) + (list (gnus-compress-sequence + (sort (cadr artgroup) '<)) action marks)) mlist))))) + (dolist (request (nnir-categorize mlist car cadr)) + (gnus-request-set-mark (car request) (cadr request))))) + + +(deffoo nnir-request-update-info (group info &optional server) + (nnir-possibly-change-group group server) + ;; clear out all existing marks. + (gnus-info-set-marks info nil) + (gnus-info-set-read info nil) + (let ((group (gnus-group-guess-full-name-from-command-method group)) + (articles-by-group + (nnir-categorize + (gnus-uncompress-range (cons 1 (nnir-artlist-length nnir-artlist))) + nnir-article-group nnir-article-ids))) + (gnus-set-active group + (cons 1 (nnir-artlist-length nnir-artlist))) + (while (not (null articles-by-group)) + (let* ((group-articles (pop articles-by-group)) + (articleids (reverse (cadr group-articles))) + (group-info (gnus-get-info (car group-articles))) + (marks (gnus-info-marks group-info)) + (read (gnus-info-read group-info))) + (gnus-info-set-read + info + (gnus-add-to-range + (gnus-info-read info) + (delq nil + (mapcar + #'(lambda (art) + (when (gnus-member-of-range (cdr art) read) (car art))) + articleids)))) + (dolist (mark marks) + (destructuring-bind (type . range) mark + (gnus-add-marked-articles + group type + (delq nil + (mapcar + #'(lambda (art) + (when (gnus-member-of-range (cdr art) range) (car art))) + articleids))))))))) + + +(deffoo nnir-close-group (group &optional server) + (nnir-possibly-change-group group server) + (let ((pgroup (gnus-group-guess-full-name-from-command-method group))) + (when (and nnir-artlist (not (gnus-ephemeral-group-p pgroup))) + (gnus-group-set-parameter pgroup 'nnir-artlist nnir-artlist)) + (setq nnir-artlist nil) + (when (gnus-ephemeral-group-p pgroup) + (gnus-kill-ephemeral-group pgroup) + (setq gnus-ephemeral-servers + (delq (assq 'nnir gnus-ephemeral-servers) + gnus-ephemeral-servers))))) +;; (gnus-opened-servers-remove +;; (car (assoc '(nnir "nnir-ephemeral" (nnir-address "nnir")) +;; gnus-opened-servers)))) + -(nnoo-define-skeleton nnir) (defmacro nnir-add-result (dirnam artno score prefix server artlist) @@ -813,7 +932,7 @@ ready to be added to the list of search results." ;; remove trailing slash and, for nnmaildir, cur/new/tmp (setq dirnam (substring dirnam 0 - (if (string-match "^nnmaildir:" (gnus-group-server server)) + (if (string-match "\\`nnmaildir:" (gnus-group-server server)) -5 -1))) ;; Set group to dirnam without any leading dots or slashes, @@ -823,7 +942,7 @@ ready to be added to the list of search results." "[/\\]" "." t))) (vector (gnus-group-full-name group server) - (if (string-match "^nnmaildir:" (gnus-group-server server)) + (if (string-match "\\`nnmaildir:" (gnus-group-server server)) (nnmaildir-base-name-to-article-number (substring article 0 (string-match ":" article)) group nil) @@ -850,35 +969,36 @@ details on the language and supported extensions." (apply 'vconcat (catch 'found - (mapcar - (lambda (group) - (let (artlist) - (condition-case () - (when (nnimap-possibly-change-group - (gnus-group-short-name group) server) - (with-current-buffer (nnimap-buffer) - (message "Searching %s..." group) - (let ((arts 0) - (result (nnimap-command "UID SEARCH %s" - (if (string= criteria "") - qstring - (nnir-imap-make-query - criteria qstring))))) - (mapc - (lambda (artnum) - (let ((artn (string-to-number artnum))) - (when (> artn 0) - (push (vector group artn 100) - artlist) - (when (assq 'shortcut query) - (throw 'found (list artlist))) - (setq arts (1+ arts))))) - (and (car result) (cdr (assoc "SEARCH" (cdr result))))) - (message "Searching %s... %d matches" group arts))) - (message "Searching %s...done" group)) - (quit nil)) - (nreverse artlist))) - groups)))))) + (mapcar + #'(lambda (group) + (let (artlist) + (condition-case () + (when (nnimap-possibly-change-group + (gnus-group-short-name group) server) + (with-current-buffer (nnimap-buffer) + (message "Searching %s..." group) + (let ((arts 0) + (result (nnimap-command "UID SEARCH %s" + (if (string= criteria "") + qstring + (nnir-imap-make-query + criteria qstring))))) + (mapc + (lambda (artnum) + (let ((artn (string-to-number artnum))) + (when (> artn 0) + (push (vector group artn 100) + artlist) + (when (assq 'shortcut query) + (throw 'found (list artlist))) + (setq arts (1+ arts))))) + (and (car result) + (cdr (assoc "SEARCH" (cdr result))))) + (message "Searching %s... %d matches" group arts))) + (message "Searching %s...done" group)) + (quit nil)) + (nreverse artlist))) + groups)))))) (defun nnir-imap-make-query (criteria qstring) "Parse the query string and criteria into an appropriate IMAP search @@ -1073,14 +1193,14 @@ Windows NT 4.0." (save-excursion (let ( (qstring (cdr (assq 'query query))) - (groupspec (cdr (assq 'group query))) + (groupspec (cdr (assq 'swish++-group query))) (prefix (nnir-read-server-parm 'nnir-swish++-remove-prefix server)) artlist ;; nnml-use-compressed-files might be any string, but probably this ;; is sufficient. Note that we can't only use the value of ;; nnml-use-compressed-files because old articles might have been ;; saved with a different value. - (article-pattern (if (string-match "^nnmaildir:" + (article-pattern (if (string-match "\\`nnmaildir:" (gnus-group-server server)) ":[0-9]+" "^[0-9]+\\(\\.[a-z0-9]+\\)?$")) @@ -1247,7 +1367,7 @@ Tested with swish-e-2.0.1 on Windows NT 4.0." (defun nnir-run-hyrex (query server &optional group) (save-excursion (let ((artlist nil) - (groupspec (cdr (assq 'group query))) + (groupspec (cdr (assq 'hyrex-group query))) (qstring (cdr (assq 'query query))) (prefix (nnir-read-server-parm 'nnir-hyrex-remove-prefix server)) score artno dirnam) @@ -1323,7 +1443,7 @@ Tested with Namazu 2.0.6 on a GNU/Linux system." ;; (when group ;; (error "The Namazu backend cannot search specific groups")) (save-excursion - (let ((article-pattern (if (string-match "^nnmaildir:" + (let ((article-pattern (if (string-match "\\`nnmaildir:" (gnus-group-server server)) ":[0-9]+" "^[0-9]+$")) @@ -1394,10 +1514,10 @@ actually)." (save-excursion (let ( (qstring (cdr (assq 'query query))) - (groupspec (cdr (assq 'group query))) + (groupspec (cdr (assq 'notmuch-group query))) (prefix (nnir-read-server-parm 'nnir-notmuch-remove-prefix server)) artlist - (article-pattern (if (string-match "^nnmaildir:" + (article-pattern (if (string-match "\\`nnmaildir:" (gnus-group-server server)) ":[0-9]+" "^[0-9]+$")) @@ -1467,24 +1587,23 @@ actually)." (directory (cadr (assoc sym (cddr method)))) (regexp (cdr (assoc 'query query))) (grep-options (cdr (assoc 'grep-options query))) - (grouplist (or grouplist (nnir-get-active server))) - artlist) + (grouplist (or grouplist (nnir-get-active server)))) (unless directory (error "No directory found in method specification of server %s" server)) (apply 'vconcat (mapcar (lambda (x) - (let ((group x)) + (let ((group x) + artlist) (message "Searching %s using find-grep..." (or group server)) (save-window-excursion (set-buffer (get-buffer-create nnir-tmp-buffer)) - (erase-buffer) (if (> gnus-verbose 6) (pop-to-buffer (current-buffer))) (cd directory) ; Using relative paths simplifies - ; postprocessing. + ; postprocessing. (let ((group (if (not group) "." @@ -1507,7 +1626,8 @@ actually)." (save-excursion (apply 'call-process "find" nil t - "find" group "-type" "f" "-name" "[0-9]*" "-exec" + "find" group "-maxdepth" "1" "-type" "f" + "-name" "[0-9]*" "-exec" "grep" `("-l" ,@(and grep-options (split-string grep-options "\\s-" t)) @@ -1557,8 +1677,8 @@ actually)." (error "Can't search non-gmane groups: %s" x))) groups " ")) (authorspec - (if (assq 'author query) - (format "author:%s" (cdr (assq 'author query))) "")) + (if (assq 'gmane-author query) + (format "author:%s" (cdr (assq 'gmane-author query))) "")) (search (format "%s %s %s" qstring groupspec authorspec)) (gnus-inhibit-demon t) @@ -1594,11 +1714,16 @@ actually)." ;;; Util Code: -(defun nnir-read-parms (query nnir-search-engine) +(defun gnus-nnir-group-p (group) + "Say whether GROUP is nnir or not." + (if (gnus-group-prefixed-p group) + (eq 'nnir (car (gnus-find-method-for-group group))) + (and group (string-match "^nnir" group)))) + +(defun nnir-read-parms (nnir-search-engine) "Reads additional search parameters according to `nnir-engines'." (let ((parmspec (caddr (assoc nnir-search-engine nnir-engines)))) - (append query - (mapcar 'nnir-read-parm parmspec)))) + (mapcar 'nnir-read-parm parmspec))) (defun nnir-read-parm (parmspec) "Reads a single search parameter. @@ -1612,46 +1737,23 @@ actually)." (cons sym (format (cdr mapping) result))) (cons sym (read-string prompt))))) -(autoload 'gnus-group-topic-name "gnus-topic") - -(defun nnir-run-query (query) - "Invoke appropriate search engine function (see `nnir-engines'). - If some groups were process-marked, run the query for each of the groups - and concat the results." - (let ((q (car (read-from-string query))) - (groups (if (not (string= "nnir" nnir-address)) - (list (list nnir-address)) - (nnir-categorize - (or gnus-group-marked - (if (gnus-group-group-name) - (list (gnus-group-group-name)) - (cdr (assoc (gnus-group-topic-name) - gnus-topic-alist)))) - gnus-group-server)))) - (apply 'vconcat - (mapcar - (lambda (x) - (let* ((server (car x)) - (nnir-search-engine - (or (nnir-read-server-parm 'nnir-search-engine - server t) - (cdr (assoc (car - (gnus-server-to-method server)) - nnir-method-default-engines)))) - search-func) - (setq search-func (cadr (assoc nnir-search-engine - nnir-engines))) - (if search-func - (funcall - search-func - (if nnir-extra-parms - (or (and (eq nnir-search-engine 'imap) - (assq 'criteria q) q) - (setq q (nnir-read-parms q nnir-search-engine))) - q) - server (cadr x)) - nil))) - groups)))) +(defun nnir-run-query (specs) + "Invoke appropriate search engine function (see `nnir-engines')." + (apply 'vconcat + (mapcar + (lambda (x) + (let* ((server (car x)) + (search-engine (nnir-server-to-search-engine server)) + (search-func (cadr (assoc search-engine nnir-engines)))) + (and search-func + (funcall search-func (cdr (assq 'nnir-query-spec specs)) + server (cadr x))))) + (cdr (assq 'nnir-group-spec specs))))) + +(defun nnir-server-to-search-engine (server) + (or (nnir-read-server-parm 'nnir-search-engine server t) + (cdr (assoc (car (gnus-server-to-method server)) + nnir-method-default-engines)))) (defun nnir-read-server-parm (key server &optional not-global) "Returns the parameter value corresponding to `key' for @@ -1663,36 +1765,43 @@ environment unless `not-global' is non-nil." ((and (not not-global) (boundp key)) (symbol-value key)) (t nil)))) +(defun nnir-possibly-change-group (group &optional server) + (or (not server) (nnir-server-opened server) (nnir-open-server server)) + (when (gnus-nnir-group-p group) + (setq nnir-artlist (gnus-group-get-parameter + (gnus-group-prefixed-name + (gnus-group-short-name group) '(nnir "nnir")) + 'nnir-artlist t)))) -(defun nnir-possibly-change-server (server) - (unless (and server (nnir-server-opened server)) - (nnir-open-server server))) - +(defun nnir-server-opened (&optional server) + (let ((backend (car (gnus-server-to-method server)))) + (nnoo-current-server-p (or backend 'nnir) server))) (defun nnir-search-thread (header) - "Make an nnir group based on the thread containing the article header" - (let ((parm (list - (cons 'query - (nnimap-make-thread-query header)) - (cons 'criteria "") - (cons 'server (gnus-method-to-server - (gnus-find-method-for-group - gnus-newsgroup-name)))))) - (gnus-group-make-nnir-group nil parm) + "Make an nnir group based on the thread containing the article +header. The current server will be searched. If the registry is +installed, the server that the registry reports the current +article came from is also searched." + (let* ((query + (list (cons 'query (nnimap-make-thread-query header)) + (cons 'criteria ""))) + (server + (list (list (gnus-method-to-server + (gnus-find-method-for-group gnus-newsgroup-name))))) + (registry-group (and + (gnus-bound-and-true-p 'gnus-registry-enabled) + (car (gnus-registry-get-id-key + (mail-header-id header) 'group)))) + (registry-server + (and registry-group + (gnus-method-to-server + (gnus-find-method-for-group registry-group))))) + (when registry-server (add-to-list 'server (list registry-server))) + (gnus-group-make-nnir-group nil (list + (cons 'nnir-query-spec query) + (cons 'nnir-group-spec server))) (gnus-summary-goto-subject (gnus-id-to-article (mail-header-id header))))) -;; unused? -(defun nnir-artlist-groups (artlist) - "Returns a list of all groups in the given ARTLIST." - (let ((res nil) - (with-dups nil)) - ;; from each artitem, extract group component - (setq with-dups (mapcar 'nnir-artitem-group artlist)) - ;; remove duplicates from above - (mapc (function (lambda (x) (add-to-list 'res x))) - with-dups) - res)) - (defun nnir-get-active (srv) (let ((method (gnus-server-to-method srv)) groups) @@ -1757,6 +1866,53 @@ environment unless `not-global' is non-nil." (add-hook 'gnus-summary-article-expire-hook 'nnir-registry-action t t)))) +(defun gnus-summary-create-nnir-group () + (interactive) + (or (nnir-server-opened "") (nnir-open-server "nnir")) + (let ((name (gnus-read-group "Group name: ")) + (method '(nnir "")) + (pgroup + (gnus-group-guess-full-name-from-command-method gnus-newsgroup-name))) + (with-current-buffer gnus-group-buffer + (gnus-group-make-group + name method nil + (gnus-group-find-parameter pgroup))))) + + +(deffoo nnir-request-create-group (group &optional server args) + (message "Creating nnir group %s" group) + (let* ((group (gnus-group-prefixed-name group '(nnir "nnir"))) + (specs (assq 'nnir-specs args)) + (query-spec + (or (cdr (assq 'nnir-query-spec specs)) + (list (cons 'query + (read-string "Query: " nil 'nnir-search-history))))) + (group-spec + (or (cdr (assq 'nnir-group-spec specs)) + (list (list (read-string "Server: " nil nil))))) + (nnir-specs (list (cons 'nnir-query-spec query-spec) + (cons 'nnir-group-spec group-spec)))) + (gnus-group-set-parameter group 'nnir-specs nnir-specs) + (gnus-group-set-parameter + group 'nnir-artlist + (or (cdr (assq 'nnir-artlist args)) + (nnir-run-query nnir-specs))) + (nnir-request-update-info group (gnus-get-info group))) + t) + +(deffoo nnir-request-delete-group (group &optional force server) + t) + +(deffoo nnir-request-list (&optional server) + t) + +(deffoo nnir-request-scan (group method) + t) + +(deffoo nnir-request-close () + t) + +(nnoo-define-skeleton nnir) ;; The end. (provide 'nnir) diff --git a/lisp/gnus/nntp.el b/lisp/gnus/nntp.el index a21fc85752c..58135a1e598 100644 --- a/lisp/gnus/nntp.el +++ b/lisp/gnus/nntp.el @@ -1282,7 +1282,7 @@ If SEND-IF-FORCE, only send authinfo to the server if the "nntpd" pbuffer nntp-address nntp-port-number :type (cadr (assoc nntp-open-connection-function map)) :end-of-command "^\\([2345]\\|[.]\\).*\n" - :capability-command "CAPABILITIES\r\n" + :capability-command "HELP\r\n" :success "^3" :starttls-function (lambda (capabilities) diff --git a/lisp/gnus/pop3.el b/lisp/gnus/pop3.el index 719dff471ad..5ccbd197ff0 100644 --- a/lisp/gnus/pop3.el +++ b/lisp/gnus/pop3.el @@ -98,20 +98,53 @@ set this to 1." :group 'pop3) (defcustom pop3-leave-mail-on-server nil - "*Non-nil if the mail is to be left on the POP server after fetching. - -If `pop3-leave-mail-on-server' is non-nil the mail is to be left -on the POP server after fetching. Note that POP servers maintain -no state information between sessions, so what the client -believes is there and what is actually there may not match up. -If they do not, then you may get duplicate mails or the whole -thing can fall apart and leave you with a corrupt mailbox." - ;; We can't use the UILD support from XEmacs mail-lib or cvs.m17n.org: - ;; http://thread.gmane.org/v9lld8fml4.fsf@marauder.physik.uni-ulm.de - ;; http://thread.gmane.org/b9yy8hzy9ej.fsf@jpl.org - ;; Any volunteer to re-implement this? - :version "22.1" ;; Oort Gnus - :type 'boolean + "Non-nil if the mail is to be left on the POP server after fetching. +Mails once fetched will never be fetched again by the UIDL control. + +If this is neither nil nor a number, all mails will be left on the +server. If this is a number, leave mails on the server for this many +days since you first checked new mails. If this is nil, mails will be +deleted on the server right after fetching. + +Gnus users should use the `:leave' keyword in a mail source to direct +the behaviour per server, rather than directly modifying this value. + +Note that POP servers maintain no state information between sessions, +so what the client believes is there and what is actually there may +not match up. If they do not, then you may get duplicate mails or +the whole thing can fall apart and leave you with a corrupt mailbox." + :version "24.4" + :type '(choice (const :tag "Don't leave mails" nil) + (const :tag "Leave all mails" t) + (number :tag "Leave mails for this many days" :value 14)) + :group 'pop3) + +(defcustom pop3-uidl-file "~/.pop3-uidl" + "File used to save UIDL." + :version "24.4" + :type 'file + :group 'pop3) + +(defcustom pop3-uidl-file-backup '(0 9) + "How to backup the UIDL file `pop3-uidl-file' when updating. +If it is a list of numbers, the first one binds `kept-old-versions' and +the other binds `kept-new-versions' to keep number of oldest and newest +versions. Otherwise, the value binds `version-control' (which see). + +Note: Backup will take place whenever you check new mails on a server. +So, you may lose the backup files having been saved before a trouble +if you set it so as to make too few backups whereas you have access to +many servers." + :version "24.4" + :type '(choice (group :tag "Keep versions" :format "\n%v" :indent 3 + (number :tag "oldest") + (number :tag "newest")) + (sexp :format "%v" + :match (lambda (widget value) + (condition-case nil + (not (and (numberp (car value)) + (numberp (car (cdr value))))) + (error t))))) :group 'pop3) (defvar pop3-timestamp nil @@ -144,34 +177,66 @@ Shorter values mean quicker response, but are more CPU intensive.") (truncate pop3-read-timeout)) 1000)))))) +(defvar pop3-uidl) +;; List of UIDLs of existing messages at present in the server: +;; ("UIDL1" "UIDL2" "UIDL3"...) + +(defvar pop3-uidl-saved) +;; Locally saved UIDL data; an alist of the server, the user, and the UIDL +;; and timestamp pairs: +;; (("SERVER_A" ("USER_A1" "UIDL1" TIMESTAMP1 "UIDL2" TIMESTAMP2...) +;; ("USER_A2" "UIDL1" TIMESTAMP1 "UIDL2" TIMESTAMP2...) +;; ...) +;; ("SERVER_B" ("USER_B1" "UIDL1" TIMESTAMP1 "UIDL2" TIMESTAMP2...) +;; ("USER_B2" "UIDL1" TIMESTAMP1 "UIDL2" TIMESTAMP2...) +;; ...)) +;; Where TIMESTAMP is the most significant two digits of an Emacs time, +;; i.e. the return value of `current-time'. + ;;;###autoload (defun pop3-movemail (file) "Transfer contents of a maildrop to the specified FILE. Use streaming commands." - (let* ((process (pop3-open-server pop3-mailhost pop3-port)) - message-count message-total-size) + (let ((process (pop3-open-server pop3-mailhost pop3-port)) + messages total-size + pop3-uidl + pop3-uidl-saved) (pop3-logon process) - (with-current-buffer (process-buffer process) + (if pop3-leave-mail-on-server + (setq messages (pop3-uidl-stat process) + total-size (cadr messages) + messages (car messages)) (let ((size (pop3-stat process))) - (setq message-count (car size) - message-total-size (cadr size))) - (when (> message-count 0) - (pop3-send-streaming-command - process "RETR" message-count message-total-size) - (pop3-write-to-file file) + (dotimes (i (car size)) (push (1+ i) messages)) + (setq messages (nreverse messages) + total-size (cadr size)))) + (when messages + (with-current-buffer (process-buffer process) + (pop3-send-streaming-command process "RETR" messages total-size) + (pop3-write-to-file file messages) (unless pop3-leave-mail-on-server - (pop3-send-streaming-command - process "DELE" message-count nil)))) - (pop3-quit process) + (pop3-send-streaming-command process "DELE" messages nil)))) + (if pop3-leave-mail-on-server + (when (prog1 (pop3-uidl-dele process) (pop3-quit process)) + (pop3-uidl-save)) + (pop3-quit process) + ;; Remove UIDL data for the account that got not to leave mails. + (setq pop3-uidl-saved (pop3-uidl-load)) + (let ((elt (assoc pop3-maildrop + (cdr (assoc pop3-mailhost pop3-uidl-saved))))) + (when elt + (setcdr elt nil) + (pop3-uidl-save)))) t)) -(defun pop3-send-streaming-command (process command count total-size) +(defun pop3-send-streaming-command (process command messages total-size) (erase-buffer) - (let ((i 1) + (let ((count (length messages)) + (i 1) (start-point (point-min)) (waited-for 0)) - (while (>= count i) - (process-send-string process (format "%s %d\r\n" command i)) + (while messages + (process-send-string process (format "%s %d\r\n" command (pop messages))) ;; Only do 100 messages at a time to avoid pipe stalls. (when (zerop (% i pop3-stream-length)) (setq start-point @@ -207,7 +272,7 @@ Use streaming commands." (pop3-accept-process-output process)) start-point) -(defun pop3-write-to-file (file) +(defun pop3-write-to-file (file messages) (let ((pop-buffer (current-buffer)) (start (point-min)) beg end @@ -230,6 +295,8 @@ Use streaming commands." (pop3-clean-region hstart (point)) (goto-char (point-max)) (pop3-munge-message-separator hstart (point)) + (when pop3-leave-mail-on-server + (pop3-uidl-add-xheader hstart (pop messages))) (goto-char (point-max)))))) (let ((coding-system-for-write 'binary)) (goto-char (point-min)) @@ -275,6 +342,184 @@ Use streaming commands." (pop3-quit process) message-count)) +(defun pop3-uidl-stat (process) + "Return a list of unread message numbers and total size." + (pop3-send-command process "UIDL") + (let (err messages size) + (if (condition-case code + (progn + (pop3-read-response process) + t) + (error (setq err (error-message-string code)) + nil)) + (let ((start pop3-read-point) + saved list) + (with-current-buffer (process-buffer process) + (while (not (re-search-forward "^\\.\r\n" nil t)) + (unless (memq (process-status process) '(open run)) + (error "pop3 server closed the connection")) + (pop3-accept-process-output process) + (goto-char start)) + (setq pop3-read-point (point-marker) + pop3-uidl nil) + (while (progn (forward-line -1) (>= (point) start)) + (when (looking-at "[0-9]+ \\([^\n\r ]+\\)") + (push (match-string 1) pop3-uidl))) + (when pop3-uidl + (setq pop3-uidl-saved (pop3-uidl-load) + saved (cdr (assoc pop3-maildrop + (cdr (assoc pop3-mailhost + pop3-uidl-saved))))) + (let ((i (length pop3-uidl))) + (while (> i 0) + (unless (member (nth (1- i) pop3-uidl) saved) + (push i messages)) + (decf i))) + (when messages + (setq list (pop3-list process) + size 0) + (dolist (msg messages) + (setq size (+ size (cdr (assq msg list))))) + (list messages size))))) + (message "%s doesn't support UIDL (%s), so we try a regressive way..." + pop3-mailhost err) + (sit-for 1) + (setq size (pop3-stat process)) + (dotimes (i (car size)) (push (1+ i) messages)) + (setcar size (nreverse messages)) + size))) + +(defun pop3-uidl-dele (process) + "Delete messages according to `pop3-leave-mail-on-server'. +Return non-nil if it is necessary to update the local UIDL file." + (let* ((ctime (current-time)) + (srvr (assoc pop3-mailhost pop3-uidl-saved)) + (saved (assoc pop3-maildrop (cdr srvr))) + i uidl mod new tstamp dele) + (setcdr (cdr ctime) nil) + ;; Add new messages to the data to be saved. + (cond ((and pop3-uidl saved) + (setq i (1- (length pop3-uidl))) + (while (>= i 0) + (unless (member (setq uidl (nth i pop3-uidl)) (cdr saved)) + (push ctime new) + (push uidl new)) + (decf i))) + (pop3-uidl + (setq new (apply 'nconc (mapcar (lambda (elt) (list elt ctime)) + pop3-uidl))))) + (when new (setq mod t)) + ;; List expirable messages and delete them from the data to be saved. + (setq ctime (when (numberp pop3-leave-mail-on-server) + (/ (+ (* (car ctime) 65536.0) (cadr ctime)) 86400)) + i (1- (length saved))) + (while (> i 0) + (if (member (setq uidl (nth (1- i) saved)) pop3-uidl) + (progn + (setq tstamp (nth i saved)) + (if (and ctime + (> (- ctime (/ (+ (* (car tstamp) 65536.0) (cadr tstamp)) + 86400)) + pop3-leave-mail-on-server)) + ;; Mails to delete. + (progn + (setq mod t) + (push uidl dele)) + ;; Mails to keep. + (push tstamp new) + (push uidl new))) + ;; Mails having been deleted in the server. + (setq mod t)) + (decf i 2)) + (cond (saved + (setcdr saved new)) + (srvr + (setcdr (last srvr) (list (cons pop3-maildrop new)))) + (t + (add-to-list 'pop3-uidl-saved + (list pop3-mailhost (cons pop3-maildrop new)) + t))) + ;; Actually delete the messages in the server. + (when dele + (setq uidl nil + i (length pop3-uidl)) + (while (> i 0) + (when (member (nth (1- i) pop3-uidl) dele) + (push i uidl)) + (decf i)) + (when uidl + (pop3-send-streaming-command process "DELE" uidl nil))) + mod)) + +(defun pop3-uidl-load () + "Load saved UIDL." + (when (file-exists-p pop3-uidl-file) + (with-temp-buffer + (condition-case code + (progn + (insert-file-contents pop3-uidl-file) + (goto-char (point-min)) + (read (current-buffer))) + (error + (message "Error while loading %s (%s)" + pop3-uidl-file (error-message-string code)) + (sit-for 1) + nil))))) + +(defun pop3-uidl-save () + "Save UIDL." + (with-temp-buffer + (if pop3-uidl-saved + (progn + (insert "(") + (dolist (srvr pop3-uidl-saved) + (when (cdr srvr) + (insert "(\"" (pop srvr) "\"\n ") + (dolist (elt srvr) + (when (cdr elt) + (insert "(\"" (pop elt) "\"\n ") + (while elt + (insert (format "\"%s\" %s\n " (pop elt) (pop elt)))) + (delete-char -4) + (insert ")\n "))) + (delete-char -3) + (if (eq (char-before) ?\)) + (insert ")\n ") + (goto-char (1+ (point-at-bol))) + (delete-region (point) (point-max))))) + (when (eq (char-before) ? ) + (delete-char -2)) + (insert ")\n")) + (insert "()\n")) + (let ((buffer-file-name pop3-uidl-file) + (delete-old-versions t) + (kept-new-versions kept-new-versions) + (kept-old-versions kept-old-versions) + (version-control version-control)) + (if (consp pop3-uidl-file-backup) + (setq kept-new-versions (cadr pop3-uidl-file-backup) + kept-old-versions (car pop3-uidl-file-backup) + version-control t) + (setq version-control pop3-uidl-file-backup)) + (save-buffer)))) + +(defun pop3-uidl-add-xheader (start msgno) + "Add X-UIDL header." + (let ((case-fold-search t)) + (save-restriction + (narrow-to-region start (progn + (goto-char start) + (search-forward "\n\n" nil 'move) + (1- (point)))) + (goto-char start) + (while (re-search-forward "^x-uidl:" nil t) + (while (progn + (forward-line 1) + (memq (char-after) '(?\t ? )))) + (delete-region (match-beginning 0) (point))) + (goto-char (point-max)) + (insert "X-UIDL: " (nth (1- msgno) pop3-uidl) "\n")))) + (defcustom pop3-stream-type nil "*Transport security type for POP3 connections. This may be either nil (plain connection), `ssl' (use an @@ -663,6 +908,13 @@ and close the connection." ;; Possible responses: ;; +OK [all delete marks removed] +;; UIDL [msg] +;; Arguments: a message-id (optional) +;; Restrictions: transaction state; msg must not be deleted +;; Possible responses: +;; +OK [uidl listing follows] +;; -ERR [no such message] + ;;; UPDATE STATE ;; QUIT diff --git a/lisp/gnus/shr.el b/lisp/gnus/shr.el index ae3108a0a67..293ba2445e9 100644 --- a/lisp/gnus/shr.el +++ b/lisp/gnus/shr.el @@ -347,11 +347,11 @@ size, and full-buffer size." ((eq shr-folding-mode 'none) (insert text)) (t - (when (and (string-match "\\`[ \t\n]" text) + (when (and (string-match "\\`[ \t\n ]" text) (not (bolp)) (not (eq (char-after (1- (point))) ? ))) (insert " ")) - (dolist (elem (split-string text "[ \f\t\n\r\v]+" t)) + (dolist (elem (split-string text "[ \f\t\n\r\v ]+" t)) (when (and (bolp) (> shr-indentation 0)) (shr-indent)) @@ -391,7 +391,7 @@ size, and full-buffer size." (shr-indent)) (end-of-line)) (insert " "))) - (unless (string-match "[ \t\r\n]\\'" text) + (unless (string-match "[ \t\r\n ]\\'" text) (delete-char -1))))) (defun shr-find-fill-point () @@ -520,6 +520,11 @@ size, and full-buffer size." (dolist (type types) (shr-add-font (or shr-start (point)) (point) type)))) +(defun shr-make-overlay (beg end &optional buffer front-advance rear-advance) + (let ((overlay (make-overlay beg end buffer front-advance rear-advance))) + (overlay-put overlay 'evaporate t) + overlay)) + ;; Add an overlay in the region, but avoid putting the font properties ;; on blank text at the start of the line, and the newline at the end, ;; to avoid ugliness. @@ -529,7 +534,7 @@ size, and full-buffer size." (while (< (point) end) (when (bolp) (skip-chars-forward " ")) - (let ((overlay (make-overlay (point) (min (line-end-position) end)))) + (let ((overlay (shr-make-overlay (point) (min (line-end-position) end)))) (overlay-put overlay 'face type)) (if (< (line-end-position) end) (forward-line 1) @@ -588,6 +593,17 @@ size, and full-buffer size." (put-text-property start (point) type value)))))))))) (kill-buffer image-buffer))) +(defun shr-image-from-data (data) + "Return an image from the data: URI content DATA." + (when (string-match + "\\(\\([^/;,]+\\(/[^;,]+\\)?\\)\\(;[^;,]+\\)*\\)?,\\(.*\\)" + data) + (let ((param (match-string 4 data)) + (payload (url-unhex-string (match-string 5 data)))) + (when (string-match "^.*\\(;[ \t]*base64\\)$" param) + (setq payload (base64-decode-string payload))) + payload))) + (defun shr-put-image (data alt &optional flags) "Put image DATA with a string ALT. Return image." (if (display-graphic-p) @@ -615,7 +631,12 @@ size, and full-buffer size." (overlay-put overlay 'face 'default))) (insert-image image (or alt "*"))) (put-text-property start (point) 'image-size size) - (when (image-animated-p image) + (when (if (fboundp 'image-multi-frame-p) + ;; Only animate multi-frame things that specify a + ;; delay; eg animated gifs as opposed to + ;; multi-page tiffs. FIXME? + (cdr (image-multi-frame-p image)) + (image-animated-p image)) (image-animate image nil 60))) image) (insert alt))) @@ -785,7 +806,7 @@ ones, in case fg and bg are nil." (when (and (< (setq column (current-column)) width) (< (setq column (shr-previous-newline-padding-width column)) width)) - (let ((overlay (make-overlay (point) (1+ (point))))) + (let ((overlay (shr-make-overlay (point) (1+ (point))))) (overlay-put overlay 'before-string (concat (mapconcat @@ -931,7 +952,8 @@ ones, in case fg and bg are nil." (start (point)) shr-start) (shr-generic cont) - (shr-urlify (or shr-start start) (shr-expand-url url) title))) + (when url + (shr-urlify (or shr-start start) (shr-expand-url url) title)))) (defun shr-tag-object (cont) (let ((start (point)) @@ -972,6 +994,12 @@ ones, in case fg and bg are nil." ;; Ignore zero-sized or single-pixel images. ) ((and (not shr-inhibit-images) + (string-match "\\`data:" url)) + (let ((image (shr-image-from-data (substring url (match-end 0))))) + (if image + (funcall shr-put-image-function image alt) + (insert alt)))) + ((and (not shr-inhibit-images) (string-match "\\`cid:" url)) (let ((url (substring url (match-end 0))) image) @@ -1232,8 +1260,8 @@ ones, in case fg and bg are nil." (end-of-line) (insert line shr-table-vertical-line) (dolist (overlay overlay-line) - (let ((o (make-overlay (- (point) (nth 0 overlay) 1) - (- (point) (nth 1 overlay) 1))) + (let ((o (shr-make-overlay (- (point) (nth 0 overlay) 1) + (- (point) (nth 1 overlay) 1))) (properties (nth 2 overlay))) (while properties (overlay-put o (pop properties) (pop properties))))) @@ -1334,8 +1362,8 @@ ones, in case fg and bg are nil." (let ((end (length (car cache)))) (dolist (overlay (cadr cache)) (let ((new-overlay - (make-overlay (1+ (- end (nth 0 overlay))) - (1+ (- end (nth 1 overlay))))) + (shr-make-overlay (1+ (- end (nth 0 overlay))) + (1+ (- end (nth 1 overlay))))) (properties (nth 2 overlay))) (while properties (overlay-put new-overlay @@ -1465,7 +1493,7 @@ ones, in case fg and bg are nil." (provide 'shr) ;; Local Variables: -;; coding: iso-8859-1 +;; coding: utf-8 ;; End: ;;; shr.el ends here diff --git a/lisp/gnus/sieve-mode.el b/lisp/gnus/sieve-mode.el index 712ba34fb68..64768370488 100644 --- a/lisp/gnus/sieve-mode.el +++ b/lisp/gnus/sieve-mode.el @@ -131,14 +131,17 @@ (eval-when-compile (list ;; control commands - (cons (regexp-opt '("require" "if" "else" "elsif" "stop")) + (cons (regexp-opt '("require" "if" "else" "elsif" "stop") + 'words) 'sieve-control-commands-face) ;; action commands - (cons (regexp-opt '("fileinto" "redirect" "reject" "keep" "discard")) + (cons (regexp-opt '("fileinto" "redirect" "reject" "keep" "discard") + 'words) 'sieve-action-commands-face) ;; test commands (cons (regexp-opt '("address" "allof" "anyof" "exists" "false" - "true" "header" "not" "size" "envelope")) + "true" "header" "not" "size" "envelope") + 'words) 'sieve-test-commands-face) (cons "\\Sw+:\\sw+" 'sieve-tagged-arguments-face)))) diff --git a/lisp/gnus/smiley.el b/lisp/gnus/smiley.el index 6381f5bf9d9..eb71134457c 100644 --- a/lisp/gnus/smiley.el +++ b/lisp/gnus/smiley.el @@ -59,7 +59,10 @@ (defcustom smiley-style (if (or (and (fboundp 'face-attribute) - (>= (face-attribute 'default :height) 160)) + ;; In batch mode, attributes can be unspecified. + (condition-case nil + (>= (face-attribute 'default :height) 160) + (error nil))) (and (fboundp 'face-height) (>= (face-height 'default) 14))) 'medium diff --git a/lisp/gnus/spam-stat.el b/lisp/gnus/spam-stat.el index 1ef645d2003..d75e8198842 100644 --- a/lisp/gnus/spam-stat.el +++ b/lisp/gnus/spam-stat.el @@ -494,6 +494,18 @@ where DIFF is the difference between SCORE and 0.5." (setcdr (nthcdr 14 result) nil) result)) +(eval-when-compile + (defmacro spam-stat-called-interactively-p (kind) + (condition-case nil + (progn + (eval '(called-interactively-p 'any)) + ;; Emacs >=23.2 + `(called-interactively-p ,kind)) + ;; Emacs <23.2 + (wrong-number-of-arguments '(called-interactively-p)) + ;; XEmacs + (void-function '(interactive-p))))) + (defun spam-stat-score-buffer () "Return a score describing the spam-probability for this buffer. Add user supplied modifications if supplied." @@ -511,7 +523,7 @@ Add user supplied modifications if supplied." (error nil))) (ans (if score1s (+ score0 score1s) score0))) - (when (interactive-p) + (when (spam-stat-called-interactively-p 'any) (message "%S" ans)) ans)) diff --git a/lisp/gnus/spam.el b/lisp/gnus/spam.el index d84518b68b5..063ba28d6eb 100644 --- a/lisp/gnus/spam.el +++ b/lisp/gnus/spam.el @@ -2092,22 +2092,24 @@ See the Info node `(gnus)Fancy Mail Splitting' for more details." (declare-function gnus-extract-address-components "gnus-util" (from)) (eval-and-compile - (when (condition-case nil - (progn - (require 'bbdb) - (require 'bbdb-com)) - (file-error - ;; `bbdb-records' should not be bound as an autoload function - ;; before loading bbdb because of `bbdb-hashtable-size'. - (defalias 'bbdb-buffer 'ignore) - (defalias 'bbdb-create-internal 'ignore) - (defalias 'bbdb-records 'ignore) - (defalias 'spam-BBDB-register-routine 'ignore) - (defalias 'spam-enter-ham-BBDB 'ignore) - (defalias 'spam-exists-in-BBDB-p 'ignore) - (defalias 'bbdb-gethash 'ignore) - nil)) + (condition-case nil + (progn + (require 'bbdb) + (require 'bbdb-com)) + (file-error + ;; `bbdb-records' should not be bound as an autoload function + ;; before loading bbdb because of `bbdb-hashtable-size'. + (defalias 'bbdb-buffer 'ignore) + (defalias 'bbdb-create-internal 'ignore) + (defalias 'bbdb-records 'ignore) + (defalias 'spam-BBDB-register-routine 'ignore) + (defalias 'spam-enter-ham-BBDB 'ignore) + (defalias 'spam-exists-in-BBDB-p 'ignore) + (defalias 'bbdb-gethash 'ignore) + nil))) +(eval-and-compile + (when (featurep 'bbdb-com) ;; when the BBDB changes, we want to clear out our cache (defun spam-clear-cache-BBDB (&rest immaterial) (spam-clear-cache 'spam-use-BBDB)) diff --git a/lisp/gnus/utf7.el b/lisp/gnus/utf7.el index 69b189b6b53..b55b77a383b 100644 --- a/lisp/gnus/utf7.el +++ b/lisp/gnus/utf7.el @@ -1,4 +1,4 @@ -;;; utf7.el --- UTF-7 encoding/decoding for Emacs -*-coding: iso-8859-1;-*- +;;; utf7.el --- UTF-7 encoding/decoding for Emacs -*-coding: utf-8;-*- ;; Copyright (C) 1999-2013 Free Software Foundation, Inc. @@ -52,10 +52,10 @@ ;; necessary coding system. The code below doesn't seem to DTRT ;; generally. E.g.: ;; -;; (utf7-encode "a+") +;; (utf7-encode "a+£") ;; => "a+ACsAow-" ;; -;; $ echo "a+"|iconv -f iso-8859-1 -t utf-7 +;; $ echo "a+£"|iconv -f utf-8 -t utf-7 ;; a+-+AKM ;; ;; -- fx |